Ein Programm fügt Pakete in eine Linux- TAP- Schnittstelle ein (diese Pakete stammen von einer virtuellen Maschine). Dies sind insbesondere DHCP-Anforderungen (also UDP). Ich kann die Pakete mit, tcpdump
aber nicht mit sehen iptables
und sie erreichen auch nicht den lokalen DHCP-Server. Warum nicht und wie behebe ich das?
Update : Ich habe versucht, IP-Pakete zu injizieren, die an die Adresse der tap0
Schnittstelle gerichtet sind. Ich sehe die ARP-Anforderungen, die von der VM eingehen tcpdump -i tap0
, aber die Netzwerkschicht antwortet nicht. Wenn ich ARP-Anforderungen an die VM sende, werden diese angezeigt und Antworten an den Host gesendet (und die Antworten werden in angezeigt, gehen tcpdump
aber ansonsten verloren).
Eine weitere Beobachtung: ifconfig tap0
zeigt, dass die Anzahl der gesendeten TX-Pakete für jedes Paket, das auf den Host injiziert wird, erhöht wird. Warum 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)
Die lange Geschichte: Auf einem Linux-Host (unter Ubuntu 10.04) verwende ich eine virtuelle Maschine, die unter anderem eine Ethernet-Karte emuliert. Dies geschieht durch die Kommunikation mit einem Hilfsprogramm, das für das Injizieren und Erfassen von Ethernet-Paketen auf dem Netzwerkstapel des Hosts zuständig ist. Die virtuelle Maschine ist ein ARM-Chip-Emulator, und das Hilfsprogramm wird aufgerufen nicserver
. Ich weiß nur, was in der ARM-Dokumentation zu finden ist .
Ich möchte eine Ethernet-Verbindung zwischen der VM und dem Host herstellen und darüber hinaus eine IP-Verbindung. Die VM erhält ihre IP-Adresse über DHCP. Ich möchte keine Kommunikation zwischen der VM und dem Rest der Welt, nur mit dem Host, also habe ich eine virtuelle Netzwerkschnittstelle tap0
mit erstellt
tunctl -u gilles
ifconfig tap0 192.168.56.1 netmask 255.255.255.0 up
nicserver -p 7801 -a tap0 &
Jetzt starte ich die VM und sehe, dass sie DHCP-Anforderungen mit sendet tcpdump -n -i tap0 -vv
(der DHCP-Client läuft nicht ab, ich zeige hier nur eine Beispielanforderung):
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]
Ich habe Dnsmasq auf dem Host eingerichtet, um die Anforderungen zu bearbeiten, aber es werden keine eingehenden Anforderungen angezeigt. Der Dnsmasq-Server sieht nicht einmal die eingehenden Anfragen (ich habe es gespannt). Also habe ich versucht, die Pakete mit Iptables zu beobachten. (Alle Filter- / INPUT-Regeln werden angezeigt; es gibt keine Mangle- oder Nat-Regeln.)
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
Alle diese eingehenden DHCP-Anfragen sind aktiviert eth1
(und ich achte darauf, diese nicht zu ignorieren, um meine Kollegen und meinen Netzwerkadministrator nicht zu verärgern). Diese UDP-Pakete tap0
stammen vom lokalen Samba-Server. Die DHCP-Anforderungspakete, die ich mit tcpdump sehe, scheinen den Paketfilter nicht zu durchlaufen!
Warum sehe ich eingehende Broadcast-Pakete tap0
mit, tcpdump
aber nicht mit iptables
(oder mit Programmen, die auf dem Computer abhören)? Und was muss ich reparieren, damit diese Pakete so angezeigt werden, als würden sie über eine Ethernet-Schnittstelle übertragen?
-m physdev
wird normalerweise mit Bridges und Tap-Schnittstellen verwendet. Ich weiß, dass Sie nicht versuchen, die Tap-Schnittstelle mit Ihrem Eth zu verbinden, aber ich frage mich, ob die Verwendung von physdev zur Anpassung an die Schnittstelle den Datenverkehr irgendwie ändert, um sie sichtbar zu machen. Ich habe jedoch keine Ahnung, ob es funktionieren oder etwas ändern wird.
nicserver
, dass ich sie verwenden soll eth0
, werden sogar tcpdump
keine Pakete angezeigt . Dies könnte ein Problem sein nicserver
, aber ich möchte immer noch wissen, wie Pakete von tcpdump
on tap0
und nicht von gesehen werden können iptables
.
tcpdump
mit -p
, kann tcpdump
immer noch die Pakete sehen? (-p beschränkt das tcpdump
Versetzen der Benutzeroberfläche in den Promiscuous-Modus.) Da iptables
die Benutzeroberfläche nicht in den Promiscuous-Modus versetzt wird, erhalten Sie einen genaueren Vergleich mit dem, was iptables
angezeigt wird.
iptables -A INPUT -p udp --dport 67 -m physdev --physdev-in tap+ -j LOG --log-level 4 --log-prefix "[in=tap0] "