基本概念
数据流动的链(chain)
数据包在 iptables 里经过的链如下图所示:
iptables chain在路由决策时,如果目标 IP 是本机,则进入 INPUT 链,否则交给 FORWARD 链。
表(table)
iptables 有三张表,代表三种控制机制:
- filter: 控制本机数据包的进出,可看做防火墙(默认表)
- nat: 网络地址转换
- mangle: 拆包并修改标志位
每个表都记录了在特定的检查点要处理的规则。
filter 表能关联的检查点:
- INPUT
- OUTPUT
- FORWARD
分别用来过滤入站、出站、转发的包。
nat 表能关联的检查点:
- PREROUTING
- POSTROUTING
- INPUT
- OUTPUT
分别在不同的阶段修改报文的 IP 和端口。
地址转发
首先要开启操作系统的支持。
临时开启(必须以 root 身份执行):
$ echo 1 > /proc/sys/net/ipv4/ip_forward
持久化,需要在 /etc/sysctl.conf
文件中追加一行:
net.ipv4.ip_forward = 1
使用如下命令使其生效:
$ sysctl -p
源地址转换 SNAT
替换目标主机收到的来自本机的数据包报文的源地址。
典型应用场景即 IPv4 地址紧缺的现在,做局域网到互联网的地址映射。
只能在 OUTPUT 和 POSTROUTING 检查点设置。
# 将来自 192.168.1.0/24 网段的数据包 SNAT 成来自 100.100.100.100
$ iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to-source 100.100.100.100
如果本机 IP 经常变动,静态 SNAT 不甚方便,可以采用伪装(MASQUERADE)技术实现动态 SNAT:
# 将 192.168.1.0/24 网段的数据包 SNAT 成来自本机 IP
$ iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
目的地址转换 DNAT
替换来自远端主机的数据包报文的目的地址。
典型应用场景是服务器的反向代理,做互联网到局域网的地址映射。
一般在 PREROUTING 检查点设置。
# 将发往 100.100.100.100:80 的包 DNAT 成发往 192.168.1.100:8080
$ iptables -t nat -A PREROUTING -d 100.100.100.100:80 -j DNAT --to-destination 192.168.1.100:8080
小结
所谓的 SNAT/DNAT 就是对数据包的源地址和目的地址进行修改,并且保存修改前后的映射关系,以便根据需要还原。
SNAT 是发送的时候 snat(src_address),返回的时候也会改变目的地址 un_snat(dst_address)。
DNAT 是接收的时候 dnat(dst_address),返回的时候 un_dnat(src_address)。
所谓回环,就是同时用到了 SNAT 和 DNAT,例如:
src 192.168.1.2(client)
dnat 10.14.11.177(firewall)
dst 192.168.2.2(server)
添加回环规则后,从 src 对 10.14.11.177 进行请求,然后转到 dst,随后返回数据包,最后 src 收到源为 10.14.11.177,目的为自身的数据包,正确接收。
常见命令
清空规则表:
$ iptables [-t table] -F
列出规则表的配置:
$ iptables [-t table] -L
保存规则,根据发行版不同而不同,常见的有:
$ apt-get install iptables-persistent
$ iptables-save
$ yum install iptables-services
$ service iptables save
网友评论