Networking

如何為外部 IP 地址設置靜態路由

  • September 24, 2012

我正在我們的網路上放置一個新路由器,以幫助管理我們的專用網路連接並更好地控製到外部的路由。我決定通過刪除對我們路由器上第二個專用網路的引用來簡化這個問題(但請注意,這個問題是有原因的,所以答案是不要讓舊路由器成為預設網關)。

我在路由器的 iptables 中有以下路由:

# Allow established connections, and those !not! coming from the public interface
# eth0 = public interface
# eth1 = private interface #1 (129.2.2.0/25)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW ! -i eth0 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

# Allow outgoing connections from the private interface
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

# Masquerade (NAT)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# Don't forward any other traffic from the public to the private
iptables -A FORWARD -i eth0 -o eth1 -j REJECT

這種配置意味著使用者將通過具有公共地址的調製解調器/路由器進行轉發——這對於大多數用途來說都很好,而且總的來說,所有電腦都隱藏在一個公共 IP 後面並不重要。

但是,一些使用者需要能夠訪問 192.111.222.111:8080 的代理 - 並且代理需要將此流量辨識為來自 129.2.2.126(舊路由器)的網關 - 否則它不會響應。

我嘗試在我們的路由器上添加靜態路由:

route add -host 192.111.222.111 gw 129.2.2.126 dev eth1

我可以從路由器成功 ping 192.111.222.111。當我跟踪路由時,它列出了 129.2.2.126 網關,但我只是在以下每個躍點上得到 ***(我認為這是有道理的,因為這只是一個網路代理並且需要身份驗證)。

當我嘗試從 129.2.2.0/25 網路上的主機 ping 此地址時,它失敗了。

我應該在 iptables 鏈中執行此操作嗎?我將如何配置此路由?

網路圖

在此處輸入圖像描述

這是路由器的介面配置

auto eth0
iface eth0 inet static
   address     150.1.2.2
   netmask     255.255.255.248
   gateway     150.2.2.1

auto eth1
iface eth1 inet static
   address     129.2.2.125
   netmask     255.255.255.128

這是路由表(沒有添加我的靜態路由):

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         eth1202.sa.adsl 0.0.0.0         UG    100    0        0 eth0
localnet        *               255.255.255.0   U     0      0        0 eth1
129.2.2.0       *               255.255.255.128 U     0      0        0 eth1

重申 - 我希望來自 129.2.2.7(例如)的流量現在通過我們的路由器(129.2.2.125)路由。但是這個路由器需要轉發 8080 個請求,其目的地為 192.111.222.111 - 這是舊路由器的另一端(129.2.2.126 - 我們無法管理)。

您嘗試做的事情是完全可能的,並且確實是一種經常使用的技術。您也已經完成了大部分設置。您可能缺少的是*“新路由器”上的“接受”規則,允許流量從eth1流向eth1*。只需使用

iptables -I FORWARD -i eth1 -o eth1 -s 129.2.2.0/25 -j ACCEPT
iptables -I FORWARD -i eth1 -o eth1 -d 129.2.2.0/25 -j ACCEPT

它應該足夠安全,不會規避任何現有的規則和安全措施,但又足夠通用以允許您的網路的任何客戶端和協議。完成設置和故障排除後,您可以將規則限制為您要使用的協議和目標:

iptables -I FORWARD -i eth1 -o eth1 -s 129.2.2.0/25 -d 192.111.222.111 -p icmp -j ACCEPT
iptables -I FORWARD -i eth1 -o eth1 -d 129.2.2.0/25 -s 192.111.222.111 -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -I FORWARD -i eth1 -o eth1 -s 129.2.2.0/25 -d 192.111.222.111 -p tcp --dport 8080 -j ACCEPT
iptables -I FORWARD -i eth1 -o eth1 -d 129.2.2.0/25 -s 192.111.222.111 -p tcp --sport 8080 ! --syn -j ACCEPT

請注意,在典型情況下,您幾乎不會看到任何流量通過 192.111.222.111 的*“新路由器”。Linux 會愉快地發出ICMP 重定向消息,通知您子網的主機在第一個數據包出現時使用“舊路由器”將流量傳輸到 192.111.222.111。大多數主機會跟隨(假設他們收到消息 - 即它沒有在任何地方被過濾)並直接通過“舊路由器”*將所有後續數據包發送到 192.111.222.111 。

引用自:https://serverfault.com/questions/430459