Puncte:-1

De ce nu funcționează această configurare de rutare

drapel cn

Am două interfețe pe mașina server. Ieșirea de ruta ip este urmatorul:

implicit prin 192.168.100.1 dev enp1s0 proto metric static 100
10.8.0.0/24 dev tap0 proto kernel scope link src 10.8.0.1
192.168.100.0/24 dev enp1s0 proto kernel scope link src 192.168.100.201 metric 100

și adresa IP este următorul (MAC-urile sunt ascunse):

...
1: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/eter **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
    inet 192.168.100.201/24 brd 192.168.100.255 scope global noprefixroute enp1s0
       valid_lft pentru totdeauna preferred_lft pentru totdeauna
    inet6 fe80::1409:66c6:eb0d:22a1/64 scope link noprefixroute
       valid_lft pentru totdeauna preferred_lft pentru totdeauna
2: tap0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state NECUNOSCUT grup implicit qlen 100
    link/eter **:**:**:**:**:** brd ff:ff:ff:ff:ff:ff
    inet 10.8.0.1/24 brd 10.8.0.255 scope global tap0
       valid_lft pentru totdeauna preferred_lft pentru totdeauna
    inet6 fe80::85:5fff:fe98:6cb7/64 scope link
       valid_lft pentru totdeauna preferred_lft pentru totdeauna

The /proc/sys/net/ipv4/ip_forward valoarea este 1; firewall-ul este dezactivat.

Ceea ce vreau este să accesez 192.168.100.1 din 10.8.0.100. Accesarea serverului web (care ascultă toate porturile de pe această mașină) prin curl --interfață 10.8.0.100 http://10.8.0.1 Merge bine. Dar curl --interfață 10.8.0.100 http://192.168.100.201 ieșirea este Rețeaua inaccesibilă.

Curl inițiază o strângere de mână tcp și împinge pachetul la 10.8.0.100 interfață. Pachetul ajunge apoi la serverul pornit 10.8.0.1. Serverul se uită în pachetul de destinație și vede că este 192.168.100.201. Apoi se uită în tabelul de rutare și vede asta 192.168.100.201 este local. Acum răspunsul se întoarce. Expeditorul a fost 10.8.0.100. Privind la tabelul de rutare, putem constata că este accesibil prin intermediul atinge 0, care este local. Deci acum împinge în atinge 0 și ajunge la 10.8.0.100.

Dar de fapt - nu este. Să fie asta pentru că gândurile mele sunt greșite? Am crezut că informațiile furnizate de tabelul descris sunt suficiente pentru a determina cum să trimită pachetele. Este chiar acesta incomplet?

Puncte:1
drapel np

În primul rând, furnizarea adresei IP și a interfeței cu parametrul -I către ping nu sunt sinonime. Mai întâi spune care IP sursă a ridica. Îl va direcționa în funcție de fluxul net, inclusiv adresele locale și tabelele de rutare. Al doilea vă spune să alegeți direct interfața către care să trimiteți pachetul (și va alege primul IP alocat ca sursă).

În continuare, ceea ce faci nu are nimic de-a face cu redirecționarea pachetelor. Redirecționarea înseamnă că pachetul trebuie să sosească efectiv din „exterior”. Pe măsură ce generați un pachet de la această gazdă, nu este implicată nicio redirecționare. Este un pachet generat local. Întrucât IP-ul dvs. de destinație este una dintre adresele atribuite local atunci când nu forțați ping-ul să trimită pachetul către o interfață specifică „din exterior” (cu -I interfață opțiunea) nucleul va procesa acest flux de pachete intern. Pur și simplu nu va încerca să-l scoată la o interfață reală, deoarece destinația este „deja aici”. Deci asta se întâmplă și de ce funcționează într-un caz și nu în altul.

PS: Verificați și -r opțiunea de ping instrument în cazul în care știi că faci și ambele interfețe sunt atașate la același domeniu de difuzare (mă îndoiesc de acest lucru cu interfața TAP).

Maxim Khokhryakov avatar
drapel cn
Ceea ce vreau cu adevărat este să accesez `192.168.100.1` de la `10.8.0.100` Deci ruta va fi următoarea: 10.8.0.100 --ip--> 10.8.0.1 --kernel-->192.168.100.201-->ip --> 192.168.100.1.
drapel np
Apoi trebuie să adăugați o rută pe `10.8.0.100` la `192.168.100.0/24` prin `10.8.0.1` (routerul dvs.) și o rută similară înapoi pe `192.168.100.1`. Și ping de acolo (`10.8.0.100`). Ceea ce încerci să faci acum este să ping router de la router.
Maxim Khokhryakov avatar
drapel cn
problema este că nu pot adăuga nicio rută pe 192.168.100.1. Și problema mai importantă este că nu înțeleg de ce această configurație nu funcționează. Să executăm această comandă pe 10.8.0.100: `ping -I 10.8.0.100 192.168.100.201`. Acest lucru ar trebui să creeze un pachet ICMP, să-l împingă la interfața 10.8.0.100 și să-l livreze la 10.8.0.1. 10.8.0.1 ar trebui să îl redirecționeze la 192.168.100.201 (pentru că ambii sunt pe aceeași mașină). Dar nu este! `ping -I 10.8.0.100 10.8.0.1` funcționează bine, deci problema se află cu siguranță între 10.8.0.1 și 192.168.100.201, adică în tabelul de rutare.
drapel np
@MaximKhokhryakov `10.8.0.100` are `10.8.0.1` ca traseu implicit? Nu ai menționat-o. „10.8.0.1 ar trebui să îl redirecționeze la 192.168.100.201 (pentru că ambii sunt pe aceeași mașină)” - nu este o redirecționare așa cum am spus deja. Problema este că pachetul ajunge la mașină pe interfața `tap0`, în timp ce IP-ul de destinație este pe `enp1s0`. Cel mai probabil, nucleul elimină acele pachete din cauza `rp_filter`. Încercați să-l dezactivați făcând `sysctl -w 'net.ipv4.conf.all.rp_filter=0'`
drapel np
@MaximKhokhryakov, de asemenea, `192.168.100.1` are `192.168.100.201` listat ca gateway? Dacă nu, trebuie să configurați NAT pe `192.168.100.201` sau nu veți putea ajunge la `192.168.100.1` din `10.8.0.1`, deoarece mai întâi nu veți ști cum să direcționați pachetele înapoi la 10.8. .0.0/24.
drapel np
De asemenea, puteți încerca să faceți `ping -r -I 10.8.0.100 192.168.100.201` din `10.8.0.100`.
Puncte:0
drapel cn

Problema a fost neînțelegerea diferenței dintre --IP interfață și --interfață dev. Primul folosește tabelul de rutare:

cu --interfață 10.8.0.100 pachetul nu va fi redirecționat către atinge 0 interfață (căreia îi aparține acest ip). În schimb, conform tabelului de rutare, acesta va fi redirecționat către 192.168.100.58 (interfața lan). Deci traseul este 10.8.0.100 -> 192.168.100.58 -> 192.168.100.201. Chiar și faptul că SYN a fost livrat, serverul în mod ciudat nu va răspunde cu SYN-ACK - acesta este motivul curl fail.

Folosind --interfață tap0 adică adresa stratului de legătură, va funcționa așa cum este prevăzut: 10.8.0.100 -> 10.8.0.1 -> 192.168.100.201. SYN-ACK va fi livrat înapoi folosind aceeași rută.

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.