本文目录
- 1、查看网卡情况
- 2、配置静态ip
- 3、配置IP转发和SNAT功能
- 3.1、开启Linux的报文转发功能
- 3.2、开启SNAT功能
- 4、进阶配置
- 4.1、如果WAN口(上行接口)eth0是动态分配的IP地址
- 4.2、在LAN口上,给下游主机开启自动分配IP地址功能
- 4.3、永久保存iptables, SNAT配置,并设置成开机自动启动
- 4.4、其它
根据Linux NAT软路由的简介、入门与配置这个文章,我们已经知道了如何将一台Linux主机改造成一台NAT软路由。树莓派预装了raspberry pi OS是Debian Linux的一个衍生版本,加上树莓派的低待机功耗,刚好合适用来作一个NAT软路由。
这里我们以“树梅派zero w + 一块带二个网卡的底板” 构成的硬件为例来说明如何将树莓派配置成NAT软路由。
首先登录系统后,我们可以看到这台树莓派带二个有线网卡eth0,eth1和一个无线网卡wlan0,这里我们不使用wlan0无线网卡,只使用有线网卡eth0, eth1。构建如下图的一个NAT软路由器。
- eth0 做为上行的WAN口
- eth1 做为下行的LAN口,接下游交换机或者直接连接下游的主机
+- RPi -------+
| eth0 |
+---+ 192.168.3.66| +- Laptop ----+
| | eth1 +----------+ eth0 |
| | 10.0.0.1 | | 10.0.0.2 |
| +-------------+ +-------------+
+- Router ----+ |
| Firewall | | +- PC#2 ------+
(Internet)---WAN-+ DHCP server +-LAN-+---+ 192.168.3.11|
| 192.168.3.1 | | +-------------+
+-------------+ |
| +- PC#1 ------+
+---+ 192.168.3.22|
+-------------+
1、查看网卡情况
xxx@raspberrypi:~ $ ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.3.66 netmask 255.255.255.0 broadcast 192.168.3.255
inet6 fe80::6b3f:9acb:9fe7:7940 prefixlen 64 scopeid 0x20<link>
inet6 fe80::2e0:99ff:fe62:ecb6 prefixlen 64 scopeid 0x20<link>
ether 00:e0:99:62:ec:b6 txqueuelen 1000 (Ethernet)
RX packets 8289 bytes 958968 (936.4 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 451 bytes 48838 (47.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
eth1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether 00:e0:99:63:19:61 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1000 (Local Loopback)
RX packets 12 bytes 1722 (1.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 12 bytes 1722 (1.6 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
wlan0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
ether b8:27:eb:c7:e1:1e txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
2、配置静态ip
见:树莓派配置静态IP地址,或者禁止掉网卡通过DHCP申请IP地址,简单起见,把二个网卡都配置成固定IP地址,并且没有启动eth1上的dhcp server自动给下游主机分配网络的功能。请使用systemd-networkd的方式来配置。
3、配置IP转发和SNAT功能
3.1、开启Linux的报文转发功能
打开配置文件 sysctl.conf
sudo vi /etc/sysctl.conf
找到net.ipv4.ip_forward这一行,去掉最前面的#号,打开IPv4转发功能(默认情况下每个网卡只接收发给自己这个网卡的ip地址的报文,即使目标地址为本网卡IP地址的报文,其它目标地址的报文都丢弃,打开后这个选项后,Linux会收到源IP地址不是自己网卡IP地址的报文,并交给内核做IP转发)。
# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward=1
3.2、开启SNAT功能
这个很简单,一句命令:这样就开启了NAT路由器功能,构成了如上图所示的网络。
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to 192.168.3.66
然后我们在下游主机10.0.0.2打开浏览器,就可以发现可以打开csdn.net了。
用以下命令可以看到nat table的POSTROUTING chain里已经增加了一条开启了SNAT功能的规则。
xxx@raspberrypi:~ $ sudo iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 10.0.0.0/24 anywhere to:192.168.3.66
4、进阶配置
上述说明就完成了配置,但实际使用过程中还有很多问题,比如我们要给LAN口上的下游主机开启DHCP自动分配IP的功能,我们上行的WAN口是通过DHCP自动分配 IP的,而不是固定IP的,比如开机后iptables规则就丢失了,怎么保存下来,并在开机时自动配置好等等。
4.1、如果WAN口(上行接口)eth0是动态分配的IP地址
待更新
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
4.2、在LAN口上,给下游主机开启自动分配IP地址功能
待更新
4.3、永久保存iptables, SNAT配置,并设置成开机自动启动
这里有很多办法,比如将规则用iptables-save保存后,在系统启动时通过/etc/rc.local脚本起增加iptables-restore命令的自动 执行引入开机自动设置SNAT规则,或者/etc/network/interfaces脚本里加入pre-up iptables-restore命令恢复SNAT规则等,但最简单的方式还是通过iptables-persistent软件来恢复。
第一步,安装iptables-persistent软件(本质上是安装了systemd下的iptables.services):
sudo apt install iptables-persistent
安装过程中会跳出以下窗口信息告诉你ipv4, ipv6的转发规则分别被保存在/etc/iptables/rules.v4和/etc/iptables/rules.v6下。
第二步,重启:
只需要重启则。(注意如下你的规则有更新那么需要用以下命令将更新后的规则写入上述二个文件,然后再次重启)
sudo netfilter-persistent save
4.4、其它
待更新