Puncte:0

Dispozitivul cu două atingeri nu poate comunica prin bridge

drapel cn

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:

  1. 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
  1. 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:

  1. Deși numele dispozitivului se numește tun, tipul său este tap
  2. Rulez două coduri de testare simultan, unul connect tun1 și altul connect tun2. Deci două dispozitive sunt în stare LOWBER_UP
A.B avatar
drapel cl
A.B
Vedeți acest Q/A de-al meu: https://serverfault.com/questions/994721/ping-does-not-work-on-tap-interfaces-with-bridge/996479#996479 (După cum știți, aveți nevoie de o aplicație userland , doar o parte din ea este de interes)
Miracle avatar
drapel cn
@A.B Mulțumesc pentru comentariul tău, știu că trebuie să mă ocup singur de protocolul arp. Dar acum, nu pot trimite pachet Ethernet de la tap1 la tap2. Deci nu pot implementa protocolul arp singur.
Miracle avatar
drapel cn
@A.B Care alegere este mai bună printre, atingeți, tun (punct-la-punct), veth (folosind socket brut) dacă vreau să implementez stiva tcp/ip în modul utilizator. Ca ideea mea, am nevoie doar de o modalitate de a scrie direct pachetul Ether pe interfața de rețea, implementarea unui driver de rețea este, evident, foarte complexă și dificilă. Utilizarea tun trebuie, de asemenea, să rezolve politica locală de rută. Ce zici de perechea veth (spațiu de rețea diferit, folosind soclu brut)? Nu știu ce metodă ar trebui să încerc.
Miracle avatar
drapel cn
@A.B Motivația mea este să învăț tcp/ip profund. Mulțumesc frumos, după setări funcționează. Dar nu prea înțeleg de ce trebuie să schimb adresa mac a tun1 f2:6b:68:c9:60:6b->f2:6b:68:c9:60:6c și tun2 46:44:6e:55:9b :c5->46:44:6e:55:9b:c6 . Ambele adrese Mac sunt alocate de sistemul de operare. Dacă trebuie să schimb și adresa de destinație a pachetului Ether? Dacă nu, aceasta va declanșa difuzarea. După cum am înțeles, bridge-ul acționează ca un rol de comutare și poate direcționa pachetul Ether în funcție de adresa mac. Cu toate acestea, în această situație, poate difuza doar pachete.
Puncte:0
drapel cn

Poate am inteles motivul.

Atingeți/Tun conectați stiva de rețea și programul utilizatorului. Programul utilizator poate primi orice date care este scris pe cardul de atingere prin stiva de rețea.

Să presupunem că avem program1 asculta la tap1 (mac1) și program2 ascultă a tap2(mac2).

Dacă programul1 scrie un pachet Ether(src=mac1,dst=mac2) la tap1, stiva de rețea va primi pachetul.Program2 poate primi pachetul numai dacă stiva de rețea scrie pachetul în tap2.

Acest lucru este evident imposibil! Mac-Frame fără funcționalitate de rută. În plus, pachetul aparține gazdei curente.

Cu toate acestea, atunci când scriem un pachet de difuzare, stiva de rețea va redirecționa pachetul către fiecare cartelă de rețea, cu excepția tap1.

Mai sus este doar înțelegerea mea superficială. Nu stiu daca este corect.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.