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

http-запрос через iptables --to-destination ip redirect не дает ответа

У меня есть два сервера Ubuntu, каждый из которых имеет свои IP-адреса.

Назовем их server1 и server2, имея ip 1.1.1.1 и 2.2.2.2 соответственно.

У меня есть nginx, работающий на server2. Единственная цель, которую я хочу, чтобы server1 имел, - перенаправлять все входящие HTTP-запросы (то есть порт 80) на server2, чтобы клиенты не заметили, что их запрос перенаправляется.

Я попробовал следующую команду на server1:

iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 2.2.2.2

Но когда я ввожу 1.1.1.1 в своем браузере, я не получаю ответа: страница продолжает пытаться загрузиться без каких-либо сообщений или сообщений об ошибках (у меня тайм-аут появляется через 2-3 минуты).

Но когда я удаляю указанное выше правило iptables, я сразу получаю сообщение об ошибке «страница не найдена» при вводе 1.1.1.1 в моем браузере; поэтому что-то работает, но не так, как должно: когда я вхожу в 1.1.1.1, я хочу, чтобы загружалась страница html, размещенная на 2.2.2.2

Потому что, когда я ввожу 2.2.2.2 в свой браузер, я вижу загруженную веб-страницу.

Может ли кто-нибудь помочь мне с этим? Я довольно давно ищу (на severfault и Google) по этому поводу, поэтому я спрашиваю.

Большое спасибо за то, что прочитали мой вопрос!

Обновить: Спасибо всем за информацию. К сожалению, я все еще не получаю ответа

У меня следующая конфигурация iptables:

корень @ ip-10-48-238-216: / home / ubuntu # sudo iptables -L
Цепочка INPUT (политика ACCEPT)
target prot opt ​​источник назначения

Цепочка ВПЕРЕД (политика ПРИНЯТЬ)
target prot opt ​​источник назначения

Цепочка ВЫХОДА (политика ПРИНЯТЬ)
target prot opt ​​источник назначения
корень @ ip-10-48-238-216: / home / ubuntu # sudo iptables -t nat -L
ПЕРЕДАЧА ЦЕПИ (ПОЛИТИКА ПРИНЯТЬ)
target prot opt ​​источник назначения
DNAT tcp - в любом месте tcp dpt: www to: 2.2.2.2

Цепочка ВЫХОДА (политика ПРИНЯТЬ)
target prot opt ​​источник назначения

Цепочка POSTROUTING (политика ACCEPT)
target prot opt ​​источник назначения

Когда я запускаю tcpdump и делаю запрос через Chrome на 1.1.1.1 я получаю следующее

корень @ ip-10-48-238-216: / home / ubuntu # sudo tcpdump -i eth0 порт 80 -vv
tcpdump: прослушивание eth0, тип канала EN10MB (Ethernet), размер захвата 65535 байт
13: 56: 18.346625 IP (tos 0x0, ttl 52, id 12055, смещение 0, флаги [DF], протокол TCP (6), длина 60)
212-123-161-112.ip.telfort.nl.16386> ip-10-48-238-216.eu-west-1.compute.internal.www: Flags [S], cksum 0xb398 (правильно), seq 2639758575, win 5840, параметры [mss 1460, sackOK, TS val 1223672 ecr 0, nop, wscale 6], длина 0
13: 56: 18.346662 IP (tos 0x0, ttl 51, id 12055, смещение 0, флаги [DF], протокол TCP (6), длина 60)
212-123-161-112.ip.telfort.nl.16386> ww1dc1.shopreme.com.www: флаги [S], cksum 0x9ee0 (правильно), seq 2639758575, win 5840, параметры [mss 1460, sackOK, TS val 1223672 ecr 0, nop, wscale 6], длина 0
13: 56: 18.598747 IP (tos 0x0, ttl 52, id 10138, смещение 0, флаги [DF], протокол TCP (6), длина 60)
212-123-161-112.ip.telfort.nl.16387> ip-10-48-238-216.eu-west-1.compute.internal.www: Flags [S], cksum 0xac40 (правильно), seq 2645658541, win 5840, параметры [mss 1460, sackOK, TS val 1223735 ecr 0, nop, wscale 6], длина 0
13: 56: 18.598777 IP (tos 0x0, ttl 51, id 10138, смещение 0, флаги [DF], протокол TCP (6), длина 60)
212-123-161-112.ip.telfort.nl.16387> ww1dc1.shopreme.com.www: флаги [S], cksum 0x9788 (правильно), seq 2645658541, win 5840, параметры [mss 1460, sackOK, TS val 1223735 ecr 0, nop, wscale 6], длина 0
^ C
Захвачено 4 пакета
4 пакета получены фильтром
0 пакетов отброшено ядром

