openvpn+frp访问内网


openvpn+frp访问内网

原理

1
内网部署openvpn服务器,使用frp将openvpn的端口暴露到公网的服务器上,使用openvpn客户端连接暴露的端口完成openvpn对内网的访问

安装

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
1. 安装 OpenVPN 和 Easy-RSA(用于生成证书)

sudo apt update
sudo apt install openvpn easy-rsa -y

2. 创建 Easy-RSA 工作目录

make-cadir ~/openvpn-ca
cd ~/openvpn-ca

3. 配置 Easy-RSA

编辑vars文件(可选)
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "Shanghai"
set_var EASYRSA_REQ_CITY "Shanghai"
set_var EASYRSA_REQ_ORG "MyOrg"
set_var EASYRSA_REQ_EMAIL ""
set_var EASYRSA_REQ_OU "MyDept"

4. 生成 CA、证书和密钥

./easyrsa init-pki
./easyrsa build-ca nopass # 创建 CA 根证书
./easyrsa gen-dh # 生成 Diffie-Hellman 参数
./easyrsa gen-req server nopass # 创建服务器密钥请求
./easyrsa sign-req server server # 使用 CA 签发证书
openvpn --genkey secret ta.key # 生成 TLS 密钥

配置 OpenVPN 服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
复制生成的文件到 /etc/openvpn/server
sudo cp pki/ca.crt pki/private/server.key pki/issued/server.crt pki/dh.pem ta.key /etc/openvpn/server

编辑 OpenVPN 配置文件
sudo vi /etc/openvpn/server/server.conf

port 12345 //openvpn的端口号,用来连接openvpn
proto udp
dev tun
ca /etc/openvpn/server/ca.crt //复制过来的证书和密钥
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
auth SHA256
tls-crypt /etc/openvpn/server/ta.key
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 1.1.1.1"
keepalive 10 120
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
cipher AES-256-GCM
persist-key
persist-tun
status openvpn-status.log
log-append ~/openvpn.log
verb 3

启动服务

1
2
3
4
5
sudo systemctl enable openvpn-server@server
sudo systemctl start openvpn-server@server

查看服务状态
sudo systemctl status openvpn-server@server

防火墙配置(可选)

1
2
3
4
5
6
7
8
9
10
11
开启 IP 转发
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p

设置防火墙转发规则
sudo ufw allow 你的端口号/udp
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw status

开启防火墙规则需要将端口使用ufw allow命令添加,否则端口无法使用

配置frp

1
2
3
4
5
6
7
8
vi /etc/frp/frpc.toml
添加配置
[[proxies]]
name = "openvpn"
type = "udp"
localIP = "127.0.0.1"
localPort = 12345 //这边的端口和openvpn使用的端口一致
remotePort = 12345 //这边的端口是远程服务器暴露的端口,这边使用腾讯云服务器,暴露端口12345,并且在腾讯云后台的防火墙配置中开启端口

生产客户端证书和密钥

1
2
3
4
5
6
7
8
9
cd ~/openvpn-ca
./easyrsa gen-req client1 nopass
./easyrsa sign-req client client1

获取以下四个文件备用
ca.crt
client1.crt
client1.key
ta.key

配置客户端config

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
创建config.ovpn文件

client
remote-cert-tls server
pull-filter ignore "redirect-gateway"
dev tun
proto udp
remote 你的服务器地址 frp转发的端口号这边使用12345
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
tls-crypt ta.key
data-ciphers AES-256-GCM:AES-128-GCM:CHACHA20-POLY1305
cipher AES-256-GCM
verb 3

macos下安装openvpn客户端

1
2
brew install openvpn
sudo openvpn --config client.ovpn

启动openvpn客户端

1
2
3
4
5
6
7
8
将ca.crt,client1.crt,client1.key,ta.key四个文件和config.ovpn文件放在一个文件目录下,不放在一个目录下需要修改config.ovpn配置对应的地址

使用命令启动openvpn客户端
sudo openvpn --config config.ovpn

显示
/sbin/route add -net 10.8.0.1 10.8.0.5 255.255.255.255
add net 10.8.0.1: gateway 10.8.0.5

验证是否连接成功

1
ping 10.8.0.1

注意

1
2
3
4
5
6
7
8
9
10
11
确保ip转发启用
cat /proc/sys/net/ipv4/ip_forward
输出1
否则运行
echo 1 | sudo tee /proc/sys/net/ipv4/ip_forward
sudo sysctl -w net.ipv4.ip_forward=1

调整密钥和证书权限
chmod 600 *.key
chmod 644 *.crt
chmod 600 *.ovpn

连接内网ssh

1
2
3
开启vpn后,内网ssh端口号为22

ssh 用户名10.8.0.1 即可访问内网服务器,断开vpn后无法访问,保证了内网的安全