Linux设置NAT共享上网以及端口映射
问题说明
本文的应用场景是这样的。局域网中只有一台Linux主机能够访问互联网,如何通过这一台主机让局域网内的机器都能够访问互联网。
充当网关的机器(能访问互联网的主机)必须有两个网卡。假设,eth0表示能连接到外网的网卡,eth1表示连接到内网交换机上的网卡,内部子网为192.168.19.0/24。
还能设置端口映射,可以直接管理局域网内的主机。
共享上网的设置
IP的设置
修改/etc/network/interfaces配置文件来设置IP。内网IP地址的设置不需要设置gateway。
下面是我的/etc/network/interfaces配置文件:
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto eth0
iface eth0 inet static
address 202.117.15.181
netmask 255.255.255.0
gateway 202.117.15.1
dns-nameservers 202.117.0.20
auto eth1
iface eth1 inet static
address 192.168.19.1
netmask 255.255.255.0
这里,我的外网IP地址是202.117.15.181,内网IP是192.168.19.1。这两个地址在后面可能会用到。
配置NAT规则
执行下面的命令:
sudo iptables -A FORWARD -o eth0 -i eth1 -s 192.168.19.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
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
第一条规则中的192.168.19.0/24是要根据自己的环境更改的,其他三条不用改。
第一条规则允许转发初始网络包,第二条规则允许转发已经建立连接后的网络包,第三条则设置NAT。
保存iptables规则
执行下面的命令保存iptables规则,但是如果只这样的话重启会丢失。
sudo iptables-save | sudo tee /etc/iptables.sav
编辑/etc/rc.local文件,将下面的一行添加到“exit 0”之前:
iptables-restore < /etc/iptables.sav
这样以后每次重启机器时都会自动加载NAT相关的iptables规则。
启用路由转发
编辑/etc/sysctl.conf 文件,解除
#net.ipv4.ip_forward=1
的注释。然后使其生效:
sudo sysctl -p
搭建DNS服务器
最好还是搭建一个本地的dns服务器,能局域网内的主机进行域名解析。
Ubuntu默认会自带Dnsmasq,所以一般情况下不需要进行设置。如果没有Dnsmasq的话,安装即可:
sudo apt-get install dnsmasq
到这里就搭建好了!
局域网内主机的设置
局域网内的主机设置好IP,网关等网络参数就可以上网了。以我的配置为例:
auto eth0
iface eth0 inet static
address 192.168.19.10
netmask 255.255.255.0
gateway 192.168.19.1
dns-nameservers 192.168.19.1
这里将192.168.19.10设置为IP地址。
端口映射
配置好NAT之后,虽然能上网了,但是要是想远程控制局域网内的主机的话比较麻烦。需要先ssh到网关(192.168.19.1)上,在ssh到局域网内主机。通过配置端口映射,就可以直接控制局域网内的主机了。
例如:将22010端口映射到192.168.19.10:22端口,执行下面的命令:
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 22010 -j DNAT --to 192.168.19.10:22
iptables -t nat -A POSTROUTING -j MASQUERADE
eth0是网关外网的网卡。22端口是默认的ssh端口。这样ssh网关的22010端口就能ssh到192.168.19.10。
然后保存iptables规则,方法上面有介绍。
除了ssh之外,端口映射还能用在远程桌面、web服务器等应用上面。