У меня есть 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