单位的公网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包:
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/
完毕!这样离开了局域网依然可以访问。
原文链接:https://blog.csdn.net/u014466109/article/details/110867996