У меня роутер с определенным статическим 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 в вашей локальной сети.
Итак возможное решение:
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