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

Исходящие соединения с сервера с несколькими IP-адресами

У нас есть сервер, на котором статически маршрутизированы как / 31, так и / 24 в разных / 8. У нас есть шлюз в том же / 24, что и / 31.

Входящие соединения с IP-адресами в / 24 работают должным образом, но мы не можем инициировать исходящие соединения. Наш «золотой стандарт» тест (использование IP-адреса во избежание проблем с DNS на данном этапе):

curl --interface SOME_IP_IN_THE_24 -v -H 'Host: httpbin.org' 34.230.136.58/ip

Мы используем Ubuntu 16.04, и мы настроили eno1 с одним из / 31, eno1: 1 с другим / 31 и eno1: 2 с одним из IP-адресов из / 24. Когда мы запускаем указанную выше команду, мы все равно получаем IP для eno1.

Исправление проблем

  • Проверьте маршрутизацию с помощью ip route get <dst> from <SOME_IP_IN_THE_24> команда. Исправьте это, если команда вернула неожиданный маршрут.
  • Проверьте брандмауэр с помощью iptables-save -c. Исходный адрес может быть переопределен правилами NAT.

Ответ

Ваша проблема вызвана правилом MASQUERADE. Любой исходный адрес перезаписывается на IP-адрес, который вы видите в исходном атрибуте маршрута, который был получен ip route get <dst> команда. В этом можно убедиться, используя tcpdump и conntrack -E команды. Скорее всего, вы также увидите приращение счетчиков этого правила.

Простой способ избежать такого поведения - просто вставить правила ACCEPT в начало nat/PREROUTING цепь. Лучший способ изменить набор правил брандмауэра - это использовать iptables-save/iptables-apply команды. Ваш nat/PREROUTING цепочка должна выглядеть так (iptables-save -t nat):

# Generated by iptables-save v1.6.2 on Thu Jul  4 19:05:27 2019
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING --src <LOCAL-IP-1> -j ACCEPT
-A POSTROUTING --src <LOCAL-IP-2> -j ACCEPT
...
-A POSTROUTING --src <LOCAL-IP-N> -j ACCEPT
-A POSTROUTING -j MASQUERADE
COMMIT
# Completed on Thu Jul  4 19:05:27 2019