내 LAN에서 포트 전달 IPv6 서버에 대한 OpenWrt 트래픽 규칙을 설정하는 방법은 무엇입니까?

내 LAN에서 포트 전달 IPv6 서버에 대한 OpenWrt 트래픽 규칙을 설정하는 방법은 무엇입니까?

내 홈 네트워크에서 전역적으로 라우팅 가능한 웹 서버에 대해 포트 80/443에서 인바운드 IPv6 트래픽을 허용하고 싶습니다. 기본적으로 들어오는 IPv6 트래픽을 차단하는 OpenWrt를 사용하여 이를 수행하는 가장 좋은 방법은 무엇입니까(좋은 방화벽처럼)?

내 ISP(Comcast)는 DHCPv6을 통한 위임을 위해 나에게 /60 접두사를 할당합니다. 때때로 변경됩니다. 웹 서버(Ubuntu)는 OpenWrt 라우터에서 SLAAC를 통해 글로벌 IPv6 주소를 가져옵니다.

에 따라https://wiki.openwrt.org/doc/uci/firewall#port_accept_for_ipv6이러한 종류의 트래픽을 허용하도록 트래픽 규칙을 설정할 수 있습니다.

인터넷에서 2001:db8:42::1337에 있는 로컬 웹 서버에 접근할 수 있도록 포트 80을 열려면:

구성 규칙
        옵션 src 완
        옵션 프로토 TCP
        옵션 목적지
        옵션 dest_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::1 대신 2600:dead:beef:cafe:0:0:0: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

관련 정보