我有一个本地透明代理,但我的问题是,数据包在重新路由时具有路由器 IP,而不是用户 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
- 192.168.1.231 = 代理服务器(squid)+ DNS 服务器
- 192.168.1.1 = iptable/路由器(centOs)
一切似乎都正常,但代理日志中的 IP 总是192.168.1.1
而不是可能192.168.1.46
或192.168.4.25
这对我很重要,因为我对192.168.4.XX
(DHCP) 和192.168.1.XX
或有不同的 squid 规则,192.168.2.XX
而且它确实能帮助我找出谁在滥用互联网。
答案1
使用此方法您可以避免 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://www.tldp.org/HOWTO/TransparentProxy-6.html
答案2
我不确定我对您的设置的解释。但转发可能像这样工作:
# 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
答案3
因此您的设置如下所示:clients
-> router
-> proxy
。如果从proxy
到 的流量clients
流经router
,您可以简单地删除SNAT
规则而不会破坏任何内容,因为router
将看到回复数据包并可以对其进行必要的 IP 转换。如果不是这种情况,那么您可以通过 向 中添加路由,proxy
这样我们就回到了情况 #1。如果这不可能,那么您还可以在 上安装 HTTP 代理,它将通过标头通知您原始用户的 IP 。clients
router
router
proxy
X-Forwarded-for
您也可以使用 Pat 的答案,但需稍加修改:
iptables -A PREROUTING -t nat -i eth0 ! -d $proxy_ip -p tcp --dport 80 -j REDIRECT --to-port 3128
这样,只有重定向的流量会再次重定向到 squid 代理,并且在同一服务器上运行的 apache 可以正常使用。