Назад | Перейти на главную страницу

SSH не работает через Double NAT

Я пытаюсь настроить переадресацию портов для 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 сервера) непосредственно на сервер?