การส่งต่อทราฟฟิกจากอุปกรณ์ TUN (แบ็กเอนด์ C ++) ไปยังเกตเวย์เริ่มต้น


10

ปัญหาต่อไปนี้เป็นเพียงวิธีการแก้ปัญหาที่ใหญ่กว่าที่ฉันมีปัญหา องค์ประกอบอื่น ๆ ทั้งหมดดูเหมือนจะใช้งานได้แล้วดังนั้นฉันจะพยายามอธิบายชิ้นเล็ก ๆ ที่ฉันมีปัญหา

ฉันมีเครื่องลินุกซ์พร้อมtun0 (ส่วนต่อขยายช่องสัญญาณ) และeth0 (แม่มดเป็นเกตเวย์เริ่มต้นของฉันไปยังอินเทอร์เน็ต)

เป้าหมาย:เป้าหมายของฉันคือรับแพ็กเก็ตขาเข้าจาก tun0 และส่งต่อไปยังเกตเวย์เริ่มต้น ดังนั้นจริง ๆ แล้วกรณี NAT ค่อนข้างง่ายซึ่งฉันต้องการ "แชร์" อินเทอร์เน็ตด้วย tun0 ซึ่งปลอมแปลงอินเทอร์เฟซทางกายภาพ

Tun ได้รับการสร้างขึ้นโดยใช้

sudo openvpn --mktun --dev tun0 --user USER
sudo ip addr add 10.2.0.1/24 dev tun0
sudo ip link set tun0 up

ดังนั้นฉันมีมันและทำงานฉันสามารถ ping มันเป็นต้นนอกจากนี้ฉันมีแอปพลิเคชัน C ++ ซึ่งติดกับอุปกรณ์ TUN นี้สามารถอ่านและเขียนได้ (fti: นี่คือการสอนที่ฉันได้ติดตาม: http://backreference.org/2010/03/26/tuntap-interface-tutorial/ )

ฉันทิ้งคำขอ ICMP (ping) ที่ถูกต้องที่ทำไป 8.8.8.8 ลงในอาร์เรย์ไบต์ใน C ++ ตอนนี้การใช้โปรแกรมของฉันฉันเขียนไปยังอุปกรณ์ tun0 คำขอ ICMP มี

  • แหล่งที่มา (10.2.0.10) - ดังนั้นเคอร์เนลจึงรู้เส้นทางกลับ (ซับเน็ตเดียวกัน)
  • จุดหมาย (8.8.8.8) - DNS ของ Google
  • ตรวจสอบแก้ไขที่ถูกต้อง ฯลฯ (ใน Wireshark / TShark จะปรากฏอย่างถูกต้องใน tun0)

จากนั้นฉันมีเส้นทางต่อไปนี้:

iptables -F # flush
iptables --table nat --append POSTROUTING --out-interface eth0 -j MASQUERADE
iptables --append FORWARD --in-interface tun0 -j ACCEPT

และที่นี่ฉันติดอยู่ :( แพ็คเก็ตไม่ได้รับการส่งต่อไปยัง gw เริ่มต้น (tshark เห็นมันเฉพาะใน tun0 ที่ได้รับซึ่งฉันเดาว่ามันถูกต้อง)

สิ่งที่ขาดหายไป? อาจเป็นแนวทางอื่น (แต่ต้องใช้อุปกรณ์รับสัญญาณและฉันต้องสามารถ r / w ได้) ข้อมูลเพิ่มเติม:

  • เปิดใช้งานการส่งต่อ (/ proc / sys / net / ipv4 / ip_forward)
  • 8.8.8.8 สามารถเข้าถึงได้ผ่าน eth0 (จากท้องถิ่น)
  • เกตเวย์เริ่มต้นถูกต้อง (จาก ISP ผ่าน eth0)
  • ฉันได้ลองปิด rp_tables (echo 0> / proc / sys / net / ipv4 / conf / eth5 / rp_filter)
  • และอื่น ๆ อีกมากมาย...

ขอบคุณล่วงหน้าสำหรับคำแนะนำใด ๆ !


ฉันรู้ว่านี่อายุเกินหนึ่งปีแล้ว แต่คุณได้มากับสิ่งนี้หรือ ฉันมีปัญหาเดียวกันทั้งหมด
hplbsh

คำตอบ:


1

ทางเลือกอื่นคือใช้bridge. ดังนั้นคุณสามารถเชื่อมต่อ tun0 ของคุณกับ eth0 และไม่จำเป็นต้องมี nat หรือตั้งค่า ip บน tun0 คุณเพียงแค่ใส่ IP จาก subnet เดียวกันของ eth0 และเกตเวย์เดียวกันที่คุณใช้อยู่ในส่วนติดต่ออุโมงค์ของลูกค้า

คำสั่งสำหรับการตั้งค่าบริดจ์:

# brctl addbr br0
# brctl addif br0 eth0 tun0

www.tldp.org/HOWTO/BRIDGE-STP-HOWTO/set-up-the-bridge

ในการใช้ brctl คุณต้องติดตั้งbridge-utilsแพ็คเกจ
หาก distro ของคุณคือ Ubuntu:aptitude install bridge-utils


1

ฉันเพิ่งพบปัญหานี้ (ตามบทความเดียวกันที่กล่าวถึงในคำถาม) และหลังจากเล่นซอไปรอบ ๆ เล็กน้อยฉันพบว่าคำสั่งต่อไปนี้เปิดใช้งานการส่งต่อแพ็คเก็ตในท้องถิ่นสำหรับอุปกรณ์รับสัญญาณ

echo 1 > /proc/sys/net/ipv4/conf/tun0/accept_local

ฉันรู้ว่ามันสายเกินไปฉันเพิ่งโพสต์ที่นี่เพื่อให้ใครก็ตามที่ประสบปัญหาเดียวกันสามารถมีความช่วยเหลือได้บ้าง

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