У меня есть маршрутизатор с определенным статическим 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
?
Может ли это сломать что-то еще?
решение1
Проблема не в маршрутизаторе. Маршрутизатор делает то, для чего был настроен - он транслирует трафик назначения abcd:portxx на ваш сервер linux. Это не работает, но для понимания нужно посмотреть, что происходит в сети. Например, ваш сервер linux - 192.168.1.2, а ваш маршрутизатор - 192.168.1.1 в вашей локальной сети
- С сервера вы отправляете пакет
- источник 192.168.1.2:1024 dst abcd:portxx
- на роутере делается перевод (обратно на сервер)
- источник 192.168.1.2:1024 адрес 192.168.1.2:портxx
- пакет приходит на серверное приложение, оно отвечает и отправляет ответный пакет
- источник 192.168.1.2:портxx адрес 192.168.1.2:1024
- Пакет приходит (остается) на сервере в клиентском приложении, но это соединение неизвестно, поскольку вы инициируете соединение с abcd и получаете ответ от 192.168.1.2, а не от (abcd) - пакет отбрасывается.
Итак, возможное решение:
1) на роутере, если можете, установите SNAT из пакета, приходящего из локальной сети на ваш NAT-публичный IP. Если у вас роутер 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) Добавление адреса abcd на сервер может быть решением в некоторых случаях, но иногда демон сервера (и это зависит от приложения) не прослушивает все IP-адреса или дает другой ответ для другого адреса.
4) Если вы используете имена хостов, а не IP-адреса, вы можете переопределить /etc/hosts на сервере Linux — это проще всего и иногда помогает (DNS возвращает: linuxserver abcd), поэтому в /etc/hosts вы пишете строку
192.168.1.2 linuxserver
И подключение от сервера Linux к "linuxserver" идет напрямую к 192.168.1.2