Вопрос или проблема
У меня есть машина с 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 не работает
-
Локальная петля (loopback): При использовании правила DNAT на адрес 127.0.0.1, трафик будет перенаправлен на локальный интерфейс самого клиента, а не на сервер, обрабатывающий запрос. То есть, когда пакет доходит до клиента (например, ноутбука или смартфона), он не может обратиться к своему собственному loopback-у (127.0.0.1), так как это адрес, предназначенный для связи внутри самого устройства.
-
Контексты IPTables: IPTables работает в разных контекстах (цепочках). В вашей конфигурации правило DNAT в
block-chain
перенаправляет пакеты на 127.0.0.1, но эти пакеты не проходят через сетевой стек клиента. Это означает, что клиент, который делает запрос, не сможет обработать его как входящий трафик. -
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, что обеспечит корректную маршрутизацию запросов от клиентов к вашему локальному веб-серверу. Убедитесь, что после внесения изменений вы протестируете новые настройки, чтобы убедиться в их корректной работе.