ฉันสามารถตั้งค่าเนมสเปซเครือข่ายสร้างช่องทางด้วย openvpn และเริ่มแอปพลิเคชันที่ใช้ช่องทางนี้ภายในเนมสเปซ จนถึงตอนนี้ดีมาก แต่แอปพลิเคชันนี้สามารถเข้าถึงได้ผ่านเว็บอินเตอร์เฟสและฉันไม่สามารถหาวิธีกำหนดเส้นทางคำขอไปยังเว็บอินเตอร์เฟสภายใน LAN ของฉัน
ฉันทำตามคำแนะนำจาก @schnouki อธิบายวิธีตั้งค่าเนมสเปซเครือข่ายและเรียกใช้ OpenVPN ภายใน
ip netns add myvpn
ip netns exec myvpn ip addr add 127.0.0.1/8 dev lo
ip netns exec myvpn ip link set lo up
ip link add vpn0 type veth peer name vpn1
ip link set vpn0 up
ip link set vpn1 netns myvpn up
ip addr add 10.200.200.1/24 dev vpn0
ip netns exec myvpn ip addr add 10.200.200.2/24 dev vpn1
ip netns exec myvpn ip route add default via 10.200.200.1 dev vpn1
iptables -A INPUT \! -i vpn0 -s 10.200.200.0/24 -j DROP
iptables -t nat -A POSTROUTING -s 10.200.200.0/24 -o en+ -j MASQUERADE
sysctl -q net.ipv4.ip_forward=1
mkdir -p /etc/netns/myvpn
echo 'nameserver 8.8.8.8' > /etc/netns/myvpn/resolv.conf
หลังจากนั้นฉันสามารถตรวจสอบ ip ภายนอกของฉันและรับผลลัพธ์ที่แตกต่างกันทั้งภายในและภายนอกเนมสเปซได้ตามที่ต้องการ:
curl -s ipv4.icanhazip.com
<my-isp-ip>
ip netns exec myvpn curl -s ipv4.icanhazip.com
<my-vpn-ip>
แอปพลิเคชันเริ่มต้นฉันกำลังใช้น้ำท่วมสำหรับตัวอย่างนี้ ฉันลองใช้แอปพลิเคชั่นหลายตัวพร้อมเว็บอินเตอร์เฟสเพื่อให้แน่ใจว่าไม่ใช่ปัญหาเฉพาะเจาะจง
ip netns exec myvpn sudo -u <my-user> /usr/bin/deluged
ip netns exec myvpn sudo -u <my-user> /usr/bin/deluge-web -f
ps $(ip netns pids myvpn)
PID TTY STAT TIME COMMAND
1468 ? Ss 0:13 openvpn --config /etc/openvpn/myvpn/myvpn.conf
9302 ? Sl 10:10 /usr/bin/python /usr/bin/deluged
9707 ? S 0:37 /usr/bin/python /usr/bin/deluge-web -f
ฉันสามารถเข้าถึงเว็บอินเตอร์เฟสบนพอร์ต 8112 จากภายในเนมสเปซและจากภายนอกหากฉันระบุ IP ของ veth vpn1
ip netns exec myvpn curl -Is localhost:8112 | head -1
HTTP/1.1 200 OK
ip netns exec myvpn curl -Is 10.200.200.2:8112 | head -1
HTTP/1.1 200 OK
curl -Is 10.200.200.2:8112 | head -1
HTTP/1.1 200 OK
แต่ฉันต้องการเปลี่ยนเส้นทางพอร์ต 8112 จากเซิร์ฟเวอร์ของฉันไปยังแอปพลิเคชันในเนมสเปซ เป้าหมายคือการเปิดเบราว์เซอร์บนคอมพิวเตอร์ภายใน LAN ของฉันและรับเว็บอินเตอร์เฟสด้วยhttp: // my-server-ip: 8112 (my-server-ip เป็น ip แบบคงที่ของเซิร์ฟเวอร์ที่อินสแตนซ์เครือข่ายอินสแตนซ์)
แก้ไข: ฉันลบความพยายามในการสร้างกฎ iptables สิ่งที่ฉันพยายามจะทำอธิบายไว้ข้างต้นและคำสั่งต่อไปนี้ควรส่ง HTTP 200:
curl -I localhost:8112
curl: (7) Failed to connect to localhost port 8112: Connection refused
curl -I <my-server-ip>:8112
curl: (7) Failed to connect to <my-server-ip> port 8112: Connection refused
ฉันลองใช้กฎของ DNAT และ SNAT และใส่มาสควอชสำหรับวัดที่ดี แต่เนื่องจากฉันไม่รู้ว่าฉันกำลังทำอะไรอยู่ความพยายามของฉันจึงไร้ประโยชน์ บางทีใครบางคนสามารถช่วยฉันสร้างโครงสร้างนี้
แก้ไข: tcpdump -nn -q tcp port 8112
เอาท์พุทของ แปลกใจที่คำสั่งแรกจะส่งคืน HTTP 200 และคำสั่งที่สองจะยุติลงด้วยการเชื่อมต่อที่ถูกปฏิเสธ
curl -Is 10.200.200.2:8112 | head -1
listening on vpn0, link-type EN10MB (Ethernet), capture size 262144 bytes
IP 10.200.200.1.36208 > 10.200.200.2.8112: tcp 82
IP 10.200.200.2.8112 > 10.200.200.1.36208: tcp 145
curl -Is <my-server-ip>:8112 | head -1
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes
IP <my-server-ip>.58228 > <my-server-ip>.8112: tcp 0
IP <my-server-ip>.8112 > <my-server-ip>.58228: tcp 0
แก้ไข: @schnouki ตัวเองชี้ให้ฉันไปบทความ Debian บริหารอธิบาย iptables ทั่วไปพร็อกซี่ นำไปใช้กับปัญหาที่เกิดขึ้นสคริปต์ของพวกเขาจะมีลักษณะเช่นนี้:
YourIP=<my-server-ip>
YourPort=8112
TargetIP=10.200.200.2
TargetPort=8112
iptables -t nat -A PREROUTING --dst $YourIP -p tcp --dport $YourPort -j DNAT \
--to-destination $TargetIP:$TargetPort
iptables -t nat -A POSTROUTING -p tcp --dst $TargetIP --dport $TargetPort -j SNAT \
--to-source $YourIP
iptables -t nat -A OUTPUT --dst $YourIP -p tcp --dport $YourPort -j DNAT \
--to-destination $TargetIP:$TargetPort
น่าเสียดายที่การรับส่งข้อมูลระหว่างส่วนต่อข้อมูลสัตวแพทย์ได้ยึดและไม่มีอะไรเกิดขึ้น อย่างไรก็ตาม @schnouki ยังแนะนำให้ใช้socat
เป็นพร็อกซี TCP และทำงานได้อย่างสมบูรณ์
curl -Is <my-server-ip>:8112 | head -1
IP 10.200.200.1.43384 > 10.200.200.2.8112: tcp 913
IP 10.200.200.2.8112 > 10.200.200.1.43384: tcp 1495
ฉันยังไม่เข้าใจถึงการสลับพอร์ตแปลก ๆ ในขณะที่ทราฟฟิกข้ามผ่านส่วนต่อประสานสัตวแพทย์ แต่ปัญหาของฉันได้รับการแก้ไขแล้ว
veth
อุปกรณ์เลย (พบว่าน่าสนใจมากแม้ว่า ... ;-)) คุณเคยใช้tcpdump
ในการตรวจสอบว่าแพ็คเก็ตขาเข้าได้รับมานานแค่ไหนแล้วหรือยัง? หากtcpdump -i veth0
ไม่แสดงสิ่งใดtcpdumo -i lo
อาจจำเป็น