把树莓派改造成NAT软路由器

根据Linux NAT软路由的简介、入门与配置这个文章,我们已经知道了如何将一台Linux主机改造成一台NAT软路由。树莓派预装了raspberry pi OS是Debian Linux的一个衍生版本,加上树莓派的低待机功耗,刚好合适用来作一个NAT软路由。
这里我们以“树梅派zero w + 一块带二个网卡的底板” 构成的硬件为例来说明如何将树莓派配置成NAT软路由。
在这里插入图片描述
首先登录系统后,我们可以看到这台树莓派带二个有线网卡eth0,eth1和一个无线网卡wlan0,这里我们不使用wlan0无线网卡,只使用有线网卡eth0, eth1。构建如下图的一个NAT软路由器。

  1. eth0 做为上行的WAN口
  2. 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、配置WAN口静态ip和LAN口上的DHCP server

见:树莓派配置静态IP地址,或者禁止掉网卡通过DHCP申请IP地址,简单起见,把上行的WAN口的网卡eth0配置成固定IP地址(请参照上述文章中的systemd-networkd的方式来配置),在下行的LAN口eth1上配置dhcp server自动给下游主机分配网络的功能(见本文4.2章节)。

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

3.3、测试网速

如下图我们可以看到下行最大大约可以达到45Mbps,达不到网卡的限速100Mbps,此时我们发现树莓派zero w的CPU占用率已经达到了100%,所以受限于CPU处理能力,只能达到这个速度了,如果要更快的速度就要更换更快的CPU的型号。可见SNAT还是很耗费CPU资源的。
在这里插入图片描述

4、进阶配置

上述说明就完成了配置,但实际使用过程中还有很多问题,比如我们要给LAN口上的下游主机开启DHCP自动分配IP的功能,我们上行的WAN口是通过DHCP自动分配 IP的,而不是固定IP的,比如开机后iptables规则就丢失了,怎么保存下来,并在开机时自动配置好等等。

4.1、如果WAN口(上行接口)eth0是动态分配的IP地址

可以使用IP MASQUERADE(IP伪装)功能代替SNAT功能则可以。用命令

sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

代替上述的

iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to 192.168.3.66

4.2、在LAN口上,给下游主机开启自动分配IP地址功能

  1. 安装软件包dnsmasq
sudo apt install dnsmasq
  1. 配置dnsmasq
    前面安装的dnsmasq提供了DHCP和DNS服务, 默认的配置文件模板很大,但我们其实只需要其中很小的功能,所以这里我们选择从空文件开始添加配置,这样还更容易一些。

    备份原始的配置模板文件,并新建一个空的配置文件:

sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
sudo vi /etc/dnsmasq.conf

写入以下配置:

interface=eth1 # Listening interface
dhcp-range=10.0.0.2,10.0.0.10,255.255.255.0,24h
                # Pool of IP addresses served via DHCP
domain=eth1     # Local  DNS domain
address=/gw.eth1/10.0.0.1
                # Alias for this router
  1. 重启生效
sudo reboot

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、其它

待更新

猜你喜欢

转载自blog.csdn.net/meihualing/article/details/130463214