Puncte:1

Preveniți rutarea traficului DHCP

drapel ng

În primul rând, sunt conștient că întrebări similare cu ale mele au fost puse în altă parte (am citit multe dintre aceste postări!), dar nu am reușit să găsesc o soluție la problema mea, așa că cer ajutor.

Configurația mea

Am două rețele pe LAN, 192.168.0.0/24 și 10.11.12.0/24. Primul are DHCP care rulează pe routerul meu WAN, cel de-al doilea rulează dnsmasq pe Ubuntu Server 20.04 pe o cutie care servește și ca router între cele două subrețele. Am configurat dnsmasq să servească numai DHCP în rețeaua 10.11.12.0/24 cu opțiunea no-dhcp-interface=wlp3s0, wlp3s0 fiind interfața pe partea 192.168.0.0/24.

A sumariza:

Routerul WAN (gateway la WAN) este 192.168.0.1/24
  Rulează DHCP pentru clienți pe 192.168.0.0/24

Router (subrețele alb/n):
  Ubuntu Server 20.04 cu două interfețe
    wlp3s0: 192.168.0.2/24 (IP static)
    eno1: 10.11.12.1/24 (IP static)

Am configurat iptables la FWD și NAT așa.

iptables -t nat -A POSTROUTING -o wlp3s0 -j ​​MASQUERADE  
iptables -A FORWARD -i wlp3s0 -o eno1 -m stat --state RELATED,STABLISHED -j ACCEPT  
iptables -A FORWARD -i eno1 -o wlp3s0 -j ​​ACCEPT

Am permis DHCP prin firewall-ul meu cu ufw permit 67/udp:

La Acțiune De la
-- ------ ----
67/udp PERMITERE PENTRU Oriunde

Totul pare să funcționeze bine. Cu toate acestea, din experiență știu că rularea a două servere DHCP ca acesta poate provoca conflicte dacă nu sunt păstrate strict separate. (Clienții destinați rețelei 192.168.0.0/24 nu ar fi prea încântați dacă DHCP le-ar da o adresă IP în rețeaua 10.11.12.0/24!)

Descoperirea problemei

Așa că am făcut următoarele pentru a-l testa.Am configurat o ascultare tcpdump pe interfața wlp3s0 (192.168.0.2) și am folosit nmap pentru a simula o solicitare DHCP Discover care provine de pe interfața eno1 (10.11.12.1/24), așa:

sudo tcpdump -i wlp3s0 -n udp portul 67 sau portul 68

sudo nmap --script broadcast-dhcp-discover -e eno1

După cum era de așteptat, primesc o ofertă DHCP de la dnsmasq care rulează pe 10.11.12.1. Până acum, bine!

Unele detalii au fost omise din rezultat pentru concizie (a spus el)

