Ada beberapa kemungkinan, tergantung pada bagaimana Anda ingin memutuskan paket mana yang digunakan. Sebagian besar dari mereka akan membutuhkan pemahaman tentang cara kerja jaringan TCP / IP di Linux. Alat utama yang harus Anda ketahui untuk melakukan hal-hal kompleks adalah iptables
(Ubuntu: iptables ) dan iproute2 ( ip
perintah) (Ubuntu: iproute , iproute-doc ).
Jika Anda dapat melakukan diskriminasi sepenuhnya berdasarkan alamat IP target, itu sederhana: rutekan alamat IP sesuai keinginan Anda. Sebagai contoh, perintah berikut akan menyebabkan semua paket untuk 1.2.3. x dan 1.2.4.2 untuk dikirimkan ppp0
, dan paket lain untuk dikirim eth0
.
route add -net 1.2.3.4/24 ppp0
route add -host 1.2.4.2 ppp0
route add -net 0.0.0.0/0 eth0
Untuk persyaratan yang lebih kompleks, Anda harus mulai menggunakan iptables
dan ip route
. Sebagai contoh, perintah-perintah berikut mengatur tabel routing khusus sehingga semua paket yang ditandai 1 keluar melalui eth0
dan semua paket yang ditandai 2 keluar melalui ppp0
(kecuali bahwa paket-paket yang ditujukan untuk localhost
menempel pada antarmuka loopback).
ip rule add fwmark 1 table 1
ip route add 127.0.0.0/0 table 1 dev lo
ip route add 0.0.0.0/0 table 1 dev eth0
ip rule add fwmark 2 table 2
ip route add 127.0.0.0/8 table 2 dev lo
ip route add 0.0.0.0/0 table 2 dev ppp0
Sekarang Anda dapat menggunakan iptables
untuk "memotong-motong" paket keluar, menambahkan tanda yang akan memutuskan rute apa yang mereka ambil. Misalnya, berikut cara mengirim semua lalu lintas SMTP keluar (port 25) melalui eth0
, dan semua lalu lintas berasal dari aplikasi yang berjalan sebagai pengguna proxy
via ppp0
.
iptables -t mangle -A OUTPUT -p tcp --dport 25 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -m owner --uid-owner proxy -j MARK --set-mark 2
Lihat juga 2 antarmuka jaringan yang terhubung ke internet. Pilih yang akan digunakan sesuai dengan nama domain dan ikat perangkat lunak ke antarmuka jaringan yang berbeda .
Anda harus mengatur agar perintah ini dijalankan ketika kedua antarmuka terhubung. Saya sarankan Anda menulis skrip bernama /etc/network/if-up.d/0justin-routes
yang menjalankan perintah yang Anda inginkan. Script ini akan dieksekusi setiap kali antarmuka jaringan ditampilkan; karena namanya dimulai dengan 0
itu akan berjalan lebih awal dalam proses itu, sebelum setup khusus aplikasi yang mungkin mengharapkan rute berada di tempat. Ada simetris /etc/network/if-down.d/
jika Anda juga ingin melakukan hal-hal ketika salah satu antarmuka turun. (Semua rute yang terkait secara otomatis akan dihapus, yang mungkin meninggalkan beberapa paket terlantar saat Anda ingin mereka kembali ke antarmuka lain.)
Script ifup didokumentasikan dalam interfaces(5) man page
. Hal utama yang perlu diketahui adalah bahwa nama antarmuka yang dinaikkan atau turun ada dalam variabel lingkungan IFACE
. Anda dapat mengetahui apakah antarmuka lain sudah aktif if ifconfig | sed 's/ .*//' | grep -Fqx 'eth0'; then …
.
iptables -t nat -A POSTROUTING -o tun0 -j SNAT --to-source ppp_ip
manappp_ip
alamat ip adaptor itu. Kedua, Anda akan perlu mematikan yang ketatrp_filter
di/proc/sys/net/ipv4/config/ppp0/rp_filter
. Ini berfungsi ketika diatur ke mode santai, yaitu 2.