Perutean berdasarkan domain tujuan bukan tidak mungkin, dan, dengan alat yang tepat, tidak terlalu sulit.
Saya akan menyajikan beberapa metode yang memerlukan sedikit atau tanpa konfigurasi sisi klien khusus. Ini semua menganggap Anda menggunakan OpenVPN untuk terhubung. Ini harus dapat dicapai dengan VPN lain, tetapi mungkin memerlukan lebih banyak konfigurasi manual setelah VPN diaktifkan.
Sebagai contoh, saya akan menggunakan domain "example.com", "us1.example.com", "us2.example.com", dan "geoblocked.com" untuk domain yang ingin kita rutekan melalui non-VPN antarmuka.
Semua perintah harus dijalankan sebagai root.
Metode 1 - OpenVPN
Saya hanya akan merekomendasikan ini jika Anda yakin bahwa alamat IP yang Anda rutekan memiliki IP statis yang tidak pernah berubah.
Kelebihan:
- Sangat sederhana
Kontra:
- Hanya dapat diandalkan untuk domain dengan IP yang tidak pernah ubah
- Memerlukan entri eksplisit untuk setiap domain dan subdomain
Metode:
Tambahkan baris berikut ke konfigurasi OpenVPN Anda:
route example.com 255.255.255.255 net_gateway
route us1.example.com 255.255.255.255 net_gateway
route us2.example.com 255.255.255.255 net_gateway
route geoblocked.com 255.255.255.255 net_gateway
Mulai ulang OpenVPN.
Itu saja, tetapi Anda harus memulai ulang VPN lagi jika alamat IP itu berubah.
CATATAN :Beberapa sumber mengatakan Anda juga perlu menentukan allow-pull-fqdn
, tapi sepertinya tidak demikian menurut pengalaman saya. YMMV.
Metode 2 - Perutean berbasis kebijakan
Perutean berbasis kebijakan adalah kemampuan untuk merutekan berdasarkan kriteria tertentu; umumnya alamat sumber atau protokol, tetapi dalam kasus ini kami akan memeriksa nama domain tujuan sebelum merutekan dan menggunakan paket yang ditandai ("fwmark").
Jadi yang perlu kita lakukan pertama adalah membuat tabel terpisah untuk paket yang dirutekan VPN Anda, sehingga kami dapat menandai paket yang melewati VPN, dan meneruskan paket yang ditandai melalui antarmuka non-VPN. (Ingat, ini adalah salah satu pendekatan dan ada banyak cara lain untuk melakukannya, seperti membiarkan VPN melakukan perutean seperti biasa melalui tabel utama dan membuat tabel terpisah untuk lalu lintas non-VPN.)
Kernel Anda harus cukup baru dan memiliki modul yang tepat, meskipun sistem modern mungkin memilikinya di kernel default mereka.
Nama "vpn_table" (nama tabel perutean), dan angka "201" (ID tabel perutean) dan "3" (fwmark) dipilih secara acak.
Buat tabel perutean baru (sebagai root):
echo 201 vpn_table >> /etc/iproute2/rt_tables
Konfigurasikan OpenVPN:
Buat skrip berikut di suatu tempat (saya menyebutnya "/etc/openvpn/client/setup-routing") dan buat agar dapat dieksekusi:
#!/bin/bash
ip route add 0.0.0.0/1 via $route_vpn_gateway dev $dev scope global table vpn_table
ip route add 128.0.0.0/1 via $route_vpn_gateway dev $dev scope global table vpn_table
sysctl -w net.ipv4.conf.$dev.rp_filter=2
# You can optionally leave the next two lines out but run the `ip rule add`
# command at each boot instead
ip rule del fwmark 3 table vpn_table &>/dev/null # This might fail but that's ok
ip rule add fwmark 3 table vpn_table
Variabel dalam skrip di atas akan diisi sebagai variabel lingkungan oleh OpenVPN. Perhatikan juga bahwa ini mengatur perutean ke semua alamat melalui gateway VPN di tabel perutean "vpn_table". Jika penyiapan VPN Anda memerlukan perutean yang lebih kompleks, rujuk ke dokumentasi OpenVPN dan sesuaikan sesuai kebutuhan.
Tambahkan berikut ini ke konfigurasi OpenVPN Anda:
## Policy routing
route-noexec
script-security 2
route-up /etc/openvpn/client/setup-routing
Baris "route-noexec" mengizinkan OpenVPN untuk mengambil rute dari server, tetapi mencegahnya untuk benar-benar mengisi rute. Alih-alih skrip route-up dipanggil. "script-security 2" diperlukan untuk memanggil skrip yang ditentukan pengguna.
Itu semua pengaturan yang diperlukan untuk merutekan paket yang ditandai, tetapi kita perlu menyiapkan cara untuk benar-benar menandai paket tersebut. Dua opsi menggunakan dnsmasq dengan ipset, atau menyiapkan proxy squid.
Metode 2a - Perutean berbasis kebijakan menggunakan ipset dan dnsmasq
Saya akan merekomendasikan metode ini jika Anda sudah menjalankan ini pada router berbasis dnsmasq atau klien Anda tidak mendukung konfigurasi proxy. Ini secara efektif sama dengan DNS caching yang memperbarui tabel perutean setiap kali nama domain dicari.
Kelebihan:
- Menangani subdomain
- Berfungsi pada perangkat yang tidak dapat mengakses proxy (apakah ada?)
Kontra:
- Tidak menangani bidang perujuk (lihat Metode 2b)
- Memerlukan konfigurasi ipset dan iptables yang rumit
- Memerlukan sistem yang terhubung dengan VPN untuk disiapkan sebagai router (memerlukan antarmuka khusus)
- Saya tidak tahu seberapa skalabel ipset (kasus penggunaan saya adalah untuk seluruh ccTLD)
Ini mengasumsikan Anda telah mengonfigurasi dan menyiapkan dnsmasq, dan bertindak sebagai gateway dan server DNS untuk klien yang terhubung ke antarmuka khusus "eth1".
Buat ipset:
ipset create SKIP_VPN_IPSET iphash
Beri tahu iptables untuk menandai paket ipset (n.b., ini harus dilakukan setelah membuat daftar ipset):
# Mark ALL packets coming in on eth1 - change this to the interface dnsmasq listens on
iptables -A PREROUTING -i eth1 -t mangle -j MARK --set-mark 3
# REMOVE mark on any addresses that match our ipset
iptables -A PREROUTING -t mangle -m set --match-set SKIP_VPN_IPSET dst -j MARK --set-mark 0/3
CATATAN :Perintah di atas (ipset
dan iptables
) harus dijalankan pada setiap boot. Alternatifnya, OS Anda mungkin menyediakan beberapa opsi untuk menyimpan/memulihkan aturan dan ipset iptable.
CATATAN2 :Ada didokumentasikan ! --match-set
terbalik tapi itu mengakibatkan semua paket hilang begitu saja saat saya mencobanya.
Tambahkan berikut ini ke dnsmasq.conf Anda:
ipset=/example.com/geoblocked.com/SKIP_VPN_IPSET
Jelas sesuaikan baris itu juga nama domain mana pun yang ingin Anda arahkan. Ini juga akan menambahkan SEMUA subdomain ke ipset, jadi Anda tidak perlu menentukannya secara eksplisit. Bahkan menggunakan TLD akan berhasil.
Mulai ulang dnsmasq dan atur klien Anda untuk menggunakan sistem yang terhubung dengan VPN sebagai gateway dan DNS (yang harus tersirat jika diatur sebagai server DHCP).
Metode 2b - Perutean berbasis kebijakan menggunakan squid
Ini adalah metode favorit saya dan bekerja dengan baik dengan PS4 saya dan perangkat lain yang saya gunakan untuk terhubung.
Kelebihan:
- Menangani subdomain
- Menangani bidang perujuk
- Tidak perlu mengganti router Anda yang sudah ada
- Klien (browser) dapat menggunakannya secara opsional atau tidak
Kontra:
- Klien harus mendukung koneksi proxy
Ini mengasumsikan Anda memiliki pengaturan squid yang berfungsi dan pengetahuan dasar tentang konfigurasi squid.
Tambahkan baris berikut ke squid.conf:
# redirect example domains
acl domain_to_remote_proxy dstdomain .example.com
acl ref_to_remote_proxy referer_regex [^.]*\.example.com.*
# redirect geoblocked domain
acl domain_to_remote_proxy dstdomain .geoblocked.com
acl ref_to_remote_proxy referer_regex [^.]*\.geoblocked.com.*
# mark packets that we want routed through the VPN
tcp_outgoing_mark 0x03 !ref_to_remote_proxy !domain_to_remote_proxy
Perhatikan ada 2 baris per domain, dan subdomain dicocokkan. Baris pertama memeriksa domain tujuan, dan baris kedua cocok dengan tajuk "Perujuk". Ini berguna karena browser mengirim perujuk saat mengambil konten di halaman web seperti gambar, CSS, atau javascript; ini berarti konten yang diminta oleh situs juga akan dirutekan melalui alamat non-VPN meskipun dihosting di domain yang berbeda (mis., example-cdn.com).
Pada klien, atur koneksi seperti biasa tetapi atur pengaturan proxy untuk menggunakan server dan port proxy untuk sistem ini. Sebagian besar perangkat (termasuk konsol game) memungkinkan konfigurasi seluruh sistem. Di PC, sebagian besar browser dapat dikonfigurasi untuk menggunakan proxy secara terpisah dari pengaturan sistem.
Catatan akhir - Kasus penggunaan saya sebenarnya untuk merutekan domain tertentu melalui VPN dan yang lainnya melalui non-VPN. Metodenya mirip dengan yang di atas, tetapi terbalik.
Saya akan merekomendasikan Anda untuk menghindari mengelola perutean berdasarkan nama domain (omong-omong, juga tidak mungkin untuk menyelesaikan subdomain wildcard, apakah itu poin bonus untuk itu atau tidak :D)
Agar sedikit deskriptif, Anda tidak boleh melakukan itu karena:
1) beberapa domain mengubah IP mereka dari waktu ke waktu,
2) tidak mungkin mencocokkan karakter pengganti di subdomain
3) tidak mungkin mengetahui/mengambil semua subdomain dari domain apa pun
4) subdomain acak apa pun dapat memiliki alamat IP acak apa pun.
Jadi, solusi sebagai addon browser (dan/atau proxy lokal khusus seperti squid) adalah opsi terbaik untuk masalah Anda.
Tapi, saya rasa, addon "FoxyProxy" (aslinya adalah addon Firefox, tetapi AFAIRC, ini adalah versi Chrome lainnya) persis seperti yang Anda inginkan.
Dan, juga, menjawab pemberitahuan Anda bahwa "FoxyProxy adalah layanan berbayar dan Anda sudah memiliki vpn":
FoxyProxyPlus adalah layanan berbayar, tetapi bukan FoxyProxy.
FoxyProxy adalah addon, tersedia untuk browser utama:
Edisi Standar (Firefox) | Edisi Dasar (Firefox)
Edisi Standar (Chrom{e,ium}) | Edisi Dasar (Chrom{e,ium})
Jadi, jika Anda ingin pergi ke beberapa domain melalui VPN, Anda harus:
1) tulis aturan untuk foxyproxy melalui instance squid Anda untuk daftar domain
2) dan/atau tulis daftar aturan untuk squid
3) menangkap lalu lintas http/https tidak dimiliki oleh squid dengan iptables dan arahkan ke squid dengan aturan seperti ini:
iptables -m owner -m multiport -t nat -A OUTPUT ! -o lo ! --uid-owner $squid_user_id -p tcp --dports 80,443,8080,... -j REDIRECT --to-ports $SQUID_PORT
(--syn
opsi mungkin diperlukan untuk -p tcp)
4) tangkap lalu lintas http/https milik oleh squid, dan tandai untuk perutean berikutnya ke VPN dengan aturan seperti ini:
iptables -A OUTPUT -m owner --uid-owner $squid_user_id -j MARK --set-mark 11
5)
echo 11 forcevpn >> /etc/iproute2/rt_tables
ip rule add fwmark 11 table forcevpn
ip route add default via 10.0.0.1 table forcevpn
di mana 10.0.0.1
apakah Anda gateway di dalam VPN. Atau Anda dapat menggunakan dev $VPN_IF
bukannya via 10.0.0.1
jika Anda tidak memiliki gateway dan hanya ingin mendorong semua lalu lintas di antarmuka vpn.
6) opsional, Anda mungkin perlu menjalankan sudo sysctl ipv4.conf.all.rp_filter
=0
===
Dan satu hal lagi:
Jika Anda ingin melakukan sulap yang sama dengan lalu lintas TCP non-http, Anda memerlukan sesuatu seperti proxychains, dan melakukan sulap penangkapan serupa.
Dan, jika Anda ingin melakukan keajaiban itu dengan UDP, saya punya kabar buruk:Saya tidak tahu proxy apa pun yang mampu mem-proxy UDP (karena sifat protokol ini) :)
⇓⇓⇓ EDIT ⇓⇓⇓
Jika Anda menginginkan hal sebaliknya (default gw =vpn, dan memerintah beberapa domain langsung melalui ISP), itu bisa:
1) tulis aturan untuk foxyproxy melalui instance squid Anda untuk daftar domain
2) tangkap lalu lintas milik oleh squid, dan tandai untuk selanjutnya merutekannya dengan cara lain dengan aturan seperti ini:
iptables -A OUTPUT -m owner --uid-owner $squid_user_id -j MARK --set-mark 11
3)
echo 11 novpn >> /etc/iproute2/rt_tables
ip rule add fwmark 11 table novpn
ip route add default via ${ISP_GW} table novpn
di mana ISP_GW
adalah gateway yang Anda gunakan untuk merutekan lalu lintas ke server VPN Anda. Beberapa pengguna mungkin ingin menggunakan dev ppp0
(atau ppp1
, ..., pppN
) bukan via ${ISP_GW}
seandainya mereka menggunakan pptp untuk terhubung ke internet.