iptables配置因特网共享连接(ICS)¶
Internet Connection Sharing (ICS) 提供了在一台主机上共享给局域网其他主机访问因特网对能力。这台共享主机是作为Internet gateway,其他主机通过这个网关访问Internet:
拨号连接
PPPoE连接
无线连接
实现的原理是采用 iptables
的 MASQUERADE
模式,所有局域网内部主机对外访问时,在gateway主机上做IP地址转换(SNAT)。通常我们会有以下的连接案例:
Internet <<==>> eth0 (运营商动态分配IP) <> Ubuntu gateway <> eth1 (192.168.0.254/24) <<==>> Client PC
配置
MASQUERATE
方法如下:sudo iptables -A FORWARD -o eth0 -i eth1 -s 192.168.0.0/24 -m conntrack --ctstate NEW -j ACCEPT sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT sudo iptables -t nat -F POSTROUTING #这步命令可选,因为系统中可能配置了其他nat规则,-F会清除掉所有nat规则 sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
虽然最简单的方式是使用 MASQUERADE
,但是也可以使用 SNAT
配置方法:
sudo iptables -t nat -A POSTROUTING ! -d 192.168.0.0/24 -o eth0 -j SNAT --to-source 198.51.100.1
这里 198.51.100.1
是运营商分配给你的外网IP地址( eth0
),所有目标不是 192.168.0.0/24
网段的地址 ( ! -d 192.168.0.0/24
)意味着就是外网流量,都会先将TCP数据包的源地址替换成外网 eth0
上地址 198.51.100.1
( -j SNAT --to-source 198.51.100.1
)。这样,所有外出因特网的数据包的源地址被替换成外网接口的公网地址,就能够在因特网上路由。
保存iptables:
sudo iptables-save | sudo tee /etc/iptables.sav
编辑
/etc/rc.local
在启动时恢复上述iptables
配置:iptables-restore < /etc/iptables.sav
此外,还需要解惑gateway的路由功能:
sudo sh -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
上述路由功能也可以通过 sysctl
配置 /etc/sysctl.conf
net.ipv4.ip_forward=1
然后执行 sysctl -p
刷新,或者启动时就能恢复内核IP转发功能(路由)
案例¶
上述方法,在 私有云架构 部署时 私有云DNS服务(dnsmasq)和共享因特网(ICS) : 完整结合了 DNSmasq 和 iptables 来实现内部网络共享访问因特网。