跳转至

iptables forward

iptables 用来配置转发数据包规则的工具,Linux的防火墙配置就是利用的iptables。普通的路由器也是使用的iptables来实现NAT地址转换。

使用iptables转发流量

路由器使用的局域网ip,例如可使用的局域网有3类 * A类地址:10.0.0.0 - 10.255.255.255 ==> 10.0.0.0/8 * B类地址:172.16.0.0 - 172.31.255.255 ==> * C类地址:192.168.0.0 -192.168.255.255 ==> 192.168.0.0/16

公网访问路由LAN,常见防火墙后的服务器

假设公网客户(8.8.8.8)访问路由器下的服务(192.168.0.2)。请求先到达路由的公网地址假设1.1.1.1, 此时的ip层源地址和目的地址分别为(8.8.8.8/1.1.1.1), 然后路由器需要将目的地址改写为192.168.0.2,此时ip包的地址为(8.8.8.8/192.168.0.2),这需要的iptable规则为

iptables -t nat -A PREROUTING -d 1.1.1.1 -j DNAT --to-destination 192.168.0.2
ip包就能正常到达192.168.0.2,处理完成之后,ip包变成(192.168.0.2/8.8.8.8),这是可能有几种情况: * 没有路由规则能匹配8.8.8.8,则会被丢弃。 * 一般会发送到默认网关,然后由网关发送正确发送到8.8.8.8,但8.8.8.8客户不认识源地址192.168.0.2,所以包会被丢弃 * 直接在第一个路由上被丢弃,因为192.168.0.2是一个私有地址,不能被转发。

所以需要另外一条iptables规则,将192.168.0.2发出的ip包改成(1.1.1.1/8.8.8.8)

iptables -t nat -A POSTROUTING -s 192.168.0.2 -j SNAT --to-source 1.1.1.1

Reference

https://serverfault.com/questions/627608/redirect-all-incoming-traffic-from-a-secondary-public-ip-to-an-internal-ip-addre