内网穿透:使用frp配置公网与内网服务器

单位的公网IP尚未申请,但项目需要上线进行测试。目前的状态是在研究院内部可以通过连接WIFI访问项目网站或接口,这称之为内网访问或局域网访问,开发者一回家就没办法访问了,为此,在开通公网IP之前我们先采用内网穿透允许外网访问我们的项目。

内网穿透

所谓内网穿透,就是将内网某些接口,服务暴露到外网访问。

需要内网穿透的场景原因如下:

  • 这个世界的IPv4是有限的,现在已经严重不足,在没有普及v6之前,家用宽带,大部分企业宽带都是动态IP,就是电信预留一个IP池,当你宽带上线时分配一个公网IP,一旦宽带下线就回收IP。所以各位家用宽带的IP地址难以确定,是动态的。这个IP可以在百度直接搜索IP查询到。
  • 由于你家庭,单位拥有多台设备,这些设备都需要上网,所以你把上一条中所述的公网IP在进行内网映射,通过路由器,网关设备将网络分为多条线(有线,无线)分配到每一台要上网的设备,这些设备属于同一个内网,归路由器管理,一般都是192.168.x.x。这样的IP可以称为内网IP,最后汇总到上一条中的公网IP(动态)上发送。

问题:

  • 这些携带内网IP的设备可以访问外网,就是可以访问互联网。
  • 这些设备可以互相访问,通过内网IP:192.168.x.x
  • 外网不能访问这些设备,你不可能让别人在浏览器输入:192.168.x.x这样的IP
  • 当你查询你这些设备的真实IP(例如百度查询自己IP),你发现所有设备都是同一个IP,所以在公网看来这些请求来自同一IP,这就是给你宽带分配的公网IP。
  • 上一条,公网IP会变!所以即使你采用路由器映射端口到公网IP上,依然容易出现访问时效问题。尤其是绑定了域名,一直变,就一直改DNS,DNS有缓存的,这就无解了。

采用内网穿透解决:

  • 你需要一个不变的公网IP,静态IP
  • 你需要一个可以进行点对点通信的穿透软件,包含客户端,服务端
  • 无论客户端怎么改变网络环境都能访问到服务端,所以将静态IP的一台设备设定为服务端
  • 将请求发送到服务端(公网IP),服务端通过穿透软件和客户端通信,把请求分配给客户端
  • 客户端就是指我们内网的服务器了
  • 这些内网服务器通过公网的一台服务器就可以被外网访问了
  • 公网服务器相当于一台反向代理

配置穿透

我们以frp这个穿透软件为例,实现将我们单位的服务暴露到外网访问,解决离开单位无法访问项目服务的问题。

一台云端服务器

购买一台云端的服务器,拥有静态的公网IP,例如阿里云,腾讯云的服务器。以下用ubuntu 18.04为例。

去这里下载frp包:

https://github.com/fatedier/frp/releases

wget https://github.com/fatedier/frp/releases/download/v0.34.3/frp_0.34.3_linux_amd64.tar.gz
tar -xvf 包名

配置一下服务端,编辑frps.ini

[common]
bind_port = 7000
dashboard_port = 7500
# dashboard's username and password are both optional,if not set, default is admin.
dashboard_user = admin
dashboard_pwd = admin

第一个是frp所使用的端口,用于公网内网通信。

第二个是控制面板端口,可以通过访问该网址查看frp运行状态。

测试启动frp服务:

./frps -c ./frps.ini

注意,这里启动的是frps,意思是frp服务端,另一个frpc是客户端,下面会讲到

开机启动frp

修改sysytemd下的frps.service

[Unit]
Description=Frp Server Service
After=network.target

[Service]
Restart=on-failure
RestartSec=5s
ExecStart=/root/frp/frps -c /root/frp/frps.ini

[Install]
WantedBy=multi-user.target

这里,由于我的frp程序目录名已经改为frp并且放在了root用户目录下,这里应该把ExecStart改为你frp所在的地址即可。

保存退出,把编辑好的service文件复制到systemd/system服务下:

cp ./systemd/frps.service /etc/systemd/system/

启动服务:

#刷新服务列表:
systemctl daemon-reload

#设置开机自启
systemctl enable frps
#关闭开机自启
systemctl disable frps

#启动服务
systemctl start frps
#停止服务
systemctl stop frps

至此公网上的服务端已经配置完毕,并且加入开机启动。

内网服务器

同理,内网服务器我们需要配置frpc.ini:

frpc中c表示client

[common]
server_addr = 10.220.23.66
server_port = 7000

[ssh http]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 8000

# [ssh http2]
# .....

这里,local_ip就是本地ip,localhost一般不需要改动,local_port是局域网内这台服务器暴露的端口,这里举例80,remote_port是访问公网服务器的端口,这里举例8000。意思是,当你访问10.220.23.66:8000的时候,会映射到内网192.168.x.x:80端口。所以你需要把服务跑在内网服务器的80端口,外网就可以通过穿透访问到了。

其他端口也是同样道理,可以配置多个ssh来映射多个服务到外网。

配置开机启动:

同理,修改systemd下的frpc.service

[Unit]
Description=Frp Client Service
After=network.target
Wants=network.target

[Service]
Restart=on-failure
RestartSec=5s
ExecStart=/home/devil/App/frp/frpc -c /home/devil/App/frp/frpc.ini
ExecReload=/home/devil/App/frp/frpc reload -c /home/devil/App/frp/frpc.ini

[Install]
WantedBy=multi-user.target

复制到系统systemd下:

cp ./systemd/frpc.service /etc/systemd/system/

完毕!这样离开了局域网依然可以访问。

posted @ 2020-12-08 19:07  devilyouwei  阅读(1325)  评论(1编辑  收藏  举报