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服务器等应用上面。