0%

Linux设置SSH的Proxy(反向代理)

前言

笔者最近经常加班,因为去加班的同事需要我的提供的服务,而我的服务是直接搭建在自己的笔记本上的。刚好有台闲置的主机没用到,可用来装 Linux 伪装成服务器。可是下班后在家服务器出问题了咋办呢?之前电脑是 Windows 的时候还能直接用 Teamviewer 进行远程操作,Linux 似乎只有黑乎乎的命令行。于是翻山越岭终于找到了解决方案,话不多说,开门见山。

环境

  • 内网服务器(10.0.0.128) 服务器A
  • VPS(zmcdbp.cn) 服务器B
  • MacBook Pro PC

安装 Autossh (服务器A)

包管理安装

系统 命令
ArchLinux sudo pacman -S autossh –noconfirm
Ubuntu/Debian sudo apt-get install -y autossh
Mac OS brew install autossh
Fedora/CentOS sudo yum install autossh

如果你是其他的包管理工具,也可以直接试试看包管理中是否包含 autossh, 如果没有(比如 Fedora 28)也没关系,我们直接用源码编译就好。

源码编译(需要 GCC ,坑爹的 Fedora 28GCC 移除了。。)

1
2
3
4
5
6
wget https://www.harding.motd.ca/autossh/autossh-1.4e.tgz
gunzip -c autossh-1.4e.tgz | tar xvf -
cd autossh-1.4e
./configure
make
sudo make install

OK,安装完成,让我们先到 服务器B 上做点设置。

配置 SSH (服务器B)

使用 SSH 代理需要设置一个配置项,用文本编辑器(Vim、nano等等)打开 /etc/ssh/sshd_config 文件并加上下面这行:

1
GatewayPorts yes

OK,搞定,让我们回到服务器A上。

##连接服务器A和服务器B

执行以下代码:

1
autossh -M 0 -o "ExitOnForwardFailure=yes" -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -NR public-port:localhost:22 remote-username@remote-host

解释一下主要参数。

参数 含义
public-port 公网连接服务器A时想要的 SSH 端口,是服务器B上需要开放的端口,切记不要与已有端口重复
remote-username 服务器B上的用户名
remote-host 服务器B的地址
others 其他的配置项是 autossh 的配置项,具体可以看这里

执行完上面命令后,到服务器B上看下是否已经连接成功,执行以下命令:

1
netstat -anltp | grep public-port

如果看到如下图所示则证明连接上了:

服务器B的端口占用情况

测试从公网连接内网的服务器A

服务器已经连接上了,那么我们开始测试从公网是否可以访问到内网的服务器A,执行以下代码:

1
ssh local-username@remote-host -p public-port

这里多了个 local-username 的参数,意思就是使用处在内网的服务器A的用户名,而不是暴露在公网的服务器B

配置 Autossh 服务

当当当当,很好,已经连接成功了,但是 Ctrl + C 就断开了,咋办呢?很简单,配置个 systemd 服务就可以啦!执行以下命令:

1
sudo vim /etc/systemd/system/autossh.service

然后把下面的内容贴进去,记得把相应的参数替换成你自己的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[Unit]
Description=Auto Proxy SSH To Public Network
Wants=network.target
After=network.target

[Service]
Type=simple
Environment="AUTOSSH_GATETIME=0"
User=username
ExecStart=/usr/bin/autossh -M 0 -o "ExitOnForwardFailure=yes" -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -NR publi-port:localhost:22 remote-username@remote-host
ExecStop=/usr/bin/kill -9 autossh
StandarOutput=syslog
StandarError=inherit
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

保存好文件后,执行以下命令把服务加入开机自启动服务中。

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable autossh.service
sudo systemctl restart autossh.service

大功告成

享受在家里连接公司内网服务器的快感吧!