让 Linux 服务器将发往外部 IP 的数据包路由到本地主机

让 Linux 服务器将发往外部 IP 的数据包路由到本地主机

我有一个具有特定静态 IP 的路由器a.b.c.d,它一边连接到 Linux 服务器,另一边连接到互联网。

使用 IP 地址从外部访问安装在 Linux 服务器上的软件a.b.c.d:portxx可以正常工作。

但是,如果有人从服务器本身打开浏览器尝试访问相同的软件,则会 a.b.c.d:portxx失败。重试localhost:portxx就可以了。

所以我的诊断是 DSL 路由器很笨并且没有意识到它a.b.c.d自己存在这个问题。

有没有办法修复这个问题,最好是在不改变路由器任何东西的情况下?即Through /etc/hosts服务器上是否有其他机制可以将任何数据包a.b.c.d重新路由到localhost

这可能会破坏其他东西吗?

答案1

问题不在于路由器。路由器会执行已配置的操作 - 它将流量目的地 abcd:portxx 转换到您的 Linux 服务器。它不起作用,但为了理解,您必须查看网络上发生了什么。例如,您的 Linux 服务器是 192.168.1.2,而您的路由器在您的 LAN 网络上是 192.168.1.1

  • 从服务器发送数据包
  • 源 192.168.1.2:1024 目标 abcd:端口xx
  • 在路由器上进行翻译(返回服务器)
  • 源地址 192.168.1.2:1024 目标地址 192.168.1.2:portxx
  • 数据包到达服务器应用程序,它回复 - 并发送回复数据包
  • 源 192.168.1.2:端口xx 目标 192.168.1.2:1024
  • 数据包从服务器到达(停留)到客户端应用程序,但此连接未知,因为您发起与 abcd 的连接并收到来自 192.168.1.2 的回复而不是来自(abcd)的回复 - 数据包被丢弃。

因此可能的解决方案:

1) 在路由器上,如果可以,将来自本地网络的数据包的 SNAT 设置为您的 NATed 公共 IP。如果您有 Linux 路由器,请尝试以下方法

iptables -t nat -I PREROUTING -s 192.168.0.0/24 -d a.b.c.d -j SNAT --to-source 192.168.1.1

您更改了数据包从内网通过路由器的源数据包地址,服务器应用程序回复到 192.168.1.1,并在收到回复时使用 SNAT 规则,将数据包正确映射回服务器上的客户端应用程序。此解决方案适用于所有内网计算机,但在服务器上,您会看到所有请求都来自路由器地址 192.168.1.1。

2)在服务器上,你可以通过 iptables 重定向流量

 iptables -t nat -I OUTPUT -d a.b.c.d -p tcp --dport portxx -j REDIRECT --to-ports portxx

它将来自您的服务器的传出连接重定向到服务器上的本地端口。我认为这可能是您的情况的最佳解决方案

3)在某些情况下,在服务器上添加 abcd 地址可能是解决方案,但有时服务器守护进程(并且它是特定于应用程序的)不会监听所有 IP 地址或对其他地址给出另一个答复。

4)如果你使用主机名而不是 IP 地址,你可以在 Linux 服务器上重新定义 /etc/hosts - 这是最简单且有时有帮助的(DNS 返回:linuxserver abcd),因此在 /etc/hosts 中写入行

192.168.1.2 linuxserver

从 Linux 服务器到“Linuxserver”的连接直接转到 192.168.1.2

相关内容