У меня есть сервер Ubuntu, который виден из Интернета, назовем его «перемычкой». И этот сервер имеет это имя на самом деле, потому что мне нужно, чтобы всякий раз, когда пользователь SSH этот сервер, он перескакивает (или пересылает или перенаправляет) соединение SSH на другой сервер (который не виден из Интернета), поэтому SSH фактически на невидимый сервер . Также мне нужно сделать это именно с помощью iptables.
iptables -t nat -A PREROUTING -d ${jumper_ip} -p tcp --dport 22 -j DNAT --to-destination ${invisibleserver_ip}
iptables -t nat -A POSTROUTING -s ${invisibleserver_ip} -p tcp --sport 22 -j SNAT --to-source ${jumper_ip}
iptables -A FORWARD -p tcp ${invisibleserver_ip} --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
Да, на ядре включена переадресация IP.
Когда я использую SSH-узел перемычки, ничего не происходит. Выдается сообщение "Превышено время ожидания соединения". Любая идея?
Спасибо всем за ответы.
Твой первый iptables
Правило является правильным и достаточным для выполнения работы. Я бы рассмотрел возможность явного указания входящего интерфейса, такого как:
iptables -t nat -A PREROUTING -i ${wan_if} -d ${jumper_ip} -p tcp --dport 22 -j DNAT --to-destination ${invisibleserver_ip}
Но этого не требуется. Ваш POSTROUTING
правило немного ошибочно. Я не думаю, что это что-нибудь сломает. Но лучше убрать. Это применимо, когда клиент работает на порту 22, что не относится к SSH.
В FORWARD
правило полностью избыточно, если вы не внесли другие изменения, о которых вы нам не сообщили. Политика по умолчанию: ACCEPT
. Единое правило с ACCEPT
и политика по умолчанию ACCEPT
приведет к тому, что все пакеты будут приняты независимо от того, соответствует ли пакет критериям. Так что вы можете просто удалить это правило и полагаться на значение по умолчанию ACCEPT
политика.
Ничто из этого не объясняет, что вызывает проблему. Причин тому двоякое. Вы не объяснили, с какой проблемой вы столкнулись, и не упомянули все важные детали вашей конфигурации, чтобы определить настоящую причину.
Однако я могу сделать несколько вероятных предположений:
Сначала убедитесь, что пересылка включена, набрав:
cat /proc/sys/net/ipv4/ip_forward
Если он отключен, вы можете включить его, набрав:
echo 1 >/proc/sys/net/ipv4/ip_forward
И если это решит проблему, вы можете сделать ее постоянной, обновив /etc/sysctl.conf
.
Если ваша маршрутизация настроена так, что возвращаемые пакеты не маршрутизируются через ваш узел перехода, вы можете добавить SNAT
Правило для вашего POSTROUTING
цепочка, которая должна применяться к тем же пакетам SYN, которые только что были обработаны вашим DNAT
правило.
Если вы хотите знать о потенциальных недостатках использования DNAT
для этого и некоторые альтернативы. у меня есть ответил похожий вопрос в прошлом.
Если проблема вызвана дополнительными правилами iptables, которые вы не упомянули в своем вопросе, вам необходимо удалить или исправить эти правила. Очевидно, я не могу более подробно рассказать об этом, не зная содержания и цели этих правил - если таковые имеются.