ปัญหา
อินสแตนซ์เซิร์ฟเวอร์ OpenVPN ( tun
, udp
พอร์ต1194
) มีการตั้งค่าบนเราเตอร์ Linux-based ที่ยังทำงานเป็นตัวอย่างลูกค้า OpenVPN ( tun
, udp
พอร์ต1197
) เชื่อมต่อไปยังผู้ให้บริการ VPN ดำเนิน ทั้งลูกค้าและปรับเซิร์ฟเวอร์เช่นการทำงานเป็นรายบุคคล อย่างไรก็ตามไคลเอนต์ไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ VPN เมื่อเปิดใช้งานอินสแตนซ์ไคลเอนต์ VPN
ฉันแน่ใจว่าสิ่งนี้เกิดขึ้นเนื่องจากอินสแตนซ์ไคลเอนต์ VPN ปรับเปลี่ยนmain
ตารางเส้นทางเพื่อให้การรับส่งข้อมูลทั้งหมดจาก ( OUTPUT
) และถึง ( FORWARD
) เราเตอร์ถูกกำหนดเส้นทางไปยังผู้ให้บริการ VPN นี่เป็นพฤติกรรมเริ่มต้นที่ต้องการ แต่ไม่ใช่สำหรับการเชื่อมต่อที่เริ่มต้นจากอินเทอร์เน็ต
การใช้iptables
และ / หรือip
นโยบายการกำหนดเส้นทางจะสามารถตั้งค่าอย่างไรเพื่อให้การเชื่อมต่อทั้งหมด (หรืออย่างน้อย VPN) ที่เริ่มต้นจากอินเทอร์เน็ตถูกกำหนดเส้นทางผ่านเกตเวย์เริ่มต้นมาตรฐาน ( 192.168.1.1
)
ติดตั้ง
LINUX ROUTER
-----------------------------------------
| LAN if: br-lan, 192.168.2.1/24 |
| VPN client if: tun0, 10.63.10.6/32 |
| VPN server if: tun1, 10.255.0.1/24 |
| DMZ if: eth0, 192.168.1.2/24 |
-----------------------------------------
|
GATEWAY ROUTER |
--------------------------
| DMZ if: 192.168.1.1/24 |
| WAN if: x.x.x.x/x |
--------------------------
|
INTERNET | VPN CLIENT OF LINUX ROUTER (public IP: y.y.y.y/y)
----------------- --------------------------------------
| |----| VPN client if: tun1, 10.255.0.6/24 |
----------------- --------------------------------------
|
|
VPN PROVIDER OF LINUX ROUTER
--------------------------------
| VPN server if: 10.63.10.1/32 |
--------------------------------
คุณจะสังเกตเห็นว่าเราอยู่ในสถานการณ์ NAT สองเท่าที่นี่ อึดอัดใจเนื่องจากอาจไม่ใช่ปัญหาเนื่องจากไคลเอนต์สามารถเชื่อมต่อได้เมื่ออินสแตนซ์ไคลเอ็นต์ VPN ถูกปิดใช้งาน
เมื่อเปิดใช้งานไคลเอนต์ VPN และอินสแตนซ์ของเซิร์ฟเวอร์นี่คือmain
ตารางเส้นทางที่กำหนดโดยip route list table main
:
0.0.0.0/1 via 10.63.10.5 dev tun0 #added by VPN client instance
default via 192.168.1.1 dev eth0 proto static
10.63.10.1 via 10.63.10.5 dev tun0 #added by VPN client instance
10.63.10.5 dev tun0 proto kernel scope link src 10.63.10.6 #added by VPN client instance
10.255.0.0/24 via 10.255.0.2 dev tun1
10.255.0.2 dev tun1 proto kernel scope link src 10.255.0.1
128.0.0.0/1 via 10.63.10.5 dev tun0 #added by VPN client instance
178.162.199.211 via 192.168.1.1 dev eth0 #added by VPN client instance
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.2
192.168.2.0/24 dev br-lan proto kernel scope link src 192.168.2.1
และนี่คือกฎ ip ตามที่กำหนดโดยip rule list
:
0: from all lookup 128 #a non-existent table
1: from all lookup local
32766: from all lookup main
32767: from all lookup default #empty table
พยายามของ
ก่อนอื่นฉันได้สร้างno_vpn_provider
ตารางเส้นทาง ( echo "2 no_vpn_provider" >> /etc/iproute2/rt_tables
) ซึ่งเป็นสำเนาที่แน่นอนของmain
ตารางโดยไม่มีการแก้ไขอินสแตนซ์ของไคลเอนต์ VPN ip route list table no_vpn_provider
แสดงให้เห็นว่า
default via 192.168.1.1 dev eth0 proto static
10.255.0.0/24 via 10.255.0.2 dev tun1
10.255.0.2 dev tun1 proto kernel scope link src 10.255.0.1
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.2
192.168.2.0/24 dev br-lan proto kernel scope link src 192.168.2.1
1)ฉันลองip
กฎง่ายๆเหล่านี้
ip rule add from 192.168.1.2 table no_vpn_provider priority 2
ip rule add from 10.255.0.1 table no_vpn_provider priority 3
โดยที่192.168.1.2
และ10.255.0.1
เป็นที่อยู่ IP ของอินเทอร์เฟซภายนอกeth0
และอินเทอร์เฟซเซิร์ฟเวอร์ VPN tun1
ตามลำดับ
ฉันยังพยายามfrom all iif eth0
และfrom all iif tun1
แทนและfrom 192.168.1.2
from 10.255.0.1
2)ฉันลองทำเครื่องหมายด้วยการเชื่อมต่อ0x1
ใหม่( ติดตั้งโมดูล) ไปยังอินเทอร์เฟซและconntrack
eth0
tun1
iptables -t mangle -A PREROUTING -m conntrack --ctstate NEW -i eth0 -j CONNMARK --set-mark 0x1
iptables -t mangle -A PREROUTING -m conntrack --ctstate NEW -i tun1 -j CONNMARK --set-mark 0x1
และเพิ่มกฎนี้เพื่อให้การเชื่อมต่อที่ทำเครื่องหมายไว้ใช้ตารางเส้นทางใหม่
ip rule add fwmark 0x1 table no_vpn_provider priority 2
3)ฉันลองทำเครื่องหมายแพ็คเก็ตขาออกจากพอร์ตเซิร์ฟเวอร์ VPN1194
iptables -t mangle -A OUTPUT -p udp --sport 1194 -j MARK --set-mark 0x1
iptables -t mangle -A OUTPUT -p tcp --sport 1194 -j MARK --set-mark 0x1 # just in case
และใช้กฎเดียวกัน
ip rule add fwmark 0x1 table no_vpn_provider priority 2
ฉันได้ลอง 2) และ 3) ด้วยเครื่องหมายต่าง ๆ และแทรก ( -I
) แทนการต่อท้าย ( -A
) สงสัยว่าไฟร์วอลล์ของฉันไม่ได้ทำเครื่องหมายเลยที่ฉันทดสอบ
iptables -t mangle -A FORWARD -s 192.168.2.0/24 -j MARK --set-mark 0x1
ip rule add fwmark 0x1 table no_vpn_provider priority 2
แต่อย่างที่คาดไว้แพ็กเก็ตจาก LAN ของฉันไม่ได้ถูกส่งต่อไปยังผู้ให้บริการ VPN
4)สิ่งเดียวที่ใช้ได้ผลก็คือกฎนี้น่าเกลียด
ip rule add from all to y.y.y.y/y table no_vpn_provider priority 2
โดยที่ yyyy / y เป็นที่อยู่ IP สาธารณะของลูกค้าที่พยายามเชื่อมต่อ: นี่เป็นวิธีการแก้ปัญหาที่แย่มากเพราะลูกค้าจะไม่เชื่อมต่อกับเครือข่ายเดียวกันเสมอ