Перенаправить исходящий трафик с порта 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 .

Desired setup

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

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

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

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

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.

3
задан 22 October 2016 в 15:16
1 ответ

Все, что вам нужно сделать, это направить весь трафик на порт 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

Где -назначение - это ip вашего сервера squid.

.
1
ответ дан 3 December 2019 в 07:24

Теги

Похожие вопросы