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

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

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

Связанный контент