如何为我的 LAN 上的端口转发 IPv6 服务器设置 OpenWrt 流量规则?

如何为我的 LAN 上的端口转发 IPv6 服务器设置 OpenWrt 流量规则?

我想允许家庭网络上全局可路由的 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

要使用脚本:

  1. PREFIX使用脚本创建防火墙规则。
  2. 使用 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

相关内容