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

Сделать пакеты маршрутизации сервера Linux, предназначенные для его внешнего IP-адреса, на localhost

У меня роутер с определенным статическим IP a.b.c.d который подключен к серверу Linux с одной стороны и к Интернету с другой.

Доступ к программному обеспечению, установленному на сервере Linux, извне с использованием IP-адреса a.b.c.d:portxx работает отлично.

Однако, если браузер, открытый кем-то с самого сервера, пытается получить доступ к тому же программному обеспечению, что и a.b.c.d:portxx это не удается. Пытаюсь localhost:portxx снова работает нормально.

Итак, мой диагноз заключается в том, что маршрутизатор DSL тупой и не понимает, что a.b.c.d сам по себе.

Есть ли способ исправить это, желательно ничего не меняя на роутере? т.е. Through /etc/hosts или какой-либо другой механизм на сервере может любой пакет, идущий a.b.c.d быть перенаправлен на localhost?

Это может сломать что-нибудь еще?

Проблема не в роутере. Маршрутизатор выполняет то, для чего был настроен - он транслирует пункт назначения трафика a.b.c.d: portxx на ваш Linux-сервер. Это не работает, но для понимания вы должны увидеть, что происходит в сети. Например, ваш Linux-сервер - 192.168.1.2, а ваш маршрутизатор - 192.168.1.1 в вашей локальной сети.

  • С сервера вы отправляете пакет
  • src 192.168.1.2:1024 dst a.b.c.d: portxx
  • на роутере сделан перевод (обратно на сервер)
  • src 192.168.1.2:1024 dst 192.168.1.2:portxx
  • пакет приходит в серверное приложение, оно отвечает - и отправляет ответный пакет
  • src 192.168.1.2:portxx dst 192.168.1.2:1024
  • пакет приходит (остается) на сервере к клиентскому приложению, но это соединение не известно, потому что вы инициируете соединение с a.b.c.d и получаете ответ от 192.168.1.2, а не от (a.b.c.d) - пакет отбрасывается.

Итак возможное решение:

1) на маршрутизаторе, если вы можете, установите SNAT из пакета, поступающего из локальной сети, на ваш публичный IP-адрес с NAT. Если у вас Linux-роутер, попробуйте что-нибудь

iptables -t nat -I PREROUTING -s 192.168.0.0/24 -d a.b.c.d -j SNAT --to-source 192.168.1.1

Вы изменили адрес исходного пакета для прохождения пакета через маршрутизатор из внутренней сети, ответ серверного приложения обратно на 192.168.1.1 и правило SNAT при получении ответа, правильно сопоставьте пакет с вашим клиентским приложением на сервере. Это решение работает для всех компьютеров внутренней сети, но на сервере вы видите все запросы, поступающие с адреса маршрутизатора 192.168.1.1.

2) На сервере вы можете сделать ПЕРЕНАПРАВЛЕНИЕ трафика с помощью iptables

 iptables -t nat -I OUTPUT -d a.b.c.d -p tcp --dport portxx -j REDIRECT --to-ports portxx

Он перенаправляет исходящее соединение с вашего сервера на локальный порт на сервере. Думаю, это может быть лучшим решением для твоего случая

3) Добавление адреса a.b.c.d на сервере может быть решением в некоторых случаях, но иногда демон сервера (и это зависит от приложения) не прослушивает все IP-адреса и не дает другой ответ для другого адреса.

4) Если вы используете имена хостов, а не IP-адрес, вы можете переопределить / etc / hosts на сервере Linux - это проще всего и иногда помогает (возврат DNS: linuxserver a.b.c.d), поэтому в / etc / hosts вы пишете строку

192.168.1.2 linuxserver

И подключение с сервера linux к "linuxserver" идет напрямую к 192.168.1.2