ubuntu linux nanopi r3s 全局路由网关配置

ubuntu linux nanopi r3s 全局路由网关配置

ubuntu linux nanopi r3s 全局路由网关配置

#linux,#NanoPi R3S,#anti-AD,#Netplan,#iptables,#DNSmasq,

网络搭建思路如下,设备是 nanopir3s 官方 ubuntu 系统,用户为 root ,其中 enp1s0(lan) end0(wan)

(((·)))                                                                          
    \                                                                          
(wifi 2.4/5g 桥接)                                                              
        \                                                                        
  +-----------------------------------+                                               
  |    主路由器                        |             +-------------------------+ 
  |-----------------------------------|             | my computer             | 
  | WAN: wifi网络桥接                  |--- (lan) ---| IP: 192.168.255.54      | 
  | LAN: 192.168.255.254              |             | DNS: 192.168.255.253    | 
  | DHCP: 1~253                       |             | GATEWAY: 192.168.255.253| 
  | DNS: 192.168.255.254              |             +-------------------------+ 
  | 全局旁路由 DNS: 192.168.255.253     |
  | 全局旁路由 GATEWAY: 192.168.255.253 |
  +-----------------------------------+                                            
                    |                 \                                           
                    |                  \                                          
                  (lan)               (wifi 2.4/5g 连接)                             
                    |                               \                                       
                    |                                \                                      
 +------------------+--------------------+            \                                    
 | nanopir3s ubuntu (旁路由网关)           |      +-------------------------+          
 |---------------------------------------|      | my cell phone           |           
 | LAN: 192.168.255.253                  |      | IP: 192.168.255.53      |           
 | DNS: 192.168.255.254                  |      | DNS: 192.168.255.253    |           
 | GATEWAY: 192.168.255.254              |      | GATEWAY: 192.168.255.253|           
 | linux 配置全局 DHCP: 1~252              |     +-------------------------+           
 | linux 配置全局 DNS: 192.168.255.253     |                                             
 | linux 配置全局 GATEWAY: 192.168.255.253 |                                             
 +---------------------------------------+                                                                                  

安装依赖工具

先查看网络接口 enp1s0(lan) end0(wan) 其中 wan 口连接了网线状态是 UP ,lan 未接网线处于 DOWN 关闭状态

ip link

接口记录如下

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state DOWN mode DEFAULT group default qlen 1000
    link/ether ae:a6:b7:96:be:90 brd ff:ff:ff:ff:ff:ff
3: end0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc mq state UP mode DEFAULT group default qlen 1000
    link/ether 56:ea:01:c9:30:d0 brd ff:ff:ff:ff:ff:ff
    altname enx56ea01c930d0

安装工具,安装时会提示填写 dhcpv6 客户端接口,输入 lan wan 口也就是 enp1s0 end0

sudo apt -y remove --auto-remove iptables iptables-persistent
sudo apt -y purge iptables iptables-persistent
sudo apt -y install dnsmasq nftables \
               pppoeconf wide-dhcpv6-client

修改 enp1s0(lan) end0(wan) 网口的 netplan 配置, wan 口自动识别 lan 口固定

sudo nano /etc/netplan/10-dhcp-all-interfaces.yaml

配置内容大概如下

10-dhcp-all-interfaces.yaml


