我在安装新的 Ubuntu 服务器时遇到了问题(Ubuntu 22.04.1 LTS-5.15.0-56-通用 x86_64)。
我运行了 PHP 内置服务器,并在所有接口上监听端口 8080:
php -S 0.0.0.0:8080
当我尝试从同一网络中的其他计算机检查它时,它起作用了(192.168.1.18
是服务器的 IP)
curl -I http://192.168.1.18:8080
HTTP/1.1 200 OK
但是,当我将路由器配置为打开端口8080
并将所有请求转发到192.168.1.18:8080
时,我无法再连接到服务器,服务器在请求到达后立即断开连接:
curl -I http://<External IP>:8080
curl: (56) Recv failure: Connection reset by peer
从 PHP 日志中,我看到了这一点
<Client IP>:53799 Accepted
<Client IP>:53799 [200]: HEAD /
<Client IP>:53799 Closing
我尝试在另一台计算机上执行同样的事情(在我的 Mac 上监听端口 8080,让路由器将请求转发到它)并且一切正常,所以我很确定问题不在于路由器 - 我在这个路由器上使用 NAT 已有多年了。
我检查了 ufw,但它说它处于非活动状态
$ ufw status
Status: inactive
还有 iptables
$ iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
tcpdump 捕获的数据包
$ tcpdump port 8080
01:39:24.729154 IP <Client IP>.60626 > ubuntu-22.http: Flags [S], seq 2953074355, win 65535, options [mss 1460,nop,wscale 6,nop,nop,TS val 2461284049 ecr 0,sackOK,eol], length 0
01:39:24.731151 IP <Client IP>.60626 > ubuntu-22.http: Flags [.], ack 3852377597, win 2058, options [nop,nop,TS val 2461284051 ecr 813415924], length 0
01:39:24.731153 IP <Client IP>.60626 > ubuntu-22.http: Flags [P.], seq 0:86, ack 1, win 2058, options [nop,nop,TS val 2461284051 ecr 813415924], length 86: HTTP: GET / HTTP/1.1
01:39:24.731992 IP <Client IP>.60626 > ubuntu-22.http: Flags [R], seq 2953074442, win 0, length 0
01:39:24.836197 IP <Client IP>.60626 > ubuntu-22.http: Flags [P.], seq 0:86, ack 1, win 2058, options [nop,nop,TS val 2461284156 ecr 813415924], length 86: HTTP: GET / HTTP/1.1
你遇到过这种情况吗?或者我在 Ubuntu 上遗漏了什么?谢谢!非常感谢!
答案1
这行不通。
您正在尝试通过 NAT 规则将 LAN 外部的 IP 传输到 LAN 内部的 IP。您要求路由器将流量通过同一接口两次(从公网 IP 传输到您的 nat'd 源端口公网 IP,这是该网络上的唯一接口)。必须在接口之间路由,而不是在“地址”或其他抽象之间路由。此流量将被自动丢弃,因为它永远不会通过 NAT 规则。
简而言之:
- 内部->外部 IP - 有效
- 内部->外部 IP 通过 NAT 转换为内部 IP - 不行,也永远不会起作用。
撤销你所做的任何花哨操作,恢复 NAT 规则,并正确使用它。仅通过 LAN IP 或环回访问服务器。使用类似这 查看远程访问是否可以成功以及您的规则是否正常运行。