У меня есть сервер http и ssh в локальной сети за домашним маршрутизатором. Маршрутизатор настроен для переадресации портов TCP и UDP в диапазоне 1:1024 с открытого интерфейса (1.2.3.4) на сервер внутри локальной сети (192.168.0.12). Я могу связаться с сервером по общедоступному IP-адресу как из Интернета, так и из локальной сети.

Проблема заключается в том, что соединения SSH от клиента в локальной сети к общедоступному IP-адресу маршрутизатора являются чрезвычайно медленными (сокращение в ~ 10 раз) по сравнению с подключениями от клиента в локальной сети к частному IP-адресу сервера. Это не относится к HTTP-соединениям.

Некоторое снижение скорости при использовании общедоступного IP-адреса ожидается из-за накладных расходов на выполнение NAT, но я ожидаю, что это не будет зависеть от протокола.

Некоторые примеры

Это загружается со скоростью ~ 3 МБ / с с частыми задержками:

tleonardi@host ~ $ scp 1.2.3.4:/path/to/file.txt .

Пока это скачивается со скоростью ~ 30 МБ / с:

tleonardi@host ~ $ scp 192.168.0.12:/path/to/file.txt .

Загрузка того же файла через HTTP на общедоступный IP-адрес происходит только на ~ 2 МБ / с медленнее, чем частный IP-адрес.

Дальнейшая информация

  • Сервер ssh настроен с UseDNS no

  • Запуск Wireshark во время передачи файла из 1.2.3.4 (медленный) обнаружил множество пакетов, помеченных как TCP Dup Ack

  • MTU маршрутизатора установлен на 1500

  • В дополнение к scp соединения ssh с удаленным терминалом также часто зависают.

Любая помощь высоко ценится!

1 ответ1

0

Соединение с сервером отображается с IP-адресом маршрутизатора. Если нет, то, скорее всего, происходит асимметричная маршрутизация. Пакеты от клиента отправляются на маршрутизатор, где адрес получателя переводится. Поскольку адрес источника является локальным, ваш клиент видит и получает пакеты непосредственно от маршрутизатора. Маршрутизатор также может видеть ответы и отправлять их обратно клиенту. Это объясняет дубликаты пакетов. IP-стек клиента, вероятно, очень занят работой с дублированными пакетами.

При выполнении шпильки NAT обычно требуется преобразовать адреса источника и назначения (двойной NAT). Может быть лучше использовать разделенный DNS с разрешением внешних имен DNS на локальные IP-адреса в локальной сети.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .