在Linux系统中,iptables堪称防火墙工具中的“元老级”组件——功能全面、性能稳定、配置灵活,专门用于管理网络数据包的过滤与转发。通过它,系统管理员可以制定一系列规则,精准控制数据包的流动方向,既能保障网络安全,又能实现灵活的流量调度。下面这张示意图能帮你快速理解其核心运作逻辑:

iptables的作用
iptables最核心的能力,就是根据预设的规则对网络数据包实施过滤——是放行还是拦截,完全由规则决定。这样一来,未授权的访问以及各类网络威胁自然被拒之门外。
此外,iptables还支持网络地址转换(NAT)。你可以将内部网络的私有IP映射至外部公网IP,反之亦可。端口转发、IP伪装等实用功能,其底层实现都离不开NAT。
谈及端口转发,这无疑是iptables的“高光场景”——它能把进入系统的数据包重新导向至另一个地址与端口。无论是搭建对外服务的服务器,还是让内网服务被外部访问,这一功能都频繁登场。
更令人称道的是,iptables还能对数据包进行“精细调控”:修改目标地址、变更端口号……只要你能构思出规则,它便能按照你的意愿改造数据包。
iptables的工作原理
要掌握iptables,关键在于理解它如何与内核协同工作。每当一个数据包抵达Linux系统,内核会首先将其交给iptables处理。iptables持有按顺序排列的规则集——它从第一条规则开始,逐条匹配数据包的特征。一旦命中某条规则,立刻执行该规则中定义的动作(放行、丢弃、重定向等),并停止后续匹配。
如果数据包遍历整个规则集后仍无匹配项,则轮到“默认策略”发挥作用——通常是直接放行,或是二话不说直接拒绝。这条“兜底”规则至关重要。
iptables基础概念和术语
1. 链(Chain)
链,即一系列规则构成的“队伍”。每个进入系统的数据包,都会按照预定义的链来“受审”,链中的规则决定其最终命运。常见的链包括:
- INPUT:处理进入系统的数据包。
- OUTPUT:处理从系统发出的数据包。
- FORWARD:处理经过系统的数据包(既非进入系统,也非由系统发出)。
2. 规则(Rule)
规则是iptables最基本的操作单元。每条规则由两部分构成:匹配条件 + 动作。数据包到来后,从第一条规则开始逐条比对,一旦匹配成功,立即执行对应的动作。
3. 表(Table)
表是规则的“收纳箱”,不同表负责不同任务。每个表包含若干预定义的链,用于特定类型的数据包处理。常见的表有四个:
- filter表:负责数据包过滤。
- nat表:负责网络地址转换。
- mangle表:负责数据包修改。
- raw表:负责原始数据包处理。
4. 匹配条件(Match)
匹配条件是规则中的“筛选器”。你可以依据源地址、目标地址、协议类型、端口号等任意组合来设定条件。只有数据包满足所有条件时,对应规则才会被触发。
5. 动作(Target)
动作定义了规则匹配成功后的操作。常见动作如下:
- ACCEPT:放行数据包。
- DROP:直接丢弃,不通知发送方。
- REJECT:拒绝并告知发送方“此路不通”。
- REDIRECT:将数据包重定向至另一个地址和端口。
6. 表和链的关系
表包含链,链包含规则——这是一种层层嵌套的结构。数据包到达时,iptables先根据数据包类型选择对应的表,再进入该表的特定链,逐条匹配规则,直至命中或到达链尾。
端口转发的原理
端口转发,说白了就是把从某个端口进来的数据包,转交给另一个端口去处理。在Linux中,iptables通过修改数据包的目标地址和目标端口来实现这种“乾坤大挪移”。其大致流程如下:
- 数据包进入系统,内核依据iptables规则集开始处理。
- 若规则集中包含端口转发规则,且当前数据包匹配成功,iptables便会修改数据包的目标地址和端口。
- 修改完成后,数据包被转发至新的地址和端口。
- 这个新地址和端口,可以是本机上的服务,也可以是网络中的其他设备。
端口转发的应用场景
端口转发在实际运维中非常常见,例如:
- 让外部网络能够访问内网的服务器——将外网流量引入内部。
- 将某个端口的流量分摊到多台设备上——实现负载均衡或故障转移。
- 把同一端口进入的流量,根据规则分配到不同的目标地址和端口——灵活配置网络。
配置端口转发时,安全问题始终放在第一位。必须严格限制源地址、目标地址和端口,防止被恶意用户利用。同时,定期审查并更新iptables规则集也是一个良好的安全习惯。
使用iptables进行端口转发的步骤
启用IPv4转发
动手之前,请先确认系统已开启IPv4数据包转发功能。编辑/etc/sysctl.conf文件,找到下面这行(若没有则手动添加):
代码语言:bash
net.ipv4.ip_forward=1
然后使配置生效:
代码语言:bash
sudo sysctl -p
添加端口转发规则
使用iptables添加转发规则。例如,将外部TCP流量转发到内网某台服务器的特定端口:
代码语言:bash
sudo iptables -t nat -A PREROUTING -p tcp --dport [外部端口] -j DNAT --to-destination [内部服务器IP]:[内部端口]
允许转发的流量通过防火墙
如果系统防火墙处于开启状态,还需要放行转发流量:
代码语言:bash
sudo iptables -A FORWARD -i [进入网卡] -o [出去网卡] -p [协议] --dport [内部端口] -j ACCEPT
保存和应用规则
规则配置完成后务必保存,否则重启后就会丢失:
代码语言:bash
sudo iptables-sa ve > /etc/iptables/rules.v4
让系统在启动时自动加载:
代码语言:bash
sudo iptables-restore < /etc/iptables/rules.v4
将外部HTTP流量转发到内部Web服务器
假设内网有一台Web服务器,IP为192.168.1.100,监听80端口。将外网的HTTP流量(80端口)引入这台机器:
代码语言:bash
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
将外部SSH流量转发到内部服务器的另一个SSH端口
再例如,内网一台SSH服务器(192.168.1.101)监听22端口。你想让外网SSH流量进来时,实际落到它的2222端口上:
代码语言:bash
sudo iptables -t nat -A PREROUTING -p tcp --dport 22 -j DNAT --to-destination 192.168.1.101:2222
设置端口映射
假设一台内网服务器同时运行Web服务(80端口)和FTP服务(21端口)。你想让外网的HTTP流量去Web服务器,FTP流量去另一台FTP服务器(192.168.1.102)。规则可以这样编写:
代码语言:bash
# HTTP流量转发到Web服务器 sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80 # FTP流量转发到FTP服务器 sudo iptables -t nat -A PREROUTING -p tcp --dport 21 -j DNAT --to-destination 192.168.1.102:21
配置完成后,从外部网络尝试访问相应的服务端口,即可验证转发是否生效。例如,用浏览器访问Web服务器的公网IP,或者使用SSH客户端连接对应IP和端口。如果一切正常,说明你的端口转发已经成功运行。
