Я пытаюсь настроить переадресацию портов для ssh через 2 NAT
Первый маршрутизатор переводит мой IP-адрес в Интернете во внешнюю сеть (10.1.7.0). Во внешней сети есть второй маршрутизатор, который выполняет NAT для моей внутренней сети (192.168.1.0).
Целевой сервер подключен как к внешней, так и к внутренней сети.
Я не могу изменить параметры переадресации портов для внешнего маршрутизатора. В настоящее время он настроен для перенаправления портов SSH и HTTP на маршрутизатор для внутренней сети.
Internet
+
|
v
+-----------------+ +------------------+
| Outer Router | | Inner Router |
|-----------------| |------------------|
| | SSH HTTP | |
+----+ +--------------------->| |
| | | | |
| | | | |
| +-------+---------+ +------+---------+-+
| | | |
| | | |
| | | |
| | +------------------+ | SSH |
| | | Server | | |
| | |------------------| | |
| +-----------> |<-------+ |
| | | |HTTP (testing)
| +------------------+ |
| |
+------v------------------+ |
| Outer Workstation | +-------------------+ |
|-------------------------| | Inner Workstation| |
| | |-------------------| |
| | | |<----------------+
+-------------------------+ | |
+-------------------+
При подключении с внешней рабочей станции к адресу внутреннего маршрутизатора оба протокола SSH и HTTP работают нормально.
При подключении из Интернета к моему общедоступному IP-адресу с помощью HTTP соединение также работает нормально.
Однако SSH просто истекает. Скорее всего, потому что ответ не маршрутизируется должным образом.
Я подозреваю, что это связано либо с самим SSH, либо с тем, что сервер подключен как к внутренней, так и к внешней сети.
Есть идеи, как я могу решить эту проблему?
В настоящее время на сервере есть следующие маршруты:
ip route show
default via 10.1.7.254 dev eth0 metric 100
10.1.7.0/24 dev eth0 proto kernel scope link src 10.1.7.1
192.168.1.0/24 dev eth1 proto kernel scope link src 192.168.1.2
Я должен это изменить? Если да, то как?
Такое отсутствие поведения может быть вызвано асимметричной маршрутизацией и особенностями внешнего маршрутизатора, которые ее запрещают. Сервер направляет ответы ssh обратно через другое соединение (используя свой шлюз по умолчанию в Интернет), а внешний маршрутизатор отбрасывает пакет. Попробуйте отслеживать трафик с помощью iptraf
или tcpdump
и посмотрите, по какому проводу сервера отправляются пакеты. Iptraf имеет вид подключения с отображением пакетов в нижней части экрана.. Возможно, вам придется добавить правило NAT источника к вашему внутреннему маршрутизатору, чтобы пакеты SSH возвращались правильным путем.
Изменить: соединение с внешней рабочей станцией не проходит через внешний маршрутизатор. Он просто подключается напрямую к внутреннему маршрутизатору с IP-адресом из той же подсети и может получать пакеты напрямую от внешнего интерфейса сервера, поскольку он тоже находится в той же подсети.
Чтобы прояснить это, подумайте, как работают соответствующие NAT. Когда внешний маршрутизатор получает пакет на порт SSH из Интернета, его адрес «TO» и порт перезаписываются на соответствующие значения внутреннего маршрутизатора. Адрес "ОТ" пакета остается неизменным. Внутренний маршрутизатор получает пакет и снова перезаписывает адрес TO и порт, но адрес FROM остается тем же, исходным маршрутизируемым IP-адресом, с которого пришел пакет SSH. Внутренний маршрутизатор передает пакет на сервер (если вся ваша переадресация портов настроена правильно), sshd на сервере получает его и отправляет ответ непосредственно внешнему маршрутизатору. Если внешний маршрутизатор настроен на отбрасывание пакетов с асимметричной маршрутизацией, он увидит, что у отправителя нет адреса внутреннего маршрутизатора, и переместит его в большую корзину. SNAT или NAT источника во внутреннем маршрутизаторе будут переписывать адрес FROM таким образом, чтобы сервер возвращал пакет внутреннему маршрутизатору, который, в свою очередь, внешнему маршрутизатору, а последний - исходному отправителю.
Если сервер подключен к обеим сетям, можете ли вы перенаправить порт с внешнего устройства NAT (я предполагаю, что это gw сервера) непосредственно на сервер?