I systemet mitt har jeg eth0 (som kanskje ikke er koblet til) og et modem på ppp0 (som alltid kan være opp eller ned). Tilfellet der begge grensesnittene er oppe og ppp0 er standardruten, jeg vil gjerne finne en måte å bestemme gatewayens IP-faktiske adresse til eth0. Jeg prøvde «netstat -rn», men i denne konfigurasjonen er utgangen:
Kernel IP routing table Destination Gateway Genmask Flags MSS Window irtt Iface xx.xx.xxx.xxx 0.0.0.0 255.255.255.255 UH 0 0 0 ppp0 192.168.98.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo 0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 ppp0
Så hvordan bestemmer jeg eth0s gateway-adresse? I ovennevnte tilfelle er den faktiske gateadressen 192.168.98.1.
Kommentarer
- Hva er " eth0 ' s gateway-adresse " skal være?
- Grensesnitt don ' t har gateway-adresser, nettblokker gjør. En gateway-adresse forteller kjernen hvor du skal videresende pakker som er bestemt for noen vert på et eller annet nettverk. Hvis adressen er knyttet til et gitt grensesnitt, vil det grensesnittet bli brukt, men adressen er uavhengig av grensesnittet.
- Så i min applikasjon skal jeg gjøre eth0 til standard gateway hvis den har tilkobling. Men for å sjekke tilkobling, lager jeg en midlertidig rute til min kjente server. Men for å gjøre dette må jeg vite eth0 ' s gateway-adresse. Så hvordan kan jeg bestemme dette?
- sjekk dette: stackoverflow.com/a/15973156/1422630
Svar
Anta eth0
er DHCP-klientgrensesnitt.
Ett alternativ er å sjekke DHCP-klientleiefiler dhcpd.leases
Sted og navn avhenger av systemet; på noen Fedora-systemer er filene under /var/lib/dhclient/
lease-filer, der den interessante strengen er slik:
option routers 192.168.1.1;
Et annet alternativ som fungerte for meg på en funtoo-boks: dhcpcd -U eth0
skriver ut en fin tabell, klar til kilde i skript
broadcast_address=192.168.1.255 dhcp_lease_time=86400 dhcp_message_type=5 dhcp_server_identifier=192.168.1.1 domain_name_servers="192.168.1.1 192.168.1.101" ip_address=192.168.1.101 network_number=192.168.1.0 routers=192.168.1.1 subnet_cidr=24 subnet_mask=255.255.255.0
Det er andre alternativer som dhcping
, dhclient -n
, ifølge google og manpages, men de mislykkes i boksene mine, men kan fungere for deg.
Svar
Din feil er at du knytter informasjonen på netstat-utgangen til grensesnittet i stedet for destinasjonen. Destinasjonsadresser kan ha tilknyttede gateways. Når du konfigurerer nettverket ditt, knytter du grensesnitt og gateways til sett med destinasjonsadresser – så spørsmålet du må stille er «hva» er gatewayen for destinasjoner i 192.168.98 / 24? «Jeg vedder på at det ikke skal være en, at enhetene i th på rekkevidde er enten bro eller direkte koblet til det Ethernet.
Legg merke til at standardruten din er via ppp0
(den siste linjen er en jokertegnsrute, masken er alt null, slik at ingen biter faktisk sammenlignes, så pakker for disse adressene sendes via ppp0
). Så pakker for alle destinasjoner som ikke er i 127.xx.xx.xx
eller 192.168.98.xx
vil til slutt matche jokertegnemasken og sendes over ppp0
. Fordi det er en punkt-til-punkt-protokoll, går hver pakke som sendes på det grensesnittet til den eneste enheten som direkte kan adresseres på den lenken, den i den andre enden av den. Det er ikke nødvendig å spesifisere en gateway for den. fordi hver pakke blir sendt over det grensesnittet, sendes via den enheten, enten Internett-destinasjonen er den enheten eller ikke.
Nå: hvis du har en ruter tilgjengelig over eth0
som du bruker når du kan, den ruteren har nesten helt sikkert en IP-adresse i området 192.168.98.xx, minst like sannsynlig som ikke 192.168.98.1, og når den ruteren er drevet opp og faktisk er koblet til Internett, du vil at standardruten din, den for alt som ikke er direkte koblet til et lokalt nettverk, skal være default via 192.168.98.1
Du kan ha nyere (at «et relativt begrep, det har eksistert veldig lenge nå) ip
kommando i bruk, prøv ip route
og hvis det gir deg noe resultat, prøv . Ellers kan du prøve route help
.
Så, eth0
-grensesnittet har rett og slett ikke t en gateway-adresse. Det kan være en annen enhet eller flere enheter som er koblet til Ethernet-en som er villige til å fungere som en gateway. Du sier at nettverket ditt har en som svarer på (rent konvensjonelle) .1
. Ingen lov sier at den må ha den adressen, og ingen lov sier at den må annonsere sin tilstedeværelse. Det er noen vanlige måter, den vanligste av dem er at bokser som kjører rutingsprogramvare, også kan kjøre dhcp-servere og fortelle alle som snakker dhcp om seg selv på den måten. MolbOrgs svar gir en ganske typisk smak av oppsettet, men alt som noen kan foreslå på dette tidspunktet, vil bare være mer eller mindre sannsynlig å matche din spesielle nettverk.
Kommentarer
- i mitt tilfelle slutter gatewayen med .129 som er ganske forvirrende .. det bestemmes når USB-deling er aktivert, men etter det ser jeg ingen måte å bestemme det (for de andre grensesnittene) etter en
route -n
(der gatewayene ikke er konfigurert (0.0.0.0). EDIT: fant det! stackoverflow.com/a/15973156/1422630
Svar
Linux:
Du må åpne en terminal. Avhengig av Linux-distribusjon, kan den være plassert i menyelementene øverst eller nederst på skjermen. I dette eksemplet , vil vi bruke Fedora. Klikk på applikasjoner > Systemverktøy > Terminal.
Når terminalen er åpen, skriv inn følgende kommando: ip route | grep default
Utgangen av dette skal se ut som følgende:
joe$ ip route | grep default default via 192.168.1.1 dev eth0 proto static
I dette eksemplet er 192.168.1.1 igjen din standard gateway (router) IP-adresse.
For mer informasjon om dette emnet hvordan finne din gateway-IP (linux / win / osx) .
Kommentarer
- Til tross for at vi ikke snakket med " når det er ikke standard gateway " del av spørsmålet, dette svaret inneholder hintet jeg trengte (
route -n
) for å få gatewayens IP-adresse for eth0 i et bash-skript:route -n | grep "^0\.0\.0\.0" | awk '{print $2}'
Svar
For å få NIC-navnet til at det er standard gateway, bruk denne kommandoen:
netstat -rn | grep -m 1 UG | awk "{print $8}"
Hvis du har flere aktive nettverkskort på maskinen din, hjelper denne kommandoen deg med å finne det viktigste nettverkskortet som har den viktigste standardporten.
Kommentarer
-
grep XX | awk '{ action }'
kan vanligvis samles tilawk '/XX/ { action }'
- Vær så snill å vurdere å forklare hva og hvordan kommandoen din utfører
- @ mattia.b89 Jeg oppdaterte svaret mitt.