упомянутый адрес относится к следующему
212-123-161-112.ip.telfort.nl.16386 : мой персональный компьютер
ww1dc1.shopreme.com.www : dns сервера 2 (2.2.2.2)
ip-10-48-238-216.eu-west-1.compute.internal.www : amazon web services ec2 внутренний адрес server1 (1.1.1.1)

Однако журнал tcpdump на server2 (2.2.2.2) остается пустым, и я не получаю ответа в своем браузере.

Я могу пинговать с server1 на server2.
И net.ipv4.ip_forward установлен в 1, и поэтому /proc/sys/net/ipv4/ip_forward
Может быть что-то еще отсутствует?

Обновление2:

Server1 - это микро-экземпляр aws ec2, он подключен к эластичному IP-адресу, который я назвал 1.1.1.1. все время. Микросервер раньше был более крупным сервером ec2, но из-за его высокой стоимости мы переходим на выделенный хостинг. Но в нашем клиенте для iPhone мы использовали фиксированный IP-адрес, а именно упомянутый выше эластичный IP-адрес. Клиент iPhone использует службы REST на сервере. Итак, теперь мы используем микросервер на этом эластичном IP-адресе, который должен перенаправлять все запросы на vps от другой компании (www.xlshosting.nl), которая имеет другую подсеть. Я не знаю функций, которые могут перенаправить эластичный IP-адрес aws на внешний IP-адрес, поэтому я пробую его с помощью микро-экземпляра + iptables. Этот vps - это то, что я все время называл server2 с ip 2.2.2.2. Итак, server1 и server2 находятся в другой подсети. Вам это помогает?

Похоже, у вас может быть проблема с маршрутизацией. Проверьте использование tcpdump на обоих серверах и указание tcpdump с параметром -i на правильное устройство ethX, чтобы проверить, отправляются ли пакеты через правильное сетевое устройство на server1, и эти пакеты также поступают на server2.

tcpdump -i ethX host 1.1.1.1 and port 80

Может быть, пакеты приходят на server2, но server2 не знает, куда отправлять ответы? На server2 настроен правильный шлюз по умолчанию?

Проверить это с

route -n

Ваша проблема может быть:

1- Проблема с маршрутизацией: Вам необходимо проверить следующее:

1.1- Маршрутизация включена на Server1, как было предложено Патриком. файл /proc/sys/net/ipv4/ip_forward установлен на 1.

1.2- Server2 может связаться с запрашивающим клиентом. Вы можете попробовать pinging server2 2.2.2.2 от вашего клиента. Вы можете добавить статический маршрут, используя route add команда.

2- Проблема с брандмауэром: Вам нужно убедиться, что ваш брандмауэр разрешает доступ к IP 2.2.2.2. Для простоты вы можете настроить политику брандмауэра на прием всего трафика (ВХОД, ВЫВОД, ВПЕРЕД).

бегать

echo 1 > /proc/sys/net/ipv4/ip_forward

Чтобы сделать изменение постоянным, поместите следующее в /etc/sysctl.conf

net.ipv4.ip_forward = 1

У меня есть несколько вопросов:

Какова цель вашей установки? Является ли server1 брандмауэром, который проксирует сервер server2, потому что вы не хотите, чтобы server2 был напрямую доступен из сети?

Как связаны две машины? Напрямую через кроссовер или через роутер или еще что?

Вы пробовали запускать tcpdump на обоих интерфейсах server1, а также на интерфейсе server2? Одновременный запуск всех трех во время запроса даст вам довольно хорошее представление о том, где что-то происходит.