Linux

將IP從伺服器A路由到伺服器B

  • November 17, 2016

我嘗試將 137.74.9.193 從伺服器 A 路由到伺服器 B(Ubuntu 16.04)。

如果我嘗試從伺服器 A ping 137.74.9.193,它會按預期工作,但是當我嘗試從我的個人電腦 ping 時它不起作用。

計劃

伺服器 A:

Public IP (ens3): 213.32.69.16
Public IP: 137.74.9.193
Local Tunnel IP: 10.0.0.1

伺服器 B:

Public IP (eth0): 139.59.131.76
Local Tunnel IP: 10.0.0.2

伺服器 A 上的配置:

納米 /etc/network/interfaces

auto lo
iface lo inet loopback

auto ens3
iface ens3 inet dhcp

auto tun1
iface tun1 inet static
   address 10.0.0.1
   netmask 255.255.255.252
   pre-up iptunnel add tun1 mode gre local 213.32.69.16 remote 139.59.131.76 ttl 255
   up ifconfig tun1 multicast
   up ifconfig tun1 arp
   up ifconfig tun1 broadcast
   pointopoint 10.0.0.2
   post-up ip route add 137.74.9.193 via 10.0.0.2 dev tun1
   post-down iptunnel del tun1

執行的命令:

# enable ip forward
$ echo 1 > /proc/sys/net/ipv4/ip_forward
$ echo 1 > /proc/sys/net/ipv4/conf/ens3/proxy_arp

# Add ip to arp to complete the loop.
$ arp -s 137.74.9.193 fa:16:3e:76:31:ea -i ens3 pub

結果核心IP路由表:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         213.32.64.1     0.0.0.0         UG    0      0        0 ens3
10.0.0.2        *               255.255.255.255 UH    0      0        0 tun1
ip193.ip-137-74 10.0.0.2        255.255.255.255 UGH   0      0        0 tun1
213.32.64.1     *               255.255.255.255 UH    0      0        0 ens3

伺服器 B 上的配置:

納米 /etc/network/interfaces

auto eth0
iface eth0 inet static
       address 139.59.131.76
       netmask 255.255.240.0
       gateway 139.59.128.1
iface eth0:0 inet static
       address 137.74.9.193
       netmask 255.255.255.255
       broadcast 137.74.9.193

auto tun1
iface tun1 inet static
       address 10.0.0.2
       netmask 255.255.255.252
       pre-up iptunnel add tun1 mode gre local 139.59.131.76 remote 213.32.69.16 ttl 255
       up ifconfig tun1 multicast
       up ifconfig tun1 arp
       up ifconfig tun1 broadcast
       pointopoint 10.0.0.1
       post-down iptunnel del tun1

執行的命令:

# enable ip forward
$ echo 1 > /proc/sys/net/ipv4/ip_forward

# Route to tun1
ip route add 10.0.0.1 dev tun1

核心IP路由表:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         gateway         0.0.0.0         UG    0      0        0 eth0
10.0.0.1        *               255.255.255.255 UH    0      0        0 tun1
10.19.0.0       *               255.255.0.0     U     0      0        0 eth0
139.59.128.0    *               255.255.240.0   U     0      0        0 eth0

謝謝你的幫助 :)

更新(14.11.2016):在伺服器 B 上添加路由命令

據我從您問題中的資訊可以看出,您的問題是

arp -s 137.74.9.193 fa:16:3e:76:31:ea -i ens3 pub

不做你認為它做的事。此命令在您的伺服器上創建一個新的 ARP 表條目,這樣如果您的伺服器要向其發送數據包ens3137.74.9.193則不會執行任何 ARP 請求,因為您已經指定了目標 MAC 地址。

但是您還需要確保路由器知道將數據包發送到您的伺服器。路由器將發送一個 ARP 請求137.74.9.193。但由於該 IP 地址未分配給您伺服器上的任何介面,您的伺服器不會響應這些 ARP 請求。

要完成這項工作,您需要啟用代理 ARP,您可以使用以下命令執行此操作:

echo 1 > /proc/sys/net/ipv4/conf/ens3/proxy_arp

如果您使用該命令而不是該arp命令,我認為它會起作用。(我知道這適用於點對點介面的對等 IP。我沒有使用路由表條目測試相同的設置,通過隧道介面發送流量,我不確定是否需要額外的步驟。)

如果 ISP 託管伺服器 B 根據源 IP 地址過濾流量,您可能無法使用137.74.9.193源地址從那裡發送數據包。如果您137.74.9.193從外部 ping 並在伺服器 B 上擷取 ICMP 數據包,eth0您應該看到 ICMP 回顯響應是否正在該介面上發送。

如果您發現伺服器 B 正在發送 ICMP 回顯響應並且它們從未到達目的地,則最可能的解釋是 ISP 正在根據源 IP 地址進行過濾。

在這種情況下,您有兩個選擇。您可以聯繫 ISP 並解釋您需要使用此源 IP 發起數據包,以便他們可以更新其過濾器。或者,您可以通過伺服器 A 隧道返回流量。

通過 A 隧道返回流量的最簡單方法是在 B 上創建一個路由表,如下所示:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         *               0.0.0.0         UG    0      0        0 tun1
213.32.69.16    gateway         255.255.255.255 UG    0      0        0 eth0
10.0.0.1        *               255.255.255.255 UH    0      0        0 tun1
10.19.0.0       *               255.255.0.0     U     0      0        0 eth0
139.59.128.0    *               255.255.240.0   U     0      0        0 eth0

然而,這將使139.59.131.76網際網路的其餘部分無法訪問。如果您希望 B 可以同時通過兩個 IP 地址訪問,您需要創建兩個不同的預設路由和一個路由策略,以便根據數據包源 IP 在它們之間進行選擇。

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