将端口 80 上的流量重定向到 apache(对于未知的 Mac),以及 squid(对于某些 Mac)

将端口 80 上的流量重定向到 apache(对于未知的 Mac),以及 squid(对于某些 Mac)

我有一个 Linux 机器,其行为类似于路由器,可处理两个网络接口:eth0 用于互联网,eth1 用于 LAN。

我设置了 iptables,以便将来自 LAN 的所有网络流量重定向到本地 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 地址添加此行为的例外,以便将它们的网络流量重定向到监听端口 3128 的 squid 代理而不是 apache。

我设法删除了重定向并让 Web 请求转到请求的主机并附加了另一条规则:

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

但我想要的是将网络流量进行网络转发$BOX_IP:3128。最好的方法是什么?

答案1

为什么你要在行中重复所有这些过滤条件--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

相关内容