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

Перенаправить HTTP-трафик на другой IP-адрес с помощью iptables

Мы хотим перенаправить весь HTTP-трафик на другой IP-адрес на стандартной Linux-машине Amazon EC2 (на базе CentOS). Я знаю, как это сделать с помощью правил прокси и apache, но я предполагал, что iptables будет гораздо более быстрым решением (возможно, нет!)

Команды

sudo iptables -P INPUT ACCEPT
sudo iptables -F
sudo iptables -A PREROUTING -t nat -p tcp -i eth0 --dport 80 -j DNAT --to 208.68.208.81:80
sudo iptables -A FORWARD -p tcp -d 208.68.208.81 --dport 80 -j ACCEPT

iptables -t нат -L -v -n

Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DNAT       tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80 to:208.68.208.81:80

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 11 packets, 820 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 11 packets, 820 bytes)
 pkts bytes target     prot opt in     out     source               destination

iptables -L -v -n

Chain INPUT (policy ACCEPT 202 packets, 15705 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            208.68.208.81       tcp dpt:80

Chain OUTPUT (policy ACCEPT 145 packets, 13747 bytes)
 pkts bytes target     prot opt in     out     source               destination

http://208.68.208.81 в веб-браузер работает, но когда я пытаюсь ввести IP-адрес машины EC2 с этой конфигурацией, я получаю тайм-аут. Я вижу некоторые пакеты с watch -d iptables -t nat -L -v -n

Помогите!

Обновление: добавлено -i eth0 к правилу PREROUTING

Я вижу три потенциальных проблемы (в отличие от другого ответа, я не вижу ничего, что могло бы вызвать «петлю» даже в неотредактированной версии вашего вопроса).

  1. Пересылка IP должна быть включена.
  2. После обработки и повторного размещения в сети пакет может стать жертвой фильтрации адреса источника, так как он очень похож на поддельный пакет.
  3. Ответы на пакеты, проходящие через NAT, должны проходить через один и тот же NAT, чтобы можно было выполнить обратную трансляцию. В противном случае клиент получит ответ с неправильным исходным IP / портом, который он, вероятно, сбросит (если он еще не был отброшен фильтрацией обратного пути).

Вы можете обойти точки 2 и 3, используя правило SNAT или MASQURADE в дополнение к DNAT, но если вы это сделаете, вы потеряете исходный IP-адрес источника трафика. Это очень затруднит контроль над злоупотреблениями.

Другое решение пунктов 2 и 3 - это установка VPN между двумя серверами. Затем используйте DNAT для пересылки трафика через VPN и маршрутизацию на основе IP-адреса источника, чтобы вернуть ответы обратно в NAT.

Вы создали петлю. Убедитесь, что вы добавили интерфейс в PREROUTING правило (например, -i eth1 или что-то еще).

Вам также может понадобиться такое правило:

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination 

  45M 3723M MASQUERADE  all  --  *     WAN_IF  0.0.0.0/0            0.0.0.0/0  

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

Вы можете использовать rinetd, чтобы просто перенаправить свой IP-трафик.