Hvilken kildeadresse logger NGINX for en VPN-klient?
Avgjør hva NGINX ser ved siden av OpenVPN på én og samme vert: en indre tunneladresse, en offentlig utgående adresse eller en videresendt peer, avhengig av hvilken vei forespørselen tok.
Tre klientadresser dukker opp i et NGINX- og OpenVPN-oppsett på samme vert, én for hver vei en forespørsel kan ta. En nettleser som treffer tunneladressen, en nettleser som treffer den offentlige adressen og et program som går ut via gatewayens internettvei ser alle ulike ut ved den lyttende socketen. Avgjør hvilken vei du ser på før du tolker logglinjen. Avgjørelsen avhenger av hvilket mål klienten brukte, hvilket unntak den har for den ytre VPN-endepunktet, og om noe oversetter pakken på veien.
Avgjør etter mål, ikke etter hvem brukeren er
Begynn med adressen forespørselen ble sendt til, fordi den adressen velger veien. En forespørsel til vertens tunneladresse kommer inn på tunnelgrensesnittet med klientens indre adresse som kilde. En forespørsel til vertens offentlige adresse kommer vanligvis inn på grensesnittet som vender mot internett, med klientens offentlige adresse, også når samme bærbare datamaskin har en tunnel opprettet i det øyeblikket. Medlemskap i VPN-bassenget er derfor en egenskap ved pakkens vei, ikke en egenskap som følger brukeren.
| Path the request took | Source the site normally records |
|---|---|
| Client reaches the site at its tunnel address, 10.24.0.1 | Client inner address, 10.24.0.20 |
| Client reaches another internet site through the gateway | Gateway public egress address, 192.0.2.44 |
| Client reaches the gateway's public address through the endpoint exception | Client's own public access address |
Nettopp denne tredje raden er verdt å sjekke først når en VPN-bruker dukker opp i loggen med en adresse som ikke har noe med tunnelen å gjøre. Den forklarer også hvorfor to brukere med samme profil kan gi ulike oppføringer: deres egne tilgangsnett er ulike, og ingenting i tunnelen skriver over det.
Hvorfor det ytre endepunktet lager en andre offentlig vei
Klienten må nå gatewayens offentlige adresse for å opprette tunnelen, så det må finnes en rute til den adressen utenfor tunnelen. Når en klient omdirigerer all trafikk innover, holder en fornuftig implementasjon en eksplisitt vertsrute til serverens offentlige adresse for å unngå en tunnel som er avhengig av seg selv. Det unntaket er ikke selektivt med hensyn til tjenester, så enhver forespørsel til den samme offentlige adressen følger det, også en nettleserforespørsel til et nettsted som hostes på gatewayen.
Dette er mekanismen bak de fleste forvirrende rapportene på dette feltet, og den ligger i klientimplementasjonen og ikke i serveren. To klienter med identiske profiler kan derfor oppføre seg ulikt. Fjerner man unntaket for å »reparere« loggen, faller tunnelen med, så behold det og design rundt det.
Les socketen, tabellen og loggformatet sammen
Tre observasjoner avgjør hvilken vei du ser på: hvor socketen lytter, hvilket grensesnitt som svarer på målet, og hva loggformatet faktisk registrerer. Hvis lytteren bare er bundet til tunneladressen, kan en offentlig forespørsel ikke nå den i det hele tatt, noe som straks utelukker to rader. Hvis oppslaget for klienten returnerer tunnel-enheten, kom forespørselen inn med en indre kilde, og loggen burde vise det.
ss -lntp 'sport = :443'
ip route get 10.24.0.20
ip route get 192.0.2.44Les deretter formatet i stedet for linjen. Et felt som fôres av en videresendt header, registrerer en påstand, ikke en socket-peer, og påstanden teller bare når den nærmeste peeren er en klarert proxy. Å skrive begge verdiene i loggen avgjør senere diskusjoner, fordi den nærmeste peeren og den erstattede adressen er forskjellige fakta og bare én av dem kom fra nettet.
log_format tunneled '$remote_addr $realip_remote_addr $request $status';
grep -n 'log_format' /etc/nginx/nginx.confVelg inngangspunktet du vil ha og få DNS til å stemme
Hvis nettstedet skal være bare via tunnelen, gi det et navn som for VPN-klienter løses ut til tunneladressen, og håndhev policy på den lyttende socketen. Et delt DNS-svar som returnerer 10.24.0.1 for det interne navnet, er et rutingsvalg i kostyme av en detalj om navneoppslag. Hvis nettstedet også må være offentlig, behold to navn eller to porter og la loggen si hvilken som betjente forespørselen.
Tillatelsesregler følger samme logikk. Å tillate tunnelbassenget gir ikke rett til en offentlig forespørsel, og det fyller ikke ut en indre adresse på en tilkobling som kom over internett. Å blande begge inngangspunktene under ett navn gjør den registrerte kilden til en bivirkning av klientrutingen i stedet for et designvalg.
Verifiser veien, deretter policyen
Bekreft veien med en fangst på gatewayen og en forespørsel du kontrollerer. En fangst på tunnel-enheten og en på det offentlige grensesnittet viser hvilken som bar bytene, og rekkefølgen på pakkene forteller om det skjedde en oversettelse mellom dem.
tcpdump -ni tun0 port 443 -c 5
tcpdump -ni eth0 port 443 -c 5Verifiser deretter tilgang i begge retninger: det tiltenkte navngitte inngangspunktet virker for den tiltenkte klienten, og en ikke-godkjent offentlig vei avvises i stedet for bare å være treg. Et generelt IP-ekko-nettsted beviser noe om gatewayens internettutgang og ingenting om dette nettstedet på samme vert. Når en side og en WebSocket er uenige, sammenlign URL-ene, adressefamiliene og DNS-svarene deres før du rører ved serverkonfigurasjonen.