在单个绑定设备上路由多个IP-debian linux

在单个绑定设备上路由多个IP-debian linux

我使用带有 nginx 的 Linux 服务器以及用于各种网站的附加 IP 地址。它具有主 eth0 设备,具有 ipv4(xx.xxx.210.245)和 ipv6(xxxx:xxxx:xxxx:xxxx:xxxx:ffff:6189:d2f5)以及 bond0(xx.xxx.92.134)、bond0:1(xxx.xxx.22.68)、bond0:2(xx.xxx.39.43)。bond0:3(xxx.xxx.11.118)等设备,并为其分配了附加 IP。IP 来自不同位置,而不是来自一个子网。我的网站可通过这些 IP 从互联网访问,并且它们都有自己的域名。

问题是,如果我使用 php 和 curl 检查传出的 IP,如下所示:

<?php
//$ch = curl_init('http://whatismyip.org/'); // ipv6
$ch = curl_init('http://ipinfo.io/ip'); // ipv4
curl_setopt($ch,CURLOPT_RETURNTRANSFER,TRUE);
$myIp = curl_exec($ch);
echo $myIp;
?>

,那么我就会看到我的主服务器 IPv4在每个 ipv4 检查中(通过 ipinfo.io/ip)和主服务器 IPv6每次 ipv6 检查(通过 whatismyip.org)都会发生这种情况。我拥有的每个附加 IPv4 域都会发生这种情况。

如何配置具有多个 IP 的网络,以便能够通过每个 IP 保留所有传出连接?因此,如果我对 bond0:2 (xx.xxx.39.43) 或 bond0:3 (xxx.xxx.11.118) 进行上述 curl php 检查,那么我将同时在 ipv4 检查(通过 ipinfo.io/ip)和 ipv6 检查(通过 whatismyip.org)中获得它们的 IP?

更多信息:

route -n

Kernel IP routing table

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface

0.0.0.0         xx.xxx.210.254  0.0.0.0         UG    0      0        0 eth0

xxx.xxx.11.118  0.0.0.0         255.255.255.0   U     0      0        0 bond0

xx.xxx.210.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0

ip rule list

0:      from all lookup local

32764:  from all to xxx.xxx.11.118 lookup outgoing

32765:  from xxx.xxx.11.118 lookup outgoing

32766:  from all lookup main

32767:  from all lookup default

我已经为 bond0:3 (xxx.xxx.11.118) 添加了 2 条规则,该规则在outgoing表中使用以下命令:

ip rule add from xxx.xxx.11.118/32 table outgoing
ip rule add to xxx.xxx.11.118/32 outgoing

我还做了这个:

ip route add xxx.xxx.11.0/24 dev bond0:3 src xxx.xxx.11.118 table outgoing

但它无法通过 xxx.xxx.11.118 和非主服务器IP

遗憾的是,我发现我的主题中没有类似的问题/答案,所以我找不到让它工作的方法。谢谢您的帮助!

编辑:

我发现这是我的服务器数据中心的特定问题 - 我的支持人员告诉我,如果我们将每个附加 IP 的 MAC 地址都匹配上,那么可能只能解决这个问题,但之后连接可能会中断,并在恢复时重新启动。我认为这不是安全的方法,所以我决定不使用它,而是寻找更稳定、更可靠的方法。

答案1

我一直在寻找如何设置 Linux 服务器或服务的解决方案,但找不到。请随意添加您的答案 - 我将不胜感激!

经过一段时间后,我找到了如何在 php 内部解决这个问题的方法,因为我在 php 中使用 curl 后发现了这个问题。

1.使用CURLOPT_INTERFACE参数curl_setopt功能值为$_SERVER["SERVER_ADDR"]

curl_setopt($ch,CURLOPT_INTERFACE,$_SERVER["SERVER_ADDR"]);

将此行添加到 curl 代码后,它将在传出请求中使用您服务器的 ip 地址。 注意力!它可能无法在所有设置和操作系统上运行!但它在装有 nginx 和 php-fpm 5.4.45 的 Debian Wheezy 上对我有用,我相信它应该可以在装有 php > 5.3 甚至更早版本的主流 Linux 系统上运行。

2.使用上下文选项并在套接字选项中绑定服务器的 IP。

$opts['socket'] = array('bindto' => $_SERVER['SERVER_ADDR'].':0');
$context = stream_context_create($opts); 
echo file_get_contents('http://whatismyip.org/', null, $context);

我猜想当您需要在传出连接中使用其他服务器 IP 地址时,应该有其他 php 选项可以解决此问题。请随意添加您的答案!;)

我仍将尝试寻找非基于 php 但基于 OS 的解决方案,如果有人能描述我如何管理它,我将非常非常感激!

相关内容