การกำหนดเส้นทางทราฟฟิกสาธารณะ 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.