Balas pada antarmuka yang sama dengan yang masuk?

51

Saya memiliki sistem dengan dua antarmuka. Kedua antarmuka terhubung ke internet. Salah satunya ditetapkan sebagai rute default; efek sampingnya adalah jika suatu paket masuk pada antarmuka non-default-route, balasan dikirim kembali melalui antarmuka rute default. Apakah ada cara untuk menggunakan iptables (atau sesuatu yang lain) untuk melacak koneksi dan mengirim balasan melalui antarmuka asalnya?

Shawn J. Goff
sumber

Jawaban:

61
echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> dev <interface> table isp2
ip route add default via <gateway_IP> dev <interface> table isp2

Di atas tidak memerlukan penandaan paket dengan ipfilter. Ini berfungsi karena paket keluar (balasan) akan memiliki alamat IP yang awalnya digunakan untuk terhubung ke antarmuka 2 sebagai sumber (dari) alamat pada paket keluar.

Peter
sumber
7
Wow, inilah tepatnya yang saya cari. Jika ada orang yang mencari, untuk distro berbasis RH, Anda dapat menempatkan aturan dan perintah rute yang relevan dalam file bernama 'rule-eth0' atau 'route-eth0' (misalnya) yang akan ditambahkan atau dihapus pada ifup / ifdown. Tempatkan file-file ini di samping file ifcfg-eth0. Untuk IPv6, ada fungsionalitas 'route6-eth0' bawaan, tetapi belum ada 'rule6-eth0' bawaan (belum).
Kyle Brantley
18
Bagi saya itu hanya bekerja ketika saya meninggalkan devparam dalam ip ruleperintah, jadi menjalankanip rule add from <interface_IP> table isp2
cdauth
2
Anda dapat membuat ini dibuat ketika antarmuka naik dengan menambahkan up ip rule add from <interface_IP> table isp2dan up ip route add default via <gateway_IP> dev ppp0 table isp2/ etc / network / interface Anda di bawah antarmuka yang relevan.
g.rocket
4
Saya harus menghapus dev <interface>dari ip ruleagar berfungsi pada kotak saya. Jika saya mengerti benar, dev <interface>sedang memfilter paket yang entah bagaimana diatur pada antarmuka yang salah yang perlu diperebutkan ke antarmuka yang benar oleh rute yang diganti tetapi aturan penyaringan oleh antarmuka mencegah hal itu terjadi.
binki
2
Seperti kebanyakan orang lain, saya harus menghapus dev <interface>dari ip ruleperintah agar ini berfungsi. Harap perbarui jawabannya! Kecuali untuk detail itu, itu bekerja seperti pesona. Terima kasih banyak, @Peter!
MoonSweep
6

Perintah berikut membuat tabel routing alternatif via eth1untuk paket yang memiliki tanda 1 (kecuali paket ke localhost). The ipperintah dari iproute2 suite (Ubuntu: iproute Install iproute http://bit.ly/software-small , iproute-doc Install iproute-doc http://bit.ly/software-small ).

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 eth1

Separuh pekerjaan lainnya adalah mengenali paket yang harus mendapatkan tanda 1; kemudian gunakan iptables -t mangle -A OUTPUT … -j MARK --set-mark 1pada paket-paket ini untuk membuatnya dirutekan melalui tabel routing 1. Saya pikir yang berikut ini harus melakukannya (ganti 1.2.3.4 dengan alamat antarmuka non-default-rute):

iptables -t mangle -A OUTPUT -m conntrack --ctorigdst 1.2.3.4 -j MARK --set-mark 1

Saya tidak yakin apakah itu cukup, mungkin aturan lain diperlukan pada paket yang masuk untuk memberi tahu modul conntrack untuk melacaknya.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Bagus. Saya lupa semua tentang menandai. Itu seharusnya membuat saya di sana.
Shawn J. Goff
5

Saya memiliki masalah dengan paket yang dihasilkan secara lokal dengan solusi yang disarankan oleh Peter, saya telah menemukan bahwa yang berikut ini mengoreksi bahwa:

echo 200 isp2 >> /etc/iproute2/rt_tables
ip rule add from <interface_IP> table isp2 priority 900
ip rule add from dev <interface> table isp2 priority 1000
ip route add default via <gateway_IP> dev <interface> table isp2
ip route add <interface_prefix> dev <interface> proto static scope link src <interface_IP> table isp2

CATATAN: Anda dapat mengalami masalah sintaksis dengan baris ke-4 di atas. Dalam kasus seperti itu sintaks untuk perintah ke-4 mungkin ini sekarang:

ip rule add iif <interface> table isp2 priority 1000
Héctor Sánchez
sumber
Sudah banyak mencoba tetapi tidak ada yang berhasil pada skenario saya, kecuali ini .. terima kasih banyak.
agaggi
3

Saya berasumsi Anda menjalankan Linux dan, lebih lanjut, bahwa Anda menggunakan distribusi berbasis RedHat / CentOS. Unix dan distribusi lainnya akan memerlukan langkah yang sama - tetapi detailnya akan berbeda.


Mulailah dengan menguji (perhatikan bahwa ini sangat mirip dengan jawaban @ Peter. Saya berasumsi sebagai berikut:

  • eno0 adalah isp0 dan memiliki gateway default keseluruhan
  • eno1 adalah isp1 dan memiliki IP / range 192.168.1.2/24 dengan gateway 192.168.1.1

Perintahnya adalah sebagai berikut:

$ echo 200 isp1 >> /etc/iproute2/rt_tables
$ ip rule add from eno1 table isp1
$ ip route add default via 192.168.1.1 dev eno1 table isp1

Firewall tidak terlibat dengan cara apa pun. Paket balasan akan selalu dikirim dari IP yang benar - tetapi sebelumnya dikirim melalui antarmuka yang salah. Sekarang paket-paket ini dari IP yang benar akan dikirim melalui antarmuka yang benar.


Dengan anggapan hal di atas berfungsi, Anda sekarang dapat membuat aturan dan perubahan rute permanen. Ini tergantung pada versi Unix yang Anda gunakan. Seperti sebelumnya, saya mengasumsikan distribusi Linux berbasis RH / CentOS.

$ echo "from eno1 table isp1" > /etc/sysconfig/network-scripts/rule-eno1
$ echo "default via 192.168.1.1 dev eno1 table isp1" > /etc/sysconfig/network-scripts/route-eno1

Uji bahwa perubahan jaringan itu permanen:

$ ifdown eno1 ; ifup eno1

Jika itu tidak berhasil, pada versi RH / CentOS yang lebih baru Anda juga harus menggunakan salah satu dari dua opsi:

  • Jangan gunakan NetworkManager.service default ; Gunakan layanan network.ser sebagai gantinya. Saya belum menjelajahi langkah-langkah tepat yang diperlukan untuk ini. Saya akan membayangkan ini melibatkan perintah chkconfig atau systemctl standar untuk mengaktifkan / menonaktifkan layanan.
  • Instal paket NetworkManager-dispatcher-routing-rules

Secara pribadi saya lebih suka menginstal paket aturan karena ini adalah pendekatan yang lebih sederhana dan lebih didukung:

$ yum install NetworkManager-dispatcher-routing-rules

Rekomendasi kuat lainnya adalah mengaktifkan penyaringan arp karena ini mencegah masalah terkait lainnya dengan konfigurasi jaringan ganda. Dengan RH / CentOS, tambahkan konten berikut ke file /etc/sysctl.conf:

net.ipv4.conf.default.arp_filter=1
net.ipv4.conf.all.arp_filter=1
zTricky
sumber