Я пытаюсь настроить переадресацию портов, чтобы конкретный IP-адрес (например, 1.2.3.4/32) мог использовать SSH через бастион (например, 5.5.5.5:2222) на сервер приложений (10.3.3.3:22). Бастион и сервер приложений работают в VPC в Amazon, и только бастион доступен в Интернете.
Я использую следующее правило на бастионе (я пропустил исходный IP-адрес, пока он не заработает):
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 2222 -j DNAT --to 10.3.3.3:22
но когда я пытаюсь подключиться, я не получаю ответа.
Запуск tcpdump на бастионе показывает, что трафик проходит, поэтому я предполагаю, что я попал в группы безопасности VPC сервера приложений и не добрался до порта 22 на нем. Я думаю, это происходит потому, что, хотя у бастиона есть разрешение на доступ к порту 22 на сервере приложений, IP 1.2.3.4 - нет.
Итак, мой вопрос: изменяет ли NAT-способ, который я установил, автоматически исходный IP-адрес пакетов, чтобы они выглядели как исходящие от бастиона, или они будут содержать исходный исходный IP-адрес, в данном случае 1.2.3.4?
Если пакеты действительно содержат 1.2.3.4 в качестве IP-адреса источника после их пересылки, как я могу изменить исходный адрес на адрес бастиона?
Обновить
Думаю, специально для SSH я мог бы настроить SSH-туннелирование, но мне также нужно подобное решение, чтобы разрешить доступ к порту 443 на нескольких разных серверах приложений.
Теперь я попытался добавить SNAT с помощью:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.2.2.2
но все равно не работает (10.2.2.2 - это внутренний IP бастиона).
Итак, мой вопрос: изменяет ли NAT-способ, как я его настроил, автоматически исходный IP-адрес пакетов, чтобы они выглядели как исходящие от бастиона, или они будут содержать исходный исходный IP-адрес, в данном случае 1.2.3.4?
Нет, DNAT не меняет исходный ip, только место назначения. DNAT - Трансляция сетевых адресов назначения
Как я узнаю, включена ли переадресация IP на бастионе?
Следующая команда должна вернуть 1
# cat /proc/sys/net/ipv4/ip_forward
И как я могу заставить iptables выполнять SNAT (если это действительно то, что я хочу - я хочу, чтобы весь трафик внутри VPC поступал с бастиона, а затем бастион соответствующим образом перенаправлял его обратно)?
# iptables -t nat -I POSTROUTING -p tcp -s 1.2.3.4 -d 5.5.5.5 --dport 2222 -j DNAT --to-destination 10.3.3.3:22
Вы настроили DNAT
, или "NAT назначения", что означает, что ваш шлюз перезаписывает место назначения адрес подключений, соответствующих этому правилу. Исходный адрес останется прежним, и вы сможете определить, запустили ли вы tcpdump
на исходящем интерфейсе вашего хоста-бастиона или на сервере приложений.
Это означает, что сервер приложений пытается вернуть пакеты на адрес вашего исходного хоста, 1.2.3.4
в вашем примере. Будет ли это работать или нет, зависит от того, как все ваши хосты подключены.
Простым решением было бы заменить правило iptables простым прокси-сервером tcp (например, haproxy, ручка, баланс, и т.д). Попросите прокси-сервер прослушивать порт 2222 на вашем хосте-бастионе и перенаправлять соединения на порт 22 на сервере приложений, и он будет просто работать, потому что с точки зрения сервера приложений соединения происходят с хоста-бастиона.
Это просто быстрое исправление / краткосрочное решение
Тогда как насчет туннеля SSH?
ssh -L 2222:10.3.3.3:22 username@5.5.5.5 -N &
#then
ssh username@localhost -p 2222
SSH через SSH: D
Просто мысль.
Обновление: не видел этого: - /: «Обновление, я думаю, специально для SSH я мог бы настроить SSH-туннель, но мне также нужно аналогичное решение, чтобы разрешить доступ к порту 443 на нескольких разных серверах приложений».