iptables 是 Linux 防火墙工作在用户空间的管理工具,是
netfilter/iptablesIP 信息包过滤系统是一部分,用来设置、维护和检查 Linux 内核的 IP 数据包过滤规则。
iptables由两部分组成,一部分是ip另外一部分就是tables。因此iptables就是通过表的形式对ip进行各种操作。
iptables的重点是五链四表。
四表五链:
链就是位置:共有五个 进路由( PREROUTING)、进系统(INPUT) 、转发(FORWARD)、出系统(OUTPUT)、出路由(POSTROUTING);
表就是存储的规则;数据包到了该链处,会去对应表中查询设置的规则,然后决定是否放行、丢弃、转发还是修改等等操作。
四表
raw表,待学习
mangle表,操作系统级别的表,主要应用在修改数据包、流量整形、给数据包打标识,默认的规则链有:
INPUT,OUTPUT、forward,POSTROUTING,PREROUTINGfilter表,过滤表,对进入的不符合条件的流量过滤。对不符合规则输出流量也进行过滤;
nat表,对目的地址、目的端口、源地址源端口进行修改;
五链
- INPUT
- OUTPUT
- FPRWARD
- POSTROUTING
- PREROUTING
五链
- 当一个数据包进入网卡时,它首先进入
PREROUTING链,内核根据数据包目的 IP 判断是否需要转送出去。 - 如果数据包就是进入本机的,它就会沿着图向下移动,到达
INPUT链。数据包到了 INPUT 链后,任何进程都会收到它。 - 本机上运行的程序可以发送数据包,这些数据包会经过
OUTPUT链,然后到达POSTROUTING链输出。 - 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过
FORWARD链,然后到达POSTROUTING链输出。
小结
整体数据包分两类:1、发给防火墙本身的数据包 ;2、需要经过防火墙的数据包.
数据包的流程:数据包进入到链中之后,会根据此时的状态去对应的表中查询对应的规则。
匹配流程示意图
因此,在这五条链中。不同链承担的角色是不一样的。
PREROUTING:承担SNAT的作用;
POSTROUTING:承担DNAT的作用;
FPRWARD:承担转发的作用,如果需要对转发流量进行限制则可以在这里进行限制;
INPUT:承担流量输入的作用,如果想要主机不收到某些流量,则可以在这里进行限制;
OUTPUT:承担流量输出的作用,如果想要主机不发出去某些流量,则可以在这里进行限制。
iptables语法
这张图描述了iptables的相关语法命令。
四表
filter表
查看规则
1 | iptables -t filter -L -n |
可以看到结果

添加规则
追加规则,将所有进入流量的80端口的流量丢弃掉。
1 | iptables -t filter -A INPUT -j DROP -p tcp --dport 80 |
追加规则,将出口到某个192.168.0.144的流量全部丢弃
1 | iptables -t filter -A OUTPUT -j DROP -p tcp -d 192.168.0.144 |
查看iptables表

删除规则
将设置的第一条规则删除掉。
1 | iptables -t filter -D INPUT 1 |
nat表
查看nat 表

