我很困惑为什么我的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吗?
答案 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
,取决于您的设置。)