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 / 问题 / 968601
Accepted
Tometzky
Tometzky
Asked: 2019-05-24 09:10:28 +0800 CST2019-05-24 09:10:28 +0800 CST 2019-05-24 09:10:28 +0800 CST

没有默认路由的 DNAT

  • 772

我在数据中心有一个 TCP 服务,它基于源 IP 地址进行过滤和速率限制。我想把它移到另一个数据中心。

我想在新数据中心的 IP 地址上提供相同的服务,并将单个端口上的所有流量转发到旧端口,这样新数据中心和旧数据中心都可以同时工作。我不能只更改主机名,因为一些客户端使用 IP 地址进行连接(叹气),而另一些客户端使用基于 IP 地址的 IP 过滤(叹气),并且需要数周时间才能更改它们。

我知道我可以对连接进行 SNAT,但如果我这样做,所有连接都将来自同一个 IP,这与基于源 IP 地址的过滤和速率限制相冲突。

我可以 DNAT 连接并通过 VPN 隧道路由它们,但这意味着返回的数据包将尝试使用服务的默认路由和服务源 IP 地址,并且将被客户端忽略。

Linux有没有办法以某种方式标记经过DNAT处理的TCP数据包,以便可以通过VPN隧道而不是服务的默认路由将返回的数据包路由回?

linux
  • 2 2 个回答
  • 586 Views

2 个回答

  • Voted
  1. Best Answer
    Anton Danilov
    2019-05-25T02:31:33+08:002019-05-25T02:31:33+08:00

    有多种方法可以实现您想要的。绘制您的网络拓扑。

    在此处输入图像描述

    最简单的方法

    它只需要 S2(新 DC 中的服务器)上的单个 DNAT 规则和 S1(旧 DC 中的服务器)上的附加路由配置。但这也需要您的应用程序也接受 VPN 隧道地址上的请求。

    S2服务器iptables配置:

    iptables -t nat -A PREROUTING \
             -i eth0 --dst <S2.IP> \
             -p tcp --dport <APP.PORT> \
        -j DNAT --to-address <S1.TUN.IP>:<APP.PORT>
    

    此外,您应该在S2服务器上启用转发(使用sysctl -w net.ipv4.ip_forward=1命令启用它)。

    验证:使用ip route get <S1.TUN.IP> from 8.8.8.8 iif <S2.IFACE>andip route get 8.8.8.8 from <S1.TUN.IP> iif <S2.TUN.IFACE>命令。它应该返回有效的路线。

    S1服务器路由配置:

    ip route add 0/0 dev <TUN.IFACE> table 1
    ip rule add from <S1.TUN.IP> lookup 1 pref 1000
    

    LINUX 会回复来自相同 IP 地址的请求,以及收到的请求。

    验证:使用ip route get <S1.TUN.IP> from 8.8.8.8 iif <S1.TUN.IFACE>andip route get 8.8.8.8 from <S1.TUN.IP>命令。它还应该返回有效的路线。也许你会看到类似的东西invalid cross-device link。在这种情况下,您应该rp_filter在 vpn 隧道接口上调整。

    详细解释:

    1. 客户端以<C.IP>:<SOME.PORT> -> <S2.IP>:<APP.PORT>.
    2. S2服务器收到此请求,将目标重写为<S1.TUN.IP>. 它发生在路由之前,因此在此步骤之后数据包将形成<C.IP>:<SOME.PORT> -> <S1.TUN.IP>:<APP.PORT>.
    3. S2由于路由表,通过VPN隧道转发重写的请求。
    4. S1通过 VPN 隧道接收请求到<S1.TUN.IP>地址。
    5. 您的应用程序S1为请求提供服务并使用源地址回复客户端<S1.TUN.IP>。回复是<S1.TUN.IP>:<APP.PORT> -> <C1.IP>:<SOME.PORT>。
    6. 通过路由规则,所有具有源地址的数据包都<S1.TUN.IP>通过路由表进行路由1。因此,来自您的应用程序的回复数据包将通过 VPN 隧道发送到S2服务器。
    7. S2接收回复,对源地址进行反向翻译,将其<S1.TUN.IP>从<S2.IP>. 这个回复之后变成了<S2.IP>:<APP.PORT> -> <C.IP>:<SOME.PORT>。
    8. 重写的回复被转发回客户端到<C.IP>目标地址。
    9. 客户端按预期收到回复。

    要排除故障,您可以使用tcpdump.

    还有一种方法,那就更复杂了。如果你需要,我会描述它。

    • 2
  2. Count Dooky
    2019-05-24T12:25:37+08:002019-05-24T12:25:37+08:00

    这在另一篇文章中得到了回答,尽管 OP 的问题并不完全相同。

    在 nat 预路由表中转发数据包时如何在数据包上设置标记?

    第一个代码块显示了如何标记在 PREROUTING 中被 DNAT 处理的数据包。

    希望这会有所帮助,干杯!

    • 0

相关问题

  • 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