banner
amtoaer

晓风残月

叹息似的渺茫,你仍要保存着那真!
github
telegram
email
x
bilibili
steam
nintendo switch

[NAS 系列第三彈]為局域網設備配置無感知的透明代理

記得我上篇文章中有提到:

本篇不解決網路問題,默認 docker 鏡像等均可連接外網,如果不行請手動為鏡像配置 HTTP_PROXY、HTTPS_PROXY。

今天這篇文章就來分享一下我的網路配置。經過配置後,可以讓任何一台通過有線或無線方式連接到局域網中的設備,無需任何配置就可連接外網,並可以使用非常簡單的語法做到 DNS 和流量分流。

整體思路是將 NAS 作為旁路網關,讓 dhcp 返回的默認網關指向 NAS,在 NAS 側配置代理工具。老樣子,在開始之前寫幾條聲明:

  1. 本文中提到的代理工具 dae 需要內核版本 >= 5.8,如不符合需要換用其它代理工具;
  2. 本人 NAS 網路使用 Network Manager 配置,其它工具請自行查找替代寫法;
  3. 不同家庭的網路配置和結構不同,或許不能原樣照搬,但基本原理相同;
  4. ALL IN ONE, ALL IN BOOM !

網路結構#

家裡的網路結構如下圖所示(原諒我拙劣的作圖手法):

image

可以看到我並沒有單獨的路由器,撥號、NAT、無線 AP 都由內置路由的光貓代勞,只需要把所有設備連接到光貓即可上網。

因為所有設備都在同個網段,實現代理非常簡單,整體來說分為三個步驟:

  1. 把 NAS 的所有網口橋接(可跳過,主要是拓展有線接口)
  2. 固定光貓和 NAS 的 IP 地址
  3. 在 NAS 上配置代理和 IP 轉發
  4. 修改 DHCP 伺服器,將默認網關指向 NAS

下面展開說明。

橋接 NAS 的所有網口(可跳過)#

我 NAS 的主板上自帶一個網口,因為擔心光貓網口不夠用,所以單獨購入了一塊四口 pcie 網卡做橋接:

IMG_20230804_205220

插上之後執行 ifconfig,發現我的五個網口編號依次是 enp3s0、enp4s0、enp5s0、enp6s0、enp7s0。使用 Network Manager 可以很方便地橋接網口:

# 新建一個網橋
sudo nmcli connection add type bridge ifname br0 stp no
# 把物理網口全加到網橋裡
sudo nmcli connection add type bridge-slave ifname enp3s0 master br0
sudo nmcli connection add type bridge-slave ifname enp4s0 master br0
sudo nmcli connection add type bridge-slave ifname enp5s0 master br0
sudo nmcli connection add type bridge-slave ifname enp6s0 master br0
sudo nmcli connection add type bridge-slave ifname enp7s0 master br0

固定光貓和 NAS 的 IP 地址#

光貓略過不表,因為其在一般情況下 IP 都是固定的(如 192.168.0.1、192.168.1.1),此處需要固定 NAS 的 IP 地址。

使用 sudo nmcli connection show 可以看到所有的連接,位於前面並且高亮的是活躍的連接:

image

如上圖所示,一般使用最前面的連接就可以。

注:如果剛剛橋接了網口,那麼橋接的 bridge-xx 默認不會啟用,這種情況下應該使用 bridge-xx 而非最前面的連接。

以 bridge-br0 為例,固定 IP 地址的命令如下:

# 固定你的 ip 和網關(需要和光貓在同個網段)
sudo nmcli connection modify bridge-br0 ipv4.addresses 192.168.1.250/24 ipv4.gateway 192.168.1.1
# 使用你想要的 dns
sudo nmcli connection modify bridge-br0 ipv4.dns 119.29.29.29
# 調整 ipv4 地址分配方式為手動
sudo nmcli connection modify bridge-br0 ipv4.method manual
# reload 一下
sudo nmcli connection reload

注:同樣對於剛剛橋接過的情況,這裡還需要啟用橋接的所有網口,停用現有 connection 並啟用 bridge:

# 啟用橋接的所有網口
sudo nmcli connection up bridge-slave-enp3s0
sudo nmcli connection up bridge-slave-enp4s0
sudo nmcli connection up bridge-slave-enp5s0
sudo nmcli connection up bridge-slave-enp6s0
sudo nmcli connection up bridge-slave-enp7s0
# 停用正在使用的 connection
sudo nmcli connection down Wired\ connection\ 6
# 啟用剛剛配置好的 bridge
sudo nmcli connection up bridge-br0

在 NAS 上配置代理和 IP 轉發#

來到了最關鍵的一步,配置代理和 IP 轉發。

IP 轉發#

首先啟用 IP 轉發,這將允許這台設備作為網關轉發其它設備的流量:

sudo vim /etc/sysctl.d/30-ipforward.conf

# 寫入如下內容並保存
net.ipv4.ip_forward=1
net.ipv6.conf.default.forwarding=1
net.ipv6.conf.all.forwarding=1

# 重載
sudo sysctl --system

代理#

本篇使用的代理工具是 dae,實踐中為了操作方便,往往使用帶有 webui 的 daed:

daed, a modern dashboard with dae.

在 Arch Linux 上安裝非常簡單,使用如下命令安裝並自啟動:

