1、场景描述
一直使用frp内网穿透将家里的PC机映射到公网云主机,供外网随时访问
可以参考之前的文章
腾讯云主机上部署FRP+Teamviewer穿透内网进行远程运维
最近看到frp的官方文档中关于STCP的概念 对于某些服务来说如果直接暴露于公网上将会存在安全隐患。
使用 stcp(secret tcp) 类型的代理可以避免让任何人都能访问到要穿透的服务,但是访问者也需要运行另外一个 frpc 客户端
https://gofrp.org/docs/examples/stcp/
也参考搜到的一些配置案例(具体链接如下)
http://blog.itpub.net/31559985/viewspace-2731496/ https://blog.csdn.net/htxhtx123/article/details/104219317 https://www.linuxprobe.com/frp-tcpstcp-ssh-homelinux.html
2、拓扑环境+需求场景
打算在如下环境中动手实践一下
如下图拓扑图所示
A内网中 :
1、CentOS7.9虚拟机192.168.60.105上安装frpc客户端,向云主机frps服务端注册
2、Win10机器(192.168.60.112) Teamviewer15
B内网中:
1、CentOS7.9虚拟机192.168.31.232上安装frpc客户端,向云主机frps服务端注册
2、Win10机器(192.168.31.78) Teamviewer15
最终要实现 A内网win10机器Teamviewer访问192.168.60.105的5938端口就可以内网穿透直接访问B内网中win7(192.168.31.78)的Teamviewer
同样B内网win7机器Teamviewer访问192.168.31.232的5938端口就可以内网穿透直接访问A内网中Win10(192.168.60.112)的Teamviewer
达到相互的目的,并且不用在云主机上暴露其它端口
3、实现的具体配置步骤
1、A内网的CentOS7.9安装frpc,配置frpc.ini
frp的下载地址 https://github.com/fatedier/frp/releases
tar -zxvf frp_0.37.1_linux_amd64.tar.gz -C /usr/local/ cd /usr/local/ mv frp_0.37.1_linux_amd64 frp cd frp vim frpc.ini [root@centos frp]# cat frpc.ini [common] server_addr = 云服务器公网IP server_port = 云服务器FRPS端口 authentication_method = token authenticate_heartbeats = false authenticate_new_work_conns = XXXXXXX(自行定义) log_file = /usr/local/frp/logs/frpc.log log_level = info log_max_days = 30 [stcp_tv_nuc_win7] type = stcp sk = walkingcloud local_ip = 192.168.31.78 local_port = 5938 [stcp_centos_105] type = stcp role = visitor sk = walkingcloud server_name = stcp_tv_b550m bind_addr = 192.168.60.105 bind_port = 5938
cd /usr/local/frp chown -R root:root /usr/local/frp/ mkdir logs chown nobody:nobody logs touch logs/frpc.log chown nobody:nobody logs/frpc.log vim systemd/frpc.service #修改文件 [Unit] Description=Frp Client Service After=network.target [Service] Type=simple User=nobody Restart=on-failure RestartSec=5s ExecStart=/usr/local/frp/frpc -c /usr/local/frp/frpc.ini ExecReload=/usr/local/frp/frpc reload -c /usr/local/frp/frpc.ini LimitNOFILE=1048576 [Install] WantedBy=multi-user.target cp systemd/frpc.service /usr/lib/systemd/system/ systemctl enable frpc.service systemctl start frpc.service tail -f /usr/local/frp/logs/frpc.log
2、B内网的CentOS7.9安装frpc,配置frpc.ini
安装frp步骤与上面A内网的一致,不同是frpc.ini的配置
vim /usr/local/frp/frpc.ini [common] server_addr = 云服务器公网IP server_port = 云服务器FRPS端口 authentication_method = token authenticate_heartbeats = false authenticate_new_work_conns = XXXXXXX(自行定义) log_file = /usr/local/frp/logs/frpc.log log_level = info log_max_days = 30 [stcp_tv_nucwin7] type = stcp sk = walkingcloud local_ip = 192.168.31.78 local_port = 5938 [stcp_centos_232] type = stcp role = visitor sk = walkingcloud server_name = stcp_tv_b550m bind_addr = 192.168.31.232 bind_port = 5938
注意,配置中server_name 为对端的定义服务标签名,A内网与B内网要相互对应上
3、firewalld防火墙开放5938端口
firewall-cmd --permanent --zone=public --add-port=5938/tcp firewall-cmd --reload
当然我这里Win10与Win7的Teamviewer都开启了接受呼入的LAN连接
4、验证测试
- 1)、A内网win10机器Teamviewer访问192.168.60.105的5938端口
可以看出已经成功访问到B内网中win7(192.168.31.78)的Teamviewer
2)、B内网win7机器Teamviewer访问192.168.31.232的5938端口
可以看出已经成功访问到A内网中Win10(192.168.60.112)的Teamviewer
5、总结
- 1)、使用STCP的FRP内网穿透无需在云主机上面开放其它端口,可以实现安全内网穿透访问
- 2)、后续可以考虑进行P2P点对点内网穿透,有空再进行尝试
不通过服务器中转流量的方式来访问内网服务。frp 提供了一种新的代理类型 xtcp 用于应对在希望传输大量数据且流量不经过服务器的场景。使用方式同 stcp 类似,需要在两边都部署上 frpc 用于建立直接的连接。目前处于开发的初级阶段,并不能穿透所有类型的 NAT 设备,所以穿透成功率较低。穿透失败时可以尝试 stcp 的方式