使用 ssh 隧道使用外网访问 NAT 内网服务。

情景描述

一台电脑能够 使用 ssh 连接到外部电脑,比如地址是 115.115.115.1,但是反过来不行,因为这台电脑得到的地址是 10 开头的 NAT 内网地址。

现在希望 外面的 115 地址的机器可以 ssh 到这台 10 地址的机器上,并且访问该机器上面的 web 服务(比如qbittorrent的webui)。

单独使用 ssh 方向透穿不稳定,因为 ssh 不活动一段时间过后这条连接就会被中断,然后你在外面的 115 那里是死活也每办法让 10 那里再重新 ssh到 115这里的啦。

于是 autossh 就被用来干这样一件事情,维持一条持续的 ssh 通道。

反向穿透 ssh

1
2
autossh -M 5678 -CNR 2333:localhost:22 [email protected] -p 22

5678 是autossh的监听端口,2333 就是在外部 115 机器上访问 10 机器的端口号,第一个 22 表示 10 机器的 ssh 在22端口(默认值),后面的表示 115 机器ssh端口在默认的22。

这样做有个问题,就是需要输入 115 机器的ssh密码,我们可以使用 ssh 的 pub key避免输入密码,就像我们使用github那样。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
#------------------
# 在 10 机器上
ssh-keygen -t rsa
# 生成公钥,自己记得给个名字

cat ~/.ssh/你命的名.pub

#------------------
# 复制到 115 的机器上面
# 比如放到 ~/.ssh/authorized_keys 里面

# 编辑 /etc/ssh/sshd_config 文件

# 添加或则修改
AuthorizedKeysFile      .ssh/authorized_keys

这样就能实现 10 机器免密码 ssh 到 115 机器。

为了实现开机自动使用 autossh 反向透穿,使用 systemd,

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
vim /etc/systemd/system/autossh.service

[Unit]
Description=auto SSH
After=network.target
[Service]
User=rachpt
ExecStart=/usr/bin/autossh -M 5678 -CNR 2333:localhost:22 [email protected]
[Install]
WantedBy=multi-user.target

一通 daemon-reload enable start就可以了。

记得kill掉占用端口的进程,不然gg…

反向穿透 web 服务

这里以 qbittorrent-nox webui 为例。

1
autossh -M 5001 -CNR 10010:localhost:10010 [email protected]

重要提示:远程端口和服务端口必须一致,我用的10010端口,否则401连不上。

当然 qbittorrent-nox 需要在 10010端口运行 webui(具体请使用 help)。

最后

1
2
3
sudo lsof -t -i:10010

# 查看占用端口 10010 的进程