# Reference: https://netplan.readthedocs.io/en/stable/netplan-yaml/
#
# Let systemd-networkd manage all Ethernet devices on this system, but be configured by Netplan.
# Netplan 网络配置文件
# 使用 systemd-networkd 作为后端
network:
  version: 2                      # Netplan 配置语法版本
  renderer: networkd              # 使用 systemd-networkd 作为网络后端

  ethernets:
    enp1s0:                       # 主网卡(LAN),使用静态 IPv4,作为默认出口 include interfaces that are renamed to 'lanX' by udev, e.g. nanopi-r2s
      match:
        #name: "enp1s0"            # 匹配系统中的 enp1s0 网卡
        name: "enp[0-9]*"         # 匹配 enp1s0(lan)
      dhcp4: no                   # 禁/启用 DHCP 获取 IPv4,使用动态地址
      addresses:
        - "192.168.255.253/24"    # 分配静态 IPv4 地址(子网掩码为 255.255.255.0)
      nameservers:
        addresses:
          #- 198.18.0.1            # 指定 DNS 服务器(可指向主路由器)
          #- 192.168.255.253       # 指定 DNS 服务器(可指向主路由器)
          - 192.168.255.254
          - 223.5.5.5             # 指定 DNS 服务器(可指向主路由器)
          - 114.114.114.114       # 指定 DNS 服务器(可指向主路由器)
      routes:
        - to: 0.0.0.0/0           # 设置默认网关(出口)
          via: 192.168.255.254    # 默认路由走向主路由器
      #    table: 101
      #routing-policy:
      #  - from: 192.168.255.0/24
      #    table: 101
      dhcp6: yes                  # 启用 DHCPv6(动态获取 IPv6 地址)
      ipv6-privacy: yes           # 启用 IPv6 地址隐私扩展(生成临时地址防止追踪)Enabled by default on most current systems, but networkd currently doesn't enable IPv6 privacy by default, see https://man.archlinux.org/man/systemd.network.5
      dhcp6-overrides:            # 修改 DHCPv6 行为
        route-metric: 100         # 设置 IPv6 路由优先级(较低值优先)
        use-dns: yes              # 使用 DHCPv6 提供的 DNS
      wakeonlan: yes              # 启用唤醒网络功能(Wake-on-LAN)

    end0:                         # 次级网卡(WAN),由上级网络通过 DHCP 提供配置 include interfaces that are renamed to 'wanX' by udev, e.g. nanopi-r1
      match:
        #name: "end0"              # 匹配系统中的 end0 网卡
        name: "end[0-9]*"         # 匹配 end0(wan)
      dhcp4: yes                  # 禁/启用 DHCP 获取 IPv4,使用动态地址
      #addresses:
      #  - "192.168.255.252/24"    # 分配静态 IPv4 地址(子网掩码为 255.255.255.0)
      #nameservers:
      #  addresses:
      #    - 198.18.0.1            # 指定 DNS 服务器(可指向主路由器)
      #    - 192.168.255.253       # 指定 DNS 服务器(可指向主路由器)
      #    - 223.5.5.5             # 指定 DNS 服务器(可指向主路由器)
      #    - 114.114.114.114       # 指定 DNS 服务器(可指向主路由器)
      #routes:
      #  - to: 0.0.0.0/0           # 设置默认网关(出口)
      #    via: 192.168.255.253    # 默认路由走向主路由器
      #    table: 100
      #routing-policy:
      #  - from: 192.168.255.0/24
      #    table: 100
      dhcp6: yes                  # 启用 DHCPv6 获取 IPv6 地址
      ipv6-privacy: yes           # 启用 IPv6 地址隐私扩展
      dhcp4-overrides:            # 修改 DHCPv4 行为
        route-metric: 200         # 设置 IPv4 路由优先级(更高值 → 较低优先级)
        use-dns: yes              # 使用 DHCP 提供的 DNS
      dhcp6-overrides:            # 修改 DHCPv6 行为
        route-metric: 200         # 设置 IPv6 路由优先级
        use-dns: yes
      wakeonlan: yes              # 启用 Wake-on-LAN 功能

让自定义的 Netplan 网络配置生效

sudo netplan generate
sudo netplan apply

编辑 /etc/sysctl.d/99-forwarding.conf 启用 ipv4/6 转发

sudo nano /etc/sysctl.d/99-forwarding.conf

追加内容如下

# /etc/sysctl.d/99-forwarding.conf
#
# 启用 IPv4 转发
net.ipv4.ip_forward=1

# 启用 IPv6 转发
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.forwarding=1

# 接受上游路由通告 (RA),获取 IPv6 前缀
net.ipv6.conf.all.accept_ra=1
net.ipv6.conf.default.accept_ra=1

# 开启 IPv6 临时地址 (隐私扩展)
net.ipv6.conf.all.use_tempaddr=1
net.ipv6.conf.default.use_tempaddr=1

让转发功能生效

# 更新 systemd-sysctl 并验证
sudo systemctl restart systemd-sysctl
sudo sysctl net.ipv4.ip_forward
sudo sysctl net.ipv6.conf.all.forwarding
sudo sysctl -p

anti-AD 广告屏蔽(可选,如无需配置,请在以下步骤特意删除此项)

