如何将内网环境下的机器映射到外网 ip 上已经有许多解决方案了,如:ngrok, 花生壳 🥜, frp 等。这些都需要特定软件的支持,本文介绍如何使用 SSH tunnel 进行简单的内网端口映射。

配置公网 ip 机器

首先修改 /etc/ssh/sshd_config 中的 GatewayPorts 选项,在文件尾部添加

GatewayPorts yes

并重启 sshd

注:macOS 用户重启 sshd 请在 Terminal 中运行:

sudo launchctl stop com.openssh.sshd
sudo launchctl start com.openssh.sshd

配置内网 ip 机器

在内网机器中运行

ssh -N -R  0.0.0.0:8080:localhost:80 [email protected] -p 22

此条命令为将内网机器的 80 端口映射到 [email protected]:228080 端口。

ssh 保持运行

生成 ssh 公钥 🔑 进行免密码连接

检查现有的 ssh 公钥

在内网机器中运行 ls -al ~/.ssh 来查看是否有已存在的 ssh 密钥

ls -al ~/.ssh
# Lists the files in your .ssh directory, if they exist

若有已生成的公钥,请直接跳转到"添加公钥至远程服务器"

生成 ssh 公钥

在内网机器中使用 ssh-keygen 来生成新的密钥

ssh-keygen -t ecdsa -b 521 -C "$(whoami)@$(hostname)-$(date -I)"

(对于新手来说对于提示可以一路回车下去。🌚)

添加公钥至远程服务器

在内网机器中使用 ssh-copy-id 来将公钥至添加远程服务器

ssh-copy-id [email protected]

使用 autossh 进行连接

在安装完 autossh 后,执行

若内网机器用户为 root

autossh -M 5680 -NR 0.0.0.0:8080:localhost:80 [email protected] -p 22 -f

若内网机器用户不为 root

/bin/su -c '/usr/bin/autossh -M 5680 -NR 0.0.0.0:8080:localhost:80 [email protected] -f' - username

其中 username 为内网机器的用户名

参考资料

  1. Restart SSH/sshd in Mac OS X – VIVO の PUB
  2. SSH Tunnel 解决无公网 IP 80 被封等问题
  3. Connecting to GitHub with SSH - User Documentation - GitHub Help
  4. SSH keys - ArchWiki