Linux

eth0 不是預設網關時如何確定網關地址?

  • June 17, 2020

在我的系統中,我有 eth0(可能已連接或未連接)和 ppp0 上的調製解調器(可能始終處於打開或關閉狀態)。在兩個介面都up並且ppp0是預設路由的情況下,我想找到一種方法來確定eth0的網關IP實際地址。我試過“netstat -rn”,但在這個配置中,輸出是:

核心IP路由表
目標網關 Genmask 標誌 MSS 視窗 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 洛
0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 ppp0

那麼如何確定eth0的網關地址呢?在上述情況下,實際網關地址為 192.168.98.1。

假設eth0是 DHCP 客戶端介面。

一種選擇是檢查 DHCP 客戶端租用文件dhcpd.leases

位置和名稱取決於系統;在某些 Fedora 系統上,下面的文件/var/lib/dhclient/是租約文件,其中有趣的字元串是這樣的:

 option routers 192.168.1.1;

另一個選項,在一個有趣的盒子上對我有用:dhcpcd -U eth0

列印一個漂亮的表格,準備好在腳本中獲取源

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

根據Google和手冊頁,還有其他選項,如dhcping, ,但它們在我的盒子上失敗了,但可能對你有用。dhclient -n

您的錯誤是您將 netstat 輸出上的資訊與介面而不是目標相關聯。目標地址可以有關聯的網關。當您配置網路時,您將介面和網關與一組目標地址相關聯——因此您需要問的問題是“192.168.98/24 中目標的網關是什麼?” 我打賭不應該有一個,那個範圍內的設備要麼被橋接,要麼直接連接到那個乙太網。

請注意,您的預設路由是 via ppp0(最後一行是萬用字元路由,遮罩全為零,因此實際上沒有比較任何位,因此這些地址的數據包通過 發送ppp0)。因此,任何目的地的數據包不在127.xx.xx.xx192.168.98.xx最終將匹配萬用字元遮罩並被發送過去ppp0。現在,因為它是一種點對點協議,所以在該介面上發送的每個數據包都會發送到該鏈路上唯一可直接定址的設備,即鏈路另一端的設備。無需為其指定網關,因為通過該介面發送的每個數據包都是通過該設備發送的,無論其 Internet 目標是否是該設備。

現在:如果您有一個可以訪問的路由器eth0,您可以使用該路由器,該路由器幾乎肯定有一個在 192.168.98.xx 範圍內的 IP 地址,至少與不是 192.168.98.1 的可能性一樣,並且當該路由器通電並啟動時實際連接到 Internet 您想要預設路由,即所有未直接連接到本地網路的路由default via 192.168.98.1

您可能正在使用較新的(這是一個相對術語,它已經存在了很長時間)ip命令,請嘗試ip route,如果這會給您一些輸出 try ip route help。否則,請嘗試route help.


因此,您的eth0介面根本沒有網關地址。可能有另一個設備或多個設備連接到該乙太網願意充當網關。您說您的網路有一個響應(純正常)的網路.1。沒有法律規定必須擁有該地址,也沒有法律規定必須宣傳其存在。有一些常見的方法,其中最常見的方法是讓執行路由軟體的機器也執行 dhcp 伺服器,並以這種方式告訴任何使用 dhcp 的人。 MolbOrg 的回答給出了一個非常典型的設置風格,但任何人在這一點上可以提出的任何建議都只會或多或少地與您的特定網路相匹配。

引用自:https://unix.stackexchange.com/questions/124311