IPTABLES 是与最新的 3.5 版本 Linux 内核集成的 IP 信息包过滤系统。如果 Linux 系统连接到因特网或 LAN、服务器或连接 LAN 和因特网的代理服务器, 则该系统有利于在 Linux 系统上更好地控制 IP 信息包过滤和防火墙配置。
防火墙在做数据包过滤决定时,有一套遵循和组成的规则,这些规则存储在专用的数据包过滤表中,而这些表集成在 Linux 内核中。在数据包过滤表中,规则被分组放在我们所谓的链(chain)中。而netfilter/iptables IP 数据包过滤系统是一款功能强大的工具,可用于添加、编辑和移除规则。
(源自百度)
二、背景
一个内部局域网中有多台服务器提供不同的服务,如web服务、FTP服务、ssh、telnet等,通过服务器(或网关、防火墙)连接外部网络,如果外部网络上的主机和局域网设备进行相互通信,则需要中间设备转发。再转述成另一种应用场合,服务器有2个网卡,分别连接内外网。外网无法直接访问设备上的数据、服务。在服务器上实现转发后,则可达到目的。
三、原理
iptables的“四表五链”其实是对用户设置规则的管理,是看待用户设置的规则的两个维度。
filter表——过滤数据包
Nat表——用于网络地址转换(IP、端口)
Mangle表——修改数据包的服务类型、TTL、并且可以配置路由实现QOS
Raw表——决定数据包是否被状态跟踪机制处理
表的处理优先级:raw>mangle>nat>filter
INPUT链——进来的数据包应用此规则链中的策略
OUTPUT链——外出的数据包应用此规则链中的策略
FORWARD链——转发数据包时应用此规则链中的策略
PREROUTING链——对数据包作路由选择前应用此链中的规则(所有的数据包进来时都先由这个链处理)
POSTROUTING链——对数据包作路由选择后应用此链中的规则(所有的数据包出来的时都先由这个链处理)
表(tables) |
链(chains) |
||||
INPUT |
FORWARD |
OUPUT |
PREROUTING |
POSTROUTING |
|
filter |
✔ |
✔ |
✔ |
||
nat |
✔ |
✔ |
✔ |
||
mangle |
✔ |
✔ |
✔ |
✔ |
✔ |
raw |
✔ |
✔ |
要实现转发则数据包通过的流程为:PREROUTING->路由判决->FORWARD->POSTOUTING这条链路,如下图所示:
所以我们需要PREROUTING、FORWARD、POSTOUTING三条链上操作,路由判决是内核根据IP地址进行自动判断包的去向,所以我们不用管这个。
route add -net 198.120.0.0/24 gw 100.100.100.100
(2)个人电脑B配置注:配置电脑A访问198.120.0.0/24网段的网关为100.100.100.100
route add -net 100.100.100.0/24 gw 198.120.0.202
(3)arm设备配置注:配置电脑B访问100.100.100.0/24网段的网关为198.120.0.202
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -A FORWARD -j REJECT
iptables -I FORWARD -i eth3 -s 198.120.0.0/24 -p tcp --dport 12345 -j ACCEPT
iptables -I FORWARD -o eth3 -d 198.120.0.0/24 -p tcp --sport 12345 -j ACCEPT
iptables -I FORWARD -i eth11 -s 100.100.100.0/24 -p tcp --dport 12345 -j ACCEPT
iptables -I FORWARD -o eth11 -d 100.100.100.0/24 -p tcp --sport 12345 -j ACCEPT
注:默认的linux的包转发功能是关闭的,可通过命令cat /proc/sys/net/ipv4/ip_forward查看(0为关闭,1为打开),如果要让我们的linux实现转发,则需要打开这个转发功能,可以改变它的一个系统参数,使用echo "1" > /proc/sys/net/ipv4/ip_forward命令打开转发功能,仅为临时打开,重启失效。永久生效,修改/etc/sysctl.conf文件,net.ipv4.ip_forward = 1,修改配置文件后使用sysctl -p才生效
2、 测试截图
测试一:
电脑A为客户端
电脑B为服务端
测试二:
电脑A为服务端
电脑B为客户端
电脑A的网关设置为
100.100.100.100
电脑B的网关设置为
198.120.0.202
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s 198.120.0.0/24 -j SNAT --to 100.100.100.100
iptables -t nat -A POSTROUTING -s 100.100.100.0/24 -j SNAT --to 198.120.0.202
iptables -I FORWARD -i eth3 -s 198.120.0.0/24 -p tcp --dport 12345 -j ACCEPT
iptables -I FORWARD -o eth3 -d 198.120.0.0/24 -p tcp --sport 12345 -j ACCEPT
iptables -I FORWARD -i eth11 -s 100.100.100.0/24 -p tcp --dport 12345 -j ACCEPT
iptables -I FORWARD -o eth11 -d 100.100.100.0/24 -p tcp --sport 12345 -j ACCEPT
IP地址需与eth11在同一网段,网关可不设置
IP地址需与eth3在同一网段,网关可不设置
echo "1" > /proc/sys/net/ipv4/ip_forward
iptables -F
iptables -t nat -F
iptables -A FORWARD -j REJECT
iptables -t nat -A PREROUTING -d 198.120.0.202 -p tcp --dport 12345 -j DNAT --to 100.100.100.8:5678
iptables -t nat -A PREROUTING -d 100.100.100.100 -p tcp --dport 5678 -j DNAT --to 198.120.0.8:12345
iptables -t nat -I POSTROUTING -j MASQUERADE
iptables -I FORWARD -i eth3 -s 198.120.0.0/24 -p tcp --dport 5678 -j ACCEPT
iptables -I FORWARD -o eth3 -d 198.120.0.0/24 -p tcp --sport 5678 -j ACCEPT
iptables -I FORWARD -i eth11 -s 100.100.100.0/24 -p tcp --dport 12345 -j ACCEPT
iptables -I FORWARD -o eth11 -d 100.100.100.0/24 -p tcp --sport 12345 -j ACCEPT
第一行:默认的linux的包转发功能是关闭的,可通过命令cat/proc/sys/net/ipv4/ip_forward查看(0为关闭,1为打开),如果要让我们的linux实现转发,则需要打开这个转发功能,可以改变它的一个系统参数,使用echo "1" > /proc/sys/net/ipv4/ip_forward命令打开转发功能,仅为临时打开,重启失效。永久生效,修改/etc/sysctl.conf文件(装置可能不存在这个文件),net.ipv4.ip_forward= 1,修改配置文件后使用sysctl -p才生效
第二、三行指令:删除系统中存在的规则
第六行:表明在路由转发前,将目的地址为198.120.0.202,目的端口为12345的tcp包的目的地址转化为100.100.100.8,端口映射为5678
第七行:表明在路由转发前,将目的地址为100.100.100.100,目的端口为5678的tcp包的目的地址转化为198.120.0.8,端口映射为12345
第八行:表示自动获取当前网卡的IP地址进行源地址转换
第十~十二行:白名单功能,增加允许转发
个人电脑A访问的IP为100.100.100.100
个人电脑B访问的IP为198.120.0.202
iptables指令在重启后,如果未进行再次设置,已生效的指令会消失,需要再次设置,上述指令可直接写在脚本文件(setup.sh)中,自动重启执行,如果需要更改规则,修改脚本文件中的iptables指令。
查看filter表的规则指令
iptables --line -nvL
删除filter表对应的规则指令
iptables -D chain num
(本例中chain仅为FORWARD,num数为上述指令查看filter表中规则对应的num数)
查看nat表中的规则指令
iptables --line -t nat -nvL
删除nat表中对应的规则
iptables -t nat -D chain num
(本例中chain仅为POSTROUTING,num数为上述指令查看nat表中规则的对应num数)