我有一个本地透明代理,但我的问题是,数据包,当重新路由,有路由器IP而不是用户。 这些是我现在的规则:
iptables -t nat -A PREROUTING -i eth0 -s ! 192.168.1.231 -p tcp -m multiport --dport 80 -j DNAT --to 192.168.1.231:3128 iptables -t nat -A POSTROUTING -o eth0 -s 192.168.0.0/16 -d 192.168.1.231 -j SNAT --to 192.168.1.1 iptables -A FORWARD -s 192.168.0.0/16 -d 192.168.1.231 -i eth0 -o eth0 -p tcp --dport 3128 -j ACCEPT iptables -I FORWARD -i eth0 -p tcp -m multiport --dport 80 -j DROP
一切似乎工作,但代理日志中的IP始终是192.168.1.1而不是可能的192.168.1.46或192.168.4.25
这对我来说很重要,因为我对192.168.4.XX (DHCP)有不同的鱿鱼规则,对192.168.1.XX或192.168.2.XX有不同的鱿鱼规则,这也能帮助我找出谁是错误使用互联网。
用这种方法你可以避免NAT数据包的改变。
在iptables框
iptables -t mangle -A PREROUTING -j ACCEPT -p tcp --dport 80 -s squid-box iptables -t mangle -A PREROUTING -j MARK --set-mark 3 -p tcp --dport 80 ip rule add fwmark 3 table 2 ip route add default via squid-box dev eth1 table 2
在鱿鱼盒子
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
我不确定我对你的设置的解释。 但也许转发工作是这样的:
# HTTP Forward (TCP Port 80) iptables -t nat -A PREROUTING -p tcp -s 0/0 -d 192.168.1.1 --dport 80 -j DNAT --to 192.168.1.231:3128 iptables -t nat -A POSTROUTING -o eth0 -d 192.168.1.231 -j SNAT --to-source 192.168.1.1 iptables -A FORWARD -p tcp -s 192.168.1.1 --sport 80 -j ACCEPT # DNS Forward (TCP & UDP Port 53) iptables -t nat -A PREROUTING -p udp -s 0/0 -d 192.168.1.1 --dport 53 -j DNAT --to 192.168.1.231:53 iptables -t nat -A PREROUTING -p tcp -s 0/0 -d 192.168.1.1 --dport 53 -j DNAT --to 192.168.1.231:53 iptables -t nat -A POSTROUTING -o eth0 -d 192.168.1.231 -j SNAT --to-source 192.168.1.1 iptables -A FORWARD -p udp -s 192.168.1.1 --sport 53 -j ACCEPT iptables -A FORWARD -p tcp -s 192.168.1.1 --sport 53 -j ACCEPT
所以你的设置如下所示: clients – > router – > proxy 。 如果从proxy到clientsstream量通过routerstream动,您可以简单地删除SNAT规则而不会破坏任何东西,因为router将看到回复数据包,并可以对其进行必要的IP转换。 如果情况并非如此,那么您可以通过router将proxy路由添加到clients ,所以我们回到了案例#1。 如果这是不可能的,那么你也可以在router上安装一个HTTP代理,它将通过一个X-Forwarded-for标头向你的proxy通知原始用户的IP。
您也可以稍微修改Pat的答案:
iptables -A PREROUTING -t nat -i eth0 ! -d $proxy_ip -p tcp --dport 80 -j REDIRECT --to-port 3128
通过这种方式,只有redirect的stream量再次被redirect到squid代理,并且运行在同一台服务器上的apache才能正常使用。