项目场景
我使用内网穿透的场景:家里一台windows的笔记本,办公室一台windows的服务器,但是由于这台windows服务器没有公网ip,所以一直是用向日葵或者todesk链接,跑代码什么的比较麻烦,所以用我的一个云服务器来搭建一个内网穿透服务。也是在网络上搜集流程来做,在这里做一下汇总记录。
要用frp进行内网穿透首先需要一个有公网IP的云服务器,相当于一个中转机器。
注意:下面的配置中
客户端都是指办公室的windows电脑,也就是你想要远程访问的电脑。
服务端都是指具有公网IP的云服务器
所有的配置都在这两台机器上,你其他要连接办公室服务器的电脑都无需进行额外配置。
一、下载frp客户端和服务端
首先去github上下载frp软件。点击这里进入下载 frp下载地址
如图下载对应文件,分别是win和linux端的,win端的需要这里需要客户端,给办公室的服务器用, linux端的给云服务器用,所以是要服务端。下面进行详细配置。
二、配置
我这里是有一个linux的云服务器作为服务端,windows作为客户端,所以这里我也是分别下载了这两个压缩包,下载好之后进行解压。
1. win端
首先是windows端,win端作为客户端,我们只保留这三个c结尾的文件,其他的可以删除
配置只需要把frpc.ini中的server_addr项,改为自己云服务器的公网IP地址就可以了,其他的不需要动,了解原理之后可以自己进行更改或者添加,我这里就是简单的先连通,但其实我的需求这个配置已经可以满足了。
- [common]
- server_addr = 自己的服务器公网IP
- server_port = 7000
- # 下面这个可以创建多个,做多个端口映射。
- # 其中local_port就是本地需要映射的端口
- # remote_port就是云服务器的端口
- # 也就是说,连接的时候,我们只需要连接云服务器的6000端口,就相当于链接办公室服务器的22端口
- [ssh]
- type = tcp
- local_ip = 127.0.0.1
- local_port = 22
- remote_port = 6000
复制代码
然后把win的文件放到你需要内网穿透的这台win上,随便找一个位置,建议别放C,有权限问题。
我放在了D盘下创建了一个叫做frp的文件夹,把上面的三个文件拷贝进去就可以了。
2. windows开启openssh
因为windows端,默认没有下载openssh服务端,所以我们这里要下载一下,这里有两种下载方式,一种是去设置中,找到添加可选方式,搜索openssh,找到openssh服务端,下载。下载好之后去计算机管理,服务,找到opensshservice这个服务,打开它,并在属性中设置自动启动就可以了。
这个网上有很多教程,下面给出一个直接用命令行下载的方法,这个比较快不用找,所以详细介绍这个方法。
首先需要用管理员身份启动 PowerShell,使用如下命令看一下,要确保 OpenSSH 可用于安装:
- Get-WindowsCapability -Online | ? Name -like 'OpenSSH*'
复制代码
输出应该是类似的结果:
- Name : OpenSSH.Client~~~~0.0.1.0
- State : NotPresent
- Name : OpenSSH.Server~~~~0.0.1.0
- State : NotPresent
复制代码
然后使用 PowerShell 安装服务器即可:
- Add-WindowsCapability -Online -Name OpenSSH.Server~~~~0.0.1.0
复制代码
输出结果类似:
- Path :
- Online : True
- RestartNeeded : False
复制代码
这样就可以完成 OpenSSH 的安装。
安装完成之后,就需要进行一些初始化配置了,还是以管理员身份,使用 PowerShell 执行即可。
首先需要开启 SSHD 服务:
然后设置服务的自动启动:
- Set-Service -Name sshd -StartupType 'Automatic'
复制代码
最后确认一下防火墙是否是放开的:
- Get-NetFirewallRule -Name *ssh*
复制代码
如果是放开的,那么结果会提示 OpenSSH-Server-In-TCP这个状态是 enabled。
好了,完成如上操作之后我们就可以使用 SSH 来连接我们的 Windows 服务器了。
但是注意,这里只开启了openssh服务,我们只能在局域网中和这个电脑经行ssh链接
3. 服务端(linux端)
linux端也是只需要保留三个s结尾的文件作为服务端,配置如下,其实不需要更改,如果想要网页端的一个显示面板,可以加上下面的内容,也就是在浏览器访问服务器的7500端口,可以出来一个可视化的面板。
frps.ini
- [common]
- bind_port = 7000
- # 下面的内容可要可不要,没什么大用,不用的话配置文件都不需要改,直接上传
- dashboard_port = 7500
- # dashboard 用户名密码,默认都为 admin
- dashboard_user = admin
- dashboard_pwd = admin
复制代码
这里你一定要记得去云服务器管理页面,在防火墙中把6000,7000,7500这三个端口打开,如果你需要更多端口的映射,你就要记得把端口打开。
然后把我们配置好的linux端的三个文件都上传到服务器,我是放在了root目录下创建了一个frp的文件夹,这个位置无所谓,你能找得到就可以。
三、运行
接下来,我们分别把客户端和服务端手动运行起来,以便测试没有什么问题。
1. linux端
把文件上传好之后,在这个文件夹中,输入以下命令
如果提示权限不足,输入下面的命令把权限给他
然后再输入上面的命令跑起来,会提示你运行成功,linux端也就是服务端就运行好了
2. win端
这里我们先进入之前,创建的frp文件夹中,然后在这个文件夹下打开cmd
运行如下命令
跑起来之后就可以了,这个时候会看到linux服务端多了三条,就说明他们已经成功连起来了
3. 测试
然后可以用家里的电脑试一下,在powershell中输入
- ssh -p 6000 你要连接的win的用户名@你的服务器公网IP
复制代码
第一次链接会让你输入yes,然后输入密码,就连接成功了,到这里可以连接成功,已经算是是完成了,可以做很多事情了。
四、配置自启动
上一步我们是手动启动,关了窗口就没了,重启之后还要手动重新打开,比较麻烦。
所以我们配置一下自动启动,一劳永逸。
用样的分别在两个地方分别配置
1. linux
先进入下面的文件夹
在这个文件夹中我们创建并编辑文件frps.service
文件中我们写下面的内容
- [Unit]
- Description=Frp Server Service
- After=network.target
- [Service]
- Type=simple
- User=你的用户名
- Restart=on-failure
- RestartSec=5s
- ExecStart=/root/frp/frps -c /root/frp/frps.ini "这里写你的绝对路径的手动启动frc的命令"
- LimitNOFILE=1048576
- [Install]
- WantedBy=multi-user.target
复制代码
需要改的位置就两个,User和ExecStart,user改成你的用户名,ExecStart改成你的手动启动命令,但是注意要用绝对路径,修改好之后我们:wq保存退出
然后分别执行下面的命令
- systemctl daemon-reload //重新加载
- systemctl enable frps //frps自启动
- systemctl start frps //开启frps服务
- systemctl status frps //查看frps开启状态
复制代码
在输入systemctl status frps后,可以看到输出内容说已启动就ok了
2. win端
这里配置的有两种方式,一个是bat快捷方式放在启动文件夹里,一个是做服务项
这里我们做做服务项,稍微复杂一点,但是很方便,而且没有黑窗口
使用WinSW实现service服务配置
WinSW(Windows Service Wrapper)是一个开源的 Windows 服务包装器,它可以将任何可执行文件(如 Java 应用程序、Python 脚本、Ruby 脚本等)转换为 Windows 服务,并为其提供了一些额外的功能,如重新启动、日志记录、配置文件管理等。
1. 下载WinSW安装包
github下载地址:WinSW
将下载的文件改名为winsw.exe,并在同级创建winsw.xml文件,都放在win端的frp文件夹中
下面配置winsw,我们编辑winsw.xml文件
- <service>
- <!-- 该服务的唯一标识 -->
- <id>frpc</id>
- <!-- 该服务的名称 -->
- <name>frpc_0.43.0-windows-amd64</name>
- <!-- 该服务的描述 -->
- <description>frp内网穿透-客户端</description>
- <!-- 要运行的程序路径 -->
- <executable>D:\frp_0.43.0\frpc.exe</executable>
- <!-- 携带的参数 -->
- <arguments>-c D:\frp_0.43.0\frpc.ini</arguments>
- <!-- 第一次启动失败 60秒重启 -->
- <onfailure action="restart" delay="60 sec"/>
- <!-- 第二次启动失败 120秒后重启 -->
- <onfailure action="restart" delay="120 sec"/>
- <!-- 日志模式 -->
- <logmode>append</logmode>
- <!-- 指定日志文件目录(相对于executable配置的路径) -->
- <logpath>logs</logpath>
- </service>
复制代码
2. 运行
配置好之后,我们安装服务,在当前文件中打开cmd,运行下面的命令
会提示服务安装成功
然后我们打开服务,Win键 + R,然后输入services.msc
找到刚才安装的服务
我们右键点击属性,把启动方式改成自动,然后再到这个页面右键启动它,就ok了,以后就不用管了,也不会出来黑窗口
补充:winsw常用命令
- //注册服务
- .\winsw.exe install
- //卸载服务
- .\winsw.exe uninstall
- //启动服务
- .\winsw.exe start
- //停止服务
- .\winsw.exe stop
- //重启服务
- .\winsw.exe restart
- //查看状态
- .\winsw.exe status
复制代码
五、免密登录
这个算是一个补充,之前的每次登录都会要求你输入密码,会比较麻烦,所以可以配置免密登录,这样每次登录直接就能连接,而不需要输入密码,步骤也很简单。
1.生成公钥和私钥
Windows 打开 cmd
输入:ssh-keygen
连续回车或者根据提示确定生成的私钥公钥存放的路径。默认(就是一路回车)会在C盘/用户/用户名/.ssh目录下生成公钥和私钥。
id_rsa:私钥
id_rsa.pub:公钥
2. 将公钥拷贝到服务器
-
在服务器输入 ssh-keygen回车(生成服务器的公私钥)
-
如果是windows端,就在cmd中输入ssh-keygen
-
完成后会在用户目录下生成 .ssh目录(输入 ls -a查看)
-
同样的windows端的话就是在C盘用户目录生成.ssh目录
-
进入ssh目录 cd .ssh
-
将客户端的公钥(也就是刚刚Windows上自己生成的id_rsa.pub)添加到 authorized_keys文件:
-
可以vim authorized_keys直接将Windows上自己生成的id_rsa.pub的内容拷贝过去
注意:如果没有 authorized_keys文件的话,用 touch authorized_keys创建一个,创建后权限改为 600
-
windows端的操作类似,也是在.ssh目录中,有一个authorized_keys文件,注意这里是没有后缀名的,如果没有就自己创建一个,然后把在客户端生成的公钥,也就是id_rsa.pub里面的内容,全部复制到authorized_keys中
-
之后再继续增加免密登录的设备的话,就继续往authorized_keys文件中复制公钥就可以了。
4. 重启ssh服务
linux端直接执行下面的命令
window端就去计算机管理,找到里面的服务,然后找到之前安装的openssh服务端,右键重启他就可以了
然后链接时就可以不用输入密码了
六、使用
内网穿透之后,想做什么都可以。比如可以用vscode的remote ssh插件,直接链接到服务器,相当于直接在你配置了内网穿透的机器上跑代码,体验感非常好。
而需要注意的是,你在连接时,你要输入的ip都是你有公网ip的服务器的ip,而端口就是我们之前设置好的端口6000。
命令就是这个
- ssh -p 6000 你要连接的win的用户名@你的服务器公网IP
复制代码
如下图所示,下载这个插件之后,添加你的服务器进来,就可以本地写代码,服务器跑代码了。链接的时候,会让你输入一段ssh命令,就写上面的就可以了。