[技术]利用FRP内网转发OpenVPN服务

作者: hackliu 分类: 技术文章 发布时间: 2020-04-23 01:01

由于疫情最近不少公司人员有部分远程办公需求,要在外网访问公司内网服务器的资源

最简单的办法只要配置一下公司路由做端口映射就可以很简单的实现,太巧了(一般现实比较残酷),刚好没有公司路由器的权限,所以只能自己想想办法.

最终解决方案:

FRP + OpenVpn

FRP实现内网穿透,映射到公网
OpenVpn实现不同局域网下搭建虚拟网络
个人电脑A搭建VPN客户端,网络请求转发到公网IP,经过FRP映射到内网OpenVpn服务端(公司电脑B),使个人电脑A与公司电脑B形成虚拟网络,A就可以访问B的资源

简单给一个案例拓扑图,看图理解更容易。

tap.png

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

捕获.jpg

捕获2.jpg

捕获3.jpg

将配置好的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模式不够稳定,搭建容易)

待整理

如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!

3条评论
  • 基佬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

    1. kj

      2020年7月31日 01:45

      我知道啥问题了,frpc 监听的ip不应该写127.0.0.1的,应该写openvpn监听网卡的ip

kj进行回复 取消回复

邮箱地址不会被公开。 必填项已用*标注