AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题 / 586486
Accepted
sat
sat
Asked: 2014-04-04 09:58:29 +0800 CST2014-04-04 09:58:29 +0800 CST 2014-04-04 09:58:29 +0800 CST

如何在同一网络中进行从一个 ip 到另一个 ip 的端口转发?

  • 772

我想NAT在iptables. 这样,所有进入192.168.12.87和端口的数据包都80将被转发到192.168.12.77端口80。

如何用 iptables 做到这一点?

或者

还有其他方法可以达到同样的效果吗?

linux
  • 2 2 个回答
  • 262144 Views

2 个回答

  • Voted
  1. Best Answer
    krisFR
    2014-04-04T13:46:03+08:002014-04-04T13:46:03+08:00

    假设iptables在服务器上运行,这些规则应该有效192.168.12.87:

    #!/bin/sh
    
    echo 1 > /proc/sys/net/ipv4/ip_forward
    
    iptables -F
    iptables -t nat -F
    iptables -X
    
    iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:80
    iptables -t nat -A POSTROUTING -p tcp -d 192.168.12.77 --dport 80 -j SNAT --to-source 192.168.12.87
    

    您必须对端口 80 上的传入流量进行 DNAT,但您还需要对流量进行 SNAT。


    替代(和最好的方法恕我直言):

    根据您的 Web 服务器是什么(Apache、NGinx),您应该考虑在前端服务器(192.168.12.87)上使用 HTTP 代理:

    • mod_proxy (阿帕奇)

    • proxy_pass (NGinx)

    • 91
  2. kasperd
    2014-04-04T13:44:10+08:002014-04-04T13:44:10+08:00

    一个看似明显iptables -t nat -A PREROUTING -d 192.168.12.87 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77不起作用的原因是返回数据包将如何路由。

    您可以设置规则,将发送到 192.168.12.87 的数据包简单地 NAT 到 192.168.12.77,但 192.168.12.77 将直接将回复发送回客户端。这些回复不会通过您的 iptables 规则正在执行 NAT 的主机,因此一个方向的数据包会被转换,但另一个方向的数据包不会。

    解决这个问题有三种方法。

    1. 在第一台主机上,不仅要进行 DNAT,还要进行 SNAT,这样返回的流量将通过第一台主机发回。规则可能看起来像iptables -t NAT -A POSTROUTING -d 192.168.12.77 -p tcp --dport 80 -j SNAT --to-source 192.168.12.87
    2. 从以太网层而不是 IP 层的 DSR 负载平衡和 DNAT 数据包中获取灵感。通过将数据包的目标 MAC 替换为 192.168.12.77 的 MAC 并在以太网上发送而不触及 IP 层,那么 192.168.12.77 可以在虚拟接口上配置 192.168.12.87,从而能够终止 TCP 连接使用客户端已知的服务器 IP。
    3. 在第一台主机上使用幼稚(但不起作用)的解决方案。然后通过对返回流量执行 SNAT 来处理第二台主机上的返回数据包。规则可能看起来像iptables -t nat -A OUTPUT -p tcp --sport 80 -j SNAT --to-source 192.168.12.87

    这三个解决方案中的每一个都有缺点,所以你需要仔细考虑,如果你真的需要做这个特定的转发。

    1. 使用 SNAT 会丢失客户端 IP,因此 2 号主机会认为所有连接都来自 192.168.12.87。此外,您将对所有回复数据包使用通过主机号 1 的带宽,这将与其他方法一起采用更直接的路由。
    2. DSR 方法将中断两个节点之间的所有其他通信。只有当服务器地址不是任何主机的主 IP 时,DSR 方法才真正适用。每个主机都需要有一个主 IP,而不是 DSR IP。
    3. 在一个主机上使用连接跟踪来向一个方向进行转换,而在另一台主机上使用连接跟踪来向另一个方向进行转换是非常丑陋的,并且有多种方式可能会破坏它。例如,如果任一主机上的 NAT 修改了端口号,则无法重建这些端口号。如果它看到的第一个数据包是 SYN-ACK 而不是 ACK,连接跟踪将正常工作也不是给定的。

    在这三种方法中,我认为第一种是最有可能奏效的。因此,如果您不需要知道客户端 IP 地址,那是我推荐的。

    您也可以选择完全忘记 NAT,而不是尝试解决 MAC 或 IP 层的问题。您可以一直到 HTTP 层并在那里寻找解决方案。在这种情况下,您将找到的解决方案是 HTTP 代理。如果您在 192.168.12.87 上安装 HTTP 代理并对其进行适当配置,则可以让它将请求转发到 192.168.12.77 并将答案转发回来。此外,它可以插入一个 X-Forwarded-For 标头,保留原始客户端 IP。然后需要将 192.168.12.77 上的服务器配置为信任来自 192.168.12.87 的 X-Forwarded-For 标头。

    • 33

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve