我有一个远程服务器,IP 为 111.222.333.444。我想在该机器上运行一个 http 服务器,该服务器在 localhost:8000 上运行
我如何从外部(从我希望的机器)向 111.222.333.444:6000 发出请求,以到达在远程服务器上的 localhost:8000 上运行的 http 服务器。
我使用的是 ufw。在/etc/sysctl.conf
DEFAULT_FORWARD_POLICY中启用了 ip_forwarding/etc/default/ufw
尝试过/etc/ufw/before.rules
*nat
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 6000 -j REDIRECT --to-port 8000
COMMIT
在该行中-A PREROUTING -p tcp --dport 6000 -j REDIRECT --to-port 8000
,如果没有指定流量应进入的 IP,是否会将其设置为eth0
接口的默认 IP 地址?
使用 Ubuntu-20.04-amd64
如果有人能告诉我,他将如何编写这个东西来实现相同的目的。通过编辑 iptables,或 ufw 等。
更新:
从头开始。Http 服务器正在 上运行localhost:8000
。我的ufw status
显示如下
To Action From
-- ------ ----
8000/tcp ALLOW Anywhere
6000/tcp ALLOW Anywhere
8000/tcp (v6) ALLOW Anywhere (v6)
6000/tcp (v6) ALLOW Anywhere (v6)
/etc/ufw/before.rules
在*filter 之前添加以下行:
:PREROUTING ACCEPT [0:0]
-A PREROUTING -p tcp --dport 6000 -j REDIRECT --to-port 8000
什么应该允许我在远程服务器上键入命令行
curl localhost:6000
并curl 127.0.0.1:6000
获取响应,正如我所理解的那样。但我收到的是 - curl: (7) Failed to connect to localhost port 6000: Connection refused
。
更新:/etc/ufw/before.rules
从 改为-A PREROUTING -p tcp --dport 6000 -j REDIRECT --to-port 8000
-A INPUT -i eth0 -p tcp --dport 6000 -j ACCEPT
-A INPUT -i eth0 -p tcp --dport 8000 -j ACCEPT
-A PREROUTING -t nat -i eth0 -p tcp --dport 6000 -j REDIRECT --to-port 8000
现在有了新规则,当我从终端发出 curl 请求时,它会挂起。而不是产生错误。
答案1
端口转发
如果您想从公共互联网访问本地主机,使用 Ngrok 可能会对您有所帮助。恩格罗克“将您的本地开发服务器暴露给互联网”,为您提供一个唯一的随机子域名 URL,例如 abcdef.ngrok.io,以便从该子域名访问您的本地主机。如果您拥有自定义域名,则可以选择一个(有关自定义域的更多信息请参见此处)。
注意::不幸的是,您不必使用此方法编辑 IP 表。
答案2
请在服务器上尝试以下命令:
$ rm -f /tmp/f ; mkfifo /tmp/f
$ nc -l 6000 </tmp/f | nc localhost 8000 >/tmp/f
这会将进入服务器 6000 端口的所有 TCP 流量内部重定向到 TCP 端口 8000。
请注意,这仅适用于单个连接,并且必须为每个新连接重复上述第二条命令。因此,这实际上不是一个解决方案,而只是一个测试,看看这是否是你真正想要做的。