I mit system har jeg eth0 (som muligvis ikke er tilsluttet) og et modem på ppp0 (som altid kan være op eller ned). Sagen hvor begge grænseflader er op og ppp0 er standardruten, jeg vil gerne finde en måde at bestemme gatewayens IP-aktuelle adresse på eth0. Jeg prøvede “netstat -rn”, men i denne konfiguration er output:

 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 ovenstående tilfælde er den aktuelle gateway-adresse 192.168.98.1.

Kommentarer

  • Hvad er " eth0 ' s gateway-adresse " formodes at være?
  • Grænseflader don ' t har gateway-adresser, netblocks gør. En gateway-adresse fortæller kernen, hvor pakker, der er bestemt til en eller anden vært på et eller andet netværk, skal videresendes. Hvis adressen er knyttet til en given grænseflade, vil den grænseflade blive brugt, men adressen er uafhængig af grænsefladen.
  • Så i min applikation skal jeg gøre eth0 til standard gateway, hvis den har forbindelse. Men for at kontrollere forbindelse gør jeg en midlertidig rute til min kendte gode server. Men for at gøre dette skal jeg vide eth0 ' s gateway-adresse. Så hvordan kan jeg bestemme dette?
  • tjek dette: stackoverflow.com/a/15973156/1422630

Svar

Antag, at eth0 er DHCP-klientinterface.
En mulighed er at kontrollere DHCP-klient-lease-filer dhcpd.leases
Sted og navn afhænger af systemet; på nogle Fedora-systemer er filerne under /var/lib/dhclient/ lease-filer, hvor den interessante streng er sådan:

 option routers 192.168.1.1; 

En anden mulighed, som fungerede for mig på en funtoo-boks: dhcpcd -U eth0
udskriver en flot tabel, klar til kilde i scripts

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 

Der er andre muligheder som dhcping, dhclient -n, ifølge google og manpages, men de fejler i mine felter, men fungerer muligvis for dig.

Svar

Din fejl er, at du “forbinder oplysningerne på netstat-output til grænsefladen snarere end destinationen. Destinationsadresser kan have tilknyttede gateways. Når du konfigurerer dit netværk, forbinder du grænseflader og gateways med sæt destinationsadresser – så det spørgsmål, du skal stille, er “hvad” er gatewayen til destinationer i 192.168.98 / 24? “Jeg ved, at der ikke skulle være en, at enheder i th inden for rækkevidde er enten broforbundet eller direkte forbundet til det Ethernet.

Bemærk, at din standardrute er via ppp0 (den sidste linje er en jokertegnsrute, masken er alt nul, så ingen bits faktisk sammenlignes, så pakker til disse adresser sendes via ppp0). Så pakker til enhver destination, der ikke er i 127.xx.xx.xx eller 192.168.98.xx, vil i sidste ende matche jokertegnmasken og sendes over ppp0. Fordi det er en punkt-til-punkt-protokol, går hver pakke, der sendes på denne grænseflade, til den eneste enhed, der direkte kan adresseres på dette link, den ene i den anden ende af den. Der er ikke behov for at angive en gateway til det fordi hver pakke sendes over denne grænseflade sendes via den enhed, uanset om dens internetdestination er den enhed eller ej.

Nu: hvis du har en router tilgængelig via eth0 som du bruger, når du kan, den router har næsten helt sikkert en IP-adresse i området 192.168.98.xx, mindst lige så sandsynligt som ikke 192.168.98.1, og når den router er drevet op og faktisk er forbundet til internettet, skal du have din standardrute, den for alt, der ikke er direkte forbundet til et lokalt netværk, skal være default via 192.168.98.1

Du har muligvis nyere (at “en relativ betegnelse, den har eksisteret i meget lang tid nu) ip kommando i brug, prøv ip route og hvis det giver dig noget output, prøv . Ellers skal du prøve route help.


Så din eth0 interface har simpelthen ikke “t har en gateway-adresse. Der kan være en anden enhed eller flere enheder, der er tilsluttet det Ethernet, der er villige til at fungere som en gateway. Du siger, at dit netværk har en, der reagerer på den (rent konventionelle) .1. Ingen lov siger, at den skal have den adresse, og ingen lov siger, at den skal annoncere sin tilstedeværelse. Der er nogle almindelige måder, den mest almindelige af dem er, at kasser, der kører routing-software, også kører dhcp-servere og fortæller alle, der taler dhcp om sig selv på den måde. MolbOrgs svar giver en ret typisk smag af opsætningen, men alt, hvad nogen kan foreslå på dette tidspunkt, vil kun være mere eller mindre tilbøjelige til at matche din særlige netværk.

Kommentarer

  • i mit tilfælde slutter gatewayen med .129, der er ret forvirrende .. det bestemmes, hvornår USB-tethering er aktiveret, men efter det ser jeg ingen måde at bestemme det (for de andre grænseflader) efter en route -n (hvor gateways ikke er konfigureret (0.0.0.0). EDIT: fundet det! stackoverflow.com/a/15973156/1422630

Svar

Linux:

Du skal åbne en terminal. Afhængigt af din Linux-distribution kan den findes i menupunkterne øverst eller nederst på skærmen. I dette eksempel , vi bruger Fedora. Klik på applikationer > Systemværktøjer > Terminal.

Når terminalen er åben, skriv følgende kommando: ip route | grep default

Outputtet af dette skal se ud som følgende:

joe$ ip route | grep default default via 192.168.1.1 dev eth0 proto static 

I dette eksempel er 192.168.1.1 igen din standard gateway (router) IP-adresse.

indtast billedbeskrivelse her

For mere information om dette emne hvordan du finder din gateway-IP (linux / win / osx) .

Kommentarer

  • På trods af ikke at tale til " når det er ikke standard gateway " del af spørgsmålet, dette svar indeholder det tip, jeg havde brug for (route -n) for at få gatewayens IP-adresse for eth0 i et bash-script: route -n | grep "^0\.0\.0\.0" | awk '{print $2}'

Svar

For at få NIC-navnet, som det er standardgatewayen, skal du bruge denne kommando:

netstat -rn | grep -m 1 UG | awk "{print $8}" 

Hvis du har flere aktive NIC på din maskine, hjælper denne kommando dig med at finde det primære NIC, at det har den primære standard gateway.

Kommentarer

  • grep XX | awk '{ action }' kan normalt samles til awk '/XX/ { action }'
  • Overvej venligst at forklare hvad og hvordan din kommando udfører
  • @ mattia.b89 Jeg opdaterede mit svar.

Skriv et svar

Din e-mailadresse vil ikke blive publiceret. Krævede felter er markeret med *