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

Перенаправить исходящий трафик с порта 80 на локальный httpd с помощью iptables / ebtables

Что я хочу

Мне нужно реализовать очень специфическую настройку с помощью squid, dansguardian и nginx. Я намеренно здесь очень конкретен, поскольку подобные вопросы часто требуют дополнительной информации, чтобы дать точные ответы. Кроме того, я обычно не занимаюсь сетевыми вещами, и мое текущее решение является результатом сбора кусочков головоломки из других вопросов и ответов Stack Exchange, поэтому, пожалуйста, извините / исправьте любые ошибки / недоразумения, которые я сделал до сих пор.

По сути, я хочу заблокировать любые попытки доступа в Интернет через порты 80 и 443, если только к указанным портам не обращаются через прокси на порт 3128. Причина этого в том, что прокси и Dansguardian могут фильтровать / блокировать нежелательные веб-страницы. Мы решили использовать непрозрачный прокси, чтобы использовать блокировку SSL без вторжения. Эта часть уже работает.

Однако, если клиент пытается получить доступ к Интернету напрямую, вместо того, чтобы прерывать попытку, Magic Box должен перенаправить клиента к пошаговому руководству по настройке прокси.

У нас есть настройка wpad, чтобы исключить необходимость настройки клиентских устройств вручную. Однако OSX и Linux и, что более важно, iOS и Android не имеют поддержки wpad по умолчанию (или не поддерживают ее полностью). Наша первая идея заключалась в том, чтобы оставить для клиента инструкции по настройке устройств на бумаге. Однако мой босс хочет, чтобы я установил вариант перенаправления, поскольку для клиента было бы лучше сразу увидеть, почему Интернет не работает.

Вот наглядное пособие по желаемой настройке. Не изображен тот факт, что enp1s0 и enp2s0 являются частью моста br0.

На схеме сети показаны все соответствующие физические устройства. Красным отмечены устройства, которые нельзя трогать или настраивать. Зеленым отмечены наши устройства.

На схеме «Внутри Magic Box» показаны желаемые решения по маршрутизации.

Текущая ситуация

Наши исходные правила ebtables / iptables, в которых мы оставляем пошаговые инструкции по настройке на бумаге, выглядели так:

ebtables -A FORWARD -p ipv4 -i lo -o enp1s0 --ip-proto tcp --ip-destination-port 80 -j ACCEPT
ebtables -A FORWARD -p ipv4 -o enp1s0 --ip-proto tcp --ip-destination-port 80 -j DROP
ebtables -A FORWARD -p ipv4 -i lo -o enp1s0 --ip-proto tcp --ip-destination-port 443 -j ACCEPT
ebtables -A FORWARD -p ipv4 -o enp1s0 --ip-proto tcp --ip-destination-port 443 -j DROP

Чтобы разрешить перенаправление клиента к пошаговой инструкции в браузере при доступе к Интернету без прокси, мы изменили правила на следующие

ebtables -t broute -A BROUTING -i lo -j ACCEPT
ebtables -t broute -A BROUTING -p IPv4 --ip-proto tcp --ip-destination-port 80 --ip-destination ! 192.168.2.75 -j redirect --redirect-target DROP
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.2.75:80

С помощью этих правил всякий раз, когда я пытаюсь получить доступ к Интернету напрямую с помощью браузера, я вижу, что эти пакеты отображаются в iptable. PREROUTING цепь. Между тем, nginx httpd все еще доступен, и Интернет через прокси также работает.

Часть, которая не работает, - это перенаправление на nginx httpd. Браузер просто сообщает мне, что сервер недоступен, а журнал доступа nginx также не показывает никакой активности.

Я тоже пробовал следующие вещи, но никто не решил проблему
* Настройка SNAT и MASQUERADE правила в POSTROUTING цепь
* Настройка net.ipv4.ip_forward к 1
* Настройка net.ipv4.conf.all.route_localnet к 1

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

Все, что вам нужно сделать, это направить весь трафик на порт 80 на определенный IP-адрес и порт. Правильно? Если так :

iptables -A PREROUTING -s 192.168.2.0/24 ! -d 192.168.2.0/24 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.2.75:3128

Где --to-destination - это IP-адрес вашего сервера Squid.