IPTABLES

1、容器:包含或者说属于的关系


2、Netfilter/iptables是表的容器,iptables包含的各个表

(filter,NAT,MANGLE,RAW)


3、iptables的表tables又是链的容器

链chains:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING


4、链chains是规则容器:


5、规则Policy:一条条过滤的语句。

lsmod |egrep "nat|filter"

modprobe ip_tables

modprobe iptable_filter

modprobe iptable_nat

modprobe ip_conntrack

modprobe ip_conntrack_ftp

modprobe ip_nat_ftp

modprobe ipt_state


iptables -F  //清除所有规则,不会处理默认的规则。

iptables -X  //删除用户自定义的链。

iptables -Z  //链的记数器清零。



什么是表tables?

表是链的容器,即所有的链都属于其对应的表,如果把Netgilter看成是某小区的一栋楼,那么表就是楼里的其中一套房子 

什么是链chains?

链chains是规则policys的容器,如果把表当做一套房子,那么链就可以说是房子里的家具、柜子等

什么是规则Policy?

规则policy就比较容易理解了,就是iptables一系列过滤信息的规范和具体方法条款了,可以理解为柜子如果增加并摆放柜子东西等



iptable表和链的关系

iptables详解_自定义


 iptables详解_端口号_02



FILTER表:

iptables详解_linux_03

iptables详解_iptables_04


 iptables -L  -n  查看filter表

 iptables -L  -n  -t nat 查看fnat表

iptables详解_iptables_05



nat表

iptables详解_linux_06

iptables详解_linux_07

 iptables详解_自定义_08


 iptables详解_linux_09


iptables工作流程

iptables详解_自定义_10



 数据包的流向是从左向右的!

iptables详解_自定义_11

小结…

1、防火墙是层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的。

2、如果匹配上规则,即明确表明是阻止还是通过,数据包就不在向下匹配新规则了。

3、如果所有规则中没有明确表明是阻止还是通过,也就是没有匹配规则,向下进行匹配, 直到匹配默认规则得到明确的阻止还是通过。

4、防火墙默认规则是所有的规则执行完才会执行的。


iptables详解_自定义_12


iptables表和链的工作流程图

iptables详解_自定义_13



简化后的

iptables详解_端口号_14


命令学习:

1.1、查看是否安装成功

命令:systemctl status iptables

1.2、安装iptables

yum install iptables-services

检查是否安装成功

systemctl status iptables


启动iptables

systemctl start iptables.service


1.5、关闭SELINUX

在CentOS7 下由于SELINUX的开启会导致很多系统服务和驱动不兼容,所以建议大家关闭SELINUX,我们可以通过修改配置文件的方式关闭SELINUX

命令:vi /etc/selinux/config

iptables详解_iptables_15



iptables -L -n 默认查看filter表
[root@localhost shell]# iptables -L -n
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target prot opt source destination


 lsmod | egrep "nat|filter" 默认加载的内核模块

[root@localhost shell]# lsmod | egrep "nat|filter"
nf_nat_masquerade_ipv4 13412 1 ipt_MASQUERADE
iptable_nat 12875 1
nf_nat_ipv4 14115 1 iptable_nat
nf_nat 26787 2 nf_nat_ipv4,nf_nat_masquerade_ipv4
nf_conntrack 133387 5 nf_nat,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ipv4
ebtable_filter 12827 0
ebtables 35009 1 ebtable_filter
ip6table_filter 12815 0
ip6_tables 26901 1 ip6table_filter
iptable_filter 12810 1
ip_tables 27115 3 iptable_filter,iptable_mangle,iptable_nat
libcrc32c 12644 3 xfs,nf_nat,nf_conntrack


加载如下模块到内核

iptables详解_端口号_16




iptables -F  清除防火墙 不会清除默认

iptables  -X 是删除用户自定义的链

iptables -Z 把 chain 或者所有 chain(当未指定 chain 名称时)的包及字节的计数器清空

iptables详解_linux_17



iptables 规则中各指令(command)的含义:

各种指令如下。既可以使用长指令,也可以使用短指令字母,例如,

iptables --append chain firewall-rule
等价于
iptables -A chain firewall-rule

另外,指令后面所带的参数/选项,如果以 [ ] 包括,则表示该参数/选项可省略(有缺省值)。

--APPEND,-A

指令形式:

iptables -A chain firewall-rule

-A chain – 指定规则应该添加到的 chain 的名称。例如,使用 INPUT 将会把规则添加到默认的 INPUT(入站)链的末尾,而使用 OUTPUT 则会将规则添加到出站链的末尾。

firewall-rule – 包含各种参数选项的防火墙规则,一次一条规则

“-A” 的意思是附加(append),并不是添加(Add)的意思。它是将规则添加到已有的防火墙链(chain)的末尾的操作指令。这是特别重要的,因为规则在 iptables 中的位置非常重要,所以千万要记住, -A 的意思是将规则添加到末尾。因为一般情况下 iptables 中最后一条规则是丢弃所有数据包。如果你已经有了一条这样的规则,使用 -A 参数添加的规则将会在丢弃规则之后,以至于新规则根本无法起作用。如果要插入到中间位置,需要用 -I 指令。


