Bagaimana cara menangkap lalu lintas di antarmuka virtual?

12

Saya ingin menangkap lalu lintas di antarmuka virtual Linux, untuk keperluan debugging. Saya telah bereksperimen dengan veth, tundan dummytipe antarmuka; pada ketiga, saya mengalami kesulitan tcpdumpuntuk 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 curlpermintaan, 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 tcpdumpharus terikat ke antarmuka dengan cara yang berbeda?

solidsnack
sumber
Tidak yakin mengapa sulit untuk melihat hal itu terjadi pada paket TCP. Seperti ping, itu diproses dalam kernel. Hal yang sama terjadi.
derobert
@derobert Dalam kasus ping, kernel dapat merespons. Dalam hal paket data, saya agak membayangkan mereka harus "melihat" antarmuka sehingga aplikasi dapat meresponnya.
solidsnack
1
Aplikasi berbicara ke kernel menggunakan baca, tulis, dll. Banyak aplikasi jaringan bahkan tidak perlu menyadari bahwa ada antarmuka. Untuk mendapatkan traffic yang melewati salah satunya, kernel perlu melihatnya sebagai non-lokal. Misalnya, mengatur terowongan OpenVPN, maka Anda dapat menangkap lalu lintas melewati tun0. (Tentu saja, tun0 adalah cara khusus bagi aplikasi untuk berbicara dengan kernel, untuk mengimplementasikan antarmuka jaringan di userland, yang dilakukan oleh OpenVPN.)
derobert

Jawaban:

8

Lalu lintas menuju loantarmuka.

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:

ip route show table local

Yang pada sistem saya terlihat seperti ini:

local 10.230.134.38 dev tun0  proto kernel  scope host  src 10.230.134.38 
broadcast 10.230.134.38 dev tun0  proto kernel  scope link  src 10.230.134.38 
broadcast 127.0.0.0 dev lo  proto kernel  scope link  src 127.0.0.1 
local 127.0.0.0/8 dev lo  proto kernel  scope host  src 127.0.0.1 
local 127.0.0.1 dev lo  proto kernel  scope host  src 127.0.0.1 
broadcast 127.255.255.255 dev lo  proto kernel  scope link  src 127.0.0.1 
broadcast 172.17.0.0 dev docker0  proto kernel  scope link  src 172.17.42.1 
local 172.17.42.1 dev docker0  proto kernel  scope host  src 172.17.42.1 
broadcast 172.17.255.255 dev docker0  proto kernel  scope link  src 172.17.42.1 
broadcast 192.168.0.0 dev enp6s0  proto kernel  scope link  src 192.168.0.20 
local 192.168.0.20 dev enp6s0  proto kernel  scope host  src 192.168.0.20 
broadcast 192.168.0.255 dev enp6s0  proto kernel  scope link  src 192.168.0.20 

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.1atau 192.168.0.20, lalu lintas akan bisa disalurkan melalui antarmuka loopback, meskipun IP tersebut benar-benar pada antarmuka yang berbeda.

Patrick
sumber
1

Anda dapat menggunakan tcpdumpantarmuka apa saja di host ( tcpdump -i any ...)

Charles nakhel
sumber
0

Ini harus dimungkinkan dengan menjalankan sistem kedua (bahkan mungkin VM di host itu).

Anda dapat menggunakan DNATdalam OUTGOINGrantai dari natmeja dan mengarahkan paket ke sebuah antarmuka kernel tidak mengontrol. Anda harus merefleksikannya di sana:

iptables -t nat -A OUTPUT -p tcp -d 99.99.99.1 --dport 2048 \
  -j DNAT --to-destination 1.2.3.4
Hauke ​​Laging
sumber