ตั้งค่าการกำหนดเส้นทางและ iptables สำหรับการเชื่อมต่อ VPN ใหม่เพื่อเปลี่ยนเส้นทาง ** เท่านั้น ** พอร์ต 80 และ 443


8

ฉันมีการเชื่อมต่อ VPN ใหม่ (โดยใช้ openvpn) เพื่อให้ฉันสามารถกำหนดเส้นทางได้ตามข้อ จำกัด ของ ISP ในขณะที่มันใช้งานได้ดีก็จะทำให้ปริมาณการใช้ข้อมูลทั้งหมดผ่าน VPN นี่เป็นสาเหตุที่ทำให้ฉันมีปัญหาในการดาวน์โหลด (การเชื่อมต่ออินเทอร์เน็ตของฉันเร็วกว่าที่ vpn อนุญาต) และสำหรับการเข้าถึงระยะไกล ฉันใช้เซิร์ฟเวอร์ ssh และมี daemon ที่ทำงานอยู่ซึ่งอนุญาตให้ฉันดาวน์โหลด schdule ผ่านโทรศัพท์ของฉัน

ฉันมีการเชื่อมต่ออีเธอร์เน็ตที่มีอยู่บน eth0 และการเชื่อมต่อ VPN ใหม่บน tun0

ฉันเชื่อว่าฉันต้องตั้งค่าเส้นทางเริ่มต้นเพื่อใช้การเชื่อมต่อ eth0 ที่มีอยู่ของฉันบนเครือข่าย 192.168.0.0/24 และตั้งค่าเกตเวย์เริ่มต้นเป็น 192.168.0.1 (ความรู้ของฉันสั่นคลอนเนื่องจากฉันไม่ได้ทำสิ่งนี้เป็นเวลาหลายปี ) หากถูกต้องแล้วฉันไม่แน่ใจว่าจะทำอย่างไร! ตารางเส้นทางปัจจุบันของฉันคือ:

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface    MSS   Window irtt
0.0.0.0         10.51.0.169     0.0.0.0         UG    0      0        0 tun0     0     0      0
10.51.0.1       10.51.0.169     255.255.255.255 UGH   0      0        0 tun0     0     0      0
10.51.0.169     0.0.0.0         255.255.255.255 UH    0      0        0 tun0     0     0      0
85.25.147.49    192.168.0.1     255.255.255.255 UGH   0      0        0 eth0     0     0      0
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0     0     0      0
192.168.0.0     0.0.0.0         255.255.255.0   U     1      0        0 eth0     0     0      0

หลังจากแก้ไขการกำหนดเส้นทางฉันเชื่อว่าฉันต้องใช้ iptables เพื่อกำหนดค่าการกำหนดเส้นทางล่วงหน้าหรือการหลอกลวงเพื่อบังคับให้ทุกอย่างสำหรับพอร์ตปลายทาง 80 หรือ 443 ผ่าน tun0 อีกครั้งฉันไม่แน่ใจว่าจะทำอย่างไร!

ทุกสิ่งที่ฉันพบบนอินเทอร์เน็ตกำลังพยายามทำสิ่งที่ซับซ้อนกว่ามากและการพยายามจัดเรียงไม้จากต้นไม้พิสูจน์ได้ยาก

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชมมาก

UPDATE

จนถึงตอนนี้จากแหล่งต่าง ๆ ฉันได้เรียนรู้สิ่งต่อไปนี้ด้วยกัน:

#!/bin/sh

DEV1=eth0
IP1=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 192.`
GW1=192.168.0.1
TABLE1=internet
TABLE2=vpn
DEV2=tun0
IP2=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 10.`
GW2=`route -n | grep 'UG[ \t]' | awk '{print $2}'`

ip route flush table $TABLE1
ip route flush table $TABLE2
ip route show table main | grep -Ev ^default | while read ROUTE ; do
    ip route add table $TABLE1 $ROUTE
    ip route add table $TABLE2 $ROUTE
