如何為 LAN 上的連接埠轉送 IPv6 伺服器設定 OpenWrt 流量規則?

如何為 LAN 上的連接埠轉送 IPv6 伺服器設定 OpenWrt 流量規則?

我希望允許連接埠 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

若要使用該腳本:

  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

相關內容