需求与设计
需求:在家通过ssh连接公司电脑(Windows系统)进行开发
设计:使用公网服务器(Ubuntu)安装frps做中转,公司电脑(Windows)安装frpc客户端以及OpenSSH-server作为被访者,家里电脑(Windows)安装frpc客户端以及OpenSSH-client作为访客。
中转服务器frps安装和配置
下载frp
下载页面:Releases · fatedier/frp (github.com)
服务器操作系统是Ubuntu,选择linux amd64进行下载,下载链接:
https://github.com/fatedier/frp/releases/download/v0.43.0/frp_0.43.0_linux_amd64.tar.gz
通过网络下载:
1 | wget https://github.com/fatedier/frp/releases/download/v0.43.0/frp_0.43.0_linux_amd64.tar.gz |
下载到本地再拷贝过去(scp
命令:scp [local_file] [remote_user]@[ssh_address]:[remote_path]
):
1 | scp frp_0.43.0_linux_amd64.tar.gz user@ip:/etc/frp |
解压
1 | tar -xf *.gz # 全部解压,省得输文件名 |
-x
取出文件
-f
指定文件名
两个参数缺一不可。解压后:
中转服务配置
1 | # frps.ini |
其他客户端通过bind_port
连接中转服务器
dashboard是frp运行状态的检查面板,也可以在这里查看代理数据的统计,dashboard_
配置了其运行的端口、用户名和密码
完整配置在压缩包的”frps_full.ini”文件中,参考frp/frps_full.ini at dev · fatedier/frp (github.com)
启动服务
打开命令行,进入解压后的目录执行以下命令即可启动。
1 | ./frps -c ./frps.ini |
添加到系统服务并设置开机运行
在目录/etc/systemd/system
中添加文件frps.service
,写入:
1 | [Unit] |
启动服务:
1 | systemctl start frps |
查看并设置自动启动:
1 | systemctl is-enabled frps |
输入systemctl status frps
或service frps status
,查看运行状态:
开启防火墙端口
1 | firewall-cmd --add-port=[port]/tcp --permanent |
被控端Windows配置
开启OpenSSH服务端
在Windows-设置-应用-可选功能,添加可选功能,选择OpenSSH服务器,安装:
右键“计算机”,管理,服务,找到“OpenSSH SSH Server”,启动并设置开机自动启动:
在命令行输入ssh [用户名]@localhost
,并输入当前用户的密码,即可通过ssh登录当前用户:
被控端配置frpc
使用私有化连接方式,被控端frpc.ini配置:
1 | # frpc.ini |
该项配置将被控端的22端口暴露给中转服务器,其他客户端通过中转服务器,认证通过密钥后,即可连接该被控端。
运行./frpc.exe -c ./frpc.ini
,即可启动。
控制端配置frpc
1 | # frpc.ini |
运行./frpc.exe -c ./frpc.ini
,在命令行输入ssh -oPort [用户名]@127.0.0.1
,即可进行ssh连接。
Windows frpc客户端持久化运行
NSSM - the Non-Sucking Service Manager
下载后解压nssm-2.24.zip
,打开命令行cd
到该文件夹下的win32
或win64
文件夹中,执行以下命令:
1 | ./nssm.exe install CustomService |
这句话的意思是将要在添加一个名为CustomService
的系统服务,运行后会弹出一个对话框,选择程序目录、程序名称、输入命令行参数等,全都输入完毕再点击“确定”,即可添加服务。
输入frpc.exe
的程序目录以及配置文件参数:
然后打开计算机管理,找到服务nssmFrpc22,启动服务并设置开机自启动,被控端的配置就算完成。控制端的frpc配置与被控端的一致。
控制端VS Code开启免密登录
主要针对控制端,连接时省得输入密码
控制端操作
生成密钥对(使用git bash):
1 | ssh-keygen -t rsa -C "example@abc.com" |
命令执行期间需要输入密钥对的名称,假设为id_rsa
生成后,将得到id_rsa
和id_rsa.pub
,前者是私钥,后者是公钥。将私钥文件拷贝到用户文件夹的.ssh
文件夹中
打开VS Code,确保安装插件Remote - SSH(ms-vscode-remote.remote-ssh
)后,点击左下角,并选择“Connect to Host…”,点击“Add New SSH Host…”,输入ssh -oPort=6000 [被控端用户名]@127.0.0.1
,将该配置添加到[用户文件夹]/.ssh/config
文件中,随后VS Code打开该文件,找到刚刚添加的条目,加上字段IdentityFile
,将其设置为私钥文件的路径,如下图所示:
最后将id_rsa.pub
文件中的公钥字符串拷贝到被控端[用户文件夹]/.ssh/authorized_keys
文件中,没有就新建一个文本文件改后缀名,若已存在则换行添加。
被控端设置允许密钥对登录
接着需要对被控端的OpenSSH-server做进一步配置,使其允许密钥对连接。
打开文件C:\ProgramData\ssh\sshd_config
,确保以下几个选项的配置正确:
1 | # 允许使用公钥验证登录 |
接着将OpenSSH SSH Server服务重启,即可完成配置。
连接
在控制端,打开VS Code,使用Remote SSH连接到前几步添加的服务器,第一次连接需要选择服务器,选择“Windows”,若不需要输入密码直接连接,则说明密钥对配置成功。
使用VS Code连接被控端时,会自动在被控端Windows用户文件夹下的.vscode-server
文件夹安装Remote SSH的相关资源:
远程连接时安装的插件都会放在这个文件夹中,需要注意避免用户文件夹过大。