Правило DNAT IPTables для локального веб-сервера не работает с localhost?

Вопрос или проблема

У меня есть машина с Linux, которая функционирует как беспроводная точка доступа. Беспроводные клиенты подключаются и затем просматривают веб. Я разрешаю только порт 80.

Есть определенные сайты, которые я хотел бы заблокировать, но не просто, сбрасывая пакет, а перенаправляя их на страницу blocked.html, которая обслуживается локальным веб-сервером.

У меня есть две сетевые карты. Та, которая находится на стороне интернета, связана с 10.0.2.15. Если я делаю правило DNAT для перенаправления трафика на мой веб-сервер с использованием сетевой карты интернета, страница возвращается. Если я перенаправляю на 127.0.0.1, это не так.

Почему так?

Вот моя конфигурация IPTables:

# iptables -S
-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT DROP
-A INPUT -i lo -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT 
-A INPUT -p tcp -m tcp --sport 80 -j ACCEPT 
-A OUTPUT -o lo -j ACCEPT 
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT 
-A OUTPUT -p tcp -m tcp --sport 80 -j ACCEPT 
# iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N block-chain
-A PREROUTING -j block-chain 
-A POSTROUTING -o eth1 -j MASQUERADE 
# ЭТО НЕ ВЕРНЕТ СТРАНИЦУ К КЛИЕНТУ
-A block-chain -d 206.190.36.45/32 -p tcp -j DNAT --to-destination 127.0.0.1:80 
# ЭТО БУДЕТ
-A block-chain -d 206.190.36.45/32 -p tcp -j DNAT --to-destination 10.0.2.15:80 
-A block-chain -j RETURN 

Для localhost вам нужно использовать REDIRECT вместо DNAT. В вашем примере:

-A block-chain -d 206.190.36.45/32 -p tcp -j REDIRECT --to-ports 80

-j DNAT --to-destination 127.0.0.1:80 перенаправляет клиентов на их собственный адрес обратного соединения для веб-страницы.

Сосредоточьтесь на -A block-chain -d 206.190.36.45/32 -p tcp -j DNAT --to-destination 10.0.2.15:80

Ответ или решение

Во время настройки IPTables для перенаправления трафика на локальный веб-сервер часто могут возникать трудности, особенно когда речь идет о локальном адресе (127.0.0.1). В вашем случае попытка перенаправления с помощью DNAT на локальный веб-сервер не приводит к успешному результату. Давайте рассмотрим, почему это происходит и как эффективно решить вашу проблему.

Причины, по которым DNAT к 127.0.0.1 не работает

  1. Локальная петля (loopback): При использовании правила DNAT на адрес 127.0.0.1, трафик будет перенаправлен на локальный интерфейс самого клиента, а не на сервер, обрабатывающий запрос. То есть, когда пакет доходит до клиента (например, ноутбука или смартфона), он не может обратиться к своему собственному loopback-у (127.0.0.1), так как это адрес, предназначенный для связи внутри самого устройства.

  2. Контексты IPTables: IPTables работает в разных контекстах (цепочках). В вашей конфигурации правило DNAT в block-chain перенаправляет пакеты на 127.0.0.1, но эти пакеты не проходят через сетевой стек клиента. Это означает, что клиент, который делает запрос, не сможет обработать его как входящий трафик.

  3. Redirect vs DNAT: Для перенаправления трафика на локальный веб-сервер следует использовать правило REDIRECT, а не DNAT. REDIRECT автоматически изменяет целевой порт на локальном устройстве, что позволяет использовать адрес 0.0.0.0 или ваш внутренний адрес, чтобы сервер правильно обработал запрос.

Решение

Для корректного перенаправления трафика на локальный веб-сервер вам нужно заменить DNAT на правило REDIRECT. В вашем случае это будет выглядеть следующим образом:

-A block-chain -d 206.190.36.45/32 -p tcp -j REDIRECT --to-ports 80

Это правило перенаправляет весь входящий трафик на порт 80 прямо к локальному интерфейсу, тем самым обеспечивая правильную обработку запросов.

Корректная конфигурация IPTables

Вам может понадобиться внести изменения в вашу текущую конфигурацию IPTables. Вот как это должно выглядеть:

# iptables -S
-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT DROP
-A INPUT -i lo -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT 
-A INPUT -p tcp -m tcp --sport 80 -j ACCEPT 
-A OUTPUT -o lo -j ACCEPT 
-A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT 
-A OUTPUT -p tcp -m tcp --sport 80 -j ACCEPT 

# iptables -t nat -S
-P PREROUTING ACCEPT
-P INPUT ACCEPT
-P OUTPUT ACCEPT
-P POSTROUTING ACCEPT
-N block-chain
-A PREROUTING -j block-chain 
-A POSTROUTING -o eth1 -j MASQUERADE 

# Измените эту строку
-A block-chain -d 206.190.36.45/32 -p tcp -j REDIRECT --to-ports 80 

# Удалите или закомментируйте эту строку
# -A block-chain -d 206.190.36.45/32 -p tcp -j DNAT --to-destination 10.0.2.15:80 
-A block-chain -j RETURN 

Заключение

Согласно изложенной информации, правила DNAT нельзя использовать для перенаправления трафика на адрес 127.0.0.1, поскольку это приведет к неудачам в связи. Вместо этого следует использовать REDIRECT, что обеспечит корректную маршрутизацию запросов от клиентов к вашему локальному веб-серверу. Убедитесь, что после внесения изменений вы протестируете новые настройки, чтобы убедиться в их корректной работе.

Оцените материал
Добавить комментарий

Капча загружается...