如何將預設來源IP位址變更為面向預設路由的位址以外的位址?

如何將預設來源IP位址變更為面向預設路由的位址以外的位址?

背景資料

  • 我正在使用 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.9via 10.0.0.10

  • 路由器透過 與乙太網路交換器連接eth0eth0配置為使用公共位址之一。

  • 交換器連接所有其他公共主機。每個連接的主機都使用公用 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那裡有網路。但是,由於該位址不可公開路由,因此aptping、 和其他程式無法運作。如果我在支援它的應用程式上明確設定來源位址(即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或任何其他名稱。這取決於您在設定腳本中處理這個問題。


設定相同路線設定的替代方法:

  1. 最初設定指標時加入較低的指標

    如果設定了原始度量(即它不是 0,假設它是 100),您可以新增具有較低度量的備用預設路由,而不是取代先前的路由:

    # ip route add default via 10.0.0.9 dev ppp0 src 192.0.2.1 metric 50
    
  2. 專用路由規則

    如果您擔心 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 
    
  3. 簡化路由的路由規則

    人們可以將路由保留在主表中,並僅使用規則中基於前綴的抑制器覆蓋預設路由:這避免了複製全部路線:只需複製和更改預設路線即可。

    將 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 配置並正確路由它。然後你的路由器也可以出去了。

相關內容