5

我很困惑为什么我的 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 的情况下使其工作吗?

4

5 回答 5

4

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

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 应该是您的传出接口。

于 2012-09-28T12:57:17.227 回答
4

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

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

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

于 2014-11-25T00:45:24.730 回答
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;
}
于 2015-01-22T15:39:56.277 回答
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

于 2016-08-31T22:27:28.787 回答
0

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

于 2012-06-16T12:00:27.953 回答