--DELETE,-D

从 chain 中删除与指定规则匹配,或指定编号的条目。

指令形式:

iptables -D chain firewall-rule

表示从 chain 中删除对应规则 firewall-rule 的那一条目。这种形式删除规则比较麻烦,通常用下面的形式

iptables -D chain rulenum

删除 chain 中编号为 rulenum 的那条规则。1 表示第一条。

--INSERT,-I

指令形式:

iptables -I chain [rulenum] firewall-rule

将 firewall-rule 添加为 chain 中的第 rulenum 条规则,原先的第 rulenum 条及以后各条的需要顺次 +1。如上面一样,1 表示该 chain 中第一条。默认为 1,即,如果没有指定 rulenum 则将该 chain 中第一条规则替换掉。

--REPLACE,-R

指令形式:

iptables -R chain [rulenum] firewall-rule

将 chain 中原来的第 rulenum 条规则替换为 firewall-rule。如果没有指定 rulenum,则替换该 chain 中第一条。

--LIST,-L

指令形式:

iptables -L [chain [rulenum]]

列出 chain 或者所有 chain(当未指定 chain 名称时)中的 第 rulenum 条规则或者所有规则(当未指定 rulenum 时)。不过要注意,如果未指定 chain 则不能带 rulenum 参数。

如果在 -L 后再加上 –line-numbers,则表示在每条规则前面显示序号。如,iptables -L --line-numbers

--LIST-RULES,-S

指令形式:

iptables -S [chain [rulenum]]

打印出 chain 或者所有 chain(当未指定 chain 名称时)中的 第 rulenum 条规则或者所有规则(当未指定 rulenum 时)。不过要注意,如果未指定 chain 则不能带 rulenum 参数。

--FLUSH,-F

指令形式:

iptables -F [chain]

清空 chain 或所有 chain (当未指定 chain 名称时)中的规则。

--ZERO,-Z

指令形式:

iptables -Z [chain [rulenum]]

把 chain 或者所有 chain(当未指定 chain 名称时)的包及字节的计数器清空。

--NEW,-N

指令形式:

--new -N chain

创建一个名称为 chain 的新链。

--DELETE-CHAIN,-X

指令形式:

iptables -X [chain]

删除用户自定义 chain 或者所有用户自定义 chain(当未指定 chain 名称时)。该指令不影响预设规则(如 INPUT、OUTPUT、FORWARD 等)。

--POLICY,-P

指令形式:

iptables -P chain target

改变 chain 的策略为 target。

--RENAME-CHAIN,-E

指令形式:

iptables -E old-chain new-chain

将 old-chain 名称更改为 new-chain。这样做可以使所有引用 old-chain 的规则失效。


iptables 规则中各参数的含义:

-P 代表协议(PROTOCOL)

指明当前规则针对的传输协议(如 TCP、UDP、ICMP 等)

可能的参数值有:tcp, udp, icmp, all

使用 “all” 表示适用于所有协议。而如果在规则中不指定 -p 参数,则默认使用 “all” 参数。一般不使用 “all” 这个值,要么指定某个特定的协议,要么就指定 -p 参数。

-p 的参数值既可以用名称(如 tcp)也可以用协议对应的数值(如 6 代表 tcp 协议)

/etc/protocols 文件中包含了所有允许的协议名称和相应数值

也可以用长的参数名 --protocol

-S 代表源地址(SOURCE)

指定数据包的源地址

可以是 ip 地址,或者网络地址,或者主机名(hostname)

例如:-s 192.168.1.101 表示针对特定的 ip 地址

对于网络掩码,使用 /mask。例如,“-s 192.168.1.0/24″ 表示网络掩码为 255.255.255.0 的所有 192.168.1.x 地址都匹配。

如果不指定 -s 参数,默认匹配所有源地址

也可以用长参数名 --src 或者 --source

-D 代表目的地址(DESTINATION)

指定数据包的目的地址

使用方式与上面的 “-s” 一样(不同之处仅在于 -s 指源,而 -d 表示目的地址)

也可以用长参数名 --dst 或者 --destination

-J 代表跳转(TARGET)

j 的意思是 “jump”(跳转) 到目标

指定当某个数据包满足该规则的时候的就跳转到的下一个处理规则,而不再顺序执行后面的规则判断

可能的值有:ACCEPT, DROP,REJECT, QUEUE, RETURN,分别表示接受、丢弃、拒绝、进入队列,返回(跳出,通常是从某个 chain 中跳回到调用该 chain 的上层 chain)

也可以跳转到某个自定义的 chain 中,使用该 chain 的名称做为跳转目标(DROP好于REJECT)

-I 代表 IN INTERFACE(入站接口)

i 表示 “input interface”(输入接口,即,指定网络数据处理的网卡,一般 eth0 即表示第一块有线网卡的外网接口,lo 表示局域网接口)

