透明代理的IPTables配置

Jam*_*s G 5 proxy iptables

我很困惑为什么我的IPTable无法在路由器中工作。我想做的是将来自目的IP的所有数据包重定向到端口80和443到192.168.1.110:3128。但是,当我尝试这样做:

 iptables -t nat -A PREROUTING -s 192.168.1.5 -p tcp --dport 80:443 -j DNAT --to-destination 192.168.1.110:3128
Run Code Online (Sandbox Code Playgroud)

不起作用。但是,当我添加它时,

iptables -t nat -A POSTROUTING-j MASQUARADE
Run Code Online (Sandbox Code Playgroud)

有用。但假装的问题是我没有得到真正的IP,而是路由器的IP。我需要获取源IP,以便我的代理服务器可以记录连接到它的所有IP。有人可以告诉我如何在不使POSTROUTING跳至Masquarade的情况下使其工作吗?

vin*_*rag 5

如果我没记错的话,该规则的正确语法是:

iptables -t nat -A PREROUTING -s 192.168.1.5 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 192.168.1.110:3128
Run Code Online (Sandbox Code Playgroud)

--dport 80:443将转发从 80 到 443 的所有端口
--dports 80,443将仅转发端口 80 和 443。

如果您希望将端口 80 和 443 上到达 192.168.1.5 的流量转发到 192.168.1.110 的 3128 端口,那么您应该使用以下规则:

iptables -t nat -A PREROUTING -d 192.168.1.5 -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 192.168.1.110:3128
Run Code Online (Sandbox Code Playgroud)

您还应该确保 192.168.1.110 上的网关指向您的路由器 IP。

最后您可以使用如下的伪装规则。

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADE

eth1 应该是您的传出接口。

  • 如果代理需要身份验证怎么办? (2认同)

Rob*_*mer 5

对于真正的透明代理,您需要使用 TPROXY 目标(在 mangle 表中的 PREROUTING 链中)。所有其他 iptables 机制(如任何 NAT、MASQUERADE、REDIRECT)都会重写数据包的 IP 地址,这使得无法找出数据包最初的目的地。

\n\n

代理程序必须像任何其他服务器一样在套接字上进行bind()和listen(),但需要一些特定的套接字标志(这需要一些Linux功能(权限类型)或root)。\xe2\x80\x93 连接后,可以通过某种方式从操作系统获取 \xe2\x80\x9cintended 服务器\xe2\x80\x9d。

\n\n

抱歉,我\xe2\x80\x99m对细节有点懒,但是搜索\xe2\x80\x9cTPROXY\xe2\x80\x9d作为关键字会让你快速前进!

\n

  • 抱歉说得含糊。是的,您是对的,目标地址不容易供服务器进程使用。也就是说,对于 HTTP 和 HTTPS,协议本身包含服务器主机名,这可能就足够了。 (2认同)

小智 0

我认为您通过不指定接口来进行双向 NAT。尝试添加-o eth0到您的-j MASQUERADE行中。(根据eth0您的设置,替换您的“外部”接口,而不是 。)