四表五链、禁止ping、防火墙规则添加/删除、自建链使用、SNAT\DNAT模式、FTP服务器防火墙规则、防火墙规则备份
@
1. 概述
1.1 四表
应用顺序:由上至下
- raw:对连接做追踪
- mangle:对数据包做修改,如给数据包打标记
- nat :修改数据包地址
- filter:对数据包过滤
1.2 五链
- INPUT:针对目标地址
- OUTPUT:针对源地址
- FORWARD:穿过防火墙
- PREROUTING:路由前过滤
- POSTROUTING:路由后过滤
1.3 四表五链的关系
表 |
支持的链 |
raw |
PREROUTING、OUTPUT |
mangle |
PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD |
nat |
PREROUTING、POSTROUTING、OUTPUT |
fIlter |
INPUT、OUTPUT、FORWARD |
1.4 使用流程

2. 语法和操作
1.1 语法
| iptables [-t 要操作的表] <操作命令> [要操作的链] [规则号码] [匹配条件] [-j 匹配后的动作] |
| # 小写 大写 大写 小写 大写 |
1.2 常用操作命令
-L
:查看,v详细,n不反解
-A
:追加,放置最后一条
-I
:插入,默认插入成第一条(第一条生效后不会考虑后边规则
)
-D
:删除
-F
:清空flush
-X
:删除空的自定义链
-P
:设置默认策略
-Z
:计数器归零
-N
:建立自定义链
1.3 基本匹配条件
-s 192.168.2.0/24
:源地址
-d 192.168.2.1
:目标地址
-p tcp|upd|icmp
:协议
-i eth0
:input 从eth0接口进入的数据包
-o eth0
:output 从eth0出去的数据包
-p tcp --sport 80
:源端口是80的数据包
-p tcp --dport 80
:目标端口是80
1.4 基本动作
- filter表
-j ACCEPT
:接受
-j REJECT
:拒绝
-j DROP
:丢弃
-j LOG
:记录日志
DROP和REJECT的区别:
REJECT
:直接拒绝链接,和客户端断开。更适合可控网络。
DROP
:丢弃——意味着不予回复,客户端只能等超时。更适合服务器安全和面对攻击。
- nat表
-j SNAT
:源地址转换
-j DNAT
:目标地址转换
-j MASQUERADE
:伪装
-j REDIRECT
:端口转换
- mangle表
1.5 常用命令示例
- 设置默认值
设置默认值,禁止所有穿过防火墙
- 禁止80端口访问
| iptables -I INPUT -p tcp --dport 80 -j DROP |
- 查看防火墙规则
| iptables -nL --line-number |
- 保存规则
该命令会把防火墙规则保存在/etc/sysconfig/iptables
文件中
| [root@liubei-02 ~]# cat /etc/sysconfig/iptables |
| # Generated by iptables-save v1.4.21 on Tue Jan 10 16:06:09 2023 |
| *mangle |
| :PREROUTING ACCEPT [31154:2463094] |
| :INPUT ACCEPT [10892:1355724] |
| :FORWARD ACCEPT [0:0] |
| :OUTPUT ACCEPT [15203:10068473] |
| :POSTROUTING ACCEPT [15203:10068473] |
| COMMIT |
| # Completed on Tue Jan 10 16:06:09 2023 |
| # Generated by iptables-save v1.4.21 on Tue Jan 10 16:06:09 2023 |
| *raw |
| :PREROUTING ACCEPT [31154:2463094] |
| :OUTPUT ACCEPT [15203:10068473] |
| COMMIT |
| # Completed on Tue Jan 10 16:06:09 2023 |
| # Generated by iptables-save v1.4.21 on Tue Jan 10 16:06:09 2023 |
| *filter |
| :INPUT ACCEPT [5015:664817] |
| :FORWARD ACCEPT [0:0] |
| :OUTPUT ACCEPT [7751:5368662] |
| -A INPUT -p tcp -m tcp --sport 80 -j DROP |
| COMMIT |
| # Completed on Tue Jan 10 16:06:09 2023 |
| # Generated by iptables-save v1.4.21 on Tue Jan 10 16:06:09 2023 |
| *nat |
| :PREROUTING ACCEPT [20546:1128148] |
| :INPUT ACCEPT [235:18006] |
| :OUTPUT ACCEPT [1055:72144] |
| :POSTROUTING ACCEPT [1055:72144] |
| COMMIT |
| # Completed on Tue Jan 10 16:06:09 2023 |
如上可见:
*mangle
:表明
:INPUT ACCEPT [5015:664817]
:这种是默认规则
-A INPUT -p tcp -m tcp --sport 80 -j DROP
:这种是我们在每个表下加的规则
- 允许ssh
| iptables -I INPUT -p tcp --dport 22 -j ACCEPT |
- 禁止ping
| iptables -t filter -I INPUT -p icmp -m icmp --icmp-type echo-reply -j REJECT |
或
| iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 0 -j REJECT |
| iptables -t filter -I INPUT -p icmp -m icmp --icmp-type echo-request -j REJECT |
或
| iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8 -j REJECT |
- 删除规则
N为规则编号。
- 清除规则(不包括默认规则)
- 新建自定义链
- 删除空的自定义链
- 端口转发
访问本机100端口转发至本机80端口
| iptables -t nat -I PREROUTEING -p tcp --dport 100 -j REDIRECT --to-port 80 |
3. 完整示例
3.1 创建和删除规则
| [root@liubei-02 ~]# iptables -L |
| Chain INPUT (policy ACCEPT) |
| target prot opt source destination |
| |
| Chain FORWARD (policy DROP) |
| target prot opt source destination |
| |
| Chain OUTPUT (policy ACCEPT) |
| target prot opt source destination |
如上可见,当初没有任何规则。
| iptables -I INPUT -p tcp --dport 80 -j DROP |
| [root@liubei-02 ~]# iptables -L |
| Chain INPUT (policy ACCEPT) |
| target prot opt source destination |
| DROP tcp -- anywhere anywhere tcp dpt:http |
| |
| Chain FORWARD (policy DROP) |
| target prot opt source destination |
| |
| Chain OUTPUT (policy ACCEPT) |
| target prot opt source destination |
| |
如上可见,nat表中多了一条记录
| [root@liubei-02 ~]# service iptables save |
| iptables: Saving firewall rules to /etc/sysconfig/iptables:[ 确定 ] |
如上可见,规则保存在/etc/sysconfig/iptables
中
| # Generated by iptables-save v1.4.21 on Tue Jan 10 17:22:38 2023 |
| *mangle |
| :PREROUTING ACCEPT [1960:156458] |
| :INPUT ACCEPT [675:88821] |
| :FORWARD ACCEPT [0:0] |
| :OUTPUT ACCEPT [961:649865] |
| :POSTROUTING ACCEPT [961:649865] |
| COMMIT |
| # Completed on Tue Jan 10 17:22:38 2023 |
| # Generated by iptables-save v1.4.21 on Tue Jan 10 17:22:38 2023 |
| *raw |
| :PREROUTING ACCEPT [1960:156458] |
| :OUTPUT ACCEPT [961:649865] |
| COMMIT |
| # Completed on Tue Jan 10 17:22:38 2023 |
| # Generated by iptables-save v1.4.21 on Tue Jan 10 17:22:38 2023 |
| *filter |
| :INPUT ACCEPT [312:38483] |
| :FORWARD DROP [0:0] |
| :OUTPUT ACCEPT [457:343983] |
| -A INPUT -p tcp -m tcp --dport 80 -j DROP |
| COMMIT |
| # Completed on Tue Jan 10 17:22:38 2023 |
| # Generated by iptables-save v1.4.21 on Tue Jan 10 17:22:38 2023 |
| *nat |
| :PREROUTING ACCEPT [1300:68667] |
| :INPUT ACCEPT [15:1030] |
| :OUTPUT ACCEPT [77:5220] |
| :POSTROUTING ACCEPT [77:5220] |
| COMMIT |
| # Completed on Tue Jan 10 17:22:38 2023 |
| |
如上可见,我们创建的规则被保存在文件中。
先查看规则的编号
| [root@liubei-02 ~]# iptables -nL --line-number |
| 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 DROP) |
| num target prot opt source destination |
| |
| Chain OUTPUT (policy ACCEPT) |
| num target prot opt source destination |
| |
如上可见,我们刚才创建的规则是nat
表INPUT
链中编号为1
的规则
删除规则
| [root@liubei-02 ~]# iptables -D INPUT 1 |
默认是nat
表,因此我们不用写 -t nat
| [root@liubei-02 ~]# iptables -nL |
| Chain INPUT (policy ACCEPT) |
| target prot opt source destination |
| |
| Chain FORWARD (policy DROP) |
| target prot opt source destination |
| |
| Chain OUTPUT (policy ACCEPT) |
| target prot opt source destination |
如上可见,之前创建的规则被删除了。
3.2 创建新链并应用
要求:使用新建的MYCHAIN创建允许80端口访问的规则
| [root@liubei-02 ~]# iptables -I INPUT -p tcp --dport 80 -j DROP |
| [root@liubei-02 ~]# iptables -N MYCHAIN |
- 目标地址是本机地址且目标端口是80端口的请求全部交给MYCHAIN链处理
| [root@liubei-02 ~]# iptables -I INPUT -p tcp --dport 80 -d 10.10.239.32 -j MYCHAIN |
| [root@liubei-02 ~]# iptables -I MYCHAIN -p tcp --dport 80 -j ACCEPT |
测试一下,此时80端口可以访问了。
| [root@liubei-02 ~]# iptables -L |
| Chain INPUT (policy ACCEPT) |
| target prot opt source destination |
| MYCHAIN tcp -- anywhere liubei-02 tcp dpt:http |
| DROP tcp -- anywhere anywhere tcp dpt:http |
| |
| Chain FORWARD (policy ACCEPT) |
| target prot opt source destination |
| |
| Chain OUTPUT (policy ACCEPT) |
| target prot opt source destination |
| |
| Chain MYCHAIN (1 references) |
| target prot opt source destination |
| ACCEPT tcp -- anywhere anywhere tcp dpt:http |
如上可见
- INPUT链中添加了一个拒绝规则,添加了一条规则转发的规则
- 多了一个MYCHAIN链,下边有一条允许80端口通过规则。
3.3 SNAT模式
作用:内网客户端访问公网
内网 |
路由 |
公网 |
client |
LAN:192.168.1.1--------WAN:10.10.239.32 |
web:10.252.96249 |
| iptables -t nat -I POSTROUTING -s 10.252.96.0/24 -p tcp -j SNAT --to 10.10.239.32 |
理解路由后过滤,在请求出路由的时候把请求的源地址改成路由本机,使得web可以返回给路由。
3.3 DNAT模式
作用:公网访问内网
内网 |
路由 |
公网 |
web:192.168.1.110 |
LAN:192.168.1.1,WAN 10.10.239.3 |
client |
| iptables -t nat -I PREROUTING -d 10.10.239.32 -p tcp --dport 80 -j DNAT --to 192.168.1.110 |
理解路由前过滤:请求目标是路由地址,在进入路由前被修改,否则将直接被路由本机接收。
如果转发端口不同
路由8080端口转发至内网web服务器8080端口
| iptables -t nat -I PREROUTING -d 10.10.239.32 -p tcp --dport 8080 -j DNAT --to 192.168.1.110:80 |
3.4 FTP服务器防火墙规则
| iptables -A INPUT -p tcp --dport 20 -j ACCEPT # 开放FTP主动数据端口 |
| iptables -A INPUT -p tcp --dport 21 -j ACCEPT # 对外开放FTP控制端口 |
| iptables -A INPUT -p tcp --dport 50000:60000 -j ACCEPT # 对外开放FTP数据端口 |
| iptables -A INPUT -j REJECT |
3.5 规则备份与恢复
| iptables-save > /etc/iptables-script |
| iptables-restore < /etc/iptables-script |
- 开机执行
将恢复命令写入/etc/rc.local
注意:/etc/rc.local
需要执行权限。

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?