Предположим, у нас есть два сервера A и B с «реальным» и внешним IP-адресами, и мы можем переключить так называемые IP-адрес аварийного переключения (W.X.Y.Z), чтобы указать на конкретный внешний IP-адрес A или B. Это работает «извне» и было легко сделано. В качестве фона: IP-адрес аварийного переключения настроен как новая запись в / etc / network / interfaces:
auto eth0:0
iface eth0:0 inet static
address W.X.Y.Z
netmask 255.255.255.224
Теперь предположим, что WXYZ настроен динамически для использования оборудования A. Теперь я вызываю curl domain.com из B, и он использует правильный IP-адрес аварийного переключения WXYZ, но затем каким-то образом разрешает неправильный внешний IP-адрес B (или localhost?) Вместо использования настроенный A:
Trying W.X.Y.Z ...
* connect to W.X.Y.Z port 443 failed: Connection refused
* Failed to connect to domain.com port 443: Connection refused
* Closing connection 0
curl: (7) Failed to connect to domain.com port 443: Connection refused
Когда я запускаю локальный nginx, он может успешно свернуть domain.com
Мне нужно как-то настроить DNS локально? Как я могу узнать больше о цепочке DNS?
С помощью mtr просто печатает domain.com, если пытается это с сервера B
Это связано с этот вопрос?
The failover IP is W.X.Y.Z and is also the A record of domain.com
The /etc/hosts file for both nodes serverA and serverB looks like:
127.0.0.1 localhost
127.0.1.1 luminarhost
xxx serverA
xxx serverB
The /etc/network/interfaces of serverA
### Hetzner Online AG - installimage
# Loopback device:
auto lo
iface lo inet loopback
# device: eth0
auto eth0
iface eth0 inet static
address xxx
broadcast xxx
netmask xxx
gateway xxx
# default route to access subnet
up route add -net xxx netmask 255.255.255.224 gw xxx eth0
iface eth0 inet6 static
address xxx
netmask xxx
gateway xxx
# failover ip
auto eth0:0
iface eth0:0 inet static
address W.X.Y.Z
netmask 255.255.255.224
and of serverB it is:
### Hetzner Online AG - installimage
# Loopback device:
auto lo
iface lo inet loopback
# device: eth0
auto eth0
iface eth0 inet static
address xxx
broadcast xxx
netmask xxx
gateway xxx
# default route to access subnet
up route add -net xxx netmask 255.255.255.192 gw xxx eth0
iface eth0 inet6 static
address xxx
netmask xxx
gateway xxx
# failover ip
auto eth0:0
iface eth0:0 inet static
address W.X.Y.Z
netmask 255.255.255.224
Как и обещал, вот мой ответ:
Полное раскрытие информации: я не работаю на Hetzner, но в прошлом и в настоящее время работал в разных компаниях, которые размещали оборудование в Hetzner.
Если расположение в вашем профиле правильное и вам нужна поддержка: я живу в том же городе и могу предложить руку или две.
Для всех, кто никогда не имел дела с Hetzner: они фильтруют доступ к сети и т. Д., Что означает, особенно в отношении их резервные IP-адреса (IP-адреса, которые можно использовать на разных машинах для обеспечения некоторой высокой доступности), что они отправляют трафик, направленный на определенный IP-адрес на определенный MAC.
Если кто-то хочет изменить цель (машину), на которую направлен трафик, необходимо отправить POST
просьба к API который обслуживается через HTTPS
. Затем API проверяет аутентификацию (которая представляет собой имя пользователя и соответствующий пароль) и запрос и, если он действителен, распространяет эту новую конфигурацию на различные маршрутизаторы в сети. Этот метод похож на тот, который используется OVH, крупным провайдером, базирующимся во Франции.
auto eth0:0
, настроит ваш резервный IP-адрес на интерфейсе eth0:0
, как только сеть запускается, обычно во время загрузки. У вас есть две машины с одинаковой конфигурацией, поэтому это приводит к ситуации, когда один и тот же IP-адрес активен на двух разных машинах (что не является запретом, но приводит к ситуации, с которой вы сейчас имеете дело. ). Просто примечание: синтаксис, который вы используете, несколько раз дублируя один и тот же интерфейс, устарел (но все еще работает). «Новый способ» также описан в вики Debian (эта ссылка), который просто назначает несколько IP-адресов для один интерфейс.curl
внутри вашего тестового примера выполняет следующие действия: он разрешает заданное доменное имя в IP, а затем пытается подключиться к этому IP через порт 443. Поскольку этот IP в любом случае назначается локально и, следовательно, доступен, пакеты никогда не отправляются на сеть. Если nginx
(как в вашем тестовом примере) не работает локально в это время, вы просто получаете отказ в соединении, что совершенно нормально и верно: «IP-адрес локальный, поэтому давайте отправим туда трафик». Он никогда не будет отправлять пакеты на какой-то маршрутизатор, который может быть содержит информацию: «Трафик, направленный на этот IP, должен идти на эту машину».auto eth0:0
(но оставьте остальную часть конфигурации eth0:0
на месте) от /etc/network/interfaces
. Делая это, будет не назначьте IP-адрес машине. Это будет ваша задача (задача сценария), которая выполняет ifup eth0:0
(и опять может быть, обращается к API, чтобы гарантировать, что трафик направляется на правильный компьютер).Мы столкнулись с той же проблемой, что и сам зацикливание, как упоминалось в @gf_.
Следующая библиотека работала безупречно, чтобы добиться того же.
https://github.com/mrkamel/heartbeat
Вы можете добавлять и удалять плавающий IP-адрес удаленного узла с помощью функций hooks / after и hooks / before указанной выше библиотеки.
пример хуки / до / sendmail скрипт, который отправляет уведомление о резерве и добавляет плавающий IP-адрес машине, на которую он переключился.
#!/bin/sh
echo "🔥 Switching to failover ip $1 from $2 to $3" | slacktee.sh
ssh -o StrictHostKeyChecking=no $3 'ip addr add '"$1"'/32 dev `route | grep "^default" | grep -o "[^ ]*$"`'
пример перехватчики / после / sendmail сценарий, который отправляет уведомление о резерве и удаляет плавающий IP-адрес, с которого он удалился
#!/bin/sh
ssh -o StrictHostKeyChecking=no $2 'ip addr del '"$1"'/32 dev `route | grep "^default" | grep -o "[^ ]*$"`'
echo "👍 Switch success for failover ip $1 from $2 to $3"| slacktee.sh
Примечание:
1. Машина, на которой вы запускаете Heartbeat, и машины, которым назначены плавающие IP-адреса, должны иметь логин без пароля без пароля с использованием обмена ключами ssh в первую очередь (проверьте совместное использование id_rsa).
2. Библиотека slacktee.sh используется для простой отправки Slack-уведомлений.