在取得 IPv6 後,為了提高區域網路的安全性或從外部訪問權限,需要對防火牆進項設定,以下進行 Padavan 和 OpenWRT IPv6 防火牆的設定。
# OpenWRT
# OpenWRT 啟用防火牆
OpenWRT 的防火牆設定在 WebGUI 的 網路 -> 防火牆 下

它默認是開啟的,並不需要手動開啟,當然你也可以進行更具體的設定,以下主要是介紹基本設定選項的含義和作用。
# 基本設定
此處的 基本設定 是作用於 OpenWRT 本身,並不作用於路由器下屬的其他設備

啟用 SYN-flood (SYN 洪水) 防禦,此選項是默認開啟的,同時也不建議關閉
SYN 洪水攻擊是 DDOS 攻擊的其中一種,透過消耗所有可用的伺服器資源,使伺服器無法響應合法流量,詳細的說明可以查看 cloudflare 提供的文章 SYN 洪水攻擊。丟棄無效封包
一些程式在運行過程中可能會因為某種原因產生無效的封包,如果這類無效的封包過多,會佔用過得的效能,導致網路擁堵。開啟此選項後,這些封包就會被丟棄以避免佔用過多效能,當然也有誤判的可能,導致某些程式無法正常工作。
入站資料
入站資料是指從外部網路(WAN)或內部區域網路(LAN)訪問 OpenWRT 系統本身的流量
如:訪問 OpenWRT 的 WebGUI 管理頁面出站資料
出站資料是指 OpenWRT 系統本身訪問外部網路(WAN)或內部區域網路(LAN)的流量
如: OpenWRT 系統下載安裝軟體或或驅動轉發
轉發是指不用網路之間不涉及到 OpenWRT 系統本身的流量,從內部網路(LAN)訪問外部網路(WAN)、從外部網路(WAN)訪問內部網路(LAN)
如:觀看 Youtube 等這類正常上網流量就屬於轉發接受、拒絕、丟棄
接受: 可以轉發
拒絕: 不可以轉發,並回報拒絕訪問
丟棄: 直接丟掉,假裝沒看見封包、封包沒來過,也不進行回報
# 區域
- LAN -> WAN VPM

入站資料:接受 ,指允許主動從 LAN 到 OpenWRT 系統的流量
出站資料: 接受 ,指允許主動從 OpenWRT 系統到 LAN 的流量
轉發: 接受 ,指允許主動從 LAN 到其他區域的資料(這裡只有 WAN 和 VPN 兩個區域)
此處的 轉發 相當於內部網路設備的 出站
- WAN -> REJECT

入站資料:拒絕 ,指拒絕主動從 WAN 到 OpenWRT 系統的流量,避免 OpenWRT 系統可以從外部網路直接訪問
出站資料: 接受 ,指允許主動從 OpenWRT 系統到 WAN 的流量
轉發: 拒絕 ,指拒絕主動從 WAN 到其他區域的流量,避免內部設備直接暴露於外部網路
此處的 轉發 相當於內部網路設備的 入站
- VPM -> WAN LAN