查询规则
如图所示
查询规则
-L 列出规则,在L之前还可以添加其他参数,如下所示:
- v:显示详细信息,包括每条规则匹配的包数和匹配字节号;
- x:在v的基础上,禁止自动单位换算(K、M)
- n:只显示IP地址与端口号码,不显示服务名称
用详细方法列出filter表的的所有规则,只显示IP地址与端口号:
第一种
1 | root@wjshuai:~# iptables -t filter -vnL INPUT |
第二种
1 | root@wjshuai:~# iptables -t filter -v -n -L INPUT |
匹配规则
按网络接口匹配
-i,匹配数据进入的网络接口
1 | -i eth0 匹配是否从网络接口eth0进入 |
-o,匹配数据流出的网络接口
1 | -o eth0 匹配是否从网络接口eth0出去 |
按照地址进行匹配
-s,匹配来源地址
可以是IP、NET、Domain也可以为空(任何)
1 | -s 192.168.0.1 匹配来自192.168.0.1的数据包 |
-d,匹配目的地址
可以是IP、NET、Domain也可以为空(任何)
1 | -d 202.106.0.20 匹配去往202.106.0.20的数据包 |
按照协议类型进行匹配
-p,匹配协议类型
可以是任何的网络协议
1 | -p tcp |
按照端口进行匹配
–sport,匹配源端口
1 | --sport 1000 匹配源端口是1000的数据包 |
–dport,匹配目的端口
1 | --dport 80 |
ps:如果需要匹配端口那就需要规则中必须有-p参数。
附加匹配模块
按包状态匹配
state
-m state –state 状态
状态:
- NEW,有别于tcp的syn
- ESTABLISHED,连接状态
例子
1 | ipttables -A INPUT -m state --state NEW.ESTABLISHED -j ACCEPT |
按来源MAC匹配
mac
-m mac –mac-source MAC
例如
阻断来自某MAC地址的数据包
1 | iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP |
按包速率匹配
limit
用一定的速率去匹配数据包,而不是去限制数据包。
多端口匹配
multiport
1 | iptables -A INPUT -p tcp -m multiports --ports 21,22,23 -j DROP |
ps:如果需要匹配端口那就需要规则中必须有-p参数。
target
动作,处理方式,按照规则匹配到流量后,对该流量进行的动作。有如下处理方式:
- ACCEPT
- DROP
- SNAT
- DNAT
- MASQUERADE
ACCEPT
接受数据流量
DROP
丢弃数据流量
SNAT
源地址转换,nat表的POSTROUTING链
例如
1 | # 将内网192.168.0.0/24源地址修改为1.1.1.1 |
DNAT
目的地址转换,DNAT支持 转换为单IP,也支持转换到IP地址池
1 | # 从ppp0接口进来的要访问TCP/80端口的数据包目的地址修改为192.168.0.1 |
转发流量
使用iptables的转发流量功能前,需要先开启转发功能
开启转发功能
1 | sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf |
清除下所有默认的iptables表
1 | iptables -F |
SNAT策略
策略概述
SNAT策略的典型应用环境
- 局域网主机共享单个公网IP地址接入Internet
SNAT策略的原理
源地址转换,Source Network Address Translation
- 修改数据包的源地址
SNAT未使用前
如果SNAT没有使用的话,那么就会像下图以下,无法进行通信。

SNAT使用后
可以进行相互通信了

SNAT 规则编写
1 | [root@localhost ~]# iptables -t nat -A POSTROUTING -s A.A.A.0/24 -o eth0 -j SNAT --to-source D.D.D.D |
SNAT效果
如果SNAT设置成功,那么就会实现以下效果
在局域网主机 A.A.A.A 中能够访问外网的Web服务器 C.C.C.C
查看Web主机 C.C.C.C 的访问日志,记录的来访者应是网关主机的外网IP地址 D.D.D.D
1
2
3
4[root@localhost ~]# less /var/log/httpd/access_log
……
D.D.D.D - - [26/May/2011:15:26:23 +0800] "GET / HTTP/1.1" 200 28 "-" "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2;
.NET CLR 2.0.50727; Media Center PC 6.0)"
DNAT策略
DNAT的典型应用环境:在Internet中发布内网服务器。

策略编写
1 | [root@localhost ~]# iptables -t nat -A PREROUTING -i eth0 -d D.D.D.D |
验证DNAT
如何验证,很简单只要实现以下方式就算验证成功。
在外网客户机 C.C.C.C 中能够访问位于企业内网的Web服务,访问地址为 http://D.D.D.D/
查看Web服务器 A.A.A.A 的访问日志,记录了外网客户机的IP地址 C.C.C.C
流量转发
转发TCP流量
1 | iptables -t nat -A PREROUTING -p tcp --dport [源端口号] -j DNAT --to-destination [目标IP:目标端口号] |
转发UDP流量
1 | iptables -t nat -A PREROUTING -p udp --dport [源端口号] -j DNAT --to-destination [目标IP:目标端口号] |
PS:执行完毕后,必须进行保存 请使用service iptables save 进行保存。
参考文献
- 开源Linux. iptables系列教程(一)| iptables入门篇[EB/OL]. 2020/05/13 [2021/11/13]. https://bbs.huaweicloud.com/blogs/164852.
- 2020/05. iptables系列教程(二)| iptables语法规则[EB/OL]. 2020/05[2021/11]. https://bbs.huaweicloud.com/blogs/detail/165033.
- 开源Linux. iptables系列教程(三)| iptables 实战篇[EB/OL]. 2020/05/13[2021/11/13]. https://bbs.huaweicloud.com/blogs/167485.
- 乃逸夫. https://zhuanlan.zhihu.com/p/26325389[EB/OL]. 2017/04/12[2021/11/13]. https://zhuanlan.zhihu.com/p/26325389.
- 一本正经的搞事情. iptables 四表五链[EB/OL]. 2018/09/26[2021/11/13]. https://www.cnblogs.com/zhujingzhi/p/9706664.html.