可以直接理解为 “-i” 表示接口。不过,-i 和 -o 都表示接口,-i 表示输入时的接口,而 -o 特指输出用的接口。

指定数据包进入 INPUT、FORWARD 和 PREROUTING 链时经由的接口。

例如:-i eth0 表示该规则应该针对从 eth0 接口进来的数据包。

如果不指定 -i 参数,则经由系统中所有可用的接口进入的数据包都可以匹配该规则。

也可以使用长参数 –in-interface


-A 代表 IN INTERFACE(入站接口)

同上面-I类似

 -A  是添加规则到指定链的结尾、最后一条。

 -I 是添加规则到指定链的开头,第一条。


-O 代表 OUT INTERFACE(出站接口)

o 表示 “output interface”(出站经由接口)

指定发送出去的数据包进入 INPUT、FORWARD 和 PREROUTING 链时经由的接口。

如果不指定 -o 参数,则经由系统中所有可用的接口发出的数据包都可以匹配该规则。

也可以使用长参数 --out-interface


其它防火墙参数选项

上面某些防火墙参数还有属于它自己的参数选项,可以与其配合使用。下面是一些常用的选项。

要使用这些参数选项,需要指定相应的参数,例如,要使用 “--sport” 选项,应该在规则中指定 “-p tcp” (或者 “-p udp”)等参数。

注意:所有这些选项前面都是 --(2个短横线 -- )。

--SPORT 表示 SOURCE PORT (源端口,用于 -P TCP, 或者 -P UDP)

默认匹配所有端口(未特别指定时)

可以指定端口号(数字),也可以指定端口名称。例如,默认的 SSH 端口号码为 22,名称为 ssh,可以表示为 “–sport 22″ 或者 “–sport ssh”。

/etc/services 文件包含了所有允许的端口名称和对应的端口号码。

在规则中使用号码比使用名称要好(效率高些)

要匹配一个端口范围,使用英文半角冒号(:),如 22:100 匹配从 22 到 100 的所有端口号。

也可以使用长名称 --source-port

--DPORT 表示 DESTINATION PORT (目的端口,-P TCP, 或者 -P UDP)

与 –sport 的用法相同,区别仅在于对象是目的端口

也可以使用长名称 –destination-port

--TCP-FLAGS 表示 TCP FLAGS (用于 -P TCP)

可以使用英文半角逗号(,)来指定多个 TCP 状态标识

可能值有:SYN, ACK, FIN, RST, URG, PSH。可以全用,也可以不用。

--ICMP-TYPE 表示 ICMP TYPE (ICMP 类型,用于 -P ICMP)

当使用 icmp 协议 “-p icmp” 的时候,可以使用 “–icmp-type” 特别指定 ICMP 类型

例如,使用 “–icmp-type 0″ 表示 “Echo Reply”,“–icmp-type 8″ 表示 “Echo”。


------------------------------------------------------------------------------------------------------------------------

 eg1:禁止掉当前SSH端口,这里是22

iptables -t filter -A INPUT -p tcp --dport 22  -j DROP  


eg2:删除上面规则

iptables  -A INPUT -p tcp --dport 22 -j DROP


其它删除方法-根据序号删除


iptables -L -n --line-numbers 规则加序号 清除规则方便
iptables -t filter -D INPUT 1 根据序号删除
[root@ipt ~]# iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80

Chain FORWARD (policy ACCEPT)
num target prot opt source destination

Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
[root@ipt ~]# iptables -t filter -D INPUT 1


iptables详解_iptables_18



自定义规则顺序:

iptables详解_端口号_19



封端口:

iptables详解_端口号_20


封ip:

iptables详解_端口号_21


封网段:


iptables -t filter -A INPUT -i eth0 -s 10.0.0.0/24 -j DROP


iptables详解_iptables_22


测试配置拒绝规则也是匹配:

下面的测试有两个要点:非的作用,匹配拒绝也是匹配


iptables -t filter -A INPUT -i  eth0 ! -s 10.0.0.115 -j DROP


iptables -t filter -A INPUT -i  eth0 ! -s 10.0.0.115 -j ACCEPT




原地址不是10.0.0.101单个ip的禁止链接(ping命令)

iptables详解_自定义_23



 匹配指定协议外的所有协议


iptables -A INPUT -p  ! tcp

iptables -I INPUT ! -p tcp -s 10.0.0.123 -j DROP




匹配主机源ip


iptables  -A  INPU -s  10.0.0.14

iptables  -A  INPU  !  -s  10.0.0.14



匹配网段:


iptables  -A  INPU -s  10.0.0.0/24

iptables  -A  INPU  !  -s  10.0.0.0/24



匹配单一端口:

iptables详解_iptables_24




匹配指定端口之外的端口

iptables详解_linux_25



匹配端口范围:

iptables详解_iptables_26


iptables详解_端口号_27



iptables详解_linux_28



匹配网络状态

iptables详解_端口号_29