done
ip route add table $TABLE1 $GW1 dev $DEV1 src $IP1
ip route add table $TABLE2 $GW2 dev $DEV2 src $IP2
ip route add table $TABLE1 default via $GW1
ip route add table $TABLE2 default via $GW2

echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

ip rule add from $IP1 lookup $TABLE1
ip rule add from $IP2 lookup $TABLE2
ip rule add fwmark 1 lookup $TABLE1
ip rule add fwmark 2 lookup $TABLE2

iptables -t nat -A POSTROUTING -o $DEV1 -j SNAT --to-source $IP1
iptables -t nat -A POSTROUTING -o $DEV2 -j SNAT --to-source $IP2

iptables -t nat -A PREROUTING           -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables        -A OUTPUT               -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables -t nat -A PREROUTING -i $DEV1  -m state --state NEW                          -j CONNMARK --set-mark 1
iptables -t nat -A PREROUTING -i $DEV2  -m state --state NEW                          -j CONNMARK --set-mark 2
iptables -t nat -A PREROUTING           -m connmark --mark 1                          -j MARK --set-mark 1
iptables -t nat -A PREROUTING           -m connmark --mark 2                          -j MARK --set-mark 2
iptables -t nat -A PREROUTING           -m state --state NEW -m connmark ! --mark 0   -j CONNMARK --save-mark

iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport  80 -j CONNMARK --set-mark 2
iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport 443 -j CONNMARK --set-mark 2

route del default
route add default gw 192.168.0.1 eth0

ตอนนี้ดูเหมือนว่าจะทำงานได้ ยกเว้นมันไม่ใช่!

การเชื่อมต่อกับเว็บไซต์ที่ถูกบล็อกกำลังดำเนินการอยู่การเชื่อมต่อที่ไม่ได้อยู่ในพอร์ต 80 และ 443 กำลังใช้การเชื่อมต่อที่ไม่ใช่ VPN

อย่างไรก็ตามการเชื่อมต่อพอร์ต 80 และ 443 ที่ไม่ได้เชื่อมต่อกับเว็บไซต์ที่ถูกบล็อกก็ใช้การเชื่อมต่อที่ไม่ใช่ VPN ด้วย!

เมื่อถึงเป้าหมายทั่วไปฉันมีความสุขแต่มันก็เป็นการดีที่ได้รู้ว่าทำไมมันไม่ทำงานอย่างถูกต้อง

ความคิดใด ๆ

สำหรับการอ้างอิงตอนนี้ฉันมีตารางเส้นทาง 3 เส้นทางหลักอินเทอร์เน็ตและ VPN รายชื่อของพวกเขามีดังนี้ ...

หลัก:

default via 192.168.0.1 dev eth0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1 

อินเทอร์เน็ต:

default via 192.168.0.1 dev eth0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1 
192.168.0.1 dev eth0  scope link  src 192.168.0.73

VPN:

default via 10.38.0.205 dev tun0 
10.38.0.1 via 10.38.0.205 dev tun0 
10.38.0.205 dev tun0  proto kernel  scope link  src 10.38.0.206 
85.removed via 192.168.0.1 dev eth0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.73  metric 1

สคริปต์ด้านบนทำงานตามที่คาดไว้ ฉันคาดหวังว่าจะเห็นปริมาณข้อมูลที่มาจากที่อยู่ 10 แห่งใน netstat อย่างไรก็ตามการรับส่งข้อมูลทั้งหมดมาจาก 192 แต่พอร์ต 80 และ 443 นั้นกำกับผ่าน VPN ฉันจะแก้ปัญหาทั้งหมดในคำตอบ แต่ props ถึง @anttir สำหรับการแนะนำ iproute2 และ fwmark ฉันไม่ได้เจอสิ่งเหล่านั้นและถ้าไม่มีพวกมันฉันก็ยังคงจ้องหัวกับกำแพงอิฐ!
Steve

คำตอบ:


