Output traffic pada antarmuka yang berbeda berdasarkan port tujuan

23

Pertanyaan saya pada dasarnya sama dengan Hanya mengizinkan lalu lintas keluar tertentu pada antarmuka tertentu .

Saya memiliki dua antarmuka eth1(10.0.0.2) dan wlan0(192.168.0.2). Rute default saya adalah untuk eth1. Katakanlah saya ingin semua https-traffic dilalui wlan0. Sekarang jika saya menggunakan solusi yang disarankan dalam pertanyaan lain, lalu lintas https akan melalui wlan0, tetapi masih akan memiliki sumber-alamat eth1(10.0.0.2). Karena alamat ini tidak dapat dirutekan ke wlan0gateway, jawaban tidak akan pernah kembali. Cara mudahnya adalah dengan hanya mengatur bind-addr dengan benar dalam aplikasi, tetapi dalam hal ini tidak berlaku.

Saya pikir saya perlu menulis ulang src-addr:

# first mark it so that iproute can route it through wlan0
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2

Sekarang tcpdump melihat paket keluar baik-baik saja dan paket masuk tiba untuk 192.168.0.2, namun mereka mungkin tidak pernah berakhir dalam aplikasi, karena semua yang pernah saya lihat, adalah bahwa aplikasi sedang mengirim ulang paket-SYN, meskipun SYN- ACK sudah diterima.

Jadi saya pikir, mungkin saya perlu menulis ulang alamat yang masuk juga:

iptables -A PREROUTING -t nat -i wlan0 -p tcp --sport 443 -j DNAT --to 10.0.0.2

tapi itu juga tidak berhasil. Jadi saya agak macet di sini. Ada saran?

rumpel
sumber

Jawaban:

24

Anda sudah dekat.

Alasan sebenarnya bahwa aplikasi tidak melihat lalu lintas kembali adalah karena perlindungan built-in IP spoofing kernel. Yaitu, lalu lintas kembali tidak cocok dengan tabel perutean dan karena itu dibatalkan. Anda dapat memperbaikinya dengan mematikan perlindungan spoofing seperti ini:

sudo sysctl net.ipv4.conf.wlan0.rp_filter=0

Tapi saya tidak akan merekomendasikannya. Cara yang lebih tepat adalah membuat instance rute alternatif.

  1. Tanda itu perlu. Simpan saja.
  2. Sumber NAT juga diperlukan.
  3. DNAT final tidak perlu, jadi Anda bisa menghapusnya.

Pastikan Anda memiliki iproutepaket yang diinstal. Jika Anda memiliki ipperintah maka Anda diatur (yang sepertinya Anda lakukan, tetapi jika tidak mendapatkannya terlebih dahulu).

Edit /etc/iproute2/rt_tablesdan tambahkan tabel baru dengan menambahkan baris berikut:

200 wlan-route

Anda kemudian perlu mengonfigurasi tabel perutean baru Anda yang diberi nama wlan-routedengan gateway default dan membuat aturan untuk mengirimkan lalu lintas ke meja tersebut secara kondisional. Saya akan menganggap gateway default Anda adalah 192.168.0.1. Secara alami ini harus sesuai dengan jaringan Anda yang sebenarnya, dan bukan hanya asumsi saya.

ip route add default via 192.168.0.1 dev wlan0 table wlan-route
ip rule add fwmark 0x1 table wlan-route

Script beranotasi terakhir Anda akan terlihat seperti ini:

# Populate secondary routing table
ip route add default via 192.168.0.1 dev wlan0 table wlan-route
# Anything with this fwmark will use the secondary routing table
ip rule add fwmark 0x1 table wlan-route
# Mark these packets so that iproute can route it through wlan-route
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# now rewrite the src-addr
iptables -A POSTROUTING -t nat -o wlan0 -p tcp --dport 443 -j SNAT --to 192.168.0.2
bahamat
sumber
Terima kasih telah meluangkan waktu untuk melihat ini. Namun, ini sudah apa yang saya gunakan, (seperti yang dijelaskan dalam pertanyaan lain) jadi saya sudah menyiapkan rute tambahan, tetapi masih sama. SYN-ACK kembali ke 192.168.0.2 tetapi tampaknya tidak pernah mencapai aplikasi.
rumpel
Kembali dan baca jawabanku lagi. Saya membahasnya.
bahamat
Bagian tentang perlindungan spoofing? Tidak ada perubahan bahkan setelah mencoba. Maaf, bacalah bolak-balik beberapa kali, tetapi belum mendapatkan apa yang saya lewatkan.
rumpel
Anda perlu menambahkan srcopsi ke ip routeperintah untuk menentukan alamat sumber yang benar.
David Schwartz
@ Davidvidchwartz: POSTROUTING SNATakan mengurusnya.
bahamat
8

solusi bahamat benar; namun, harap dicatat bahwa satu-satunya cara bagi saya untuk membuat pekerjaan ini adalah dengan menonaktifkan rp_filter untuk setiap antarmuka dalam sistem, tidak hanya dua (eth1 dan wlan0 dalam kasus ini) yang terlibat dalam NATing.

for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $f; done
echo 1 > /proc/sys/net/ipv4/route/flush

(lihat catatan PENTING di akhir halaman ini: Howto Routing Lanjutan - tautan yang diposting di sana tidak ada lagi, tapi saya menemukannya melalui mesin wayback)

Davide C
sumber
Terima kasih atas jawaban ini, saya juga hanya bisa mendapatkan solusi bahamats bekerja mengingat jawaban Anda.
Dynalon
bagi saya pada kotak ubuntu 12,04 LTS cukup standar, selain menonaktifkan rp_filter dan flushing rute cache saya juga harus menghapus nama antarmuka dari argumen iptables. tidak punya cukup waktu untuk menyelidiki alasannya.
Costin Gușă
0

Satu saran: Anda harus selalu menggunakan --sportalih-alih --dportdalam rantai keluaran.

NAT mengubah dportdan itu akan membuat aturan Anda tidak dapat dibatalkan.

pengguna73451
sumber
2
Apakah ada sesuatu yang tidak saya dapatkan? Dport, seperti pada port tujuan, tidak dapat berubah. Ini adalah port dari layanan yang coba dijangkau oleh sesi, misalnya http, ssh, smtp. Entah Anda bingung soal olahraga dan olahraga, atau saya kehilangan sesuatu yang jelas. : P
Seseorang
0

Saya pikir di bawah ini diperlukan:

ip ru add from 192.168.0.2 table 3 prio 300
ip ro add table 3 default via 192.168.0.1 dev wlan0
pengguna181234
sumber