sudo pacman -S daed
sudo systemctl enable --now daed.service

打開 NAS 的 2023 端口,輸入初始化的帳號密碼,就能看到主頁面了:

image

整體的操作邏輯非常簡單,在右下方添加訂閱,並把訂閱或節點拖動到左下方的群組中即可。在 DNS 和路由模塊中點擊編輯按鈕即可展開配置,編寫分流規則。

dae 的分流規則繼承了 v2raya,語法簡單明瞭,下面是我的 DNS 和路由規則樣例:

# dns 規則

upstream {
  googledns: 'tcp+udp://dns.google.com:53'
  alidns: 'udp://dns.alidns.com:53'
}
routing {
  request {
    # 阻斷廣告的 dns 解析
    qname(geosite:category-ads) -> reject
    qname(geosite:category-ads-all) -> reject
    # 默認使用 alidns 查詢
    fallback: alidns
  }
  response {
    # 上游是 googledns 直接通過,避免回環
    upstream(googledns) -> accept
    # 非國內網站解析到了局域網 ip,認為是遇到 dns 汙染,重新在 googledns 查一次
    !qname(geosite:cn) && ip(geoip:private) -> googledns
    # 其它情況直接 accept
    fallback: accept
  }
}
# 路由規則

# 在默認規則的基礎上添加了 qbittorrent 的直連
pname(NetworkManager, systemd-resolved, qbittorrent-nox) -> direct
# 阻斷廣告連接
domain(geosite:category-ads, geosite:category-ads-all) -> block
# 一般梯子都不支持 ipv6,走直連
ipversion(6) -> direct
# 對於 chatgpt,走固定的節點組
domain(geosite:openai, regex: ".+\.openai$") -> chatgpt
# 廣播地址、局域網地址和國內 ip,走直連
dip(224.0.0.0/3, 'ff00::/8', geoip:private, geoip:cn) -> direct
# steam、國內域名走直連
domain(geosite:steam@cn, geosite:cn, geosite:geolocation-cn) -> direct
# 未匹配,走代理
fallback: proxy

分流規則設置完畢後,需要在配置中設置需要綁定的接口。在旁路網關的使用場景中,LAN 和 WAN 中都應該添加當前活躍的接口(對於我來說是 br0),此外 LAN 口還可以添加一些其它需要代理的接口(如 docker0):

image

其它選項一般不需要修改,點擊最下面的提交,接著在主頁右上角點擊啟動即可。

image

此時 NAS 和所有網關指向 NAS 的設備產生的流量均會被 dae 接管分流,實現了透明代理。

修改 DHCP 伺服器,將默認網關指向 NAS#

雖然現在網關指向 NAS 即可透明代理,但 DHCP 返回的網關仍然是 192.168.1.1(即光貓路由器的地址),接入到網路的設備需要手動修改網關才能成功代理。為了改變這種情況,需要調整 DHCP 伺服器。

光貓路由器內提供的 DHCP 伺服器沒辦法修改返回的網關地址,因此需要在 NAS 上啟動一個 DHCP 伺服器,並用其替代光貓路由器上的 DHCP 伺服器。

在 NAS 上部署 DHCP 伺服器#

Linux 上可用的 DHCP 伺服器有很多,個人選用的是 dhcpd 的繼任者 kea,dnsmasq 也能實現同樣的目的:

A modern, scalable, robust DHCPv4 and DHCPv6 server, with database (MySQL, PostgreSQL), hooks, multi-threading, RADIUS, NETCONF, Kerberos and more.

在 Arch Linux 中安裝:

sudo pacman -S kea

在這裡我們只需要替換掉 dhcp4 即可滿足需求。參考官方文檔編寫 dhcp 配置如下:

{ "Dhcp4":

{
  "interfaces-config": {
    "interfaces": [ "br0" ]
  },

  "lease-database": {
      "type": "memfile",
      "lfc-interval": 3600
  },

  "valid-lifetime": 4000,


  "subnet4": [
    {
       "pools": [ { "pool":  "192.168.1.2 - 192.168.1.254" } ],
       "subnet": "192.168.1.0/24",
       "interface": "br0",
       "option-data": [
         {
             "name": "domain-name-servers",
             "data": "119.29.29.29"
         },
         {
             "name": "routers",
             "data": "192.168.1.250"
         },
      ]
    }
  ],
    "loggers": [
        {
            "name": "kea-dhcp4",
            "output_options": [
                {
                    "output": "stdout"
                }
            ],
            "severity": "INFO"
        }
    ]
}

}

將上述配置寫入 /etc/kea/kea-dhcp4.conf,並啟動 kea-dhcp4 服務:

sudo systemctl enable --now kea-dhcp4.service

接著登錄光貓路由器的後台,關閉自帶的 dhcp4 伺服器:

image

現在隨便使用某台有線或無線設備連接到網路中,查看 dhcp 是否正常工作:

image

看到路由器位置顯示的地址是我們設置的 192.168.1.250,說明 NAS 上部署的 dhcp 工作正常。

至此配置完畢,大功告成。

參考資料#

  1. dae dns 文檔
  2. dae routing 文檔
  3. dae 配置示例
  4. Arch Wiki - Network Bridge
  5. Arch Wiki - Internet Sharing
  6. Kea examples
載入中......
此文章數據所有權由區塊鏈加密技術和智能合約保障僅歸創作者所有。