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

Перенаправление портов 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 приводит к connection refused. Я подтвердил, что IP-адрес назначения 10.30.8.191 напрямую доступен с этого хоста.

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

  • Пакеты, отправленные локально, не проходят 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