我有一个 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