Menyalin paket dari antarmuka ke antarmuka lain

9

Saya memiliki sistem Linux (biarlah A) dengan 2 kartu ethernet, yaitu eth0 dan eth1 yang terpasang pada dua LAN yang sama sekali tidak terkait.

Pada dasarnya eth0 digunakan untuk lalu lintas aplikasi normal dan eth1 hanya digunakan untuk keperluan debugging. Debugging berarti bahwa eth1 dihubungkan menggunakan kabel silang ke kotak linux lain (biarlah B) yang menjalankan Wireshark. Saya ingin Wireshark dapat memproses paket aplikasi yang bepergian menggunakan A's eth0.

Pada dasarnya saya perlu menyalin paket perjalanan dari antarmuka eth0 ke antarmuka eth1 sehingga Wireshark pada kotak B dapat mengendus mereka (untuk beberapa alasan saya tidak memiliki akses fisik ke LAN eth0). Saya juga perlu menentukan paket mana yang akan disalin dari eth0 ke eth1 menurut beberapa aturan (hanya berdasarkan pada bidang TCP / IP).

Perhatikan juga bahwa eth0 A tidak perlu dimasukkan ke mode promiscuous karena saya hanya ingin menyalin subset paket yang memiliki A sebagai tujuan

Apakah ada cara untuk mencapai ini menggunakan iptables sendiri? Atau apakah saya perlu menulis aplikasi untuk membuat ini berfungsi? Apa yang harus saya lakukan untuk "menyalin" paket?

Emiliano
sumber

Jawaban:

7

Jika kernel Anda cukup baru, Anda bisa menggunakan iptables --tee untuk meneruskan frame dari eth0 ke mesin capture.

Sisir Gerald
sumber
Tautan itu sekarang dilindungi kata sandi.
Pipa
4

Anda dapat menggunakan tindakan ajaib tc. Misalnya: Untuk lalu lintas masuk:

tc qdisc add dev eth0 ingress
tc filter add dev eth0 parent ffff: \
   protocol all prio 2 u32 \
   match u32 0 0 flowid 1:1 \
   action mirred egress mirror dev eth1

Untuk lalu lintas keluar:

tc qdisc replace dev eth0 parent root handle 10: prio
tc filter add dev eth0 parent 10: \
   protocol all prio 2 u32 \
   match u32 0 0 flowid 10:1 \
   action mirred egress mirror dev eth1
undefine
sumber
3

Cari di internet untuk tcpbridge, yang persis seperti yang dilakukan Ayub. Ini dapat digunakan untuk berbicara dengan mesin virtual juga.

Walter
sumber
1

Sesuatu seperti rinetd mungkin bekerja (redirector / server untuk TCP saja saya percaya, jadi tidak ada ARP, Layer 2, dll), tetapi dalam semua kejujuran, mendapatkan beberapa switch yang dikelola yang memiliki kemampuan port mirroring atau jika kotak itu hanya digunakan untuk wireshark, Anda dapat menambahkan NIC lain untuk itu, menjembatani dua antarmuka, meletakkannya di depan et0 mesin A, dan memiliki mesin sniffing khusus.

gravyface
sumber
1

Perangkat yang menyalin frame ethernet dari satu antarmuka ke antarmuka lainnya adalah jembatan. Anda dapat mengkonfigurasi sistem Linux Anda untuk bertindak sebagai jembatan. Beberapa dokumentasi dapat ditemukan di sini:

Anda bisa menerapkan aturan pemfilteran untuk traffic yang dijembatani menggunakan ebtables , yang merupakan analog dari iptablesuntuk layer 2 traffic.

larsks
sumber
0

Dalam pengaturan saya, lalu lintas TX multicast ditandai oleh iptables tetapi kebijakan routing menggunakan tabel routing baru tidak pernah berfungsi. Meskipun itu bekerja untuk paket TX unicast (mengarahkan paket yang berasal dari eth0 ke eth5). Menggunakan tc saya bisa mendapatkan trafik mcast eth0 ke eth5 Alamat src mac dan src ip diubah dari eth5 jadi tidak akan ada masalah dengan sakelar pembelajaran. Semua dukungan kernel untuk penjadwalan paket kernel CONFIG_NET_SCHED harus diaktifkan

Di bawah ini BEKERJA untuk pengalihan lalu lintas unicast dan multicast dari eth0 ke eth5

Netfilter dapat digunakan untuk berinteraksi secara langsung dengan struktur yang mewakili sebuah paket di kernel. Struktur ini, sk_buff, berisi bidang yang disebut "__u32 nfmark" yang akan kita modifikasi. TC kemudian akan membaca nilai itu untuk memilih kelas tujuan suatu paket.

IP_ADDR_ETH0 = ifconfig eth0 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n' iptables -t mangle -A OUTPUT -s $ {IP_ADDR_ETH0} -p udp --match multiport --dports 329.330 -o eth0 -j MARK --set-mark 2

Pergi untuk membuat pohon yang mewakili kebijakan penjadwalan kami, dan yang menggunakan PRIO qdisc (penjadwal paket) (dapat mencoba yang lain tersedia). qdiscs melampirkan di root perangkat

tc qdisc menambahkan dev eth0 root handle 15: prio

Sekarang memiliki kebijakan pembentukan lalu lintas di satu sisi, dan di sisi lain menandai paket. Untuk menghubungkan keduanya, kita perlu filter.

refer man tc-mirred (8): Tindakan mirred memungkinkan mirroring paket (menyalin) atau mengalihkan (mencuri) paket yang diterimanya. Mirroring adalah apa yang kadang-kadang disebut sebagai Switch Port Analyzer (SPAN) dan biasanya digunakan untuk menganalisis dan / atau men-debug aliran.

refer man tc-fw (8): fw - fwmark filter kontrol lalu lintas memungkinkan filter fw untuk mengklasifikasikan paket berdasarkan pada fwmark yang sebelumnya diatur oleh iptables. Jika identik dengan 'pegangan' filter, filter cocok. iptables memungkinkan untuk menandai paket tunggal dengan target MARK, atau seluruh koneksi menggunakan CONNMARK.

MAC_ADDR_ETH1 = cat /sys/class/net/eth1/address IP_ADDR_ETH1 = ifconfig eth1 | grep 'inet addr'| cut -d ':' -f 2 | cut -d ' ' -f 1 | tr -d '\n' tc filter tambahkan dev eth0 parent 15: 0 protokol ip prio 1 handle 0x2 fw aksi pedit ex munge eth src set $ {MAC_ADDR_ETH1} pipe \ action pedit ex munge ip src set $ {IP_ADDR_ETH1} pipe \ action mirred egress redirect egress dev eth1

tampilkan aturan yang ditetapkan di atas: tc qdisc tunjukkan dev eth0 tc filter tunjukkan dev eth0

hapus / hapus set aturan di atas: tc qdisc del dev eth0 root

noel av
sumber