วิธีการตั้งค่ากฎการรับส่งข้อมูล OpenWrt สำหรับการส่งต่อพอร์ตเซิร์ฟเวอร์ IPv6 บน LAN ของฉัน


3

ฉันต้องการอนุญาตการรับส่งข้อมูล IPv6 ขาเข้าในพอร์ต 80/443 สำหรับเว็บเซิร์ฟเวอร์ที่กำหนดเส้นทางได้ทั่วโลกในเครือข่ายภายในบ้านของฉัน อะไรคือวิธีที่ดีที่สุดในการทำเช่นนี้กับ OpenWrt ซึ่งตามค่าเริ่มต้นจะบล็อกทราฟฟิก IPv6 ที่เข้ามา (เช่นไฟร์วอลล์ที่ดี)

ISP ของฉัน (Comcast) กำหนดคำนำหน้า / 60 ให้ฉันเพื่อมอบหมายผ่าน DHCPv6 บางครั้งมันก็เปลี่ยนไป เว็บเซิร์ฟเวอร์ (Ubuntu) รับที่อยู่ IPv6 ทั่วโลกผ่าน SLAAC จากเราเตอร์ OpenWrt

ตามhttps://wiki.openwrt.org/doc/uci/firewall#port_accept_for_ipv6คุณสามารถตั้งค่ากฎจราจรเพื่ออนุญาตการรับส่งข้อมูลประเภทนี้:

หากต้องการเปิดพอร์ต 80 เพื่อให้เว็บเซิร์ฟเวอร์ภายในเครื่องที่ 2001: db8: 42 :: 1337 สามารถเข้าถึงได้จากอินเทอร์เน็ต:

กฎการกำหนดค่า
        ตัวเลือก src wan
        ตัวเลือก proto tcp
        ตัวเลือกปลายทาง lan
        ตัวเลือก dest_ip 2001: db8: 42 :: 1337
        ตัวเลือก dest_port 80
        ตัวเลือกตระกูล ipv6
        เป้าหมายตัวเลือกที่ยอมรับ

ง่ายพอยกเว้น .... IP ปลายทางนั้นฮาร์ดโค้ดแล้ว!

วิธีหนึ่งอาจตั้งค่ากฎประเภทนี้เมื่อ IP ปลายทางอาจมีการเปลี่ยนแปลงอย่างไร (เนื่องจากการเปลี่ยนแปลงในคำนำหน้าที่มอบหมายจาก ISP ของฉัน) สันนิษฐานว่าจะต้องมีการอัปเดตเป็นระยะ .... มีใครเคยลองบ้างและถ้าเป็นเช่นนั้นอะไรที่ใช้งานได้ดี / ทำงานได้ไม่ดี?

คำตอบ:


0

ฉันพบปัญหาเดียวกันและสิ้นตายเหมือนคุณ ฉันเขียนสคริปต์ที่รวดเร็วและสกปรกเพื่อทำให้ไฟร์วอลล์เปลี่ยนแปลงโดยอัตโนมัติ

#!/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: ตาย: เนื้อ: cafe: 0: 0: 0: 1 แทน 2,600: ตาย: เนื้อ: คาเฟ่ :: 1)

สคริปต์นั้นยังห่างไกลจากความสมบูรณ์แบบดังนั้นจงใจดี ฉันเสนอสคริปต์ด้วยความหวังว่าคุณจะพบว่ามีประโยชน์ :)


เพื่อให้คำตอบนี้มีประโยชน์คุณอย่างน้อยควรลองและอธิบายว่าสคริปต์ทำอะไร Read it yourselfคำตอบนั้นไม่ค่อยมีประโยชน์ในเว็บไซต์ถาม - ตอบและพวกเขาจะขมวดคิ้วอย่างแน่นอนใน StackExchange
MariusMatutiae
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.