sudo wget https://anti-ad.net/anti-ad-for-dnsmasq.conf \
          -O"/etc/dnsmasq.host"
sudo chmod -v a+x /etc/dnsmasq.host

添加自动更新任务更新广告屏蔽配置文件

cat << '469138946ba5fa' | sudo tee /etc/host.sh
#!/usr/bin/env bash
wget https://anti-ad.net/anti-ad-for-dnsmasq.conf \
           -O"/etc/dnsmasq.host.bak"
mv -fv /etc/dnsmasq.host
systemctl restart dnsmasq.service
469138946ba5fa
sudo chmod -v a+x /etc/host.sh

为 root 用户编辑自动任务

# 为 root 用户编辑自动任务
sudo su - root bash -c 'crontab -e'

可能会出现以下内容,选择你习惯的编辑器,比如 1 回车

no crontab for root - using an empty one
Select an editor.  To change later, run 'select-editor'.
1. /bin/nano  <---- easiest
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
4. /bin/ed
Choose 1-4 [1]:

新增自动任务的内容如下,每小时 0 分执行更新任务,保存并退出

0 * * * * /etc/host.sh

编辑 DNSmasq 提供 DNS 缓存和 DHCP 服务

sudo nano /etc/dnsmasq.conf

追加内容如下

addn-hosts=/etc/dnsmasq.host                               # anti-AD 广告屏蔽(可选,未配置请删除)
listen-address=0.0.0.0, 127.0.0.1, 192.168.255.253         # 设置 DNS 缓存监听地址
port=53                                                    # 指定 DNS 端口,用于 DHCP/TFTP
server=192.168.255.254                                     # 指定外网 DNS
interface=enp1s0                                           # 指定内网网口
dhcp-range=192.168.255.1,192.168.255.252,255.255.255.0,12h # 用于分配的起始/结束 IP,子网掩码,租期
dhcp-option=option:router,192.168.255.253                  # 指定 DHCP 网关
enable-ra                                                  # 启用 Router Advertisements
dhcp-range=::,constructor:enp1s0,ra-only,slaac             # 向局域网发送 RA,使用 slaac 分配地址,此处需注意网卡
no-resolv                                                  # 不要使用系统默认的 /etc/resolv.conf
resolv-file=/etc/resolv.dnsmasq.conf                       # 明确告诉它该去哪找上游 DNS

启用 DNSmasq 服务

重启 DNSmasq 服务

# 关闭 systemd-resolved,不然会因端口占用无法启动 DNSmasq
sudo systemctl stop systemd-resolved.service
sudo systemctl disable systemd-resolved.service

# 手动创建一个静态的上游 DNS 配置,例如
echo "nameserver 192.168.255.254" | sudo tee /etc/resolv.dnsmasq.conf
sudo ln -sfv /etc/resolv.dnsmasq.conf /etc/resolv.conf

# 启动 DNSmasq
sudo systemctl enable dnsmasq.service 
sudo systemctl start dnsmasq.service 
sudo systemctl status dnsmasq.service

配置防火墙 nftables 规则

sudo systemctl enable nftables
sudo systemctl status nftables
# 查看当前规则
sudo nft list ruleset
# 配置规则
sudo nano /etc/nftables.conf

配置内容如下,记得修改为自己的接口匹配规则比如 enp+ end+

#!/usr/sbin/nft -f

flush ruleset

# ===================== 防火墙规则 =====================
table inet filter {
  chain input {
    type filter hook input priority 0;
    policy accept;
    #policy drop;

    # 放行 IPv6 基础通信
    ip6 nexthdr icmpv6 accept
    # 放行 IPv4 ping
    ip protocol icmp accept
    # 放行 loopback & 已建立连接
    #iifname "lo" accept
    #ct state established,related accept

    # 放行必要端口(可按需调整)
    #tcp dport { 22, 80, 443 } accept
    #udp dport { 53, 443 } accept

    # 拒绝日志(可限速)
    #log prefix "nft input drop: " flags all limit rate 5/second counter
  }

  chain forward {
    type filter hook forward priority 0;
    policy accept;
    #policy drop;

    ip protocol icmp accept
    ip6 nexthdr icmpv6 accept
    #ct state established,related accept
  }

  chain output {
    type filter hook output priority 0;
    policy accept;
    #policy drop;

    ip protocol icmp accept
    ip6 nexthdr icmpv6 accept
  }
}

