Tại sao các gói đến trên giao diện TAP được nhìn thấy với tcpdump nhưng không phải với iptables?


7

Một chương trình tiêm các gói trên giao diện Linux TAP (các gói này đến từ một máy ảo). Cụ thể, đây là các yêu cầu DHCP (vì vậy chúng là UDP). Tôi có thể thấy các gói có tcpdumpnhưng không có iptablesvà chúng cũng không đến được máy chủ DHCP cục bộ. Tại sao không, và làm thế nào để tôi sửa nó?

Cập nhật : Tôi đã thử tiêm các gói IP hướng đến địa chỉ của tap0giao diện. Tôi thấy các yêu cầu ARP đến từ VM tcpdump -i tap0, nhưng lớp mạng không trả lời. Nếu tôi gửi các yêu cầu ARP đến VM, nó sẽ thấy chúng và trả lời cho máy chủ lưu trữ (và các phản hồi hiển thị tcpdumpnhưng bị mất).

Một quan sát khác: ifconfig tap0cho thấy số lượng gói tin bị giảm TX được tăng lên cho mỗi gói được tiêm vào máy chủ. Tại sao TX?

# ifconfig tap0
…
          TX packets:0 errors:0 dropped:958 overruns:0 carrier:0
          collisions:0 txqueuelen:500
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

Câu chuyện dài: Trên máy chủ Linux (chạy Ubuntu 10.04), tôi đang chạy một máy ảo, trong số những thứ khác mô phỏng thẻ Ethernet. Nó làm như vậy bằng cách liên lạc với một chương trình trợ giúp chịu trách nhiệm tiêm và bắt các gói Ethernet vào ngăn xếp mạng của máy chủ. Máy ảo là một trình giả lập chip ARM và chương trình trợ giúp được gọi nicserver; tất cả những gì tôi biết về nó là những gì được tìm thấy trong tài liệu ARM .

Tôi muốn thiết lập một liên kết Ethernet giữa VM và máy chủ, và ở trên tôi muốn có một liên kết IP. VM có được địa chỉ IP của nó qua DHCP. Tôi không muốn bất kỳ giao tiếp nào giữa VM và phần còn lại của thế giới, chỉ với máy chủ, vì vậy tôi đã tạo một giao diện mạng ảo tap0với

tunctl -u gilles
ifconfig tap0 192.168.56.1 netmask 255.255.255.0 up
nicserver -p 7801 -a tap0 &

Bây giờ tôi khởi động VM và tôi có thể thấy nó đang gửi các yêu cầu DHCP với tcpdump -n -i tap0 -vv(máy khách DHCP không hết thời gian, tôi chỉ hiển thị một yêu cầu mẫu ở đây):

tcpdump: listening on tap0, link-type EN10MB (Ethernet), capture size 96 bytes
18:29:23.941574 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto UDP (17), length 576)
    0.0.0.0.68 > 255.255.255.255.67: [no cksum] BOOTP/DHCP, Request from 02:52:56:47:50:03, length 548, xid 0x238a7979, secs 46, Flags [none] (0x0000)
          Client-Ethernet-Address 02:52:56:47:50:03 [|bootp]

Tôi đã thiết lập Dnsmasq trên máy chủ để phục vụ các yêu cầu, nhưng nó không thấy bất kỳ yêu cầu đến nào. Máy chủ Dnsmasq thậm chí không nhìn thấy các yêu cầu đến (tôi đã thực hiện theo yêu cầu). Vì vậy, tôi đã cố gắng quan sát các gói với Iptables. (Tất cả các quy tắc bộ lọc / INPUT được hiển thị; không có quy tắc mangle hoặc nat).

Chain INPUT (policy ACCEPT 2366K packets, 5334M bytes)
 pkts bytes target     prot opt in     out     source               destination 
  119 39176 LOG        udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:67 LOG flags 4 level 4 prefix `[DHCP request] '
  119 39176 DROP       udp  --  eth1   *       0.0.0.0/0            0.0.0.0/0           udp dpt:67
    2   490 LOG        udp  --  tap0   *       0.0.0.0/0            0.0.0.0/0           LOG flags 4 level 4 prefix `[in=tap0] '
   26  6370 ACCEPT     udp  --  tap0   *       0.0.0.0/0            0.0.0.0/0   
    0     0 ACCEPT     all  --  tap0   *       0.0.0.0/0            0.0.0.0/0   
 3864  457K ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0   