Începând cu Nmap 7.80 ( https://nmap.org ) la 22/12/2021 16:19 UTC
Rezultatele scriptului pre-scanare:
| broadcast-dhcp-discover:
| Răspunsul 1 din 1:
| IP oferit: 10.11.12.53
| Tip mesaj DHCP: DHCPOFFER
| Identificator de server: 10.11.12.1
| Adresa de difuzare: 10.11.12.255
| Mască de subrețea: 255.255.255.0
| Server de nume de domeniu: 10.11.12.1
|_ Router: 10.11.12.1

Cu toate acestea, tcpdump arată că ambele servere DHCP răspund la cererea de descoperire. (De fapt, routerul meu WAN trimite 2 răspunsuri!)

16:19:43.517029 IP 10.11.12.1.68 > 255.255.255.255.67: BOOTP/DHCP, Solicitare de la de:ad:c0:de:ca:fe, lungime 316
16:19:46.486227 IP 10.11.12.1.67 > 255.255.255.255.68: BOOTP/DHCP, Răspuns, lungime 321
16:19:46.794207 IP 192.168.0.1.67 > 255.255.255.255.68: BOOTP/DHCP, Răspuns, lungime 323
16:19:46.794207 IP 192.168.0.1.67 > 255.255.255.255.68: BOOTP/DHCP, Răspuns, lungime 323

Se pare că cererea de descoperire DHCP este redirecționată către rețeaua 192.168.0.0/24 prin interfața wlp3s0. Privind la iptables și la regulile mele de firewall, nu văd niciun motiv să fiu surprins de asta. Cu toate acestea, ceea ce mă lupt cu adevărat este să îmi dau seama cum să o prevenim.

Ceea ce am incercat

Am încercat diverse permutări ale regulilor atât în ​​ufw, cât și în iptables, dar fără rezultat, probabil pentru că nu înțeleg pe deplin nici iptables, nici ufw. Câteva exemple din ceea ce am încercat:

(Toate regulile ufw/iptables au fost adăugate în partea de sus a setului de reguli/lanțului respectiv pentru a se asigura că au fost atinse.)

ufw:

# Limitați 67/udp la o singură interfață
ufw permite accesul pe eno1 proto udp de la 0.0.0.0/0 la 0.0.0.0/0 portul 67

# Respinge rutarea
ufw route deny in on eno1 out on wlp3s0 to 0.0.0.0/0 port 67 proto udp

iptables:

# Preveniți redirecționarea portului UDP 67/68
iptables -I FORWARD 1 -p udp --match multiport --dports 67,68 -j DROP

# Renunțați la portul UDP 67 de ieșire
iptables -I OUTPUT 1 -p udp --match multiport --dports 67,68 -o wlp3s0 -j ​​DROP

Trebuie să lipsesc o înțelegere fundamentală a modului în care funcționează acest lucru, deoarece niciuna dintre cele de mai sus nu împiedică routerul WAN DHCP să primească descoperirea și să ofere un IP pe subrețeaua 192.168.0.0/24.

Am citit undeva că serverele DHCP pot asculta pe un socket brut (sau pachet?), care nu este supus iptables. Acesta nu este cazul cu dnsmasq, așa cum este documentat aici https://github.com/imp/dnsmasq/blob/master/FAQ#L195. De asemenea, am demonstrat că ștergând regula allow 67/udp în ufw, după care dnsmasq nu mai răspunde la descoperirea DHCP. Poate în mod surprinzător (sau nu), chiar și cu regula de autorizare ștearsă în ufw, routerul meu WAN continuă să primească și să răspundă la descoperirea DHCP. Probabil pentru că am reguli iptables configurate pentru a redirecționa tot traficul, dar nicio regulă INPUT echivalentă (până când adaug una folosind ufw).

Ce aș dori să obțin

De preferință, aș dori să împiedic ca difuzarea de descoperire DHCP în rețeaua 10.11.12.0/24 să ajungă chiar și la rețeaua 192.168.0.0/24.

Dacă acest lucru se dovedește dificil, aș fi bucuros să împiedic doar ofertele DHCP de la routerul meu WAN să ajungă în rețeaua 10.11.12.0/24.

Rețineți că nu am nicio problemă în rețeaua 192.168.0.0/24, deoarece am configurat dnsmasq să nu ofere DHCP pe interfața wlp3s0 (192.168.0.2). Se pare că funcționează și DHCP Discover pe wlp3s0 (192.168.0.2/24) nu primește un răspuns de la dnsmasq.

Deci ce îmi lipsește? Merg cu totul greșit sau pur și simplu nu înțeleg bine? Orice ajutor este mult apreciat.

Sărbători fericite!

Actualizați

Ca răspuns la o întrebare din comentariile de la @sleepyhead, iată configurarea mea pentru iptables nat.

PRERUUTARE în lanț (politica ACCEPTĂ 13452 pachete, 4312K octeți)
 pkts bytes target prot opt ​​in out source destination

INTRARE în lanț (politica ACCEPTĂ 48 de pachete, 12715 octeți)
 pkts bytes target prot opt ​​in out source destination

IEȘIRE în lanț (politica ACCEPTĂ 87 pachete, 10884 octeți)
 pkts bytes target prot opt ​​in out source destination

POSTROUTING în lanț (politica ACCEPTĂ 55 de pachete, 8622 de octeți)
 pkts bytes target prot opt ​​in out source destination
   32 2262 MASQUERADE toate -- * wlp3s0 0.0.0.0/0 0.0.0.0/0

Actualizare 2

Este posibil ca acesta să fie un artefact al modului în care îmi conduc testul? Ceea ce mă face suspect este IP-ul sursă al ieșirii tcpdump. Ar putea fi faptul că rularea DHCP Discover pe o interfață care are deja un IP să producă un rezultat diferit decât dacă nu ar avea-o? Oricum, dacă pot reutiliza unul dintre Raspberry Pis-ul meu, voi rula acest test cu el ca client DHCP și voi vedea dacă obțin aceeași ieșire, deși bănuiesc că o voi face.

drapel ru
Ceea ce trebuie să faceți este să dezactivați unul dintre serverele DHCP și să utilizați un mecanism DHCP Relay pentru a retransmite DHCP de la o rețea la alta. Singura modalitate de a face acest lucru este cu NAT-ul specializat, care poate fi problematic sau configurarea releelor ​​DHCP pe segmentele rețelei pe care *doriți* să nu aveți un server DHCP și să le transmiteți la un alt server DHCP. Apropo, așa se face în lumea normală când aveți un server DHCP pe o subrețea diferită de rețeaua pentru care faceți DHCP.
sleepyhead avatar
drapel in
Cele 2 răspunsuri pe care le vezi de la routerul wan sunt aceleași, vezi cele de intrare și de ieșire, cumva interfețele tale par conectate, pentru că o difuzare la 255.255.255.255 nu ar trebui să depășească limitele rețelei, dar a ta face. Dacă păstrați bridge-ul, trebuie să faceți firewall L2 cu ebtables. Nu lăsați discuția despre socket brută să vă încurce, este mai mult o dezbatere de implementare între sistemele de operare decât descrierea problemei dvs. ``` adresa ip spectacol brctl ``` Acestea vă vor arăta puntea dintre interfețe
drapel ng
Mulțumesc pentru răspuns, dar conform brctl show nu există nicio punte (nu există nicio ieșire de la acea comandă).
drapel ng
Speram să evit asta. Principalul meu motiv pentru care am DHCP secundar este să ofer boot PXE în rețeaua 10.11.12.0. Există, de asemenea, complicația suplimentară că interfața wi-fi de pe acea cutie este destul de slabă, așa că nu aș vrea să mă bazez pe ea pentru a oferi servicii DHCP pentru rețeaua mea principală (192). În cel mai rău caz, aș putea scăpa de ceea ce am, deoarece pare să existe un decalaj suficient între cele două oferte DHCP, încât DHCP-ul meu preferat pare să câștige întotdeauna (?) în rețeaua 10.11.12.0, iar rețeaua 192.168.0.0 are nici un conflict cu configurația mea.
sleepyhead avatar
drapel in
Dacă nu este o punte, atunci traficul este eliminat cumva, inclusiv transmisiunile, asta ar trebui să scadă, puteți posta ieșirea iptables? iptable -L v -n -t nat
drapel ng
Am adăugat rezultatul la întrebarea mea de mai sus, mulțumesc.
Puncte:0
drapel ng

All sorted, @sleepyhead was onto something about the routing but the issue was much more mundane (or idiotic!) than bridged interfaces etc. There's a switch on the 10.11.12.0/24 network and it turns out I'd left a cable in it that was connected to one of my mesh routers! So there were in fact two routes out of the box to the 192.168.0.0/24 network, one via the wlp3s0 interface (correctly blocked in iptables) and another out via eno1, which obviously was open. This explains why I kept receiving responses from the WAN router and also, I think, why they were duplicated.

Well, blunders aside I hope this will be helpful to someone given how many questions are asked about DHCP and routing.

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.