# ===================== NAT IPv4 =====================
table ip nat {
  chain postrouting {
    type nat hook postrouting priority 100;
    policy accept;

    oifname "enp+" masquerade
    oifname "ppp+" masquerade
    oifname "end+" masquerade
  }
}

# ===================== NAT IPv6 =====================
table inet nat {
  chain postrouting {
    type nat hook postrouting priority 100;
    policy accept;

    oifname "enp+" masquerade
    oifname "ppp+" masquerade
    oifname "end+" masquerade
  }
}

检测配置并启动

# 检查语法
sudo nft -c -f /etc/nftables.conf
# 应用规则
sudo nft -f /etc/nftables.conf
# 查看当前状态
sudo nft list ruleset

wan 口插上拨号宽带网线,配置 PPPoE 拨号上网,按照提示输入宽带账号密码,剩下都是 yes 同意

sudo pppoeconf

编辑已经生成的 PPPoE 配置文件最后一行添加 ipv6 支持

sudo nano /etc/ppp/peers/dsl-provider

追加的内容如下

+ipv6

为下游设备分配 IPv6 编辑 /etc/wide-dhcpv6/dhcp6c.conf 并修改

想让 ppp0 和 end0 都作为可能的上游来源,可以写两个独立的 PD 块,像这样
如果只一个接口在线(比如拨号没建立),另一个照样能工作

sudo nano /etc/wide-dhcpv6/dhcp6c.conf

追加内容如下

interface ppp0 {
  send ia-pd 0;
  script "/etc/wide-dhcpv6/dhcp6c-script";
};

interface end0 {
  send ia-pd 1;
  script "/etc/wide-dhcpv6/dhcp6c-script";
};

id-assoc pd 0 {
  prefix-interface enp1s0 {
    sla-id 0;
    ifid 1;
  };
};

id-assoc pd 1 {
  prefix-interface enp1s0 {
    sla-id 1;
    ifid 1;
  };
};

创建自启动服务,最后重启linux,将网线从wan口切换到lan口,检查联网

注意修改为自己的网卡接口,比如 enp1s0 end0

cat << '469138946ba5fa' | sudo tee /etc/systemd/system/dhcp6c.service
[Unit]
Description=WIDE DHCPv6 Client
Wants=network-online.target
After=network-online.target
[Service]
ExecStart=/usr/sbin/dhcp6c -f enp1s0 end0 ppp0
ExecReload=/bin/kill -HUP $MAINPID
Restart=on-failure
RestartSec=3
NoNewPrivileges=yes
PrivateTmp=yes
ProtectHome=yes
ProtectSystem=strict
ReadWritePaths=/run/ /var/log/
ProtectKernelTunables=yes
ProtectControlGroups=yes
SystemCallFilter=~@mount
SystemCallArchitectures=native
LockPersonality=yes
MemoryDenyWriteExecute=yes
RestrictRealtime=yes
RemoveIPC=yes
[Install]
WantedBy=multi-user.target
469138946ba5fa

# 执行重启服务命令
sudo systemctl stop wide-dhcpv6-client.service
sudo systemctl disable wide-dhcpv6-client.service
sudo systemctl enable dhcp6c.service
sudo systemctl start dhcp6c.service
sudo systemctl status dhcp6c.service
# 重启电脑,完成路由设置
sudo reboot
# 将网线从wan口切换到lan口

主路由器中开启全局广播 DNS 和 GATEWAY

以防万一 nanopi r3s 的 dhcp 失效,在主路由器中开启全局广播 DNS 和 GATEWAY 替 nanopi r3s 分担 dhcp 的功能

配置内容如下

地址池开始地址 192.168.255.1
地址池结束地址 192.168.255.253
地址租期 120min
网关 192.168.255.253
首选DNS服务器 192.168.255.253

5

接下来你就可以自由自在想做什么就做什么了,比如安装 1panel面板 实时查看资源占用或者安装 ShellCrash 实现全局网络环境又或者安装 docker + docker-compose 弄个青龙(青龙可能压力有些大😮‍💨)或者 op 实现全局环境配置

6

参考

利用 Ubuntu Server 搭建软路由

Comments