目录
- 1 iptables中的“四表五链”概述
- 1.1 iptables中的“四表”
- 1.2 iptables中的“五链”
- 2 iptables命令详解及示例
- 2.1 iptables命令语法规则
- 2.2 ACTION动作
- 2.3 COMMAND命令
- 2.3.1 规则管理
- 2.3.2 链管理
- 2.3.3 查看规则
- 2.4 匹配条件
- 2.4.1 通用匹配条件
- 2.4.2 隐含匹配条件
- 2.4.3 显式扩展匹配条件
- 2.5 iptables服务的重启、备份与保存
- 3 NAT网络地址转换示例
- 3.1 示例1
- 3.2 示例2
- 参考文章
iptables的主要功能是实现对网络数据包进出设备及转发的控制。当数据包需要
进入设备、从设备中流出或者经该设备转发、路由时,都可以使用iptables进行控制。
1 iptables中的“四表五链”概述
1.1 iptables中的“四表”
“四表”是指,iptables的功能——filter, nat, mangle, raw.
(1)filter:过滤,进行包过滤,控制数据包是否允许进出及转发(INPUT、OUTPUT、FORWARD),可以控制的链路有input, forward, output。
(2)nat:控制数据包中网络地址转换,可以控制的链路有prerouting, input, output, postrouting
(3)mangle:修改数据包中的原数据,可以控制的链路有prerouting, input, forward, output, postrouting
(4)raw:控制nat表中连接追踪机制的启用状况,可以控制的链路有prerouting, output
注:在centos7中,还有security表,不过这里不作介绍
1.2 iptables中的“五链”
“五链”是指内核中控制网络的NetFilter定义的五个规则链,分别为:
(1)PREROUTING:路由前,
(2)INPUT:数据包流入口,指当目标地址是自己时,该规则链起作用。
(3)FORWARD:转发,指当源地址和目标地址均不是自己时,该规则链起作用。
(4)OUTPUT:数据包出口,指当源地址是自己时,该规则链起作用。
(5)POSTROUTING:路由后,
2 iptables命令详解及示例
本文的环境如下:
操作系统:CentOS7.3
Linux系统的ip地址:192.168.1.254和172.16.1.254.
2.1 iptables命令语法规则
(1)语法:iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION
(2)讲解:
- -t table,是指操作的表,filter、nat、mangle或raw, 默认使用filter
- COMMAND,子命令,定义对规则的管理
- chain, 指明链路
- CRETIRIA, 匹配的条件或标准,如网段、IP、协议、端口、状态
- ACTION,操作动作或控制类型。
(3)注意事项:
1)不指定表名时,默认指filter表
2)不指定链名时,默认指表内的所有链
3)除非设定链的默认策略,否则必须指定匹配条件
4)链名、动作均为大写字母,命令大部分大写,其余均为小写。
(4)例子:
- 1)不允许10.8.0.0/16网络对80/tcp端口进行访问
iptables -A INPUT -p tcp -s 10.8.0.0/16 -d 192.168.1.254 --dport 80 -j DROP
#-A为追加新规则于指定链的尾部;-s为源地址;-d为目标地址;-p为协议;
- 2)查看iptables中filter表
iptables -t filter -nvL
#-n为数字格式显示主机地址和端口号;-v为显示详细信息;-L为列出规则。
tips:
每1秒钟观察filter表的命令如下:
watch -n1 iptables -t filter -nvL
2.2 ACTION动作
数据包的常见动作(控制类型)有以下几种:
(1)ACCEPT:允许通过
(2)DROP:直接丢弃,不给出任何回应
(3)REJECT:拒绝通过,必要时会给出提示
(4)LOG:记录日志信息,然后传给下一条规则继续匹配。
谈谈REJECT和DROP之间的区别,Ming写了一封信,向Rose示爱。Rose如果不愿意接受,她可以不回应Ming,这个时候Ming不确定Rose是否接到了信;Rose也可以同样写一封信,在信中明确地拒绝Ming。前一种操作就如同执行了DROP操作,而后一种操作就如同REJECT操作。
2.3 COMMAND命令
2.3.1 规则管理
-A, --append chain rule-specification:追加新规则于指定链的尾部;
-I, --insert chain [rulenum] rule-specification:插入新规则于指定链的指定位置,默认为首部;
-R, --replace chain rulenum rule-specification:替换指定的规则为新的规则;
-D, --delete chain rulenum:根据规则编号删除规则;
#在filter表INPUT链首部开始第2行加一条规则;允许所有icmp协议的通过
iptables -t filter -I INPUT 2 -p icmp -j ACCEPT
#删除filter表ORWARD第2条规则
iptables -t filter -D FORWARD 2
2.3.2 链管理
-N, --new-chain chain:新建一个自定义的规则链;
-X, --delete-chain [chain]:删除用户自定义的引用计数为0的空链;
-F, --flush [chain]:清空指定的规则链上的规则;
-E, --rename-chain old-chain new-chain:重命名链;
-Z, --zero [chain [rulenum]]:置零计数器;
-P, --policy chain target, 设置链路的默认策略
#将filter表ORWARD链全部清空
iptables -t filter -F FORWARD
#将filter表ORWARD链的默认策略改为DROP,注意默认策略只能选择ACCEPT和DROP
iptables -t filter -P FORWARD -j DROP
2.3.3 查看规则
-L, --list [chain]:列出规则;
-v, --verbose:详细信息;
-vv, -vvv 更加详细的信息
-n, --numeric:数字格式显示主机地址和端口号;
-x, --exact:显示计数器的精确值;
–line-numbers:列出规则时,显示其在链上的相应的编号;
-S, --list-rules [chain]:显示指定链的所有规则;
#显示filter的详细信息,并显示行号
iptables -t filter -nvL --line-numbers
2.4 匹配条件
匹配条件包括通用匹配条件、隐含匹配条件和显式匹配条件。
(1)通用匹配条件:是指针对源地址、目标地址的匹配,包括单一源IP、单一源端口、单一目标IP、单一目标端口、数据包流经的网卡以及协议。
(2)隐含匹配条件:要求以特定的协议匹配作为前提,包括端口TCP标记、ICMP类型等条件
(3)显式匹配条件:要求以“-m 扩展模块”的形式明确指出类型,包括多端口、 MAC地址、IP范围、数据包状态等条件。
2.4.1 通用匹配条件
(1)协议匹配:-p, --protocol 协议名:匹配报文中的协议,可用值tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh 或者 “all”, 亦可以数字格式指明协议;
(2)地址匹配:
- -s, --source 地址[/mask][,…]:检查报文的源IP地址是否符合此处指定的范围,或是否等于此处给定的地址;
- -d, --destination address[/mask][,…]:检查报文的目标IP地址是否符合此处指定的范围,或是否等于此处给定的地址;
(3)接口匹配:
- -i, --in-interface 入站网卡:限定报文仅能够从指定的接口流入;only for packets entering the INPUT, FORWARD and PREROUTING chains.
- -o, --out-interface 出站网卡:限定报文仅能够从指定的接口流出;for packets entering the FORWARD, OUTPUT and POSTROUTING chains.
iptables -A INPUT -i eth1 -p icmp -s 172.16.0.0/12 -j ACCEPT
2.4.2 隐含匹配条件
(1)端口匹配:
- –source-port,–sport port[:port] 匹配报文源端口;可以给出多个端口,但只能是连续的端口范围 ;
- –destination-port,–dport port[:port] 匹配报文目标端口;可以给出多个端口,但只能是连续的端口范围 ;
(2)TCP匹配标记:
- –tcp-flags mask comp 匹配报文中的tcp协议的标志位;Flags are: SYN ACK FIN RST URG PSH ALL NONE;
①mask:要检查的FLAGS list,以逗号分隔;
②comp:在mask给定的诸多的FLAGS中,其值必须为1的FLAGS列表,余下的其值必须为0;
(3)ICMP匹配标记:
- –icmp-type {type[/code]|typename},其中,8为ping请求、0为ping应答、3为目标主机不可达。
icmp的类型可具体查看《第16节 ICMP协议—Internet控制报文协议》。
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
2.4.3 显式扩展匹配条件
必须用-m option选项指定扩展匹配的类型,常见的有以下几种,
(1)多端口匹配:以离散或连续的 方式定义多端口匹配条件,最多15个;
- -m multiport --sport 源端口列表
- -m multiport --dport 源端口列表
iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -j ACCEPT
(2)IP范围匹配:以连续地址块的方式来指明多IP地址匹配条件;
- -m iprange --src-range 源IP范围
- -m iprange --dst-range 目标IP范围
iptables -I INPUT -d 172.16.0.7 -p tcp -m multiport --dports 22,80,139,445,3306 -m iprange --src-range 172.16.0.61-172.16.0.70 -j REJECT
(3)MAC地址匹配:
- -m mac --mac-source 源MAC地址
(4)状态匹配:限制收发包的状态
- -m state --state 状态:状态包括INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED。每个状态的含义如下:
①NEW: 新连接请求;
②ESTABLISHED:已建立的连接;
③INVALID:无法识别的连接;
④RELATED:相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接;
⑤UNTRACKED:未追踪的连接;
2.5 iptables服务的重启、备份与保存
上述对iptables的所有修改,当重启iptables后又失效,回到最初状态.
#重启iptables服务
systemctl restart iptables.service
'''备份与导入'''
#将当前iptables状态备份到某文件中
iptables-save > 文件路径及名称(如/root/桌面/ipt.txt)
将某文件的规则导入到当前iptables中
iptables-restore < 文件路径及名称(如/root/桌面/ipt.txt)
'''直接保存'''
service iptables save
3 NAT网络地址转换示例
网络拓扑图如下,其中将linux作为两个网段的网关。另外不给外网的winxp指定网关来模拟现实中私有地址无法在互联网传播的情形。
3.1 示例1
假如内网主机win7想访问外网的winxp(web服务器),由于公网上不能出现私网IP,当数据包到达Linux时需要做nat网络地址转换。NAT网络地址转换的工作原理详见《第22节 NAT(网络地址转换)—实现公网IP和私网IP之间的转换》。操作步骤如下:
(1)查看NAT表详细信息。我们可以先输入命令iptables -t nat -nvL
查看查看NAT表详细信息,如下图所示。可以看到NAT表有PREROUTING 、INPUT、OUTPUT、POSTROUTING四个链。
(2)做NAT网络地址转换。在Linux上的外网端口配置NAT代码如下:
iptables -F FORWARD #清空filter表中的转发链,由于默认策略是ACCEPT,清空后,就允许转发。
#在nat表的路由后链上首行新增一条规则:只要是源地址为192.168.1.0/24访问TCP协议且从ens34网卡出的数据就给其做源地址转换,并将源地址转换为12.1.1.254
iptables -t nat -I POSTROUTING -p tcp -o ens34 -s 192.168.1.0/24 -j SNAT --to-source 12.1.1.254
3.2 示例2
假如内网的公网IP并不是固定的12.1.1.254,公司买的是动态的公网IP,公网IP时常变换,这时的NAT网络地址转换代码如下:
iptables -t nat -I POSTROUTING -p tcp -o ens34 -s 192.168.1.0/24 -j MASQUERADE #MASQUERADE为乔装的意思,是指进行动态转换
[1] 《iptables命令使用详解》 [2] 视频传送门