把树莓派改造成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、其它

待更新

### 配置树莓派4B作为软件定义的路由器 #### 准备工作 为了使树莓派4B能够充当路由器的角色,需要确保其操作系统已经正确安装并更新。对于此目的,推荐使用Ubuntu Server 20.04 LTS版本[^2]。 #### 安装必要的包和服务 首先,在树莓派上打开终端窗口,并执行以下命令以安装所需的软件包: ```bash sudo apt update && sudo apt upgrade -y sudo apt install hostapd dnsmasq bridge-utils iptables-persistent -y ``` 这些工具分别用于创建无线接入点、提供DNS服务和DHCP功能、管理网络接口桥接以及保存防火墙规则。 #### 设置静态IP地址 编辑`/etc/dhcpcd.conf`文件来为eth0(有线连接)分配一个固定的IPv4地址范围内的地址,这将是内部LAN端口;而wlan0则保持动态获取外网IP以便上网共享给内网设备: ```bash interface eth0 static ip_address=192.168.50.1/24 nohook wpa_supplicant ``` 上述配置使得eth0获得了一个固定私有的子网下的第一个可用主机号作为默认网关[^3]。 #### 启用IP转发 允许Linux内核转发数据包,即开启路由功能。修改 `/etc/sysctl.conf` 文件取消注释下面这一行: ```plaintext net.ipv4.ip_forward=1 ``` 接着应用新的设置: ```bash sudo sysctl -p ``` #### NAT转换与防火墙规则设定 为了让局域网中的其他计算机可以通过树莓派访问互联网,需建立NAT表项并将所有来自指定接口的数据重定向到外部网络接口上去。这里假设wan侧是 wlan0 , lan侧 是 eth0 : ```bash sudo iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE sudo iptables-save | sudo tee /etc/iptables/rules.v4 ``` 以上指令实现了源地址伪装(Source Network Address Translation),从而让内网机器可以借用树莓派的身份向外发送请求[^1]。 #### HostAPD配置Wi-Fi热点 接下来要做的就是把WLAN变一个可供客户端连接上的WiFi AP (Access Point) 。 编辑hostpad配置文件 `/etc/hostapd/hostapd.conf` 如下所示: ```ini interface=wlan0 driver=nl80211 ssid=RaspberryPiRouter hw_mode=g channel=7 macaddr_acl=0 auth_algs=1 ignore_broadcast_ssid=0 wpa=2 wpa_passphrase=YourSecurePasswordHere wpa_key_mgmt=WPA-PSK rsn_pairwise=CCMP ``` 最后一步启动HostAPD服务并且将其加入开机自启列表里边去: ```bash sudo systemctl unmask hostapd sudo systemctl enable hostapd sudo service hostapd start ``` #### DNSMASQ DHCP服务器配置 同样地调整dnsmasq的服务参数使其能响应来自eth0所代表的那个小型局域网里的客户机发出的租约申请。 修改/etc/dnsmasq.conf如下: ```ini interface=eth0 # Use the require interface - change 'eth0' as required dhcp-range=192.168.50.50,192.168.50.150,12h server=8.8.8.8 # Google's public DNS server or any other preferred one. domain-needed # Never forward addresses in the non_fqdn domain. bogus-priv # Never forward addresses in the private range. ``` 重启DNSServer之后即可生效: ```bash sudo service dnsmasq restart ``` 完以上步骤后,树莓派就变了一个完整的软路由装置,它不仅支持基本的路由功能还集了WiFi热点分享能力[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值