Перенаправление портов Iptables в Ubuntu (Docker)

У меня есть образ Ubuntu Docker, работающий в Kubernetes, и я пытаюсь настроить переадресацию портов для маршрутизации запросов, поступающих на порт 5000, в другой пункт назначения и порт (10.30.8.191:443). Я установил iptables (не установлен по умолчанию) и добавил следующие правила:

iptables -A PREROUTING -t nat -p tcp --dport 5000 -j DNAT --to 10.30.8.191:443
iptables -A FORWARD -p tcp -d 10.30.8.191 --dport 443 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Я также подтвердил, что для параметра / proc / sys / net / ipv4 / ip_forward установлено значение 1 . Однако вызов curl на https://127.0.0.1:5000 приводит к тому, что соединение отклоняется . Я проверил, что IP-адрес назначения 10.30.8.191 напрямую доступен с этого хоста.

Есть идеи, что мне может не хватать? Я не указал интерфейс в моих правилах iptables, что, насколько я понимаю, означает, что правила должны применяться ко всем существующим интерфейсам. Разве это не так?

1
задан 2 May 2019 в 19:49
1 ответ
  • Пакеты, отправленные локально, не проходят через цепочку nat / PREROUTING . Для успешного выполнения запроса 127.0.0.1:5000 вы должны добавить такое же правило DNAT в цепочку nat / OUTPUT :
iptables -t nat -A OUTPUT \
         -d 127.0.0.1 -p tcp --dport 5000 \
    -j DNAT --to 10.30.8.191:443
  • Это также требует изменения net.ipv4. conf.lo.route_localnet переменная:
sysclt -w net.ipv4.conf.lo.route_localnet=1
  • Ответные пакеты должны проходить через ваш хост ubuntu, иначе вы получите проблему с треугольником маршрутизации. Для этого вы должны добавить правило SNAT :
iptables -t nat -A POSTROUTING \
         -d 10.30.8.191 -p tcp --dport 443 \
         -m conntrack --ctstate DNAT --ctorigdstport 5000 \
    -j MASQUERADE
2
ответ дан 3 December 2019 в 20:08

Теги

Похожие вопросы