【问题标题】:IPTables configuration for Transparent Proxy透明代理的 IPTables 配置
【发布时间】:2012-05-22 15:50:40
【问题描述】:

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

【问题讨论】:

  • 只要是 NAT 你就需要伪装
  • 有没有其他方法可以保留它的原始 ip,所以一旦它到达我的代理服务器,我就会得到它的真实 ip,而不是我的路由器的 ip?
  • 我猜你的问题是代理无法回复你的机器,因为它没有路由到它。尝试为一个地址添加路由(在代理服务器上,到客户端),将您的路由器作为网关。 NAT 需要的注意力要少得多,也许您需要其他方式来验证您的客户端。

标签: proxy iptables


【解决方案1】:

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

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

【讨论】:

  • 如果代理需要身份验证怎么办?
  • 别忘了启用 IP 转发(这花了我太长时间):sudo bash -c 'echo 1 > /proc/sys/net/ipv4/ip_forward
【解决方案2】:

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

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

对不起,我有点懒,但是搜索“TPROXY”作为关键字会很快!

【讨论】:

  • 是和不是。 HTTP/1.1 客户端将在 Host 标头中发送服务器名称,并且许多 HTTPS 客户端支持 SNI。这使得 NAT 对于某些用例来说已经足够好了。
  • @Alex “是”对什么,“否”对什么?
  • 抱歉含糊不清。是的,您是正确的,目标地址不容易被服务器进程使用。也就是说,对于 HTTP 和 HTTPS,协议本身包含可能足够好的服务器主机名。
  • @AlexJasmin 我无法忍受这个关于透明代理的问题没有关于真正透明代理的答案!其余的都是拐杖。
【解决方案3】:

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

【讨论】:

    【解决方案4】:

    我使用了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

    【讨论】:

      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-02-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-29
        • 2010-12-25
        • 1970-01-01
        相关资源
        最近更新 更多