iptables 带透明代理,如何传递用户 IP

iptables 带透明代理,如何传递用户 IP

我有一个本地透明代理,但我的问题是,数据包在重新路由时具有路由器 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.46192.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 。clientsrouterrouterproxyX-Forwarded-for

您也可以使用 Pat 的答案,但需稍加修改:

iptables -A PREROUTING -t nat -i eth0 ! -d $proxy_ip -p tcp --dport 80 -j REDIRECT --to-port 3128

这样,只有重定向的流量会再次重定向到 squid 代理,并且在同一服务器上运行的 apache 可以正常使用。

相关内容