Я использую Linux-сервер с nginx и дополнительными 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), связь0: 2 (xx.xxx.39.43). bond0: 3 (xxx.xxx.11.118) и т. д. с назначенными им дополнительными IP-адресами. IP-адреса находятся из разных мест, а не из одной подсети. Мои веб-сайты доступны из Интернета по этим IP-адресам, и все они имеют собственные доменные имена.
Проблема в том, что если я проверю исходящие IP-адреса с помощью php и curl следующим образом:
<?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-адресов? Итак, если я сделаю упомянутую проверку curl php на bond0: 2 (xx.xxx.39.43) или bond0: 3 (xxx.xxx.11.118), тогда у меня будут их IP-адреса в обеих проверках ipv4 (через ipinfo.io/ip) и проверка ipv6 (через whatismyip.org)?
Дополнительная информация:
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
Я добавил 2 правила для bond0: 3 (xxx.xxx.11.118), которое находится в 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-адрес сервера.
Жалко заметить, что нет подобных вопросов / ответов, как в моей теме, поэтому я не могу найти способ заставить это работать .. Спасибо за любую помощь!
РЕДАКТИРОВАТЬ:
Я обнаружил, что это конкретная проблема центра обработки данных моего сервера - моя служба поддержки сказала, что это можно исправить, только если мы будем использовать MAC-адреса для каждого дополнительного IP-адреса, но после этого разрывы соединения и перезагрузка при восстановлении возможно. Я считаю, что это небезопасный способ, поэтому решил не использовать и найти что-то более стабильное и надежное.
Я искал решение, как настроить сервер или службы linux, но не нашел. Не стесняйтесь добавлять свой ответ - буду очень признателен!
Через некоторое время я нашел, как решить эту проблему внутри самого php, поскольку я обнаружил проблему после использования curl в php.
1. С помощью CURLOPT_INTERFACE
параметр в curl_setopt
функция с участием $_SERVER["SERVER_ADDR"]
стоимость:
curl_setopt($ch,CURLOPT_INTERFACE,$_SERVER["SERVER_ADDR"]);
После добавления этой строки в curl-код он будет использовать IP-адрес вашего сервера в исходящем запросе. Внимание! Он может работать не на всех настройках и операционных системах! Но у меня это сработало на Debian Wheezy с nginx и php-fpm 5.4.45, и я считаю, что он должен работать на основных системах Linux с php> 5.3 или даже раньше.
2. Использование параметров контекста и привязка IP-адреса сервера в параметрах сокета.
$opts['socket'] = array('bindto' => $_SERVER['SERVER_ADDR'].':0');
$context = stream_context_create($opts);
echo file_get_contents('http://whatismyip.org/', null, $context);
Я думаю, что должны быть другие варианты php для решения этой проблемы, когда вам нужно использовать дополнительные IP-адреса сервера в исходящих соединениях. Не стесняйтесь добавлять свой ответ! ;)
И я по-прежнему буду пытаться искать решения не на php, а на ОС, и буду очень-очень благодарен, если кто-нибудь опишет, как я могу с этим справиться!