我希望允許連接埠 80/443 上的入站 IPv6 流量用於我的家庭網路上的全域可路由 Web 伺服器。使用 OpenWrt 執行此操作的最佳方法是什麼? 預設情況下,OpenWrt 會阻止傳入的 IPv6 流量(就像一個好的防火牆應該做的那樣)?
我的 ISP (Comcast) 為我分配了一個 /60 前綴,用於透過 DHCPv6 進行委派。它有時會改變。 Web 伺服器 (Ubuntu) 透過 SLAAC 從 OpenWrt 路由器取得全域 IPv6 位址。
按照https://wiki.openwrt.org/doc/uci/firewall#port_accept_for_ipv6您可以設定流量規則以允許此類流量:
若要開啟連接埠 80,以便可以從 Internet 存取位於 2001:db8:42::1337 的本機 Web 伺服器:
配置規則 選項 src 廣域網 選項原型 TCP 目標 LAN 選項 選項 dest_ip 2001:db8:42::1337 選項目標連接埠 80 選項系列 IPv6 選項目標接受
很簡單,除了...目標 IP 是硬編碼的!
當目標 IP 可能發生變化時,如何設定此類規則?(由於我的 ISP 委託的前綴發生了變化)。據推測,它必須定期更新......有沒有人嘗試過這個,如果是的話,什麼效果好/效果不好?
答案1
我遇到了和你一樣的問題和死胡同。我編寫了一個快速而骯髒的腳本來自動為我更改防火牆。
#!/bin/sh
# CONFIGURABLE PARAMETER: PREFIX
# the prefix is the prefix of all the firewall rules that should be changed
PREFIX=DynamicIPv6
PREFIX_LEN=${#PREFIX}
# get current IPv6 prefix from WAN
. /lib/functions/network.sh
network_get_prefix6 prefix6 wan6
prefix6=$(echo $prefix6 | cut -d/ -f1)
prefix_len=$(expr ${#prefix6} - 1)
prefix6=${prefix6:0:$prefix_len}
changed=0
index=0
name=$(uci get firewall.@rule[$index].name 2> /dev/null)
while [ "$name" != "" ]; do
subname=${name:0:$PREFIX_LEN}
# if the prefix matches, determine whether to change the firewall rules
if [ "$subname" == "$PREFIX" ]; then
dest_ip=$(uci get firewall.@rule[$index].dest_ip 2> /dev/null)
dest_network=${dest_ip:0:$prefix_len}
host_addr=$(echo $dest_ip | awk -F: 'BEGIN { OFS=":"; } { print $5,$6,$7,$8 }')
# if the firewall rule and prefix mismatch, update the firewall
if [ "$dest_network" != "$prefix6" ]; then
changed=1
new_ip="${prefix6}${host_addr}"
uci set firewall.@rule[$index].dest_ip=$new_ip
uci commit firewall
fi
fi
# advance to the next firewall rule
index=$(expr $index + 1)
name=$(uci get firewall.@rule[$index].name 2> /dev/null)
done
# if changes were detected, then reload the firewall
if [ $changed -eq 1 ]; then
/etc/init.d/firewall reload 2> /dev/null
fi
若要使用該腳本:
PREFIX
使用腳本中的建立防火牆規則。- 使用 cron 安排腳本運行。
已知問題:該腳本僅限於完整的 IPv6 位址,並且不能使用 :: 簡寫。 (例如,2600:dead:beef:cafe:0:0:0:1 而不是 2600:dead:beef:cafe::1)。
劇本遠非完美,所以請保持友善。我提供該腳本希望您會發現它有用。 :)
答案2
查看動態前綴轉發因為它有一個技巧,您可以使用負數作為前綴。
配置一個靜態 DHCPv6 租約並新增轉送規則:
uci add firewall rule uci set firewall.@rule[-1].name="Forward-IPv6" uci set firewall.@rule[-1].src="wan" uci set firewall.@rule[-1].dest="lan" uci set firewall.@rule[-1].dest_ip="::123/-64" uci set firewall.@rule[-1].family="ipv6" uci set firewall.@rule[-1].proto="tcpudp" uci set firewall.@rule[-1].target="ACCEPT" uci commit firewall /etc/init.d/firewall restart