การกำหนดเส้นทางนโยบายสำหรับเซิร์ฟเวอร์และไคลเอ็นต์ OpenVPN บนเราเตอร์เดียวกันหรือไม่


2

ปัญหา

อินสแตนซ์เซิร์ฟเวอร์ 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.2from 10.255.0.1

2)ฉันลองทำเครื่องหมายด้วยการเชื่อมต่อ0x1ใหม่( ติดตั้งโมดูล) ไปยังอินเทอร์เฟซและconntracketh0tun1

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


@ AdamSilenko ฉันพยายามที่จะเรียบเรียงคำถามใหม่อย่างชัดเจนและมีรายละเอียดเพิ่มเติม ดูว่าคุณสามารถให้ฉันป้อนข้อมูลตอนนี้ พยายามที่จะเจาะจงมากขึ้น: คุณคิดอย่างไรกับการกำหนดค่าของฉันไม่ทำงาน
ndvour

คำตอบ:


0

ในการสร้างแพ็กเก็ตทั้งหมดที่ส่งโดยอินเทอร์เฟซที่มีที่อยู่ IP ให้192.168.1.2ใช้ตารางเส้นทางที่กำหนดเองno_vpn_providerคุณสามารถใช้

ip rule add from 192.168.1.2 table no_vpn_provider priority 2

อย่างที่ฉันทำในความพยายาม 1) ปัญหาคือโดยค่าเริ่มต้นเซิร์ฟเวอร์ OpenVPN จะไม่ผูกกับที่อยู่ IP ใด ๆ ดังนั้นกฎข้างต้นจะไม่มีผลใด ๆ ( https://serverfault.com/a/228258 )

หากต้องการผูกเซิร์ฟเวอร์ OpenVPN ของคุณเข้ากับที่อยู่ IP 192.168.1.2เพียงแค่เพิ่มบรรทัดนี้ลงในไฟล์กำหนดค่าและคุณก็พร้อมแล้ว

local 192.168.1.2

หมายเหตุหากคุณสร้างกฎและตารางเส้นทางที่กำหนดเองกฎipเหล่านั้นจะถูกลบทุกครั้งที่คุณรีบูตเราเตอร์ ทั้งนี้ขึ้นอยู่กับการตั้งค่าตารางเส้นทางที่กำหนดเองนอกจากนี้ยังอาจได้รับการปรับเปลี่ยนทุกครั้งที่คุณเริ่มต้นopenvpn openvpnคุณสามารถเขียนสคริปต์ที่สร้างกฎและตารางเส้นทางที่กำหนดเองใหม่ได้ทุกเมื่อที่ต้องการ


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