我尝试将 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上的配置:
纳米/等/网络/接口
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上的配置:
纳米/等/网络/接口
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
谢谢你的帮助 :)
更新(2016.11.14):在服务器 B 上添加路由命令
答案1
据我从你的问题中的信息所知,你的问题是
arp -s 137.74.9.193 fa:16:3e:76:31:ea -i ens3 pub
不会像您想象的那样执行操作。此命令会在您的服务器上创建一个新的 ARP 表条目,这样,如果您的服务器要向其发送数据包,它就ens3
不会137.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。我尚未使用通过隧道接口发送流量的路由表条目测试相同的设置,而且我不确定这是否需要额外的步骤。)
如果托管服务器 B 的 ISP 根据源 IP 地址过滤流量,您可能无法使用137.74.9.193
源地址从那里发送数据包。如果您137.74.9.193
从外部 ping 并在eth0
服务器 B 上捕获 ICMP 数据包,您应该会看到该接口上是否正在发送 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 在它们之间进行选择。