4

ดังนั้นส่วนใหญ่จะอยู่ด้านบน แต่วิธีแก้ไขทั้งหมดเป็นดังนี้:

แก้ไข / etc / iproute2 / rt_tables และเพิ่ม 2 บรรทัดที่ด้านล่าง:

101 internet
102 vpn

คุณสามารถตั้งชื่ออื่นให้กับตารางเหล่านี้ได้โดยง่าย

จากนั้นคุณต้องสร้างสคริปต์ (ฉันเรียกมันว่า rt_setup) ใน /etc/init.d

#!/bin/sh

DEV1=eth0
IP1=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 192.`
GW1=192.168.0.1
TABLE1=internet
TABLE2=vpn
DEV2=tun0
IP2=`ifconfig|perl -nE'/dr:(\S+)/&&say$1'|grep 10.`
GW2=`route -n | grep 'UG[ \t]' | awk '{print $2}'`

ip route flush table $TABLE1
ip route flush table $TABLE2
ip route show table main | grep -Ev ^default | while read ROUTE ; do
    ip route add table $TABLE1 $ROUTE
    ip route add table $TABLE2 $ROUTE
done
ip route add table $TABLE1 $GW1 dev $DEV1 src $IP1
ip route add table $TABLE2 $GW2 dev $DEV2 src $IP2
ip route add table $TABLE1 default via $GW1
ip route add table $TABLE2 default via $GW2

echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv4/ip_dynaddr

ip rule add from $IP1 lookup $TABLE1
ip rule add from $IP2 lookup $TABLE2
ip rule add fwmark 1 lookup $TABLE1
ip rule add fwmark 2 lookup $TABLE2

iptables -t nat -A POSTROUTING -o $DEV1 -j SNAT --to-source $IP1
iptables -t nat -A POSTROUTING -o $DEV2 -j SNAT --to-source $IP2

iptables -t nat -A PREROUTING           -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables        -A OUTPUT               -m state --state ESTABLISHED,RELATED          -j CONNMARK --restore-mark
iptables -t nat -A PREROUTING -i $DEV1  -m state --state NEW                          -j CONNMARK --set-mark 1
iptables -t nat -A PREROUTING -i $DEV2  -m state --state NEW                          -j CONNMARK --set-mark 2
iptables -t nat -A PREROUTING           -m connmark --mark 1                          -j MARK --set-mark 1
iptables -t nat -A PREROUTING           -m connmark --mark 2                          -j MARK --set-mark 2
iptables -t nat -A PREROUTING           -m state --state NEW -m connmark ! --mark 0   -j CONNMARK --save-mark

iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport  80 -j CONNMARK --set-mark 2
iptables -t mangle -A PREROUTING -i $DEV2 -m state --state NEW -p tcp --dport 443 -j CONNMARK --set-mark 2

route del default
route add default gw 192.168.0.1 eth0

จากนั้นเห็นได้ชัดว่าการเชื่อมโยงจาก / etc / rc2.d (ฉันใช้ Ubuntu, Runlevel อาจแตกต่างกันสำหรับคุณ) ตรวจสอบให้แน่ใจว่าคุณให้หมายเลข S สูงกว่าลิงก์ openvpn!

สคริปต์ทำหลายสิ่งหลายอย่าง ส่วนบนตั้งค่าตัวแปรด้วยคำสั่ง perl และ awk บางคำที่ใช้ในการรับ IP แบบไดนามิกและที่อยู่เกตเวย์ส่วนที่สองล้างตารางที่คุณติดตั้งใน ipruote2 และคัดลอกตารางเส้นทางปัจจุบันไปยังพวกเขา จากนั้นจะสร้างเส้นทางใหม่สองเส้นทางและเกตเวย์เริ่มต้นสองเส้นทางด้วย VPN หนึ่งผ่าน VPN และอินเทอร์เน็ตหนึ่งผ่านเครือข่ายท้องถิ่นของฉัน

ฉันไม่มั่นใจว่า 2 บรรทัดถัดไปเป็นสิ่งที่จำเป็น แต่พวกเขาเปิดใช้งานการส่งต่อไอพีเพื่อใช้ใน iptables

ถัดไปสคริปต์จะสร้างกฎบางอย่างเกี่ยวกับสถานที่ที่จะมองหาทราฟฟิกที่มาจากที่อยู่ IP ที่เกี่ยวข้องและตำแหน่งที่จะดูว่าทราฟฟิกถูกทำเครื่องหมายโดยเฉพาะหรือไม่

POSTROUTING และ PREROUTING รับประกันว่าทราฟฟิกที่มาจากที่อยู่จะได้รับการตอบกลับ!

iptables ขั้นสุดท้าย PREROUTING เป็นส่วนหนึ่งของแท็กทราฟฟิกและทำให้มั่นใจได้ว่ามีการทำเครื่องหมายทุกอย่างที่พอร์ต 80 หรือ 443 เพื่อใช้ตารางที่ 2 (VPN)

สองบรรทัดสุดท้ายลบเกตเวย์ VPN ออกจากตารางเส้นทางเริ่มต้นและเพิ่มเกตเวย์เครือข่ายท้องถิ่นของฉันกลับ

กระบวนการทำงานได้อย่างยอดเยี่ยม VPN เริ่มทำงานเมื่อเครื่องเริ่มทำงานและสคริปต์นี้ทำงานในไม่กี่วินาทีต่อมา (ฉันอาจเพิ่มคำสั่ง sleep เพื่อให้แน่ใจว่า VPN จะเริ่มต้นได้อย่างสมบูรณ์ก่อนที่จะเรียกใช้สคริปต์นี้) การเชื่อมต่อการเข้าถึงระยะไกลของฉัน (ssh เป็นต้น) ทำงานได้ดีมาก การเชื่อมต่อของฉันที่ไม่ได้ไปที่พอร์ต 80 หรือ 443 กำลังใช้การเชื่อมต่อในพื้นที่ของฉัน แต่ทราฟฟิกของเว็บทั้งหมดจะผ่าน VPN และข้ามการควบคุมที่ ISP ของฉันทำไว้!

ดังที่ฉันพูดในความคิดเห็นภายใต้คำถามของฉันฉันจะไม่ได้เริ่มดูเส้นทางนี้โดยไม่ต้องแนะนำ @anttir ด้านหลังของคำแนะนำนั้นไซต์http://blog.khax.net/2009/11/28/multi-gateway-routing-with-iptables-and-iproute2/และhttp://linux-ip.net/ html / adv-multi-internet.htmlมีประโยชน์มาก (แม้ว่ารหัสจะไม่สมบูรณ์ 100%!)


1
การเพิ่มครั้งสุดท้ายหนึ่งฉันเพิ่ม a sleep 20ด้านบนสุดของสคริปต์เนื่องจากการเชื่อมต่อ openvpn ไม่เสร็จทันเวลา ฉันยังเพิ่มecho 2 > /proc/sys/net/ipv4/conf/tun0/rp_filterสคริปต์เนื่องจากจำเป็นต้องปิดใช้งานตัวกรองแพ็กเก็ตย้อนกลับสำหรับ tun0 เมื่อคำตอบกลับมาจาก tun0 พร้อมด้วยที่อยู่ต้นทาง S ตัวกรองแพ็กเก็ตย้อนกลับจะตรวจสอบ "ถ้าฉันกำหนดเส้นทางแพ็กเก็ตไปยังที่อยู่ S และจะไม่ผ่าน tun0" ฉันจะวางแพ็กเก็ต "- และเนื่องจากเมื่อทำสิ่งนี้ การค้นหาไม่มี fwmark ที่ถูกต้องกำหนดเส้นทางเป็นเส้นทางเริ่มต้นตามปกติดังนั้นจึงลดแพ็กเก็ต
Steve

ฉันต้องแก้ไขสคริปต์ของคุณเพื่อให้มันทำงานได้สำหรับฉัน บรรทัดสุดท้ายroute add default gw 192.168.0.1 eth0ดูเหมือนจะกำหนดเส้นทางการรับส่งข้อมูลพอร์ต 80/443 ผ่านเกตเวย์ท้องถิ่นแทนที่จะเป็น tun0 ตามที่ตั้งใจไว้ การเปลี่ยนบรรทัดสุดท้ายให้route add default tun0ดูเหมือนจะเป็นการหลอกลวงสำหรับฉัน

1

เส้นทางต่อโปรโตคอลนั้นซับซ้อนเล็กน้อย โดยปกติตารางเส้นทางจะถูกใช้เพื่อตรวจสอบเกตเวย์ตาม IP ปลายทางและใช้เกตเวย์เริ่มต้น openvpn หรือ 192.168.0.1

การติดตั้งจะง่ายกว่าเช่น Squid http proxy ที่ปลายอีกด้านหนึ่งของ VPN และตั้งค่าเบราว์เซอร์ให้ใช้พร็อกซี

คุณจะไม่ใช้ iptables เพราะจะเปลี่ยน IP ปลายทางของการเชื่อมต่อ HTTP และจะไม่ทำงาน

คุณสามารถสร้างตารางเส้นทางใหม่ (/ etc / iproute2 / rt_tables) ด้วยการกำหนดเส้นทางเริ่มต้นเป็นจุดสิ้นสุด VPN ใช้ iptables fwmark (-j MARK) เพื่อทำเครื่องหมายแพ็กเก็ต HTTP ทั้งหมดแล้วใช้กฎ ipเพื่อสร้างกฎที่กำหนดเองสำหรับ แพ็คเกจที่ทำเครื่องหมายไว้เพื่อใช้ตารางเส้นทางใหม่


ขอบคุณสำหรับความช่วยเหลือของคุณ. ฉันจะดูสิ่งเหล่านั้นอย่างแน่นอน สิ่งต่าง ๆ มีความยุ่งยากเล็กน้อยในการที่ฉันไม่สามารถควบคุมปลายเซิร์ฟเวอร์ได้แค่ข้างฉัน นอกจากนี้ฉันไม่สามารถใช้ปลาหมึกได้เพราะฉันต้องกำหนดเส้นทางการรับส่งข้อมูล https ผ่านการเชื่อมต่อและปลาหมึกไม่สามารถทำงานได้ดี
Steve

วิธีการเกี่ยวกับการกำหนดเส้นทาง IP เพียงไม่กี่ VPN และส่วนที่เหลือของโลกนอก VPN?
Antti Rytsölä

ฉันคิดว่าจะกำหนดเส้นทางเพียงไม่กี่ IP แต่รายการเปลี่ยนแปลงเมื่อไซต์เคลื่อนที่และฉันจำเป็นต้องทำให้ผู้ใช้รายอื่นบนพีซีใช้งานง่าย ฉันเริ่มดูการตั้งค่าตารางเส้นทางใหม่และทำเครื่องหมายแพ็คเก็ต แพ็คเก็ตที่ทำเครื่องหมายเป็นบิตง่ายมันเป็นตารางเส้นทางฉันไม่แน่ใจ ฉันสามารถตั้งค่าหนึ่งสำหรับ VPN ที่มีลักษณะถูกต้องและหนึ่งรายการสำหรับทุกอย่างอื่นที่ดูถูกต้อง แต่ฉันไม่แน่ใจว่าจะทำอย่างไรกับ main เพราะยังตั้งค่าเริ่มต้น (ซึ่งคือ VPN) ยังคงเล่น ...
Steve

linux-ip.net/html/adv-multi-internet.html การแสดงกฎ ip และกฎ ip เพิ่ม fwmark 4 ตาราง 4 ลำดับความสำคัญ 10,000
Antti Rytsölä

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