Трафик SNAT IPTables / Netfilter работает с другими хостами, но не тогда, когда адрес назначения является исходным IP-адресом SNAT - PullRequest
0 голосов
/ 25 февраля 2019

У меня есть вопрос, который может быть новичком для простого SNAT.Краткая схема сценария:

  1. Существует сервер с частным IP и общедоступным IP, и установлен Docker.
  2. Контейнеру в Docker необходимо подключиться черезSSH к другим хостам на интерфейсе Private IP.
  3. Docker по умолчанию отправляет только трафик на общедоступный IP.
  4. Для маршрутизации трафика из контейнера в контейнер можно использовать правило SNAT сетевого фильтра.Частный IP.(В настоящее время это рекомендуемое решение для обычного Docker, см. [1] ниже)
  5. Это прекрасно работает при подключении к другим хостам через частный интерфейс (например, с 10.0.0.7 по 10.0.0.3)однако трафик SNAT с частного IP при запросе порта SSH на этом частном IP не работает (например, с 10.0.0.7 по 10.0.0.7 не работает).

Правило SNAT выглядит действительно простым, поэтому я предполагаю, что здесь просто упущено что-то очевидное.Вот правила SNAT:

Системные IP-адреса:

208.10.10.123 (The public interface IP)
10.0.0.7 (The private interface IP)

Правила SNAT:

*nat
:DOCKER - [0:0]
:EXTERNAL_IP - [0:0]
-A POSTROUTING -j EXTERNAL_IP
-A EXTERNAL_IP -s 172.17.0.4/32 -j SNAT --to-source 10.0.0.7
-A EXTERNAL_IP -j RETURN

Использование команды nc для демонстрации проблемы:

# Works: Request to another host on the private interface:
bash-4.4# nc -zv 10.0.0.3 22
10.0.0.3 (10.0.0.3:22) open

# Not Working: Request to local private IP interface of server:
bash-4.4# nc -zv 10.0.0.7 22
nc: 10.0.0.7 (10.0.0.7:22): Operation timed out

Исследуя проблему, я не могу найти ни одного обсуждения или документации по соединениям SNAT, где пунктом назначения является порт с тем же IP-адресом, с которого идет SNAT.Любые указатели будут очень цениться!

(Кроме того, я был бы рад предоставить любую дополнительную информацию, которая была бы полезна. Мне кажется, что вышеизложенное является самым простым воспроизводимым случаем, который я когда-либо предлагал, но, возможно, я упустил что-то очевидное.)

[1] Невозможно выбрать исходящий (внешний) IP для контейнеров. · Ошибка № 30053 · moby / moby: https://github.com/moby/moby/issues/30053#issuecomment-364344488

...