此文记录将本地电脑作为服务器,让所有公网网络上的用户都可以访问我的服务器。
目录
为什么要进行内网穿透?
众所周知,本地电脑虽然连接了网络,但是只能上网,也就是只能访问公网上的网站等等,而其他用户是无法直接访问我们的电脑的,当我们写好了网站程序,运行起来之后只能在自己的电脑上访问自己的网页,其他人是无法访问的。
因为我们自己的电脑连接上网络之后,IP地址是不断变化的,没有固定的公网IP,所以别人是无法访问的。
这就需要用到内网穿透技术,此技术可以让其他网络用户访问我们的本地服务。
本文直接讲解如何使用frp(一个内网穿透工具)实现内网穿透来让别人访问我们本地电脑的网站服务,关于内网穿透的原理不做赘述,可自行百度学习。
为什么使用frp这个工具?
花生壳比较出名,但是已经商业化,使用上有限制,frp完全开源,并且无限制条件。
使用frp做内网穿透需要哪些准备?
一台本地可以连接网络的电脑
一个有公网IP的云服务器(VPS),腾讯云、阿里云、华为云、搬瓦工等等都可以。
VPS相关
因为frp的原理是利用服务端(所准备的VPS)进行转发,因而VPS的速度直接决定了之后连接的质量,请根据自己的需要选择相应主机配置。我使用了腾讯云的学生机。系统使用Ubuntu 16.04.5 x64,frp客户端和服务端本身同时均支持Linux和Windows,且配置方法一样,请根据实际环境自行测试,如果你是新建的VPS,那选择Ubuntu 16.04.5 x64就可以了。服务端设置
SSH连接到VPS之后运行如下命令查看处理器架构,根据架构下载不同版本的frparch查看结果,如果是“X86_64“即可选择”amd64”,运行如下命令,根据架构不同,选择相应版本并进行下载
wget然后解压
tar -zxvf frp_0.36.2_linux_amd64.tar.gz文件夹改个名,方便使用
cp -r frp_0.36.2_linux_amd64 frp把解压出来的文件夹复制到你想要的目录下,为了方便我直接放在用户目录下了,进入该目录
cd frp查看一下文件
ls -a我们只需要关注如下几个文件
frpsfrps.inifrpcfrpc.ini前两个文件(s结尾代表server)分别是服务端程序和服务端配置文件,后两个文件(c结尾代表client)分别是客户端程序和客户端配置文件。
因为我们正在配置服务端,可以删除客户端的两个文件
rm frpc rm frpc.ini然后修改frps.ini文件
vim frps.ini这个文件应有如下格式
[common] bind_port = 7000 dashboard_port = 7500 token = dashboard_user = admin dashboard_pwd = admin vhost_http_port = 80 vhost_https_port = 443“bind_port”表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。“dashboard_port”是服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为VPS的IP)查看frp服务运行信息。“token”是用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。“dashboard_user”和“dashboard_pwd”表示打开仪表板页面登录的用户名和密码,自行设置即可。“vhost_http_port”和“vhost_https_port”用于反向代理HTTP主机时使用。编辑完成后保存(vim保存如果不会请自行搜索)。
之后我们就可以运行frps的服务端了
./frps -c frps.ini如果看到屏幕输出这样一段内容,即表示运行正常,如果出现错误提示,请检查上面的步骤。
2019/01/12 15:22:39 [I] [service.go:130] frps tcp listen on 0.0.0.0:7000 2019/01/12 15:22:39 [I] [service.go:172] http service listen on 0.0.0.0:10080 2019/01/12 15:22:39 [I] [service.go:193] https service listen on 0.0.0.0:10443 2019/01/12 15:22:39 [I] [service.go:216] Dashboard listen on 0.0.0.0:7500 2019/01/12 15:22:39 [I] [root.go:210] Start frps success此时访问 x.x.x.x:7500 并使用自己设置的用户名密码登录,即可看到仪表板界面
frp服务端仪表板界面服务端后台运行
至此,我们的服务端仅运行在前台,如果Ctrl+C停止或者关闭SSH窗口后,frps均会停止运行,因而我们使用systemctl的方式部署frp服务,systemctl的方式可以避免frp服务总是断开的问题!!!
我们在/lib/systemd/system目录下创建一个文件frps.service
内容如下:
[Unit] Description=frps service After=network.target syslog.target Wants=network.target [Service] Type=simple #启动服务的命令(此处写你的frps的实际安装目录) ExecStart=/your/path/frps -c /your/path/frps.ini [Install] WantedBy=multi-user.target然后就启动frps
sudo systemctl start frps再打开自启动
sudo systemctl enable frps重启应用
sudo systemctl restart frps停止应用
sudo systemctl stop frps查看应用的日志
sudo systemctl status frps客户端设置
frp的客户端就是我们想要真正进行访问的那台设备,大多数情况下应该会是一台Windows主机,因而本文使用Windows主机做例子;Linux配置方法类似,不再赘述。
同样地,根据客户端设备的情况选择相应的frp程序进行下载,Windows下下载和解压等步骤不再描述。
假定你下载了“frp_0.36.2_windows_amd64.zip”,将其解压在了C盘根目录下,并且将文件夹重命名为“frp”,可以删除其中的frps和frps.ini文件。
用文本编辑器打开frpc.ini,与服务端类似,内容如下。
[common] server_addr = x.x.x.x server_port = 7000 token = [web] type = https local_ip = 127.0.0.1 local_port = 443 remote_port = 443 custom_domains = www.xxxxx.com其中common字段下的三项即为服务端的设置。
“server_addr”为服务端IP地址,填入即可。“server_port”为服务器端口,填入你设置的端口号即可,如果未改变就是7000“token”是你在服务器上设置的连接口令,原样填入即可。web字段都是自己定义的规则,自定义端口对应时格式如下。
“[xxx]”表示一个规则名称,自己定义,便于查询即可,此处由于我部署的是web服务,所以起名为web。“type”表示转发的协议类型,有TCP、UDP、HTTP、HTTPS等选项可以选择,如有需要请自行查询frp手册,由于我的web服务器采用的https协议,所以此处填https。“local_port”是本地应用的端口号,按照实际应用工作在本机的端口号填写即可,https协议的默认端口就是443。“remote_port”是该条规则在服务端开放的端口号,自己填写并记录即可,服务端对https设置的端口为443,所以此处也为443。“custom_domains”是此web服务的域名,根据自己的域名进行配置。frp实际使用时,会按照端口号进行对应的转发,原理如下图所示。
frp的原理配置完成frpc.ini后,就可以运行frpc了,frpc程序不能直接双击运行!
使用命令提示符或Powershell进入该目录下
cd C:\frp并执行
./frpc -c frpc.ini运行frpc程序,窗口中输出如下内容表示运行正常。
2019/01/12 16:14:56 [I] [service.go:205] login to server success, get run id [2b65b4e58a5917ac], server udp port [0] 2019/01/12 16:14:56 [I] [proxy_manager.go:136] [2b65b4e58a5917ac] proxy added: [rdp smb] 2019/01/12 16:14:56 [I] [control.go:143] [smb] start proxy success 2019/01/12 16:14:56 [I] [control.go:143] [rdp] start proxy success不要关闭命令行窗口,此时可以在局域网外使用相应程序访问 x.x.x.x:xxxx (IP为VPS的IP,端口为自定义的remote_port)即可访问到相应服务。