iptables port-mirroring

8

Saya harus bisa mendapatkan salinan paket yang diterima pada port 8001 ke port 8002. Saya telah mencoba yang berikut ini tetapi saya mendapatkan kesalahan bahwa --tee tidak terdefinisi.

sudo iptables -t nat -A PREROUTING -p TCP -s 127.0.0.1 --sport 8001 -j DNAT --to-destination 127.0.0.1:8002 --tee
Parikshit
sumber
Kernel Anda atau iptablesmungkin terlalu tua; lihat Mengirim paket duplikat melalui dua koneksi Internet.
Gilles 'SANGAT berhenti menjadi jahat'

Jawaban:

6

The --teebendera bukan bagian dari rantai DNAT, itu adalah bagian dari ROUTE. Anda hanya dapat menggunakannya setelah deklarasi -j ROUTE. Anda bisa mendapatkan bantuan khusus dari iptables pada subjek seperti ini:

 $ iptables -j ROUTE help

Saya melihat perintah iptables Anda, dan itu tidak masuk akal bagi saya. Mengapa Anda mencoba mencocokkan dengan sumber dan port sumber paket ketika dalam pertanyaan Anda Anda mengatakan "paket diterima di port"? Apakah Anda mencoba membagi lalu lintas masuk untuk menekan dua port atau mengambil output dari satu port dan mengikatnya ke input yang lain?

Jika yang pertama, benar-benar ada dua langkah. Anda tidak dapat menggunakan tee untuk mendapatkan salinan paket DAN memotong-motong paket untuk mengubah nomor port secara bersamaan. Anda dapat mencoba ini dalam dua langkah, pertama mengirimkan salinan paket yang duplikat kepada diri Anda, kemudian hanya mencocokkan salinannya dan merusak port tujuan. PERINGATAN: belum diuji, pertimbangkan kode semu ini:

$ sudo iptables -A PREROUTING -t mangle -p tcp -s !127.0.0.1/32 --dport 8001 -j ROUTE --gw 127.0.0.1 --tee
$ sudo iptables -A POSTROUTING -t nat -p tcp -s 127.0.0.1/32 --dport 8001 -j DNAT --to 127.0.0.1:8002
Caleb
sumber
1
Peringatan ... pengunjung situs lain mencatat bahwa versi yang serupa dari ini benar-benar menghasilkan loop tak terbatas! Anda mungkin perlu mencari tahu cara menandai paket duplikat dalam tindakan yang sama, lalu mencocokkannya pada tag.
Caleb
ROUTE tampaknya sudah usang, bukan?
Daisy
Ini hanya salah ketik, 172.0.0.1 -> 127.0.0.1.
Aki
1
NB untuk pembaca SE: ROUTETarget yang digunakan dalam jawaban di atas sudah usang pada tulisan ini dan tidak tersedia di iptables di distro terbaru. Lihat serverfault.com/questions/333155/…
Jonathan Ben-Avraham
6

Selanjutnya untuk jawaban Caleb , jika Anda bekerja dengan yang lebih baru iptables(v1.4.14) yang tidak lagi memiliki ROUTEtarget, Anda akan memerlukan sesuatu seperti yang berikut, diuji pada Debian Wheezy *:

iptables -A PREROUTING -t mangle -p tcp ! -s 127.0.0.1 --dport 8001 -j TEE --gateway 127.0.0.1
iptables -A OUTPUT -t nat -p tcp -s 127.0.0.1/32 --dport 8001 -j DNAT --to 127.0.0.1:8002

Tes menggunakan "netcat" ( man nc). Di jendela terminal, ketikkan untuk mengikuti dan tekan Entertombol:

nc -l 8002

Perintah akan menunggu input yang akan Anda ketik di jendela terminal kedua.

Di jendela terminal kedua ketik yang berikut ini dan tekan Entertombol:

nc 127.0.0.1 8001

Perintah akan menunggu input lebih lanjut. Ketikkan apa saja dan tekan Entertombol. Setelah Anda menekan Entertombol di jendela terminal kedua, teks yang Anda ketik di jendela terminal kedua akan muncul di jendela terminal pertama. Tekan Ctrl-c di jendela kedua untuk mengakhiri sesi.


* Sintaks ini tidak didukung di RHEL / Centos (6.5 atau lebih awal) :-( jadi Anda perlu menggunakan socatuntuk tee dan meneruskan paket masuk pada port asli ke dua port baru. Jika Anda memiliki proses mendengarkan pada port penerima asli maka Anda perlu mengkonfigurasi ulang mereka untuk mendengarkan pada salah satu port tee'd seperti socatsekarang pendengar pada port asli. Lihat posting SE ini misalnya socatsintaks untuk kloning port.

Jonathan Ben-Avraham
sumber
Untuk beberapa alasan pada debian Anda perlu menentukan port secara eksplisit dengan netcatnc -l -p 8002
Marcelo Lacerda
Saya sudah mencoba mereplikasi solusi ini pada Mint 19 Tessa saya tetapi tidak berhasil. Saya menemukan bahwa beberapa paket hanya terpental ke dalam dan hanya satu dari dua port yang menerima paket. Jika saya membuat kesalahan dengan menambahkan logging untuk mencoba memecahkan masalah aturan, log (kernel, syslog, jurnal) dengan cepat memakan penyimpanan saya.
hanzo2001
Saya juga tidak mengerti mengapa DNAT diatur pada rantai OUTPUT. Bukankah paket sudah meninggalkan proses saya ke dunia luar? atau apakah alamat loopback berperilaku berbeda?
hanzo2001