我有一个具有特定静态 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