การกำหนดเส้นทางทราฟฟิกสาธารณะ ipv6 ผ่านอุโมงค์ openvpn


13

สิ่งที่ฉันพยายามทำคือกำหนดเส้นทางการรับส่งข้อมูล IPv6 ผ่านอุโมงค์ vpn ด้วยวิธีนี้ฉันควรจะสามารถใช้ IPv6 ในเครือข่ายที่ไม่รองรับ IPv6

ฉันมี VPS ซึ่งมีบล็อก IPv6 ที่ได้รับมอบหมาย ส่วนหนึ่งของบล็อกนี้ฉันต้องการใช้สำหรับไคลเอนต์ openvpn ช่วงที่ฉันมีอยู่ในใจคือ2001:db8::111:800:0/112(คำนำหน้าไม่ระบุชื่อ) เนื่องจาก openvpn รองรับเฉพาะ / 64 และ / 112 เป็นซับเน็ตเท่านั้น

IPv6 ผ่านทันเนลกำลังทำงานจากไคลเอนต์ฉันสามารถ ping เซิร์ฟเวอร์ ( 2001:db8::111:800:1) และอินเทอร์เฟซบนเซิร์ฟเวอร์ ( 2001:db8::111:100:100และ2001:db8:216:3dfa:f1d4:81c0)

แม้ว่าเมื่อพยายาม ping google.com จากไคลเอนต์ฉันก็ไม่ได้รับการตอบกลับ (ping timeout) ในการแก้ไขปัญหานี้ฉันใช้ tcpdump เพื่อจับภาพทราฟฟิกบนเซิร์ฟเวอร์และฉันสามารถเห็นแพ็กเก็ต ping กำลังดับ แต่ไม่มีการตอบกลับ การเพิ่มกฎการบันทึกลงใน ip6tables จะแสดงเหมือนกันแพ็กเก็ตกำลังออกไป แต่ไม่มีอะไรมาเลย

ฉันใช้เครื่องมือ traceroute ออนไลน์ซึ่งทำให้หมดเวลาจากเซิร์ฟเวอร์ของฉัน ฉันพยายามตั้งค่า ip โดยตรงบนอินเทอร์เฟซซึ่งทำให้ ip ( 2001:db8::111:800:1001) เข้าถึงได้ดังนั้นฉันคิดว่านี่เป็นปัญหาการกำหนดเส้นทาง

ผมได้เปิดใช้งานการส่งต่อสำหรับ IPv6 /proc/sys/net/ipv6/conf/all/forwardingผ่าน ip6tables มีนโยบายที่อนุญาตสำหรับการโยงทั้งหมด

คำถามของฉันคือสิ่งที่จำเป็นอย่างยิ่งสำหรับ linux ที่จะยอมรับแพ็กเก็ตนั้นสำหรับ ip ที่ไม่ได้กำหนดให้กับอินเตอร์เฟสและกำหนดเส้นทางเพิ่มเติม เส้นทางที่มีอยู่ดูเหมือนไม่เพียงพอ

นี่คือการตั้งค่าสำหรับลูกค้าและเซิร์ฟเวอร์ของฉัน โปรดแจ้งให้ทราบหากต้องการข้อมูลเพิ่มเติม

ไคลเอนต์

# ip -6 addresses
10: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qlen 100
    inet6 2001:db8::111:800:1001/112 scope global 
       valid_lft forever preferred_lft forever

# ip -6 routes
2001:db8::111:800:0/112 dev tun0  proto kernel  metric 256 
2000::/3 dev tun0  metric 1024 

เซิร์ฟเวอร์

# ip -6 address
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qlen 1000
    inet6 2001:db8:216:3dfa:f1d4:81c0/64 scope global dynamic 
       valid_lft 86254sec preferred_lft 14254sec
    inet6 2001:db8::111:100:100/128 scope global 
       valid_lft forever preferred_lft forever
12: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qlen 100
    inet6 2001:db8::111:800:1/112 scope global 
       valid_lft forever preferred_lft forever

# ip -6 route
2001:db8::111:100:100 dev eth0  proto kernel  metric 256 
2001:db8::111:800:0/112 dev tun0  proto kernel  metric 256 
2001:db8::/64 dev eth0  proto kernel  metric 256  expires 86194sec
default via fe80::230:48ff:fe94:d6c5 dev eth0  proto ra  metric 1024  expires 1594sec

เป็นไปได้ว่าคุณกำลังมองหาPOSTROUTING ... MASQUERADEในnatตาราง แต่ฉันไม่แน่ใจว่าฉันเข้าใจอย่างสมบูรณ์ คุณพยายามที่จะอุโมงค์การรับส่งข้อมูล IPv6 หรือไม่? ถ้าเป็นเช่นนั้นคุณมีการตั้งค่าสิ่งอำนวยความสะดวกที่เกี่ยวข้องหรือไม่? มี-p ipv6แพ็คเก็ตได้รับอนุญาตใน IPv4 (!) กฎ?
— 0xC0000022L

คุณมีการกำหนดค่า IP ของเราเตอร์ (บน eth0) หรือไม่ คุณควบคุมเราเตอร์หรือไม่ (คุณสามารถเพิ่มเส้นทางได้ไหม)
— ysdx

