it-swarm-id.com

Balas pada antarmuka yang sama dengan yang masuk?

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?

54
Shawn J. Goff
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 menghubungkan ke antarmuka 2 sebagai sumber (dari) alamat pada paket keluar.

64
Peter

Perintah-perintah berikut membuat tabel routing alternatif melalui eth1 untuk paket yang memiliki tanda 1 (kecuali paket ke localhost). Perintah ip berasal dari iproute2 suite (Ubuntu: iprouteInstal iproute http://bit.ly/software-small =, iproute-docInstal 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; lalu gunakan iptables -t mangle -A OUTPUT … -j MARK --set-mark 1 pada paket-paket ini agar mereka dialihkan melalui tabel routing 1. Saya pikir yang berikut 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.

Saya memiliki masalah dengan paket yang dibuat 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
5
Héctor Sánchez

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


Mulailah dengan menguji (perhatikan bahwa ini sangat mirip dengan jawaban @ Peter. Saya mengasumsikan 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 default NetworkManager.service; Gunakan network.service sebagai gantinya. Saya belum menjelajahi langkah-langkah tepat yang diperlukan untuk ini. Saya akan membayangkan ini melibatkan perintah standar chkconfig atau systemctl untuk mengaktifkan/menonaktifkan layanan.
  • Instal paket NetworkManager-dispatcher-routing-rules

Secara pribadi saya lebih suka menginstal paket aturan karena merupakan 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
3
zaTricky