Назад | Перейти на главную страницу

маршрутизация нескольких IP-адресов на одном устройстве с одинарной связью - debian linux

Я использую 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, а на ОС, и буду очень-очень благодарен, если кто-нибудь опишет, как я могу с этим справиться!