我想允许家庭网络上全局可路由的 Web 服务器在端口 80/443 上进行入站 IPv6 流量。使用 OpenWrt 执行此操作的最佳方法是什么?OpenWrt 默认会阻止传入 IPv6 流量(一个好的防火墙应该这样做)?
我的 ISP(Comcast)通过 DHCPv6 为我分配了一个 /60 前缀用于委派。它有时会发生变化。Web 服务器(Ubuntu)通过 SLAAC 从 OpenWrt 路由器获取全局 IPv6 地址。
按照https://wiki.openwrt.org/doc/uci/firewall#port_accept_for_ipv6您可以设置流量规则来允许这种流量:
要打开端口 80,以便可以从 Internet 访问位于 2001:db8:42::1337 的本地 Web 服务器:
配置规则 选项 src wan 选项协议 TCP 选项目标局域网 选项目标 IP 2001:db8:42::1337 选项 dest_port 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