背景資料
我正在使用 Linux 系統為一小部分公共 IPv4 位址路由流量(透過在 中啟用 IP 轉送
sysctrl.conf
)。路由器正在
eth1
使用 PPPoE 連接到 ISP。ppp 使用的本機對等位址是由 ISP 指定的手動設定的 IP 位址。本地對等地址是
10.0.0.10
。用於 ppp 的遠端對等位址也是由 ISP 指定的手動設定的 IP 位址。遠端對等位址是
10.0.0.9
。路由器的預設路由是
10.0.0.9
via10.0.0.10
。路由器透過 與乙太網路交換器連接
eth0
。eth0
配置為使用公共位址之一。交換器連接所有其他公共主機。每個連接的主機都使用公用 IP 位址。
10.0.0.9
ISP ----------+
| 10.0.0.10 X.X.X.X
+------------- (eth1) ROUTER (eth0) --------------- SWTICH
|
+-- X.X.X.Y
+-- X.X.X.Z
...
我的問題
除了路由器上運行的程式外,一切都按預期工作。我在路由器上運行的任何應用程式10.0.0.10
在啟動與互聯網的連接時都用作來源 IP 位址。這是可以理解的,因為eth1
那裡有網路。但是,由於該位址不可公開路由,因此apt
、ping
、 和其他程式無法運作。如果我在支援它的應用程式上明確設定來源位址(即ping
),應用程式就會運作。
我的問題
如何設定路由器通過eth1
/路由未知資料包10.0.0.9
,同時eth0
在啟動新連線時使用公用 IP 位址作為預設來源?
答案1
注意:我會認為你的路由器的LAN是192.0.2.0/24並且它的LAN IP在乙太網路0是192.0.2.1/24,能夠給出具體的解釋和解決方案。
您的 ISP 為了節省一些公用 IP 位址,為您指派了一個私人 IP 用於內部路由目的。這很好,因為這個 IP 永遠不會被外界看到(並且很快就會被丟棄)嚴格反向路徑轉送沿著路徑(如果曾經放在 ISP 路由器之外的線路上),或者如果沒有,由於不可路由,將永遠不會得到答案)。但這會使您的設定更加複雜,以避免在除了從路由器連接到 ISP 之外的所有情況下都使用此 IP。
你可能有類似的東西(可能略有不同,沒關係):
# ip route
default via 10.0.0.9 dev ppp0
10.0.0.9 dev ppp0 proto kernel scope link src 10.0.0.10
192.0.2.0/24 dev eth0 proto kernel scope link src 192.0.2.1
例如,您可能有default via 10.0.0.9 dev ppp0 src 10.0.0.10
,或via 10.0.0.9
甚至沒有出現,因為它是第 3 層鏈接而不是第 2 層鏈接,因此via
不需要(但仍然被接受)。只需相應地調整以下設定即可。
目前,核心選擇顯然最適合的 IP,即設置在同一側以存取 Internet 的 IP,因為沒有任何其他資訊告訴它(或它明確告訴您使用您不想要的 IP):
# ip route get 8.8.8.8
8.8.8.8 via 10.0.0.9 dev ppp0 src 10.0.0.10 uid 0
cache
您只需要在核心檢查如何存取網際網路並聲明特定的首選來源 IP 位址時替換路由行為。請注意,如果出現錯誤和不可預見的問題,您可能會失去連接。如果可能的話,擁有備用(控制台)存取權限:
# ip route replace default via 10.0.0.9 dev ppp0 src 192.0.2.1
# ip route get 8.8.8.8
8.8.8.8 via 10.0.0.9 dev ppp0 src 192.0.2.1 uid 0
cache
就是這樣,您的路由器將照常路由,但當需要選擇本地發起的傳出 IP 時,將選擇 192.0.2.1,除非明確告知(例如:在其套接字上明確綁定來源 IP)。
每次連結斷開再接通時都必須重新設定此路由。連結完全建立後,您可以將其整合到某些 pppoe 腳本中。
另請注意介面名稱點對點0可能會更改為點對點1或任何其他名稱。這取決於您在設定腳本中處理這個問題。
設定相同路線設定的替代方法:
最初設定指標時加入較低的指標
如果設定了原始度量(即它不是 0,假設它是 100),您可以新增具有較低度量的備用預設路由,而不是取代先前的路由:
# ip route add default via 10.0.0.9 dev ppp0 src 192.0.2.1 metric 50
專用路由規則
如果您擔心 pppoe 中涉及的各種工具的交互可能會刪除上述路由,您可以在備用路由表中安裝此設置,並在路由規則中賦予其優先權,並使用主表的部分副本來防止中斷。每次斷開/重新連接後仍然需要重做,因為路線仍然會消失。這裡
iif lo
很特殊,實際上意味著「本地發起的傳出資料包」而不是傳入,並且 109 是任意選擇的表值:# ip rule add iif lo lookup 109 # needed only once # ip route add table 109 10.0.0.9 dev ppp0 proto kernel scope link src 10.0.0.10 # to keep using 10.0.0.10 for local link, just in case # ip route add table 109 192.0.2.0/24 dev eth0 src 192.0.2.1 # will disappear if eth0 is brought down # ip route add table 109 default via 10.0.0.9 dev ppp0 src 192.0.2.1 # will disappear if ppp0 is brought down
如果您在主表中新增了其他路由條目,那麼您很可能也必須在上面複製它們。
# ip route get 8.8.8.8 8.8.8.8 via 10.0.0.9 dev ppp0 table 109 src 192.0.2.1 uid 0 cache
簡化路由的路由規則
人們可以將路由保留在主表中,並僅使用規則中基於前綴的抑制器覆蓋預設路由:這避免了複製全部路線:只需複製和更改預設路線即可。
將 2. 替換為(說明偏好值,仍然按降序排列它們,就像不說明它們時發生的情況一樣):
# ip rule add pref 32765 iif lo lookup 109 # needed only once # ip rule add pref 32764 iif lo lookup main suppress_prefixlength 0 # needed only once # ip rule 0: from all lookup local 32764: from all iif lo lookup main suppress_prefixlength 0 32765: from all iif lo lookup 109 32766: from all lookup main 32767: from all lookup default # ip route add table 109 default via 10.0.0.9 dev ppp0 src 192.0.2.1 # will disappear if ppp0 is brought down
主路由表將首先用於任何不會成為預設路由的內容,然後對於本地發起的傳出流量,路由表 109 中提供預設路由。通常。
相對於 2. 的優點是不需要從表複製(非預設)路由主要的不再進入表109。下面,表主要的提供非預設路由的結果,與 2. 方法相反:
# ip route get 8.8.8.8 8.8.8.8 via 10.0.0.9 dev ppp0 table 109 src 192.0.2.1 uid 0 cache # ip route get 192.0.2.2 192.0.2.2 dev eth0 src 192.0.2.1 uid 0 cache
答案2
正如你所說。以您的路由器作為網關的交換器上的其他用戶端都有公用 IP 位址。你的路由器沒有。它有一個不會被路由的 LAN 位址。由於您的網路服務供應商沒有為您提供公共位址,因此路由器將無法出去。
如果您有另一個公用 IP,請在 eth1 上建立虛擬 eth 配置並正確路由它。然後你的路由器也可以出去了。