Proxy 透明代理的IPTables配置

Proxy 透明代理的IPTables配置,proxy,iptables,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

我不明白为什么我的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。有人能告诉我如何在不进行后期路由跳转到Masquarade的情况下让它工作吗

我认为您没有指定接口,这是在两个方向上进行NAT。尝试将
-o eth0
添加到
-j伪装行中。(根据您的设置,替换任何“外部”接口,而不是
eth0

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

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
--端口80443
将仅转发端口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-tnat-A后路由-s192.168.1.0/24-o eth1-j伪装


eth1应该是您的输出接口。

对于真正的透明代理,您需要使用TPROXY目标(在mangle表中的预路由链中)。所有其他iptables机制(如NAT、伪装、重定向)都会重写数据包的IP地址,这使得不可能找到数据包最初的目的地

代理程序必须像任何其他服务器一样在套接字上绑定()和侦听(),但需要一些特定的套接字标志(这需要一些Linux功能(权限类型)或根)一旦连接,就可以通过某种方式从操作系统获取“预期服务器”


抱歉,我对细节有点懒散,但是搜索“TPROXY”作为关键字会让你快速前进

我也遇到了同样的问题,解决方案是告诉透明代理转发右标题字段中的源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;
}

我使用了
iptables-t nat-A预路由-p tcp-s外部ip到您的设备--dport 80:443-j DNAT--来定位您的应用程序或本地ip:port
。我想您已经将设备中的数据包预路由出去了,它从未连接到端口80或443,这是用于web服务器连接到设备的。192.168.1.5类似于我的本地地址


记住要配置
echo 1>/proc/sys/net/ipv4/ip_forward

只要是NAT,你就需要伪装,这样我就可以保留它的原始ip,所以一旦它到达我的代理服务器,我就得到它的真实ip,而不是我路由器的ip?我想你的问题是代理无法回复你的机器,因为它没有通往它的路。尝试为一个地址添加路由(在代理服务器上,到客户端),将路由器作为网关。NAT需要更少的关注,也许您需要其他方式来验证您的客户端。如果代理需要验证怎么办?别忘了启用IP转发(这花了我太长时间):
sudo bash-c'echo 1>/proc/sys/net/ipv4/ip_forward
是和否。HTTP/1.1客户端将在主机头中发送服务器名称,许多HTTPS客户端支持SNI。这使得NAT对于某些用例来说已经足够好了。@Alex对什么说“是”,对什么说“否”?很抱歉说得含糊不清。是的,目标地址不容易提供给服务器进程是正确的。也就是说,对于HTTP和HTTPS,协议本身包含服务器主机名,这可能已经足够好了。@AlexJasmin我无法忍受关于透明代理的问题没有答案谈论真正的透明代理!其余的都是拐杖。