Saya ingin menangkap lalu lintas di antarmuka virtual Linux, untuk keperluan debugging. Saya telah bereksperimen dengan veth
, tun
dan dummy
tipe antarmuka; pada ketiga, saya mengalami kesulitan tcpdump
untuk menunjukkan apa pun.
Inilah cara saya mengatur antarmuka dummy:
ip link add dummy10 type dummy
ip addr add 99.99.99.1 dev dummy10
ip link set dummy10 up
Di satu terminal, tontonlah dengan tcpdump
:
tcpdump -i dummy10
Dalam sedetik, dengarkan dengan nc
:
nc -l 99.99.99.1 2048
Yang ketiga, buat permintaan HTTP dengan curl
:
curl http://99.99.99.1:2048/
Meskipun di terminal 2 kita dapat melihat data dari curl
permintaan, tidak ada yang muncul tcpdump
.
Sebuah Tun / Tap tutorial memperjelas beberapa situasi di mana kernel mungkin tidak benar-benar mengirim paket ketika salah satu beroperasi pada antarmuka lokal:
Melihat output dari tshark, kita melihat ... tidak ada apa-apa. Tidak ada lalu lintas melalui antarmuka. Ini benar: karena kita melakukan ping alamat IP antarmuka, sistem operasi dengan benar memutuskan bahwa tidak ada paket yang perlu dikirim "pada kabel", dan kernel itu sendiri membalas ping ini. Jika Anda memikirkannya, itulah yang akan terjadi jika Anda melakukan ping alamat IP antarmuka lain (misalnya eth0): tidak ada paket yang akan dikirim. Ini mungkin terdengar jelas, tetapi bisa menjadi sumber kebingungan pada awalnya (itu untuk saya).
Namun, sulit untuk melihat bagaimana ini bisa berlaku untuk paket data TCP.
Mungkin tcpdump
harus terikat ke antarmuka dengan cara yang berbeda?
Jawaban:
Lalu lintas menuju
lo
antarmuka.Ketika IP ditambahkan ke kotak, rute untuk alamat itu ditambahkan ke tabel 'lokal'. Semua rute dalam tabel ini merutekan lalu lintas melalui antarmuka loopback.
Anda dapat melihat konten tabel 'lokal' dengan yang berikut:
Yang pada sistem saya terlihat seperti ini:
Jadi pada dasarnya jika saya mengirim lalu lintas ke
10.230.134.38
,127.0.0.0/8
,127.0.0.1
(berlebihan) ,172.17.42.1
atau192.168.0.20
, lalu lintas akan bisa disalurkan melalui antarmuka loopback, meskipun IP tersebut benar-benar pada antarmuka yang berbeda.sumber
Anda dapat menggunakan
tcpdump
antarmuka apa saja di host (tcpdump -i any ...
)sumber
Ini harus dimungkinkan dengan menjalankan sistem kedua (bahkan mungkin VM di host itu).
Anda dapat menggunakan
DNAT
dalamOUTGOING
rantai darinat
meja dan mengarahkan paket ke sebuah antarmuka kernel tidak mengontrol. Anda harus merefleksikannya di sana:sumber