目录
一、前言
二、应用场景
三、详细原理
3.1传统内网穿透(服务器中转数据穿透)原理
3.2点对点穿透原理
ass="nolink"3.3延伸一个内网渗透知识
3.4穿透原理总结
四、方法实现
4.1几款主流工具实现
4.2方法实现总结
五、案例配置
5.1frp安装配置
5.2zerotier安装配置
六、总结
一、前言阅读本文前需要先搞懂NAT、PAT、端口映射几个概念,前面我有写了一篇关于这几个概念的博文。根据之前的博文我们已经知道,内网宽带中的主机可以访问公网宽带主机,反之不可以访问;公网宽带主机可以和公网宽带主机双向访问;内网宽带中的主机和内网宽带中的主机互相无法访问。那么内网宽带中的客户机和公网宽带中的客户机如何访问另一个内网宽带中的服务器呢?这里就需要用到内网穿透技术。
二、应用场景三、详细原理3.1传统内网穿透(服务器中转数据穿透)原理

1.frp(开源):
2.ngrok(开源):
3.zerotier(开源/商业):
4.花生壳(商业):
5.Nat123(商业):
6.NATAPP(商业):
7.向日葵、teamviewer、anydesk(远程桌面):
8.VPN(加密穿透):
4.2方法实现总结五、案例配置经过前面的介绍,相信大家对内网穿透的几个实现方法有了大概的了解,那么接下来就针对frp和zerotier分别做下安装配置的讲解。
5.1frp安装配置0.33.0是frp的版本号(截稿为止最新版本)exportFRP_VERSION=0.33.0sudomkdir-p/etc/frpcd/etc/frpsudowget"${FRP_VERSION}/frp_${FRP_VERSION}_linux_"sudotarxzvffrp_${FRP_VERSION}_linux__${FRP_VERSION}_linux_amd64/*/etc/frp$[common]bind_port=7000配置中转服务器域名绑定,可选配置,如果域名多可以设置一个authentication_method=tokentoken密码vhost_http_port=80内网服务器https映射的端口,内网可以有多个网站使用这个端口dashboard_port=7500启动服务的命令(此处写你的frps的实际安装目录)ExecStart=/etc/frp/frps-c/etc/frp/[Install]WantedBy=
sudosystemctlenablefrps
c:\frp\:\frp\
添加本地执行路径exportLD_LIBRARY_PATH=/etc/frp/whiletrue;doserver=`psaux|grepfrpc|grep-vgrep`if[!"$server"];thennohup./frpc-c./
[common]server_addr=1.2.3.4或者隧道端口,与服务端bind_port一致authentication_method=tokentoken密码[ssh]连接协议tcplocal_ip=192.168.1.30内网服务器ssh端口号remote_port=6000公网通过ssh加密访问内部服务器,注意这种方式还需要在客户机[secret_ssh_visitor]连接协议stcprole=visitorsk=abcdefg公网访问内部web服务器以http方式type=http内网web服务的端口号custom_domains=远程桌面控制type=tcplocal_ip=192.168.1.30如果内网服务器是https,还需要做以下配置(frp对于https的映射代理原理在后面会有工作流程图介绍)[web_https]服务方式local_ip=127.0.0.1内网web服务的端口号custom_domains=配置插件,将https请求转换成http请求后再发送给本地服务plugin_local_addr=127.0.0.1:80同http配置,这一句可选加linux下生成的证书为格式,复制到Windows上改成.crt后缀即可plugin_key_path=C:\Users\Administrator\Desktop\\这里必须写成127.0.0.1plugin_header_X-From-Where=frphttps对应端口,注意因为有nginx也有frps,以nginx这里的端口为准,frps中的vhost_http**s**_port不用配置ssl_certificate/etc/letsencrypt/live//;证书存放位置server_name*.;可以做个http强制转换为https映射的frp服务端的vhost_http_port端口proxy_set_headerX-Forwarded-For$proxy_add_x_forwarded_for;proxy_set_headerHost$http_host;proxy_set_headerX-NginX-Proxytrue;proxy_http_;proxy_set_headerUpgrade$http_upgrade;proxy_set_headerConnection"upgrade";proxy_max_temp_file_size0;proxy_redirectoff;proxy_read_timeout240s;}error_page500502503504/50;location=/50{root/usr/share/nginx/html;}}sudonginx-sreload
[common]..客户端http映射的端口,就是上面Nginx的proxy_pass对应端口.
/etc/frp/frps-c/etc/frp/
[test_http]服务方式local_ip=127.0.0.1服务端端口需要反向代理的域名,就是服务端要代理的域名,因为我们只需要https穿透,在nginx中已经做了https的域名配置,这一句可以不用添加
/etc/frp/frps-c/etc/frp/
c:\frp\:\frp\5.2zerotier安装配置


这样就进入了网络设置界面,网络设置界面可以配置很多东西,但是这里只介绍需要用到的部分,就是NetworkID和下面的Members。NetworkID是在连入新设备时需要用到的标识符,每个设备连接这个虚拟的局域网时都要输入这个ID。Members则是连入网络的设备列表,按照默认的设定,当有一个新设备接入网络时,用户需要在这个页面进行授权。这里其实可以不用自己做额外配置,默认就好,下面还是把其中一些重要参数截图说明下:


下面插入一个概念:moon。
先简单提一下UDP打洞的原理,UDP打洞的本质是让NAT后面的机器A和B先连接一个有公网IP的中间服务器,然后中间服务器经过一番操作之后让A和B直接互联,这样之后的数据传输就是A和B之间直接传输,不再通过中间服务器。但是出于节省资源和增强健壮性的角度,A和B服务器直接打出来的「洞」并不是永久的,而是维持一段时间后释放,下次连接时重新打洞。这样就带来一个问题,Zerotier是一款国外的项目,他提供的中间服务器到大陆的网络状况并不好,有很高的延迟,并且很可能丢包,这就导致我们每次「打洞」都有很高的延迟。
为了解决这个问题,Zerotier提供了一个moons的概念,官方文档中提供了详细的解释和配置方法。如果需要moon,则要做另外配置,这里再说明下如何搭建配置中转机器(moon)centos为例:给自己的中转主机安装zerotier-one这个软件包:
curl-s|sudobash

然后在自己的moon中转机器上执行:
sudozerotier-clijoin83048a0632246d2c
cd/var/lib/zerotier-one/
{"id":"deadbeef00","objtype":"world","roots":[{"identity":"deadbeef00:0:34031483094","stablepoints":[]}],"signingKey":"b324d84cec708d1b51d5ac03e75afba501a12e2124705ec34a614bf8f9b2c800f44d9824ad3ab2e3da1ac52ecb39ac052ce3f54e58d8944b52632eb6d671d0e0","signingKey_SECRET":"ffc5dd0b2baf1c9b220d1c9cb39633f9e2151cf350a6d0e67c913f8952bafaf3671d2226388e1406e7670dc645851bf7d3643da701fd4599fedb9914c3918db3","updatesMustBeSignedBy":"b324d84cec708d1b51d5ac03e75afba501a12e2124705ec34a614bf8f9b2c800f44d9824ad3ab2e3da1ac52ecb39ac052ce3f54e58d8944b52632eb6d671d0e0","worldType":"moon"}"stablepoints":["1.2.3.4/9993","2001:abcd:abcd::1/9993"]
"stablepoints":["1.2.3.4/9993"]
sudosystemctlrestartzerotier-onesyncsyncreboot
grepid/var/lib/zerotier-one/|head-n1
sudozerotier-cliorbitxxxxxxxxxxxxxxxxxxxx
sudosystemctlrestartzerotier-one
zerotier-clilistpeers

添加图片注释,不超过140字(可选)

稍等片刻,会弹出此窗口,选择“是”即可

添加图片注释,不超过140字(可选)
最后刷新官网中Network配置页面,在下方的“member”区域中勾选将其注册到网络中

添加图片注释,不超过140字(可选)
好了,到这里关于zerotier的服务端和客户端安装配置都做完了,zerotier网络组建成功后,相当于里面的设备在同一局域网下或俩个不同VLAN下,所以也就意味着里面的所有设备只要开放了端口互相就能访问,而不需要像frp那样对单独的某个端口最设置,这一点也说明zerotier和vpn相似。
六、总结以上基本把内网穿透原理和实现方法很详细的介绍了一遍,还是针对不同实现方法做个总结吧。1.如果是企业内网资料需要员工远程访问就用VPN。2.自己家里NAS或远程桌面直接用zerotier,我自己没有额外搭建moon,有点延迟但可以接收,还有远程桌面也优先用zerotier。3.一些页面访问用frp,比如测试用的web服务、路由器管理界面、NAS管理界面等等。4.最后如果觉得麻烦,资金允许可以直接花生壳之类的收费穿透。
以上内容来自


多年来一直专注于科学计算服务器,入围政采平台,H100、A100、H800、A800、L40、L40S、RTX6000Ada,RTXA6000,单台双路256核心服务器等。