入站資料:接受 ,指允許主動從 VPM 到 OpenWRT 系統的流量
出站資料: 接受 ,指允許主動從 OpenWRT 系統到 VPM 的流量
轉發: 接受 ,指允許主動從 VPM 到其他區域的流量(這裡有 WAN 和 LAN 兩個區域)
此處的 轉發 相當於連接了 VPM 的設備的 出站 和 入站
IP 動態偽裝
說得好像很專業的樣子,但其實它有個更為人熟知的名字NAT,勾選即啟用 NATMSS 鉗制 (MSS clamping)
看起來也很專業的樣子,而且解釋起來確實稍微麻煩一點
乙太網路(Ethernet)標準規範至少要有 1500 bytes,即 MTU=1500 ,而在某些情況下中間 Router 的 MTU 會比 1500 小,如使用 PPPoE 或 VPM
TCP 會設 IP 的 Don’t Fragment flag ,這樣 Router 覺得封包太大的時候,會回傳 ICMP “packet too big”,避開 Router 不處理 IP fragmentation 的問題。TCP 在 three-way handshake 的時候還會透過 SYN 封包帶上 MSS,告訴另一邊不要送超出 MSS 的封包過來。OS 會自動用下一站的 MTU-40 作為 MSS (TCP 和 IP 標頭檔各 20 bytes),所以無論是直接用 Ethernet 或行動網路(mobile network),都不會有問題。對 Ethernet 來說,MSS 就是 1500-40 = 1460
以 PPPoE 為例,它會多 8~12 bytes 的標頭檔,所以 MSS 必須再少 8~12 bytes。要求全部 client 更改 OS 的 MSS 設定並不實際,所以現行的作法是 PPPoE 的 server 會偷改 SYN 封包裡的 MSS ,讓它不要超出上限(1500),這個行為稱為 MSS clamping。也就是說 client 以為它用 MSS=1460,但 PPPoE server 在經手的時候改成 MSS=1452 (假設 PPP 標頭是 8 bytes)。
說簡單點就是避免封包大小超出上限導致出現問題。
其他設定如 埠轉發 、 流量規則 、 自訂規則 過於繁多複雜就不一一詳細說明其實是因為是我也不會
# IPv6 防火牆設定
由於 OpenWRT 默認啟用防火牆,如果想使用 IPv6 從外部網路訪問,就需要到防火牆進行相關設定
最簡單的方法就是關閉防火牆,但極其不推薦,此設定會將內部網路的所有設備暴露在風險之中
網路 -> 防火牆 -> 基本設定 -> 轉發選項改為 接受 -> 儲存並套用
如果不想讓內部網路的所有設備暴露在風險中,可以執行以下設定
# 取得設備的不變後綴
# 方法一: 使用 EUI-64
EUI-64 地址是根據 MAC 地址取得的,它後綴不變(除非更改 MAC 地址),前綴可實時更新。但如果分配的 IPv6 網段不是 /64 ,它可能不起作用
查看設備 IPv6 地址
各個作業系統請自行搜尋查看方法如果查找到的地址類似於
ABCD:EF01:2345:6789:****:**ff:fe**:****, 那麼該地址屬於是 EUI-64 地址將後綴
****:**ff:fe**:****部分記下,此處以1111:22FF:FE33:4444為例
# 方法二: 使用 DHCPv6
DHCP 擁有租期,如果 ISP 分配的 IPv6 網段發生變化但租期還未到的情況,設備是不會更新 IPv6 地址的,必須等到租期過期或釋放 DHCP 才會更新
- 在 網路 -> DHCP 與 DNS -> 找到 靜態租約
填寫主機名稱、選擇MAC 硬體位址、填寫租賃時間長度、IPv6 尾碼 (十六進位)-> 儲存並套用 -> 重新插拔網路線或重新啟動設備以獲取指定好的 IPv6 地址

主機名稱 : 可隨意填寫MAC 硬體位址 : 選擇需要分配指定 IPv6 地址的設備 MAC租賃時間長度 : IPv6 地址的租期長度,時間越短設備獲取新地址的速度越快,這裡填寫 2m ,即租期為 2minIPv6 尾碼 (十六進位) : 此處以 ABCD:EF01:2345:6789 為例
# 方法三: 使用臨時 IPv6 地址 (IPv6 隐私扩展)
夭壽哦 這防火牆規則沒法寫 PASS
# 新增轉發規則
- 在 網路 -> 防火牆 -> 流量規則 中找到
新建轉發規則
填寫好共享名 (此處以NAS為例), 來源區域 選擇WAN-> 目標區域 選擇LAN-> 新增並編輯

- 選擇
限制到位址群為僅 IPv6、填寫目標位址、目的通訊埠、 選擇動作為接受-> 儲存並套用

