Làm thế nào để một lưu lượng truy cập trên các giao diện ảo?


12

Tôi muốn nắm bắt lưu lượng trên các giao diện ảo của Linux, cho mục đích gỡ lỗi. Tôi đã được thử nghiệm với veth, tundummygiao diện loại; trên cả ba, tôi gặp khó khăn tcpdumpđể hiển thị bất cứ điều gì.

Đây là cách tôi thiết lập giao diện giả:

ip link add dummy10 type dummy
ip addr add 99.99.99.1 dev dummy10
ip link set dummy10 up

Trong một thiết bị đầu cuối, xem nó với tcpdump:

tcpdump -i dummy10

Trong một giây, lắng nghe nó với nc:

nc -l 99.99.99.1 2048

Trong một phần ba, thực hiện một yêu cầu HTTP với curl:

curl http://99.99.99.1:2048/

Mặc dù trong thiết bị đầu cuối 2 chúng ta có thể thấy dữ liệu từ curlyêu cầu, không có gì hiển thị từ đó tcpdump.

Một Tun / Tập hướng dẫn làm rõ một số tình huống mà hạt nhân có thể không thực sự gửi bất kỳ gói dữ liệu khi một đang hoạt động trên một giao diện địa phương:

Nhìn vào đầu ra của tshark, chúng ta thấy ... không có gì. Không có lưu lượng truy cập thông qua giao diện. Điều này là chính xác: vì chúng tôi ping địa chỉ IP của giao diện, hệ điều hành quyết định chính xác rằng không có gói nào cần được gửi "trên dây" và chính hạt nhân đang trả lời các ping này. Nếu bạn nghĩ về nó, đó chính xác là điều sẽ xảy ra nếu bạn ping địa chỉ IP của giao diện khác (ví dụ eth0): không có gói tin nào được gửi đi. Điều này nghe có vẻ rõ ràng, nhưng có thể là một nguồn gây nhầm lẫn lúc đầu (nó là cho tôi).

Tuy nhiên, thật khó để thấy điều này có thể áp dụng cho các gói dữ liệu TCP.

Có lẽ tcpdumpnên bị ràng buộc với giao diện một cách khác?


Không chắc tại sao khó thấy điều đó xảy ra với các gói TCP. Giống như ping, chúng được xử lý trong kernel. Điều tương tự đang xảy ra.
derobert

@derobert Trong trường hợp ping, kernel có thể đáp ứng. Trong trường hợp các gói dữ liệu, tôi khá tưởng tượng rằng họ sẽ phải "lướt qua" giao diện để ứng dụng có thể phản hồi lại chúng.
solidsnack

1
Các ứng dụng nói với kernel bằng cách đọc, ghi, v.v. Nhiều ứng dụng mạng thậm chí không cần phải biết rằng các giao diện tồn tại. Để có được lưu lượng truy cập đi qua một trong số chúng, kernel cần phải xem nó là không cục bộ. Ví dụ: thiết lập một đường hầm OpenVPN, sau đó bạn có thể nắm bắt lưu lượng truy cập đi qua tun0. (Tất nhiên, tun0 là một cách đặc biệt để các ứng dụng nói chuyện với kernel, để thực hiện giao diện mạng trong vùng người dùng, đó là những gì OpenVPN làm.)
derobert

Câu trả lời:


8

Giao thông đang đi qua logiao diện.

Khi một IP được thêm vào một hộp, một tuyến đường cho địa chỉ đó sẽ được thêm vào bảng 'cục bộ'. Tất cả các tuyến đường trong bảng này lưu lượng tuyến qua giao diện loopback.

Bạn có thể xem nội dung của bảng 'cục bộ' như sau:

ip route show table local

Mà trên hệ thống của tôi trông như thế này:

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 

Vì vậy, về cơ bản nếu tôi gửi bất kỳ lưu lượng đến 10.230.134.38, 127.0.0.0/8, 127.0.0.1(không cần thiết) , 172.17.42.1hoặc 192.168.0.20, lưu lượng sẽ được chuyển qua giao diện loopback, mặc dù những IP thực sự trên một giao diện khác nhau.


1

Bạn có thể sử dụng tcpdumpvới bất kỳ giao diện nào trên máy chủ ( tcpdump -i any ...)


0

Điều này có thể được thực hiện bằng cách gọi một hệ thống thứ hai (thậm chí có thể là VM trên máy chủ đó).

Bạn có thể sử dụng DNATtrong OUTGOINGchuỗi của natbảng và chuyển hướng các gói đến một giao diện mà kernel không điều khiển. Bạn phải phản ánh chúng ở đó:

iptables -t nat -A OUTPUT -p tcp -d 99.99.99.1 --dport 2048 \
  -j DNAT --to-destination 1.2.3.4
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.