ลองใช้ iptables ตารางดิบTRACEเป้าหมาย (อาจจะไม่มากที่นี่) และip neighbour ip route getนอกจากนี้โปรดระบุที่google.caเป็นกระตุก
— pilona

ส่ง Ping ไปที่ google.com หรือ goole.com
— totti

@totti google.com เป็นตัวพิมพ์ใหญ่
— Ikke

คำตอบ:


12

คุณต้องแจ้งให้เราเตอร์ของคุณใช้เซิร์ฟเวอร์ของคุณสำหรับ VPN ซับเน็ตนี้: ทางออกที่ถูกต้องสำหรับปัญหาของคุณคือการเพิ่มเส้นทางบนเราเตอร์สำหรับซับเน็ต OpenVPN

หากคุณไม่สามารถทำสิ่งนี้ได้เนื่องจากคุณไม่สามารถสัมผัสเราเตอร์ได้โซลูชันอื่นคือตั้งค่าพร็อกซี NDP สำหรับไคลเอนต์ที่eth0ลิงค์

ในขณะที่คุณใช้ VPS คุณอาจไม่สามารถเพิ่มเส้นทางไปยังเราเตอร์ได้: คุณอาจต้องใช้โซลูชันที่สอง

เพิ่มเส้นทางสำหรับซับเน็ต

ทางออกที่ถูกต้องสำหรับปัญหาของคุณคือแจ้งให้เราเตอร์ทราบว่าต้องกำหนดเส้นทางเครือข่ายย่อย VPN ผ่านเซิร์ฟเวอร์ OpenVPN (สำหรับ Linux):

ip route add 001:db8::111:800::/112 via 2001:db8::111:100:100

คุณต้องเปิดใช้งานการส่งต่อ IPv6 บนเซิร์ฟเวอร์:

sysctl sys.net.ipv6.conf.all.forwarding=1

พร็อกซี NDP

ดูเหมือนว่าเราเตอร์ได้รับการกำหนดค่าให้ส่งช่วง IPv6 ทั้งหมดของคุณในeth0ลิงค์: คุณสามารถตั้งค่าพร็อกซี NDP ได้

คุณควรเห็นคำขอ NDP บนeth0อินเทอร์เฟซของเซิร์ฟเวอร์สำหรับเครือข่ายย่อย OpenVPN ของคุณเมื่อพยายามเข้าถึงอินเทอร์เน็ตที่เหลือจากไคลเอนต์

คุณต้องเปิดใช้งานการส่งต่อ IPv6 บนเซิร์ฟเวอร์เช่นกันและพร็อกซี NDP:

sysctl -w net.ipv6.conf.all.proxy_ndp = 1

subnet NDP proxy

เคอร์เนล Linux ไม่อนุญาตให้เพิ่มพร็อกซี NDP สำหรับซับเน็ต แต่สำหรับ IP แต่ละรายการเท่านั้น คุณสามารถใช้ daemon (เช่น ndppdเพื่อตั้งค่าพร็อกซี NDP สำหรับเครือข่ายย่อยทั้งหมด (ไม่เคยใช้)

ต่อ IP NDP พร็อกซี

อีกวิธีหนึ่งคือการสามารถเพิ่ม NDP proxy สำหรับแต่ละ IPv6 ของเครือข่ายย่อย VPN:

for i in $(seq 0 65535) ; do
  ip neigh add proxy 2001:db8::111:800:$(printf %x $i) dev tun0
done

สิ่งนี้จะทำงานได้เมื่อคุณมี IP จำนวนน้อยที่ใช้ร่วมกันได้ในเครือข่ายย่อย OpenVPN

พร็อกซี NDP แบบไดนามิกพร้อมตะขอ OpenVPN

คุณควรจะสามารถใช้ตะขอ OpenVPN เพื่อเพิ่มไดนามิกพร็อกซี NDP

เพิ่ม hook ในเซิร์ฟเวอร์ OpenVPN conf:

learn-address /etc/openvpn/learn-address

ด้วยlearn-addressสคริปต์ต่อไปนี้:

#!/bin/sh

action="$1"
addr="$2"

case "$action" in
    add | update)
        ip neigh replace proxy "$addr" dev tun0
        ;;
    delete)
        ip neigh del proxy "$addr" dev tun0
        ;;
esac

ดูกระทู้นี้

คำตอบสั้น ๆ

for i in $(seq 0 65535) ; do
  ip neigh add proxy 2001:db8::111:800:$(printf %x $i) dev tun0
done

1
ขอบคุณฉันจะดูมัน ตอนนี้ฉันเข้าใจปัญหาแล้ว ipsidixit.net/2010/03/24/239มีรายละเอียดเพิ่มเติมเกี่ยวกับเรื่องนี้
— Ikke

ฉันมีไอพีจากลูกค้าเป็นพร็อกซีเพื่อนบ้าน ฉันเปิดใช้งาน sys.net.ipv6.conf.all.proxy_ndp แล้ว แต่ยังไม่สามารถ ping google.com ได้ เมื่อฉันตรวจสอบเซิร์ฟเวอร์ฉันเห็นแพ็คเก็ต ndp แก้ปัญหาที่มากับ eth0 แต่ไม่มีโฆษณาออกไป
— Ikke

1
หลังจากติดตั้งและตั้งค่า npd6 มันใช้งานได้ทันที!
— Ikke
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.