Setup routing dan iptables untuk koneksi VPN baru untuk mengalihkan ** hanya ** port 80 dan 443


8

Saya memiliki koneksi VPN baru (menggunakan openvpn) untuk memungkinkan saya melakukan rute sekitar beberapa pembatasan ISP. Sementara itu berfungsi dengan baik, itu mengambil semua lalu lintas melalui vpn. Ini menyebabkan saya masalah untuk mengunduh (koneksi internet saya jauh lebih cepat daripada vpn memungkinkan), dan untuk akses jarak jauh. Saya menjalankan server ssh, dan menjalankan daemon yang memungkinkan saya untuk mengunduh unduhan melalui telepon saya.

Saya memiliki koneksi ethernet yang ada di eth0, dan koneksi VPN baru di tun0.

Saya percaya saya perlu mengatur rute default untuk menggunakan koneksi eth0 saya yang ada pada jaringan 192.168.0.0/24, dan mengatur gateway default ke 192.168.0.1 (pengetahuan saya goyah karena saya belum melakukan ini selama beberapa tahun) ). Jika itu benar, maka saya tidak yakin bagaimana melakukannya !. Tabel routing saya saat ini adalah:

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

Setelah memperbaiki perutean, saya yakin saya perlu menggunakan iptables untuk mengkonfigurasi prerouting atau menyamar untuk memaksa semuanya untuk port tujuan 80 atau 443 melalui tun0. Sekali lagi, saya tidak begitu yakin bagaimana melakukan ini!

Semua yang saya temukan di internet berusaha melakukan sesuatu yang jauh lebih rumit, dan mencoba memilah kayu dari pohon terbukti sulit.

Bantuan apa pun akan sangat dihargai.

MEMPERBARUI

Sejauh ini, dari berbagai sumber, saya telah menyusun beberapa hal berikut:

#!/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

Sekarang ini tampaknya berfungsi. Kecuali itu tidak!

Koneksi ke situs diblokir yang akan melalui, koneksi tidak pada port 80 dan 443 yang menggunakan koneksi non-VPN.

Namun port 80 dan 443 koneksi yang tidak ke situs web yang diblokir juga menggunakan koneksi non-VPN!

Karena tujuan umum telah tercapai, saya relatif senang, tetapi akan menyenangkan untuk mengetahui mengapa itu tidak bekerja dengan tepat.

Ada ide?

Sebagai referensi, saya sekarang memiliki 3 tabel routing, main, internet, dan vpn. Daftar mereka adalah sebagai berikut ...

Utama:

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 

Internet:

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

Skrip di atas berfungsi seperti yang diharapkan. Saya hanya berharap untuk melihat lalu lintas yang berasal dari alamat 10. di netstat. Namun, semua lalu lintas berasal dari tahun 192., tetapi port 80 dan 443 diarahkan melalui VPN. Saya akan meletakkan seluruh solusi dalam jawaban, tetapi props ke @anttir untuk menyarankan iproute2 dan fwmark. Saya belum menemukan itu, dan tanpa mereka saya masih akan membenturkan kepala saya ke dinding bata!
Steve

Jawaban:


4

Jadi, sebagian besar di atas, tetapi seluruh solusi adalah sebagai berikut:

Edit / etc / iproute2 / rt_tables dan tambahkan 2 baris di bagian bawah:

101 internet
102 vpn

Anda bisa memberi tabel ini nama lain yang lebih masuk akal, konsisten saja.

Maka Anda perlu membuat skrip (saya menyebutnya rt_setup) di /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

Kemudian, tentu saja, tautkan dari /etc/rc2.d (saya menggunakan ubuntu, runlevel mungkin berbeda untuk Anda). Pastikan Anda memberikan nomor S lebih tinggi daripada tautan openvpn!

Script melakukan beberapa hal. Bagian atas mengatur variabel, dengan beberapa pernyataan perl dan awk digunakan untuk mengambil IP dinamis dan alamat gateway. Bagian kedua membersihkan tabel yang Anda atur di ipruote2, dan menyalin tabel routing saat ini kepada mereka. Ini kemudian menciptakan dua rute baru, dan dua gateway default untuk mereka, dengan satu VPN melewati VPN, dan satu internet melalui jaringan lokal saya.

Saya tidak yakin 2 baris berikutnya diperlukan, tetapi memungkinkan ip forwarding untuk digunakan di iptables.

Selanjutnya skrip membuat beberapa aturan tentang tempat mencari lalu lintas yang berasal dari alamat IP yang relevan, dan ke mana harus mencari jika lalu lintas ditandai secara khusus.

POSTROUTING dan PREROUTING memastikan bahwa lalu lintas yang berasal dari alamat mendapat balasan!

PROSUTING iptables terakhir adalah bagian yang menandai lalu lintas, dan memastikan bahwa apa pun yang menuju port 80 atau 443 ditandai untuk menggunakan Tabel 2 (VPN)

