記得我上篇文章中有提到:
本篇不解決網路問題,默認 docker 鏡像等均可連接外網,如果不行請手動為鏡像配置 HTTP_PROXY、HTTPS_PROXY。
今天這篇文章就來分享一下我的網路配置。經過配置後,可以讓任何一台通過有線或無線方式連接到局域網中的設備,無需任何配置就可連接外網,並可以使用非常簡單的語法做到 DNS 和流量分流。
整體思路是將 NAS 作為旁路網關,讓 dhcp 返回的默認網關指向 NAS,在 NAS 側配置代理工具。老樣子,在開始之前寫幾條聲明:
- 本文中提到的代理工具 dae 需要內核版本 >= 5.8,如不符合需要換用其它代理工具;
- 本人 NAS 網路使用 Network Manager 配置,其它工具請自行查找替代寫法;
- 不同家庭的網路配置和結構不同,或許不能原樣照搬,但基本原理相同;
- ALL IN ONE, ALL IN BOOM !
網路結構#
家裡的網路結構如下圖所示(原諒我拙劣的作圖手法):
可以看到我並沒有單獨的路由器,撥號、NAT、無線 AP 都由內置路由的光貓代勞,只需要把所有設備連接到光貓即可上網。
因為所有設備都在同個網段,實現代理非常簡單,整體來說分為三個步驟:
把 NAS 的所有網口橋接(可跳過,主要是拓展有線接口)- 固定光貓和 NAS 的 IP 地址
- 在 NAS 上配置代理和 IP 轉發
- 修改 DHCP 伺服器,將默認網關指向 NAS
下面展開說明。
橋接 NAS 的所有網口(可跳過)#
我 NAS 的主板上自帶一個網口,因為擔心光貓網口不夠用,所以單獨購入了一塊四口 pcie 網卡做橋接:
插上之後執行 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
可以看到所有的連接,位於前面並且高亮的是活躍的連接:
如上圖所示,一般使用最前面的連接就可以。
注:如果剛剛橋接了網口,那麼橋接的 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 端口,輸入初始化的帳號密碼,就能看到主頁面了:
整體的操作邏輯非常簡單,在右下方添加訂閱,並把訂閱或節點拖動到左下方的群組中即可。在 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):
其它選項一般不需要修改,點擊最下面的提交,接著在主頁右上角點擊啟動即可。
此時 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 伺服器:
現在隨便使用某台有線或無線設備連接到網路中,查看 dhcp 是否正常工作:
看到路由器位置顯示的地址是我們設置的 192.168.1.250,說明 NAS 上部署的 dhcp 工作正常。
至此配置完畢,大功告成。