家裡的 internet 架構大概是這樣 (省略過其他裝置):

一邊是 HiNet 的線路直接接中華的數據機 (modem),這段是用 PPPoE 撥接;另一邊是第四台網路 (北都),另外上面寫的 Switch 應該是 IP 分享器 (一台 ASUS 的機子,刷 DD-WRT),作圖的時候寫錯了...
最後是電腦的部份,我的桌機是跑 Ubuntu,用兩張個不同的實體線路 (界面分別是中華的 enp4s0
與第四台的 enp6s0f0
) 接到了這兩個不同的網段上面。
打算跑 source routing 的架構來善用兩邊的頻寬,想法上面大概是這樣拆解:
- 機器本身有個
192.168.3.x
的 static ip。 - 針對 source ip 是
192.168.3.x
的封包,預設會往192.168.3.254
這台分享器丟,然後 NAT 出去。 - 用 Squid 在本機上跑一個 proxy server,指定 source ip 是
192.168.3.x
。
有了這樣的架構,我就可以在瀏覽器上面就透過 SwitchyOmega 這類的套件,指定某些網段要走第四台的頻寬出去了。
另外可以指定 http proxy 的服務也可以透過這個方法往第四台的線路連出去。
其中第二點需要把 source ip 是 192.168.3.x
的封包丟到 192.168.3.254
這段需要一些設定,首先是需要設定一個獨立的 routing table,我是在 /etc/iproute2/rt_tables
裡面放:
2 second
然後因為我是透過 NetworkManager 在管理網路界面的,我希望在 enp6s0f0
啟動時自動設定這個 source routing 邏輯,所以我在 /etc/NetworkManager/dispatcher.d/99-enp6s0f0
這邊寫了:
#!/bin/bash interface=$1 event=$2 if [[ "$interface" == "enp6s0f0" && "$event" == "up" ]]; then ip route add default via 192.168.3.254 table second ip rule add from 192.168.3.0/24 table second fi
然後要記得把這個檔案 chmod 755
讓他可以執行。
接著是 Squid 的設定,在 /etc/squid/squid.conf
裡面這樣寫:
# http_access allow all # access_log /var/log/squid/access.log squid cache deny all cache_dir null /tmp cache_log /dev/null cache_mem 8 MB dns_v4_first on forwarded_for off http_port 3128 tcp_outgoing_address 192.168.3.x
其中最後的 192.168.3.x
換成自己的固定 IP address。這邊因為 traffic 基本上都是 HTTPS 了,也不需要開 cache,就這樣設定...
這邊比較特別的是 dns_v4_first
的設計,這個是讓 Squid 儘量用 IPv4 的位置連線。這是因為北都的網路沒有提供 IPv6 位置,所以如果網站的 DNS 如果有 IPv6 位置的話就會從 HiNet 這邊的 IPv6 出去了...
另外 ping 與 MTR 之類的工具不會動在這這樣的架構下是正常的,因為這些工具會自己組合 raw packet 丟,不是透過 Linux 的 network stack 處理,所以不會被我們指定的 ip rule
解析。網路上看起來是有方法可以 mitigate,但我就先放著了...
這樣看起來還算堪用,先這樣用一陣子看看... 先前是在 Raspberry Pi 上面跑個 proxy server 導流量,但會受限於 Raspberry Pi 的硬體限制,效能上面就普普通通,現在直接用桌機拼看看...