反向 ssh 隧道不暴露 ec2 上的端口

Posted

技术标签:

【中文标题】反向 ssh 隧道不暴露 ec2 上的端口【英文标题】:Reverse ssh tunnel not exposing the port on ec2 【发布时间】:2020-06-22 02:18:45 【问题描述】:

这个问题可能已经回答了,并且有很多文章展示了如何进行反向 ssh 隧道。然而,我被困在最后一步。

我有一个在 8080 端口上运行 Web 服务的 Linux 机器。它位于 NAT 后面,我无法从覆盖路由器向它转发端口。

我在 AWS 上有一个新的 Ubuntu 18 ec2 实例,我正在使用以下命令从我的 Linux 机器中反转隧道。

ssh -i "key.pem" -R \*:8080:\*:8080 ubuntu@ec2 -p 45332

EC2 ssh 服务器监听端口45332

在服务器上:

$ sudo lsof -i -P -n | grep LISTEN
systemd-r   650 systemd-resolve   13u  IPv4  15830      0t0  TCP 127.0.0.53:53 (LISTEN)
sshd        893            root    3u  IPv4  18322      0t0  TCP *:45332 (LISTEN)
sshd        893            root    4u  IPv6  18333      0t0  TCP *:45332 (LISTEN)
sshd      20731          ubuntu    9u  IPv6  75581      0t0  TCP [::1]:8080 (LISTEN)
sshd      20731          ubuntu   10u  IPv4  75582      0t0  TCP 127.0.0.1:8080 (LISTEN)

如果我在 Ec2 上执行 curl localhost:8080,我会得到正确的 Web 服务响应。

但是当我使用来自同一 ec2 或完全不同的设备的公共 IP/公共 DNS 名称进行 curl 时,我得到:

curl: (7) 无法连接到 IP> 端口 8080:连接被拒绝

我已检查我的 VPC ACL 并允许安全组中的所有入站和出站流量。

我确保防火墙规则没有阻止它:

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
45332/tcp                  ALLOW IN    Anywhere                  
45332/udp                  ALLOW IN    Anywhere                  
8080/tcp                   ALLOW IN    Anywhere                  
8080/udp                   ALLOW IN    Anywhere                  
45332/tcp (v6)             ALLOW IN    Anywhere (v6)             
45332/udp (v6)             ALLOW IN    Anywhere (v6)             
8080/tcp (v6)              ALLOW IN    Anywhere (v6)             
8080/udp (v6)              ALLOW IN    Anywhere (v6)

当这不起作用时,我删除了 ssh 隧道并直接在 ec2 上运行相同的 Web 服务。 这工作得很好。

但是,我想从我的 Linux 机器上运行该服务。

【问题讨论】:

我认为在这种情况下,您需要从 ssh 到 home box 的普通隧道。可以试试ssh -N -L 8080:localhost:8080 ubuntu@ec2 -p 45332 -v 当我在家里的 Linux 机器上运行此命令时,在端口 8080 上运行服务,我收到端口 8080 已在使用中的错误。 bind [127.0.0.1]:8080: Address already in use 我想通过我的 ec2 实例使我的家庭 Linux 机器可用,同时启动从家庭 Linux 机器到 ec2 的 ssh 连接。在这种情况下,我认为简单的 ssh 隧道没有帮助。 【参考方案1】:

我遇到了同样的问题,这对我有用。

来自您本地的 Linux 机器:

ssh -i "key.pem" -R 8081:\*:8080 ubuntu@ec2 -p 45332

请注意,我使用 8081 而不是 8080

然后在 EC2 实例中,通过 ssh 向自身隧道 8081 到 8080。

ssh locahlost -L 8080:localhost:8081

我不太明白怎么做,但是在尝试了不同的组合之后,这个对我有用。

【讨论】:

【参考方案2】:

这是因为出于安全考虑,默认情况下 SSH 仅侦听与环回地址上的转发端口的连接。

要更改该行为,请打开 sshd 配置:

sudo nano /etc/ssh/sshd_config

查找此标志并启用它:

GatewayPorts yes

参考资料:

    https://www.maketecheasier.com/reverse-ssh-tunnel-allow-external-connections/ http://www.snailbook.com/faq/gatewayports.auto.html

【讨论】:

以上是关于反向 ssh 隧道不暴露 ec2 上的端口的主要内容,如果未能解决你的问题,请参考以下文章

scp 通过 ssh 隧道打开

基于 SSH 反向隧道的 Dockerized Telnet

使用动态端口分配的反向 SSH 隧道

ssh 隧道/端口转发无法通过 EC2 实例工作到 VPC 中的 Elasticsearch 集群

两步建立 ssh 反向隧道

反向ssh隧道