내 홈 네트워크에서 전역적으로 라우팅 가능한 웹 서버에 대해 포트 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
스크립트를 사용하려면:
PREFIX
스크립트의 를 사용하여 방화벽 규칙을 만듭니다 .- 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