เพื่อสรุปบริบท มันเป็นคอนเทนเนอร์ lxd ที่เชื่อมต่อเป็นไคลเอนต์ OpenVpn เสมอ
{วรรณ} <-> {192.168.x.x <-> iptables <-> lxd โฮสต์บริดจ์ 10.0.3.1} <-> {lxd คอนเทนเนอร์ 10.0.3.3 | openvpn <-> iptables}
ในภาชนะมี
- eth0 (ip 10.0.3.3) ซึ่งเป็นอินเทอร์เฟซไคลเอนต์บนสะพาน lxd
- tun0 ซึ่งเชื่อมต่อเป็นไคลเอนต์กับเซิร์ฟเวอร์ OpenVpn
โฮสต์ lxd (10.0.3.1) ส่งต่อการรับส่งข้อมูล 10.0.3.3 ไปยังเครือข่ายภายนอก iptables ยอมรับการเชื่อมต่อขาออกเสมอ
ทั้งโฮสต์และไคลเอนต์ lxd มี iptables
ฉันได้ทำการกำหนดเส้นทางบน 10.0.3.3 แล้ว แต่สำหรับพอร์ตขาเข้า (เช่นพอร์ต http ขาเข้าไปยัง 10.0.3.3 และการตอบกลับบน eth0 ไม่ใช่ tun0)
ดังนั้นฉันจึงมีตารางเส้นทาง "novpn" พร้อมหมายเลข fwmark
ปัญหาของฉันตอนนี้คือฉันพยายามทำสิ่งที่ตรงกันข้าม คำขอขาออกที่ไปยังพอร์ต 21 บนเซิร์ฟเวอร์ระยะไกลต้องผ่าน eth0 (ตาราง "novpn")
ฉันติดตามหลายโพสต์บน stackoverflow และรวมสิ่งนี้เข้ากับ iptables ของไคลเอนต์ 10.0.3.3 ฉันรู้สึกว่ามันเป็นแค่:
กฎ ip เพิ่มตาราง fwmark 66 novpn
เส้นทาง ip เพิ่มค่าเริ่มต้นผ่านตาราง 10.0.3.1 dev eth0 novpn
iptables -t mangle -A PREROUTING -p tcp --dport 21 -j MARK --set-mark 66
iptables -t mangle -A OUTPUT -p tcp --dport 21 -j MARK --set-mark 66
ใน iptables ของ 10.0.3.1 ฉันมีกฎที่ยอมรับการส่งต่อจากการเชื่อมต่อที่สร้างไว้แล้วและรู้จัก ดังนั้นสะพานควรปฏิบัติตามและฉันไม่คิดว่าจำเป็นต้องมีกฎอื่นใด?
แต่มันใช้งานไม่ได้เมื่อฉันดู tcpdump บนโฮสต์ (10.0.3.1) ฉันเห็นว่าแพ็กเก็ตถูกส่งด้วย openvpn IP ไม่ใช่ 10.0.3.3 ดูเหมือนว่าจะมีปัญหากับการตรวจสอบของแพ็กเก็ตที่ส่ง -> cksum 0x1983 (ไม่ถูกต้อง -> 0xe8ec)
น่าแปลกที่เมื่อฉันทำ tcpdump บนคอนโซลของไคลเอนต์ lxd (10.0.3.3) tcpdump ไม่แสดงอะไรเลยและฉันก็ไม่เข้าใจอะไรเลย
ฉันสงสัยว่า lxd มีความสำคัญกว่า (อาจเป็นอุปกรณ์พร็อกซี ฯลฯ ) มากกว่า iptables (และ tcpdump ??) แต่นั่นดูแปลกมากสำหรับฉัน
ถ้ามันมีประโยชน์ ฉันมีกฎ "ip rule add to xxx.xxx.xxx.xxx table novpn" ดังนั้นการเชื่อมต่อกับ ip นี้จะต้องผ่าน eth0 และในกรณีนี้ คำขอนั้นถูกต้องใน tcpdump
ใครก็ได้ช่วยฉันที