Jestem totalnym noobem, to mój pierwszy eksperyment z siecią jądra. Próbuję utworzyć pomost między dwoma tap
interfejsami i staram się przesyłać ruch. To bardziej eksperyment niż jakikolwiek konkretny cel.
$ brctl showstp br0
br0
bridge id 8000.46846e0c0ff9
designated root 8000.46846e0c0ff9
root port 0 path cost 0
max age 20.00 bridge max age 20.00
hello time 2.00 bridge hello time 2.00
forward delay 15.00 bridge forward delay 15.00
ageing time 300.00
hello timer 1.98 tcn timer 0.00
topology change timer 0.00 gc timer 115.04
flags
tap1 (1)
port id 8001 state forwarding
designated root 8000.46846e0c0ff9 path cost 100
designated bridge 8000.46846e0c0ff9 message age timer 0.00
designated port 8001 forward delay timer 10.34
designated cost 0 hold timer 0.98
flags
tap2 (2)
port id 8002 state forwarding
designated root 8000.46846e0c0ff9 path cost 100
designated bridge 8000.46846e0c0ff9 message age timer 0.00
designated port 8002 forward delay timer 0.00
designated cost 0 hold timer 0.98
flags
Mam br0
utworzony most , z jednym tap1
i tap2
drugim. Mam program wstrzykujący pakiety ARP do tap1
używania libpcap
. Wireshark poprawnie pokazuje wchodzące pakiety tap1
. Jednak żaden pakiet nie pojawia się w tap2
. Próbowałem dodać regułę śledzenia w ebtables:
sudo ebtables -I INPUT --log --log-level debug
W dziennikach nie pojawiają się żadne pakiety. Będę wdzięczny za wszelkie dane wejściowe.
EDYCJA: Dodawanie dodatkowych informacji. Aplikowanie fałszywych pakietów jest rzeczywiście aplikacją. Moim zamiarem jest symulacja, w pełni programowo i bez maszyn wirtualnych, w jaki sposób pakiety są przekazywane przez stos jądra Linuksa. Nie tworzę żadnych nowych sieciowych nazw. Być może to jest problem?
Mam tylko dwa procesy. Proces „odczytu” ma otwarty deskryptor pliku tap2
i stale próbuje z niego czytać. Proces zapisu ma otwarty deskryptor pliku tap1
i czeka na monit użytkownika o wysłanie zapytania ARP. Zapytanie ARP ma losowy źródłowy adres IP. Źródłowy adres MAC jest ustawiony jako adres MAC tap1
. Oto wynik działania tcpdump:
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tap1, link-type EN10MB (Ethernet), capture size 262144 bytes
^[[A07:19:57.752990 ARP, Request who-has google-public-dns-a.google.com tell 0.0.248.17, length 28
0x0000: ffff ffff ffff ba9c 0589 16ad 0806 0001
0x0010: 0800 0604 0001 ba9c 0589 16ad 0000 f811
0x0020: 0000 0000 0000 0808 0808
Skonfigurowałem tap1
i tap2
nie mam adresów IP. Czy to może być problem?
brctl addbr br0
ip tuntap add name tap1 mode tap
ip tuntap add name tap2 mode tap
brctl addif br0 tap1
brctl addif br0 tap2
ifconfig tap1 0.0.0.0 up
ifconfig tap2 0.0.0.0 up
ifconfig br0 10.0.1.1 netmask 255.255.255.0 broadcast 10.0.1.255
ip link set br0 up
ip link set tap1 up
ip link set tap2 up
Na podstawie odpowiedzi sprawdziłem dołączanie różnych aplikacji do tap2
. Zauważam to: gdy żadna aplikacja nie używa tap1
lub tap2
, oba interfejsy nie mają ustawionej flagi LOWER_UP.
4: br0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN mode DEFAULT group default
link/ether 46:84:6e:0c:0f:f9 brd ff:ff:ff:ff:ff:ff
25: tap1: <NO-CARRIER,BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN mode DEFAULT group default qlen 500
link/ether ba:9c:05:89:16:ad brd ff:ff:ff:ff:ff:ff
26: tap2: <NO-CARRIER,BROADCAST,MULTICAST,PROMISC,UP> mtu 1500 qdisc pfifo_fast master br0 state DOWN mode DEFAULT group default qlen 500
Kiedy uruchamiam aplikacje, flaga LOWER_UP zostaje ustawiona:
4: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP mode DEFAULT group default
link/ether 46:84:6e:0c:0f:f9 brd ff:ff:ff:ff:ff:ff
25: tap1: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP mode DEFAULT group default qlen 500
link/ether ba:9c:05:89:16:ad brd ff:ff:ff:ff:ff:ff
26: tap2: <BROADCAST,MULTICAST,PROMISC,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast master br0 state UP mode DEFAULT group default qlen 500
link/ether 46:84:6e:0c:0f:f9 brd ff:ff:ff:ff:ff:ff
Przykro mi, że okazuje się to zbyt długie, mam tylko nadzieję, że jest wystarczająco dużo informacji, aby zrozumieć problem.
źródło
tap2
korzysta z aplikacji, ale nietap1
. Za każdym razem, gdy aplikacja łączy się z interfejsem, ustawiana jest LOWER_UP. Czy to wskazuje na problem?Walczyłem z tym bardzo i myślę, że znalazłem rozwiązanie. A przynajmniej lepsze zrozumienie tego, co się dzieje.
Należy pamiętać, że jedynym sposobem dostarczenia pakietu do interfejsu zaczepów po stronie odbierającej („RX”) jest zapisanie tego pakietu w deskryptorze gniazda utworzonym przez proces, który otworzył zaczep (przez
open("/dev/net/tun",...)
iioctl
). Tylko jeden proces może mieć jednocześnie ten deskryptor pliku. Jeśli urządzenie z kranem jest otwarte, a inny proces próbuje ponownie otworzyć inne urządzenie z kranem o tej samej nazwie, to połączenie systemowe nie powiedzie się.Więc kiedy masz jakikolwiek inny proces, jak Wireshark, otwierając gniazdo surowy a następnie wiązanie że do
tap0
, jest zdolny tylko pisać ruch z systemu (z punktu widzenia jądra). Oznacza to, że wireshark powinien obijaćTX
liczniktap0
i tylkoRX
pakiety będą przekazywane do mostkowanego interfejsu.Możesz sprawdzić liczniki dla każdego z nich:
który wyprowadza coś takiego:
Podejrzewam, że w twoim konkretnym przypadku problem jest następujący:
Jak wstrzykujesz pakiety ARP do tap1? Zakładam Wireshark nie dzwoni
fd = open("/dev/net/tun", ...)
iioctl(fd, TUNSETIFF, ...)
tak pakiety wysyłane będą TX, a zatem nie mostkiem.Będziesz potrzebował programu, który otworzy się,
tap0
aby zapisać pakiety dotap0
deskryptora pliku, aby pakiety te były przekazywanebr0
i wyświetlane natap1
.źródło