限制到位址群 : 因為設定的是 IPv6 防火牆,選擇 僅 IPv6 即可,選擇 IPv4 和 IPv6 也沒問題目標位址 : 此處填寫 ::<需要暴露的設備 IPv6 後綴>/::ffff:ffff:ffff:ffff
根據上面的假設
若使用 EUI-64 ,則填寫 ::1111:22FF:FE33:4444/::ffff:ffff:ffff:ffff
若使用 DHCPv6 ,則填寫 ::ABCD:EF01:2345:6789/::ffff:ffff:ffff:ffff目的通訊埠 : 即該設定 IPv6 地址需要開放的連接埠,此處以 80 、 443 連接埠為例動作 : 選擇為 接受
其餘保持默認即可
至此,在 OpenWRT 系統上允許從外部網路訪指定 IPv6 地址的指定連接埠的 IPv6 防火牆設定已完成
# Padavan 啟用防火牆
Padavan 並未默認開啟防火牆,因此需要手動開啟,開啟方法也很簡單
高級設置 -> 防火牆 -> 一般設置 -> 啟用防火牆 -> 應用設置 -> 重新啟動防火牆或設備以生效

# 取得設備的不變後綴
此處參考上方 OpenWRT 取得設備的不變後綴 的方法
# 編寫防火牆指令腳本
因為 Padavan 並不能直接修改防火牆設定,因此需要使用腳本執行 ip6tables 指令

# 開放指定連接埠(IPv4 和 IPv6 同時開放)
ip6tables -I FORWARD -p tcp --dport <需要暴露的連接埠> -j ACCEPT | |
ip6tables -I FORWARD -p udp --dport < 需要暴露的連接埠 > -j ACCEPT |
-p tcp /udp : 設定允許連接的協議為 tcp 或 udp
如果需要開放多個連接埠,可用半形 , 分隔
如果需要開放的是一段連續的連接埠,可以使用 <起始連接埠>:<終止連接埠> 表示,如:開放 1024~65535 連接埠 1024:65535
以開放 80 和 443 連接埠為例
ip6tables -I FORWARD -p tcp --dport 80,443 -j ACCEPT | |
ip6tables -I FORWARD -p udp --dport 80,443 -j ACCEPT |
# 開放指定 IPv6 地址的指定連接埠(僅 IPv6 開放)
ip6tables -I FORWARD -p tcp -d ::<需要暴露的設備 IPv6 後綴>/::FFFF:FFFF:FFFF:FFFF --dport < 需要暴露的連接埠 > -j ACCEP | |
ip6tables -I FORWARD -p udp -d ::< 需要暴露的設備 IPv6 後綴 >/::FFFF:FFFF:FFFF:FFFF --dport < 需要暴露的連接埠 > -j ACCEP |
再次以上面的假設,開放 80 和 443 連接埠為例
若使用 EUI-64 ,後綴為 ::1111:22FF:FE33:4444/::ffff:ffff:ffff:ffff
ip6tables -I FORWARD -p tcp -d ::1111:22FF:FE33:4444/::FFFF:FFFF:FFFF:FFFF --dport 80,443 -j ACCEP | |
ip6tables -I FORWARD -p udp -d ::1111:22FF:FE33:4444/::FFFF:FFFF:FFFF:FFFF --dport 80,443 -j ACCEP |
若使用 DHCPv6 ,後綴為 ::ABCD:EF01:2345:6789/::ffff:ffff:ffff:ffff
ip6tables -I FORWARD -p tcp -d ::ABCD:EF01:2345:6789/::FFFF:FFFF:FFFF:FFFF --dport 80,443 -j ACCEP | |
ip6tables -I FORWARD -p udp -d ::ABCD:EF01:2345:6789/::FFFF:FFFF:FFFF:FFFF --dport 80,443 -j ACCEP |
# 開放指定域名訪問(僅限制域名,不限制是否為 IPv4 或 IPv6)
此方法需要對域名進行 DDNS 或手動添加解析,操作方法請自行查找
ip6tables -I FORWARD -p tcp -d <開放訪問的域名> --dport < 需要暴露的連接埠 > -j ACCEP | |
ip6tables -I FORWARD -p udp -d < 開放訪問的域名 > --dport < 需要暴露的連接埠 > -j ACCEP |
以 example.com 域名,並開放 80 和 443 連接埠為例
ip6tables -I FORWARD -p tcp -d example.com --dport 80,443 -j ACCEP | |
ip6tables -I FORWARD -p udp -d example.com --dport 80,443 -j ACCEP |
腳本儲存後重新啟動防火牆或設備才會生效
至此,在 Padavan 系統上的 IPv6 防火牆設定已完成