[技术]利用FRP内网转发OpenVPN服务
由于疫情最近不少公司人员有部分远程办公需求,要在外网访问公司内网服务器的资源
最简单的办法只要配置一下公司路由做端口映射就可以很简单的实现,太巧了(一般现实比较残酷),刚好没有公司路由器的权限,所以只能自己想想办法.
最终解决方案:
FRP + OpenVpn
FRP实现内网穿透,映射到公网
OpenVpn实现不同局域网下搭建虚拟网络
个人电脑A搭建VPN客户端,网络请求转发到公网IP,经过FRP映射到内网OpenVpn服务端(公司电脑B),使个人电脑A与公司电脑B形成虚拟网络,A就可以访问B的资源
简单给一个案例拓扑图,看图理解更容易。
FRP(类似FRP的软件还有ngrok和Cpolar)ngrok之前博客有写个详细搭建教程
全名:Fast Reverse Proxy。FRP 是一个使用 Go 语言开发的高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务。FRP 支持 TCP、UDP、HTTP、HTTPS等协议类型,并且支持 Web 服务根据域名进行路由转发。
FRP 项目地址:https://github.com/fatedier/frp
FRP 作用
利用防火墙后的机器,对外网环境提供HTTP/HTTPS等服务,TCP/UDP服务,比如在家里通过SSH访问公司内网的主机
FRP 安装
FRP采用GO语言开发,支持windows linux MacOS 等多平台部署
各平台下载地址https://github.com/fatedier/frp/releases
1.服务端配置
FRP可转发很多服务,本文章以OpenVPN为例。同学们可举一反三
配置服务端需要一台具有公网IP的设备,可以是阿里云或百度云,也可以是任意具有公网IP的VPS
自己的服务器是Windows server 2008 R2,下载安装包后解压,做如下操作
下载frp_0.21.0_windows_amd64.zip 修改frps.ini内容如下: --------以下是内容-----------(不要复制这一行) [common] bind_port = 7000 # 默认配置中监听的是 7000 端口,可根据自己实际情况修改。 --------以上是内容-----------(不要复制这一行) 在CMD下启动FRP 服务端 frps.exe -c ./frps.ini
如此启动一个监听7000端口的服务端
2.配置客户端
和 FRP 服务端类似,FRP 默认也给出两个客户端配置文件,一个是简版的 frpc.ini,另一个是完整版本 frpc_full.ini。
客户端就是安装OpenVPN的服务器,我的vpn服务器是ubuntu18.4
执行命令
$ vim frpc.ini
修改frpc.ini内容为
[common] server_addr = 114.116.222.211 # 为 FRP 服务端的公网 IP server_port = 7000 # 为 FRP 服务端监听端口 上面配置端口对应 [vpn_test_tcp] type = tcp #local_ip = 127.0.0.1 local_port = 1194 remote_port = 21194 [vpn_test_udp] type = udp #local_ip = 127.0.0.1 local_port = 1194 remote_port = 21194 [common] # server_addr 为 FRP 服务端的公网 IP server_addr = 1.1.1.1 # server_port 为 FRP 服务端监听的端口 server_port = 7000
启动 FRP 客户端 配置好后,先启动vpn服务,再启动frp客户端服务 $ ./frpc -c ./frpc.ini
这样就可以成功在 FRP 服务端上成功建立一个客户端连接,此时还不能对外提供内网服务,因为还没有在服务端注册内网服务端口
OpenVPN
开源VPN,提供了良好的性能和友好的用户UI
1.方案一 tun模式 TCP模式 (TCP模式不够稳定,搭建容易)
网上大把openVPN的安装教程文章,基本上都是手动配置各种证书和秘钥,非常的繁琐烦人,当然不止我觉得烦,所以已经有人做了自动安装的脚本,github上有两个好几K星星的安装脚本,我选了其中一个:https://github.com/angristan/openvpn-install
curl -O https://raw.githubusercontent.com/angristan/openvpn-install/master/openvpn-install.sh chmod +x openvpn-install.sh ./openvpn-install.sh
将配置好的vpn客户端连接配置文件test.opvn下载需要连接vpn服务的机器上
修改配置文件
client proto udp explicit-exit-notify remote 114.116.229.233 1194 #将默认的1194端口改成FRP转发端口21194(上面配置文件配置的) dev tun resolv-retry infinite nobind persist-key persist-tun remote-cert-tls server verify-x509-name server_yfBzdRMw5WiMPCsf name auth SHA256 auth-nocache cipher AES-128-GCM tls-client tls-version-min 1.2 tls-cipher TLS-ECDHE-ECDSA-WITH-AES-128-GCM-SHA256 setenv opt block-outside-dns # Prevent Windows 10 DNS leak verb 3 <ca> -----BEGIN CERTIFICATE----- MIIB1zCCAX2gAwIBAgIUdqA4JOA/jBACvh5ZAL9wo99j7H0wCgYIKoZIzj0EAwIw HjEcMBoGA1UEAwwTY25fTmlOZ09BMGVlZ3VnSzhnbjAeFw0yMDA0MjIxNjIzMDda Fw0zMDA0MjAxNjIzMDdaMB4xHDAaBgNVBAMME2NuX05pTmdPQTBlZWd1Z0s4Z24w WTATBgcqhkjOPQIBBggqhkjOPQMBBwNCAARswul0MifhoIyFMa80uXSQSJsWoLel tTLAGUdn7sUK4wLNL8hK+u+BEp8jGDpC7bogQBRibmVV4dzY+TTjG1nAo4GYMIGV MB0GA1UdDgQWBBSDlNN3KILRgKkpMhHwgd8EIhCRATBZBgNVHSMEUjBQgBSDlNN3 KILRgKkpMhHwgd8EIhCRAaEipCAwHjEcMBoGA1UEAwwTY25fTmlOZ09BMGVlZ3Vn SzhnboIUdqA4JOA/jBACvh5ZAL9wo99j7H0wDAYDVR0TBAUwAwEB/zALBgNVHQ8E BAMCAQYwCgYIKoZIzj0EAwIDSAAwRQIgDetbDzSHIdFLDda5UKW4LWe1r69XJpw3 TBijLGNEkecCIQCxaJubo9Qkq/hcjCB3ZNkr9puRAUFvgUBFthHZTbraQA== -----END CERTIFICATE----- </ca> <cert> -----BEGIN CERTIFICATE----- MIIB1jCCAX2gAwIBAgIRAJ2fW265MD6oHQNH4sN5SZUwCgYIKoZIzj0EAwIwHjEc MBoGA1UEAwwTY25fTmlOZ09BMGVlZ3VnSzhnbjAeFw0yMDA0MjIxNjIzMjhaFw0y MzA0MDcxNjIzMjhaMA8xDTALBgNVBAMMBHRlc3QwWTATBgcqhkjOPQIBBggqhkjO PQMBBwNCAARhdfQ4HRv2PFP2b/83dA0r2wB/0w7wDnnv9MczwU8KKSvjL+FBI2we sE2C6l8GT2j5aEA3BeogEwBIFhsI6xlWo4GqMIGnMAkGA1UdEwQCMAAwHQYDVR0O BBYEFCHmi2Cw9MmNEJUNH9EDtt0BXdp2MFkGA1UdIwRSMFCAFIOU03cogtGAqSky EfCB3wQiEJEBoSKkIDAeMRwwGgYDVQQDDBNjbl9OaU5nT0EwZWVndWdLOGdughR2 oDgk4D+MEAK+HlkAv3Cj32PsfTATBgNVHSUEDDAKBggrBgEFBQcDAjALBgNVHQ8E BAMCB4AwCgYIKoZIzj0EAwIDRwAwRAIgQ1XzSge9u8ScP+o4Gp9hK1BVjxyWT6kA IVEgpF7+iZYCIDpmu6X4ZImBTanfkPWsjY6m0W49t12ZJZlWaUYUhQb4 -----END CERTIFICATE----- </cert> <key> -----BEGIN PRIVATE KEY----- MIGHAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBG0wawIBAQQgHaQY9lGecr59ndpu +iqk7QQW6rPvVMcLbg+gHw9ZuvShRANCAARhdfQ4HRv2PFP2b/83dA0r2wB/0w7w Dnnv9MczwU8KKSvjL+FBI2wesE2C6l8GT2j5aEA3BeogEwBIFhsI6xlW -----END PRIVATE KEY----- </key> <tls-crypt> # # 2048 bit OpenVPN static key # -----BEGIN OpenVPN Static key V1----- 03eac908a21cc2c869744905f3e8e829 19f15512429b9f2be19925280577b659 3da5e054d11c5fc12d1a2d1623e2ddf2 89e88379e83b1cd9e49202086666debf d0f6339393e7caf4941f360acef01d19 4e953619504c6ccfcdce9318981a1c3a 3d6d04d575cb3e025ccfb281e467f6c9 8ebdf2a4f1e2e5e49bf2b3af3e4e2ec6 3caa438aa2979b343296d749bc2bb2de 4996e2c10c92cb4705c7c08f79b4fdaf 838aaf60abe1b75f7e214147744cf9dd 20461c9f27656c7188c7386aa0ce8a10 9a668c88f1a483e52c3dd246745aaf95 a300533e3886c637e56285cae6cd0d1e 2de369eddadbe39a38b90ead4012e8e3 cf2e23db89d7f1c0dedf8a2212e5606c -----END OpenVPN Static key V1----- </tls-crypt>
完美连接成功
1.方案二 UDP模式 (TCP模式不够稳定,搭建容易)
待整理
基佬A
2021年2月14日 19:55
请教成生的opvn怎么使用? 在centos7上
kj
2020年7月31日 01:30
我也是这样搞得,但是一直连接不上openvpn服务器,客户端一直报错
Fri Jul 31 01:29:49 2020 TLS Error: TLS key negotiation failed to occur within 60 seconds (check your network connectivity)
Fri Jul 31 01:29:49 2020 TLS Error: TLS handshake failed
kj
2020年7月31日 01:45
我知道啥问题了,frpc 监听的ip不应该写127.0.0.1的,应该写openvpn监听网卡的ip