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ó tcpdump
nhưng không có iptables
và 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 tap0
giao 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ị tcpdump
nhưng bị mất).
Một quan sát khác: ifconfig tap0
cho 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 tap0
vớ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 tap0
với tcpdump
như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?
-m physdev
thườ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ù.
nicserver
sử dụng eth0
, thậm chí tcpdump
khô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 tcpdump
trên tap0
và không bằng iptables
.
tcpdump
với -p
, tcpdump
vẫn có thể thấy các gói? (-p hạn chế tcpdump
đặt giao diện ở chế độ lăng nhăng.) Vì iptables
khô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ì iptables
nhìn thấy.
iptables -A INPUT -p udp --dport 67 -m physdev --physdev-in tap+ -j LOG --log-level 4 --log-prefix "[in=tap0] "