Переслать SSH другому хосту

У меня есть сервер 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 хост перемычки, ничего не происходит. "Время ожидания истекло". Любая идея?
Спасибо всем за ваши ответы.

1 ответ

Ты первый 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, которые вы не упомянули в своем вопросе, вам необходимо удалить или исправить эти правила. Очевидно, что я не могу предоставить более подробную информацию об этом, не зная содержания и цели этих правил - если таковые имеются.

Другие вопросы по тегам