Чтобы описать ситуацию, мне нужно определить три машины. В локальной сети у меня есть машина (LAPTOP) и машина (SERVER), подключенные через WAN и LAN к маршрутизатору соответственно. Третья машина - это внешний vps (VPS).
Я пытаюсь подключиться по SSH к СЕРВЕРУ с НОУТБУКА, используя явный IP-адрес. Для этого я настроил серверы openssh (все машины работают под Ubuntu), прослушивая порт 22. - SSH с VPS на СЕРВЕР - SSH с НОУТБУКА на СЕРВЕР с использованием локального имени хоста, внутреннего по отношению к локальной сети
Что не работает: - SSH с НОУТБУКА на СЕРВЕР с использованием явного IP-адреса.
Чтобы попробовать и отладить, я запустил nmap, чтобы увидеть, фильтруется ли порт. Я выполнил следующую команду как на VPS, так и на LAPTOP
nmap -sS -p 22 xx.xx.xx.xx
, где x обозначает буквальный внешний IP-адрес маршрутизатора локальной сети. Результат будет следующим:
VPS: 22 / tcp open ssh
НОУТБУК: 22 / tcp filter ssh
Просто чтобы дважды проверить, использую ли я локальное имя хоста из LAPTOP, порт открыт, как и должно быть. Почему порт фильтруется при использовании SSH с LAPTOP при использовании явного внешнего IP-адреса? Мой маршрутизатор фильтрует исходящий запрос?
Ваша проблема заключается в том, что ваш маршрутизатор, вероятно, применяет правила переадресации портов (DNAT
цепочка в iptables) перед NAT (SNAT
цепочка в iptables).
Этот пост Stackexchange post подробно объясняет проблему и показывает вам, как подтвердить ее с помощью tcpdump
. В основном, вы должны увидеть, что вы отправляете ваш SYN
пакет на внешний IP, но получаете SYN/ACK
с внутреннего IP SERVER
.
Edit: Как это исправить: Не подключайтесь к внешнему IP из внутренней сети. Используйте внутренний IP-адрес SERVER
непосредственно.