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

我有一个路由器,一个静态ip abcd连接到一个Linux服务器,另一个连接到互联网。

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

但是,如果由服务器本身的某个人打开的浏览器尝试访问与abcd:portxx相同的软件,则失败。 尝试localhost:portxx再次正常工作。

所以我的诊断是,DSL路由器是愚蠢的,没有意识到abcd本身。

有没有办法解决这个问题,最好不要改变路由器上的任何东西? 即Through /etc/hosts或服务器上的其他一些机制可以将任何数据包到abcd重新路由到localhost

这可能会打破别的吗?

问题不在路由器中。 路由器做什么已经configuration – 它将交通目的地abcd:portxx翻译到您的Linux服务器。 它不工作,但为了理解,你必须看看networking上发生了什么。 例如你的linux服务器是192.168.1.2,你的路由器是192.168.1.1在你的局域网上

  • 从服务器发送数据包
  • src 192.168.1.2:1024 dst abcd:portxx
  • 在路由器上做翻译(回到服务器)
  • src 192.168.1.2:1024 dst 192.168.1.2:portxx
  • 数据包来到服务器应用程序,它会回复 – 并发送回复数据包
  • src 192.168.1.2:portxx dst 192.168.1.2:1024
  • 包到服务器到客户端应用程序,但是这个连接是不知道的,因为你启动连接到abcd并从192.168.1.2有一个答复,而不是(abcd) – 数据包被丢弃。

如此可能的解决

1)在路由器上,如果可以的话,设置SNAT从本地networking的数据包到你的NAT公共IP。 如果你有Linux路由器,请尝试一下

 iptables -t nat -I PREROUTING -s 192.168.0.0/24 -d abcd -j SNAT --to-source 192.168.1.1 

你改变了数据包的源数据包地址,从内部networking经过路由器,服务器应用程序回复到192.168.1.1,并在接收到答复时,SNAT规则,正确地将数据包映射回你的服务器上的客户端应用程序。 此解决scheme适用于所有内部networking计算机,但在服务器上,您将看到来自路由器地址192.168.1.1的所有请求。

2)在服务器上,您可以通过iptables进行REDIRECTstream量

  iptables -t nat -I OUTPUT -d abcd -p tcp --dport portxx -j REDIRECT --to-ports portxx 

它将传出连接从您的服务器redirect到服务器上的本地端口。 我想,这可能是你的情况最好的解决scheme

3)在服务器上添加abcd地址可能是某些情况下的解决scheme,但是有时服务器守护进程(并且是特定于应用程序的)不会监听所有的IP地址,也不会为其他地址提供另一个回复。

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

 192.168.1.2 linuxserver 

从linux服务器到“linuxserver”的连接直接转到192.168.1.2