使用frp实现内网穿透

现在办理宽带的时候,运营商都不会给你分配公网静态ip,这导致的问题就是如果你想让外部网络访问家里局域网内的某台设备,你不能使用一般路由器都自带的端口映射(虚拟服务器)来简单的让外部网络成功访问到。在运营商动态分配ip的时候,如果动态分配到的ip是公网ip,那么可以使用一些收费的DDNS动态域名解析服务来访问内网中的web服务,这时候路由器的端口映射也是需要配置的。如果动态分配到的ip不是公网ip,那么DDNS也不会灵光了。我们需要彻底一点的方案,那就是内网穿透,即通过一台具有公网静态ip的电脑(服务器,vps等),来反向代理内网中的机器。

怎么样来理解通过反向代理穿透到内网呢,首先我们需要在具有公网静态ip的服务端,安装一个代理服务(例如本文将要提到的frp的服务端frps),然后在内网的设备上安装此代理服务的客户端,服务端跟客户端都作为后台服务启动运行(服务端首先启动运行),客户端连接到代理服务的端口,此时我们的服务端作为反向代理服务器已经可以接受来自互联网的请求了,并能够把请求转发到客户端上设置好的相应端口(服务,例如web)上。简而言之,现在我们可以从外部网络访问内网中的某些设置好的设备了。

前些日子,我想要在上班的时候也能访问家里的刷好openwrt的路由器的设置界面及ssh服务,所以通过google,最终我决定使用frp这个开源软件,下面是github上的项目主页:

https://github.com/fatedier/frp

更多配置请访问项目主页自行研究。

折腾过程记录:

前提:

一台有公网静态ip的设备(服务器,vps,openwrt路由器...)。

代理tcp协议不需要域名,代理http,https协议必须要准备域名。

服务端配置

首先从此处找到适合自己系统架构的编译好的软件包,点击右键,从弹出菜单中找到复制链接地址单击复制。

支持systemd的linux系统(ubuntu,centos7)

我使用的是centos7的vps,通过ssh登陆进去,使用wget命令行工具把软件包下载到 /opt目录下。

这时候将下载到的软件包进行解压。

解压成功后进入刚刚解压的文件目录。

可以看到frpc,frps,frpcfull.ini,frpsfull.ini,frpc.ini,frps.ini等文件,frps是服务端二进制程序,frpc是客户端二进制程序,frps.ini是服务端的配置文件,frpc.ini是客户端的配置文件,frpsfull.ini跟frpcfull.ini是示例配置文件。在centos7下,可以通过systemd来管理守护进程,根据此github项目上issue上vc5写的systemd 的service文件修改了一份frps程序可用的service文件,文件名改为frps.service,放在 /usr/lib/systemd/system/目录下。

输入上一行命令后,进入空的frps.service文件,点击i进入编辑模式,复制粘贴下面的内容

根据frps.service中启动frps的那一行(ExecStart=......),将frps跟frps.ini移动或者复制到相应的目录下。到这一步就可以把下载的软件包跟解压出来的文件夹删除了。

现在来设置/etc/frp目录下的frps.ini,通过 切换到该目录下,输入 命令修改frps.ini,我的配置如下:

修改好frps.ini,服务端的配置基本完成,通过如下命令启动运行:

如果使用防火墙firewalld,frps相关服务端口可能并未开放,可以通过如下命令开放相关端口:

客户端配置

客户端的配置前面几步跟服务端类似,首先从此处找到适合自己系统架构的编译好的软件包并下载下来。

openwrt(LEDE)系统的路由器

把frpc复制到/usr/bin/目录,把frpc.ini复制到/etc/目录,根据网络上的教程,我尝试了在web管理界面中添加到本地启动脚本中,输入

但这样开机启动的方式并不起作用。所以我用python编写了一个监测frpc是否运行的脚本,如果脚本检测到frpc没有运行就会启动frpc。将该脚本命名为monitor.py,放在/root目录下,内容是这样的:

我们可以在linux的计划任务crond中每十分钟运行一次脚本,我们在/etc/crontabs/root文件的末尾添加上一条计划任务

客户端配置文件frpc.ini:

当客户端配置文件修改好了,可以输入 测试能否连接服务端,如下图所示说明配置正确连接成功了。现在重启openwrt路由器,过几分钟监测脚本运行后就可以从外网登陆路由器web界面了。前面的内容也适用于没有使用systemd的其他linux系统。

支持systemd的linux系统(ubuntu,centos7)

客户端配置跟服务端几乎一样,只需要注意两点,第一点就是编写service文件时把 frps替换成frpc,第二点就是使用客户端的配置文件frpc.ini。

  • 发表于:
  • 原文链接:https://kuaibao.qq.com/s/20180712G1ZFW200?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券