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

Перенаправить трафик на порт 80 в apache для неизвестных Mac и в squid для некоторых Mac

У меня есть Linux-бокс, который ведет себя как маршрутизатор, который обрабатывает два сетевых интерфейса: eth0 для Интернета и eth1 для LAN.

Я настроил iptables, чтобы перенаправить весь веб-трафик, поступающий по локальной сети, в локальный apache, также прослушивая порт 80, используя следующие правила:

sudo iptables -t mangle -N internet
sudo iptables -t mangle -A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j internet
sudo iptables -t mangle -A internet -j MARK --set-mark 99
sudo iptables -t nat -A PREROUTING -i eth1 -p tcp -m mark --mark 99 -m tcp --dport 80 -j DNAT --to-destination $BOX_IP

Теперь мне нужно добавить исключение из этого поведения для некоторых известных MAC-адресов, чтобы перенаправить их веб-трафик не на apache, а на прокси-сервер squid, который прослушивает порт 3128.

Мне удалось просто удалить перенаправление и позволить веб-запросу перейти на запрошенный хост, добавив это другое правило:

sudo iptables -t mangle -I internet 1 -m mac --mac-source $MAC_ADDRESS -j RETURN

но я хочу, чтобы веб-трафик направлялся в $BOX_IP:3128. Как лучше всего это сделать?

Почему вы повторяете все эти критерии фильтрации в --mark 99 линия? маркируете пакет, и все. Если появилось больше критериев, вам следует изменить маркировку, но не проверять больше, чем метка. Кстати название цепочки internet мне кажется неоптимальным.

#!/bin/bash

if iptables -L apache -n &>/dev/null; then
  iptables -t mangle -F apache
else
  iptables -t mangle -N apache
fi
iptables -t mangle -A apache -j MARK --set-mark 99
# finish the handling of this packet in this table
iptables -t mangle -A apache -j ACCEPT

if iptables -L squid -n &>/dev/null; then
  iptables -t mangle -F squid
else
  iptables -t mangle -N squid
fi
iptables -t mangle -A squid -j MARK --set-mark 98
# finish the handling of this packet in this table
iptables -t mangle -A squid -j ACCEPT

if iptables -L proxy_mac_check -n &>/dev/null; then
  iptables -t mangle -F proxy_mac_check
else
  iptables -t mangle -N proxy_mac_check
fi
for MAC_ADDRES in 11:22:33:44:55:66 11:22:33:44:55:67; do
  iptables -t mangle -A proxy_mac_check -m mac --mac-source $MAC_ADDRES -j squid
done
iptables -t mangle -A proxy_mac_check -j apache

iptables -t mangle -A PREROUTING -i eth1 -p tcp -m tcp --dport 80 -j proxy_mac_check

iptables -t nat -A PREROUTING -m mark --mark 99 -j DNAT --to-destination $BOX_IP
iptables -t nat -A PREROUTING -m mark --mark 98 -j DNAT --to-destination $BOX_IP:3128