ปัญหาต่อไปนี้เป็นเพียงวิธีการแก้ปัญหาที่ใหญ่กว่าที่ฉันมีปัญหา องค์ประกอบอื่น ๆ ทั้งหมดดูเหมือนจะใช้งานได้แล้วดังนั้นฉันจะพยายามอธิบายชิ้นเล็ก ๆ ที่ฉันมีปัญหา
ฉันมีเครื่องลินุกซ์พร้อม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)
- และอื่น ๆ อีกมากมาย...
ขอบคุณล่วงหน้าสำหรับคำแนะนำใด ๆ !