Vreau să schimb pachetul Ethernet între dispozitivele cu două atingeri (pentru implementarea stivei de protocol TCP/IP în modul utilizator).
Problema pe care am întâlnit-o este că tap1 și tap2 pot primi doar pachetul de difuzare prin bridge, dar nu și pachetul punct la punct!
De exemplu, când trimit pachet de la tap1 la tap2, tcmpdump poate captura pachetul pe tap1, dar tap2 nu poate primi pachetul. Cu toate acestea, când setez adresa de destinație ca „ff:ff:ff:ff:ff:ff” sau orice alt adresă Mac necunoscută (aceasta va fi difuzare de declanșare), tap2 va primi pachetul.
Configurația mea:
- creați un dispozitiv cu două atingeri
ip tuntap add mode tap tun1
ip tuntap add mode tap tun2
# atribuiți adresa IP pentru implementarea protocolului arp
ip addr add 172.19.16.1 dev tun1
ip addr add 172.19.16.2 dev tun2
link-ul ip setați tun1
link-ul ip setați tun2
- creați o punte
brctl addbr br0
brctl addif br0 tun1
brctl addif br0 tun2
linkul ip setat br0
Următoarea este starea interfeței bridge și tap:
macs:
port no mac addr este local? temporizator de îmbătrânire
2 46:44:6e:55:9b:c5 da 0,00
2 46:44:6e:55:9b:c5 da 0,00
1 f2:6b:68:c9:60:6b da 0.00
1 f2:6b:68:c9:60:6b da 0.00
stat:
br0
ID pod 8000.46446e559bc5
rădăcină desemnată 8000.46446e559bc5
Portul rădăcină 0 costul căii 0
varsta max 20,00 pod varsta max 20,00
Hello Time 2.00 bridge Hello Time 2.00
întârziere înainte 15.00 pod întârziere înainte 15.00
timp de îmbătrânire 300,00
salut timer 0.00 tcn timer 0.00
cronometru schimbare topologie 0,00 cronometru gc 89,77
steaguri
tun1 (1)
Port id 8001 redirecționare de stat
rădăcina desemnată 8000.46446e559bc5 calea costă 100
punte desemnată 8000.46446e559bc5 temporizator de vârstă mesaj 0,00
portul desemnat 8001 temporizator de întârziere înainte 0,00
cost desemnat 0 hold timer 0,00
steaguri
tun2 (2)
Port id 8002 redirecționare de stat
rădăcina desemnată 8000.46446e559bc5 calea costă 100
punte desemnată 8000.46446e559bc5 temporizator de vârstă mesaj 0,00
portul desemnat 8002 temporizator de întârziere înainte 0,00
cost desemnat 0 hold timer 0,00
steaguri
Următorul este codul meu de testare:
import fcntl
import os
import if_tun
import ctipuri
import struct
din importul scapy.all *
din if_tun import IfReq, TUNSETIFF, IFF_TUN
def register_tun(nume: str):
fd = os.open("/dev/net/tun",os.O_RDWR)
dacă fd < 0:
return fd
r = IfReq()
ctypes.memset(ctypes.byref(r), 0, ctypes.sizeof(r))
r.ifr_ifru.ifru_flags = 0x0002 | 0x1000
r.ifr_ifrn.ifrn_name = nume.encode("utf-8")
fcntl.ioctl(fd, TUNSETIFF,r)
return fd
if __name__ == "__main__":
nume = input(„nume dispozitiv de intrare”)
fd = register_tun(nume)
dacă fd < 0:
print("eroare")
if name == "tun2":
în timp ce este adevărat:
buf = os.read(fd,1024)
print(f"primiți date {len(buf)}")
Ether(raw(buf)).show()
mac1 = "f2:6b:68:c9:60:6b"
mac2 = "46:44:6e:55:9b:c5"
în timp ce este adevărat:
tip = input()
a = Ether(dst=mac2,src=mac1)/ARP(pdst="172.19.16.1",psrc="172.19.16.2")
un spectacol()
print("scrie:")
print(os.write(fd, raw(a)))
Note:
- Deși numele dispozitivului se numește tun, tipul său este tap
- Rulez două coduri de testare simultan, unul connect tun1 și altul connect tun2. Deci două dispozitive sunt în stare LOWBER_UP