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
Jawaban:
Jadi, sebagian besar di atas, tetapi seluruh solusi adalah sebagai berikut:
Edit / etc / iproute2 / rt_tables dan tambahkan 2 baris di bagian bawah:
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
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!)
sumber
sleep 20
bagian atas skrip karena koneksi openvpn tidak selesai tepat waktu. Saya juga menambahkanecho 2 > /proc/sys/net/ipv4/conf/tun0/rp_filter
ke 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.route add default gw 192.168.0.1 eth0
tampaknya merutekan lalu lintas port 80/443 melalui gateway lokal alih-alih tun0 sebagaimana dimaksud. Mengubah baris terakhir keroute add default tun0
tampaknya melakukan trik untuk saya.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.
sumber