我很困惑为什么我的 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
它有效。但伪装的问题是我没有得到真正的IP而是路由器的IP。我需要获取源 ip,以便我的代理服务器可以记录连接到它的所有 ip。有人可以告诉我如何使其工作而不使 POSTROUTING 跳转到 Masquarade 吗?
对于真正的透明代理,您需要使用 TPROXY 目标(在 mangle 表中,PREROUTING 链中)。所有其他 iptables 机制(例如任何 NAT、MASQUERADE、REDIRECT)都会重写数据包的 IP 地址,这使得无法找出数据包最初的目的地。
代理程序必须像任何其他服务器一样在套接字上进行bind()和listen(),但需要一些特定的套接字标志(这需要一些Linux功能(权限类型)或root)。 – 连接后,可以通过某种方式从操作系统获取“目标服务器”。抱歉,我对细节有点懒,但是搜索“TPROXY”作为关键字会让你快速前进!
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。
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
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 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
-o eth0
添加到您的
-j MASQUERADE
行中。 (替换您的“外部”接口,而不是
eth0
,具体取决于您的设置。)