banip
可以依照規則阻擋大量 IP,這個過濾會先於 port forwarding 發生,所以可以一併過濾 port forward 出來的內部伺服器的。設定上可以選擇 inbound / outbound ,互不影響,inbound 即使阻擋了,內部有連線要 outbound 往這些目標 IP 仍不受影響。
banip 目前不支援 OpenWRT 23 。
我的設定:
- 阻擋部分高風險國家 IP
- 阻擋高風險 ASN 的 IP,例如 AWS, DigitalOcean 等雲端主機商,很多掃 port 的行為
- 阻擋 censys, shodan 等掃描程式的 ASN
設定邏輯是這樣:
- 啟動 banip 模組
- 去 Services > banIP > Overview 下方的 Feed/Set settings,選擇要啟動的 feed(country, asn)
- inbound /outbound 分別是不同方向的過濾
- 然後去 Feed selection 選擇每一個 feed 裡面的設定,country feed 就是選國家,asn feed 就是選 asn
- Feed selection > external blocklist feeds 裡面記得也要勾選 country, asn,也可額外勾選 drop (spamhaus), etcompromised 等
第一次啟動記得看一下 log,可能啟動會失敗。我第一次啟動就遇到 banip 抱怨 service autostart is disabled ,一開始沒發現 debug 了很久,還以為 banip 不支援 openwrt 24。
參考:
- packages/net/banip/files/README.md at master · openwrt/packages
- [OpenWrt Wiki] banIP
- banip: Country block don’t work as expected · Issue #18035 · openwrt/packages
- banIP support thread – Community Builds, Projects & Packages – OpenWrt Forum
第二 WAN / 多個上游網路 / multi WAN
我的需求是這樣:
- 僅使用一個 WAN 實體接孔連接數據機(數據機已經設為 bridge mode,因此 PPPoE 由 openwrt 撥號)
- 使用同一個 WAN 接孔進行多個 PPPoE 撥號線程,建立多個 PPP tunnel device,拿到多個 public IP
- 在內網依據不同 VLAN 來使用不同 public IP,將不信任的內網裝置由不同公網出口,避免 IP 位址追蹤
我的需求不包含:
- 根據不同目標位址使用不同 public IP 出口:
這個需求很多中國人有,很多教學文章都在講這個設定,但臺灣沒有這個需求- 這個需求可以使用 PBR (Policy-Based Routing)模組: Welcome to docs.openwrt.melmac.ca! | stangri’s OpenWrt Packages Documentation.
- 合併多個 WAN 連線的頻寬,或是做頻寬聚合或是備援切換:
我還是只有一個上游網路,我只是要多拿不同 IP- 這個需求可以使用 mwan3 模組:[OpenWrt Wiki] mwan3 (Multi WAN load balancing/failover)
因此這個設定分為三個部分:
- 多 WAN 的鏈路要能夠並行接通,次要鏈路不能影響主要
- 次要內網要能夠拿到 DHCP IP 分配,且與主要內網隔離,這個我記錄在下一段落 “VLAN"
- 設定每個內網對應的 WAN 鏈路
這節先處理第一部分。以下設定可以自己調整的名稱和數字我會用底線表示。
要達到多個 PPPoE 線程,則需要在 WAN 孔設定虛擬界面,供第一個以外的 PPPoE 線程綁定:
- Network > Interfaces > Devices
- Add device configuration
- Device type = MAC VLAN
- Base device = wan 選擇要在哪一個實體界面上建立虛擬界面
- Mode = VEPA
- 預設的虛擬界面名稱會是 wanmac0
設定好裝置後開始設定第二個 PPPoE:
- Network > Interfaces > Interfaces
- Add new interface
- Name = wanb 名字可以自己調整,我是打算照 b c d e f 這樣編號
- Protocol = PPPoE
- Device = wanmac0
- 輸入 PAP/CHAP 使用者和密碼
- Advanced settings > Override IPv4 routing table = 10 這一步特別重要,這邊要手動設定一個自訂的路由表。Linux 系統內可以設置多張路由表,再藉由 ip rule 去設定哪一些封包要參照哪一張路由表。如果這邊不設定一張自訂的路由表,從這個 PPPoE 取得的 default route 就會直接新增到主路由表內,覆蓋掉原本主要 PPPoE 連線設定好的 default route,這樣會導致出口封包全部導至第二個 PPPoE 連線。如果設定一個自訂的路由表編號(除了 /etc/iproute2/rt_tables 裡面列出的預設路由表之外的編號都可以使用,數字上限多少我忘了),那這個 PPPoE 連線設定的 default route 就會跑去路由表 10,不會影響主路由表。
另外一個相關但這邊用不到的設定是 Use gateway metric,metric 是一張路由表內的優先值,如果一張路由表內有抵達同一個目標 IP 段的多筆路由,則 metric 數字最小的那一筆會先套用。所以比如說如果要設定 PBR 的話就可以把主 PPPoE 設定 metric = 10 ,第二 PPPoE 設定 metric = 20。 - 續上, Override IPv6 routing table 同理設為 10
- Firewall Settings 這邊要指定這個 PPPoE 界面到一個 firewall zone,這邊我們還沒加入新的 zone 因此先留空。不過如果設為現有的 wan zone 應該也沒問題(不確定),如果兩個 wan 連線有不同的 zone 就可以設定不一樣的規則。
設定套用之後應該就可以看到 wanb 界面透過 PPPoE 取得 public IPv4 位址,但現在還沒有任何流量會使用因為我們還沒有把內網流量導入路由表10。
設定對應的 wanB firewall zone
直接貼設定檔,懶得打網頁設定位置了:
config zone
option name 'wanB'
option input 'REJECT'
option output 'ACCEPT'
option forward 'REJECT'
option masq '1'
list network 'wanb'
- 要開 masquerading,才會啟動 NAT
- Allow forward from source zones 等一下再加入 lanB zone
有一件事情不確定的是,這邊能不能把 wanb 界面直接指定給現有的 wan firewall zone,因為雖然都是要開 masquerading 但是 masquerade 的公網 IP 不一樣,之後實驗看看就知道了。
這邊新建了 wanB firewall zone,要複製一些 wan zone 的規則過去 wanB:
- Allow-MLD: 沒有設定的話 wanb 界面會無法拿到 public IPv6 位址
- 後面兩個我想應該也是需要就直接複製過去沒有另外實驗
config rule
option name 'Allow-MLD'
option src 'wanB'
option proto 'icmp'
option family 'ipv6'
option target 'ACCEPT'
list src_ip 'fe80::/10'
config rule
option name 'Allow-DHCP-Renew'
option src 'wanB'
option proto 'udp'
option dest_port '68'
option target 'ACCEPT'
option family 'ipv4'
config rule
option name 'Allow-DHCPv6'
option src 'wanB'
option proto 'udp'
option dest_port '546'
option family 'ipv6'
option target 'ACCEPT'
設定 VLAN
設定重點邏輯如下:
- 開啟 br-lan 的 VLAN filtering,調整對應接孔的 tag / untag 需求
- 將主要 LAN 從綁定 br-lan 改為綁定 br-lan.1
- 新增及設定次要 VLAN
- 設定路由表及防火牆
- 設定 IPv6 , DNS
我一開始困惑了很久,如果我要主要 VLAN 維持 untagged(如此既有的客戶端設備就不需要任何設定調整,也比較不會出問題),那我到底該綁定 br-lan 還是要新增一個 VLAN ID 然後綁定到新的 ID 設成 untagged。網路上兩種資料似乎都有。結論是後者才是正確的。
另一困惑是,我原本想要把 interface 的網段設定為 10.0.10.0/24 ,卻發現這樣設定的時候 DHCP server 無法正常運作 (dhcp-range 選項問題),但 IPv6 SLAAC 有通,表示連接是正常的。似乎是因為 openwrt 從設定檔產生 dnsmasq 設定檔的產生器有些 bug,跟這個問題類似但是不一樣。我 debug 了很久想說直接設常見的 192.168.10.0/24 試試看,結果就成功了。我猜是 dnsmasq 設定檔產生的 script 對 IPv4 private range 有些過於簡單的假定。雖然理論上 10.0.10.0/24 也要可以運作(CIDR 都多久了),但實際上顯然支援還是不足。
設定 br-lan VLAN filtering
- Network > Interfaces > Devices
- br-lan 旁邊按下 Configure
- Bridge VLAN filtering > Enable VLAN filtering 打勾
- 新增 VLAN ID 1 untagged + primary 的接孔
- 新增次要 VLAN ID 10 tagged
轉移主 LAN 到 br-lan.1
- Network > Interfaces > Add device configuration
- 對話框選擇 Device type = VLAN 802.1q, VLAN ID =1, 儲存
- Network > Interfaces > Interfaces
- lan 旁邊按下 Edit
- Device 改選 br-lan.1
Wifi 通常沒有 VLAN,所以是直接綁定 lan interface,應該不需要修改任何設定,重新開機之後就可以正常運作。
新增 br-lan.10 裝置
- Network > Interfaces > Add device configuration
- 對話框選擇 Device type = VLAN 802.1q, VLAN ID = 10, 儲存
新增 lanB 界面
- Network > Interfaces > Interfaces
- Add new interface
- Name = lanB
- Protocol = static address
- Device = br-lan.10
- Create interface
- 新對話框
- IPv4 address = 192.168.10.1 , netmask = 255.255.255.0
- DHCP Server > Set up DHCP server
新增 lanB firewall zone
- Input, Output, Intra zone forward 全允許
- Covered networks 選 lanB 界面
- Allow forward to destination zones: wanB
設定自訂路由表規則 (ip rule)
接下來設定路由表套用規則,這部分可以說是整個設定裡面最關鍵的部分。上面我們將 wanB 指派給了路由表 10,不影響主路由表,在這邊,我們要設定路由表規則,將來自 lanB 網段 192.168.10.0/24 的封包都也指派給路由表 10,如此一來才會將流量轉送到 wanB 的閘道。
- Network > Routing > IPv4 Rules > Add
- Source = 192.168.10.0/24
- Advanced Settings -> Table = 10
- Save
這邊稍微注意,在有些類型的 WAN 連線中,上游可能不會派發 default route, 例如如果 WAN 是 Wireguard 界面就是這樣。這個時候還額外需要到 Static IPv4 Routes 裡面:
- Add
- Interface = WIREGUARD1
- Target = 0.0.0.0/0
- Advanced Settings > Table = 101
這邊 IPv6 相關設定也是同樣道理,但一個 lanB 內會有很多不同網段的 IPv6 (有本地的浮動 IP、全域、ULA 等等),這邊路由表要怎麼設定我還沒研究。
設定 IPv6 分配
相對於 IPv4 內外網轉換需要經過 NAT 設定,IPv6 需要設定 prefix delegation。我們現在有多個上游 IPv6 網段,要如何分配給多個內網就會是一個問題。
首先指定原本主 lan 的 prefix delegation:
- Network > Interfaces > Interfaces > lan > Edit
- Advanced Settings > IPv6 prefix filter = wan_6 , local (Local ULA)
再設定 lanB:
- lanB > Edit
- Advanced Settings > IPv6 prefix filter = wanb_6
lanB 我沒有設定 ULA,因為覺得不需要,但理論上也是可以設定另一段 ULA,參考 Multiple ULA ranges? – Software / SW help – Turris forum
設定 lanB DNS 伺服器分發
若沒有本地自訂的 DNS server 可以跳過。
這邊我額外設定了 lanB 的 DHCP server 派發我的 pi-hole 為 DNS server,直接填 pi-hole 在 lan 的 IPv4 位址看起來是可以運作的。
總結
- 主 lan 維持原本行為,封包從主 wan 出口
- 新增 lanB, 可以在 VLAN 10 內發 DHCP request, 會拿到 192.168.10.0/24 的 IP
- lanB 封包會從 wanB 出口