Tất cả các yêu cầu DHCP đến này đều được bật eth1(và tôi cẩn thận không bỏ qua những yêu cầu này để không làm phiền các đồng nghiệp và quản trị viên mạng của tôi). Những gói UDP trên tap0đến từ máy chủ Samba cục bộ. Các gói yêu cầu DHCP mà tôi thấy với tcpdump dường như không đi qua bộ lọc gói!

Tại sao tôi thấy các gói tin broadcast đến trên tap0với tcpdumpnhưng không phải với iptables(và cũng không có các chương trình nghe trên máy tính này)? Và tôi cần phải sửa gì để những gói này được nhìn thấy, như chúng sẽ xuất hiện nếu chúng xuất hiện trên giao diện Ethernet?


có thể thử sử dụng idables khớp với Physdev và xem điều đó có thay đổi cách bạn nhìn thấy lưu lượng truy cập không. iptables -A INPUT -p udp --dport 67 -m physdev --physdev-in tap+ -j LOG --log-level 4 --log-prefix "[in=tap0] "
Tim Kennedy

-m physdevthường được sử dụng với cầu và giao diện tap. Tôi biết bạn không cố gắng kết nối giao diện tap với eth của mình, nhưng tôi tự hỏi liệu sử dụng Physdev để khớp với giao diện bằng cách nào đó có làm thay đổi lưu lượng truy cập để hiển thị không? Tôi không biết nếu nó sẽ làm việc, hoặc thay đổi bất cứ điều gì, mặc dù.
Tim Kennedy

@TimKennedy không thay đổi bất cứ điều gì. Kỳ lạ hơn: nếu tôi bảo nicserversử dụng eth0, thậm chí tcpdumpkhông thấy bất kỳ gói tin nào. Đây có thể là một vấn đề với nicserver, nhưng tôi vẫn muốn biết làm thế nào các gói dữ liệu có thể được nhìn thấy bởi tcpdumptrên tap0và không bằng iptables.
Gilles 'SO- ngừng trở nên xấu xa'

1
Nếu bạn chạy tcpdumpvới -p, tcpdumpvẫn có thể thấy các gói? (-p hạn chế tcpdumpđặt giao diện ở chế độ lăng nhăng.) Vì iptableskhông đặt giao diện vào chế độ lăng nhăng, bạn sẽ có được sự so sánh gần hơn với những gì iptablesnhìn thấy.
Tim Kennedy

2
Chèn mục tiêu nhật ký của bạn vào chuỗi prerouting. Tôi cũng đề xuất sơ đồ iptables đẹp trên wikipedia.
artistoex

Câu trả lời:


1

Đây là phỏng đoán thêm. Hy vọng điều này là hữu ích, nhưng nó cũng có thể là sai lầm.

tap0 có hai đầu, kết thúc ngăn xếp mạng kernel và giao diện chương trình. Dường như với tôi nếu bạn cung cấp 'nicserver' với tap0, nó sẽ không gắn với nó theo cách nó được thiết kế với các thiết bị nhấn, sử dụng giao diện chương trình. Thay vào đó, nicserver sẽ chỉ đơn giản là ghi vào nó từ đầu ngăn xếp mạng và không có ứng dụng đọc từ đầu giao diện chương trình, bạn sẽ kết thúc tràn hàng đợi thiết bị. Điều này giải thích các gói bị rơi. Ngoài ra, không có gói nào được gửi, điều này có thể giải thích kết quả iptables.

Tôi đoán nếu bạn để tcpdump chụp trên tap0 thì nó thực sự gắn vào giao diện chương trình của tap0 và, voila, bạn sẽ thấy các gói. Tôi đã tìm kiếm trên internet nhưng không tìm thấy nguồn nào để xác nhận hành vi đó. Để làm sai lệch lý thuyết này, hãy chụp tap0 và xem nó ảnh hưởng đến việc giảm gói tin và nhật ký iptables.

Cuối cùng, một lời khuyên giải quyết vấn đề ban đầu của bạn: thay vì sử dụng thiết bị loopback thì sao? Thích như vậy:

nicserver -p 7801 -a lo
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.