前言

前段时间,开发微信公众号后台,本地调试真是累死我了,每改一次代码,都要部署到生产环境,效率极低。后来,发现内网穿透可以解决我的难题,让域名指向我的本地服务。

原理

内网穿透即NAT技术,最常见的是使用端口映射(NAPT),在NAT网关上使用一张映射表,表中记录了内网哪个IP和端口发起了请求,然后如果内网有主机向公网设备发起了请求,内网主机的数据包传输到NAT网关,这时NAT网关会修改该数据包的源IP地址和端口为NAT网关自身的IP地址和未使用的端口,并且把修改记录到映射表,最后把修改后的数据包发送到请求的目标主机上,等主机返回响应,然后根据响应包里的目标IP地址和端口去映射表查询哪个内网主机,发送。NAPT只解决了没有公网ip的情况下访问公网主机的问题,没有解决公网主机如何主动向内网主机发起请求的问题。 运营商:路由器的LAN端表示内网,WAN端表示外网,其实运营商是不会给你公网ip的,你本地的WAN端可能是运营商更上一级的路由器的LAN端,也可能一直到最后才到公网,这就叫流量穿透。 frp原理:frp也是基于NAPT(能让没有公网ip的情况下访问公网主机),首先在有公网ip的服务器端开个端口(如7777),监听这个端口用于让内网服务器主动连接进来打通一个隧道,然后配置好内网服务器,主动向公网的7777端口发送请求,这样内网和公网主机就建立了一个连接通道,剩下的就是转发请求了,请求公网,然后公网把请求转发到内网,内网返回响应给公网,公网再返回响应。

frp配置

内网穿透的产品有很多,花生壳,Nat123,ngork,frp等。这里使用是配置简单的frp。

# 服务器本地各下一份
# 服务器端
$ wget https://github.com/fatedier/frp/releases/download/v0.21.0/frp_0.21.0_linux_amd64.tar.gz
$ tar -xzvf frp_0.21.0_linux_amd64.tar.gz
$ mv frp_0.21.0_linux_amd64.tar.gz frp
$ cd frp
$ chmod +x frps
$ vim frps.ini

[common]
bind_port = xxx
vhost_http_port = xxx
token = xxxx
log_file = ./frps.log
log_level = info
log_max_days = 3

$ nohup ./frps -c frps.ini &
$ jobs # jobs -l
$ kill %n

# 本地
$ vim frpc.ini

[common]
server_addr = xxx.xxx.xxx.xxx # 公网ip
server_port = xxx
token = xxxx

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = xxx
remote_port = xxx

[web]
type = http
local_port = xxx
custom_domains = xxx.xxx.com

[tcp_port]
type = tcp
local_ip = 127.0.0.1
local_port = xxx
remote_port = xxx

$ ./frpc -c frpc.ini
# ssh 本地名@公网ip -p remote_port
# 最后要放行以上端口

参考

https://github.com/fatedier/frp
https://sunnyrx.com/2016/10/21/simple-to-use-frp/
https://lolico.moe/tutorial/frp.html