Dua baris terakhir menghapus gateway VPN dari tabel routing default, dan menambahkan kembali gateway jaringan lokal saya.

Seperti berdiri, prosesnya bekerja dengan cemerlang. VPN dimulai saat mesin muncul, dan skrip ini dijalankan beberapa detik kemudian (saya dapat menambahkan pernyataan tidur hanya untuk memastikan VPN sepenuhnya diinisialisasi sebelum menjalankan skrip ini). Koneksi akses jarak jauh saya (ssh dll.) Berfungsi dengan baik. Koneksi saya yang tidak masuk ke port 80 atau 443 menggunakan koneksi lokal saya, tetapi semua lalu lintas web melewati VPN, dan melewati kontrol yang dilakukan oleh ISP saya!

Seperti yang saya katakan di komentar saya di bawah pertanyaan saya, saya bahkan tidak akan mulai melihat rute ini tanpa saran dari @anttir. Di luar saran itu, situs http://blog.khax.net/2009/11/28/multi-gateway-routing-with-iptables-and-iproute2/ dan http://linux-ip.net/ html / adv-multi-internet.html sangat berguna (bahkan jika kodenya tidak 100% selesai!)


1
Satu tambahan terakhir, saya memang menambahkan sleep 20bagian atas skrip karena koneksi openvpn tidak selesai tepat waktu. Saya juga menambahkan echo 2 > /proc/sys/net/ipv4/conf/tun0/rp_filterke skrip karena itu perlu untuk menonaktifkan filter paket terbalik untuk tun0. Ketika balasan kembali dari tun0 dengan alamat sumber S, filter paket balik memeriksa "jika saya merutekan paket ke alamat S, dan itu tidak akan melalui tun0, saya akan menjatuhkan paket" - dan karena ketika melakukan ini lookup tidak ada fwmark yang valid, itu menentukan rute akan menjadi rute default yang biasa, sehingga menjatuhkan paket.
Steve

Saya harus mengedit skrip Anda agar berfungsi untuk saya. Baris terakhir route add default gw 192.168.0.1 eth0tampaknya merutekan lalu lintas port 80/443 melalui gateway lokal alih-alih tun0 sebagaimana dimaksud. Mengubah baris terakhir ke route add default tun0tampaknya melakukan trik untuk saya.

1

Routing per protokol sedikit rumit. Biasanya tabel routing digunakan untuk memeriksa gateway sesuai dengan IP tujuan dan menggunakan openvpn atau gateway default 192.168.0.1.

Akan lebih mudah untuk mengatur mis. Squid http proxy di ujung VPN dan mengatur browser untuk menggunakan proxy.

Anda tidak akan menggunakan iptables karena akan mengubah IP tujuan dari koneksi HTTP dan itu tidak akan berfungsi.

Anda bisa membuat tabel routing baru (/ etc / iproute2 / rt_tables) dengan rute default yang ditetapkan ke titik akhir VPN, gunakan iptables fwmark (-j MARK) untuk menandai semua paket HTTP dan kemudian gunakan aturan ip untuk membuat aturan khusus untuk paket bertanda untuk menggunakan tabel perutean baru.


Terima kasih atas bantuan Anda. Saya pasti akan melihatnya. Hal-hal sedikit rumit karena saya tidak memiliki kendali atas server end, hanya sisi saya. Juga, saya tidak dapat menggunakan squid karena saya perlu mengarahkan lalu lintas https melalui koneksi, dan squid tidak bekerja dengan baik dengan itu.
Steve

Bagaimana dengan merutekan hanya beberapa IP melalui VPN dan seluruh dunia di luar VPN?
Antti Rytsölä

Saya memang memikirkan routing hanya beberapa IP, tetapi daftar berubah saat situs bergerak, dan saya perlu membuatnya mudah digunakan untuk pengguna lain di PC. Saya sudah mulai melihat pengaturan tabel routing baru, dan menandai paket. Paket penandaan adalah bit yang mudah, itu adalah tabel routing yang saya tidak begitu yakin. Saya dapat mengatur satu untuk VPN yang terlihat benar, dan satu untuk semua yang terlihat benar, tapi saya tidak yakin apa yang harus dilakukan dengan main karena masih diatur ke default (Yang merupakan VPN). Masih bermain ...
Steve

linux-ip.net/html/adv-multi-internet.html ip rule show dan ip rule tambahkan fwmark 4 tabel 4 prioritas 10000
Antti Rytsölä

Menambahkan pembaruan ke dokumen asli yang merinci di mana saya sejauh ini! AH! Baru menyadari bahwa saya telah mengedit jawaban Anda, bukan pertanyaan saya. Maaf! Belum banyak menggunakan ini, dan tidak menyadari bahwa saya dapat mengedit jawaban orang lain!
Steve
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.