透明代理的IPTables配置

时间:2012-05-15 06:53:31

标签: 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

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

iptables -t nat -A POSTROUTING-j MASQUARADE

它有效。但masquarade的问题是我没有得到真正的IP,而是路由器的IP。我需要获取源IP,以便我的代理服务器可以记录连接到它的所有IP。有人可以告诉我如何让它工作而不会让POSTROUTING跳到Masquarade吗?

5 个答案:

答案 0 :(得分:3)

如果我没有错,规则的正确语法是:

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

--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

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

最后,你可以使用如下的假面舞会规则。

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

eth1应该是您的传出界面。

答案 1 :(得分:2)

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

代理程序必须像任何其他服务器一样在套接字上绑定()和listen(),但需要一些特定的套接字标志(这需要一些Linux功能(权限类型)或root)。 - 连接后,有一些方法可以从操作系统中获取“预期服务器”。

抱歉,我对这些细节有点懒惰,但搜索“TPROXY”作为关键字可以让你快速前进!

答案 2 :(得分:1)

我有同样的问题,解决方法是告诉透明代理在正确的标题字段中转发源IP。 在我的nginx代理的情况下,规则接近:

location / {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $host;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://name_of_proxy;
    proxy_redirect off;
}

答案 3 :(得分:1)

我使用了iptables -t nat -A PREROUTING -p tcp -s foreign ip to your device --dport 80:443 -j DNAT --to-destination your application or local ip:port。我认为您在设备中预先设置了从未连接到端口80或443的数据包,这些是用于Web服务器连接到设备的.192.168.1.5就像我的本地地址

并记得配置echo 1 > /proc/sys/net/ipv4/ip_forward

答案 4 :(得分:0)

我认为你没有指定一个接口,而是在两个方向上进行NAT。尝试将-o eth0添加到-j MASQUERADE行。 (取代您的“外部”界面而不是eth0,取决于您的设置。)