环境: 外网IP:139.198.15.121 内网IP:10.180.27.8
制作证书
安装 easy-rsa 软件
代码语言:javascript复制mkdir /data/
wget -P /data/ http://down.i4t.com/easy-rsa.zip
unzip -d /usr/local /data/easy-rsa.zip
编译 vars 文件
代码语言:javascript复制vim /usr/local/easy-rsa-old-master/easy-rsa/2.0/vars
export KEY_COUNTRY="CN"
export KEY_PROVINCE="BJ"
export KEY_CITY="BeiJing"
export KEY_ORG="test"
export KEY_EMAIL="test@test.com"
export KEY_CN=test
export KEY_NAME=test
export KEY_OU=test
制作 CA 证书
代码语言:javascript复制cd /usr/local/easy-rsa-old-master/easy-rsa/2.0/
source ./vars
./clean-all # 执行此命令后,会在当前目录下创建一个 keys 目录
./build-ca # 生成根证书 ca.crt 和密钥 ca.key,由于在 vars 文件中填写了基本信息,一路回车
在 keys 目录中,已经生成了 ca.crt 和 ca.key。ca.crt 就是证书文件。
制作 server 证书
代码语言:javascript复制cd /usr/local/easy-rsa-old-master/easy-rsa/2.0/
./build-key-server server # 一路回车,最后两步输入 y 即可
查看 keys 目录中,已经生成了server.crt、server.csr、server.key 三个文件,其中 server.crt 和 server.key 是我们要用的。
制作 client 证书
代码语言:javascript复制cd /usr/local/easy-rsa-old-master/easy-rsa/2.0/
./build-key chen
每一个客户端都需要一个证书,一个证书同一时间只有一个客户端连接。
生成 DH 文件
代码语言:javascript复制cd /usr/local/easy-rsa-old-master/easy-rsa/2.0/
./build-dh # 会生成 dh2048.pem 文件,生成时间会比较长。生成完成后,会在 keys 目录下生成 dh2048.pem 文件。
安装依赖
代码语言:javascript复制yum install -y lzo lzo-devel openssl openssl-devel pam pam-devel net-tools git lz4-devel
安装 openvpn
代码语言:javascript复制# 编译安装
https://openvpn.net/index.php/download/community-downloads.html
tar xf openvpn-2.5.4.tar.gz
cd openvpn-2.5.4
./configure --prefix=/usr/local/openvpn
make
make install
# yum 安装
yum install epel-release
yum install openvpn
配置 openvpn
代码语言:javascript复制mkdir -p /etc/openvpn/keys
cd /etc/openvpn/keys/
/usr/local/openvpn/sbin/openvpn --genkey --secret ta.key # 生成 tls-auth 证书
把之前生成的证书文件拷贝到证书目录中
拷贝 openvpn 配置文件
代码语言:javascript复制# 编译安装
cp /data/openvpn-2.5.4/sample/sample-config-files/server.conf /etc/openvpn/
# yum 安装
cp /usr/share/doc/openvpn-2.5.4/sample/sample-config-files/server.conf /etc/openvpn/
修改内核参数,开启路由转发
代码语言:javascript复制vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
修改服务端配置文件
代码语言:javascript复制vim /etc/openvpn/server.conf
# 服务端口号
port 1194
# 协议:tcp 或 udp
proto udp
# 生成虚拟网卡
dev tun
# 证书的路径,可以是相对路径或绝对路径
ca /etc/openvpn/keys/ca.crt
cert /etc/openvpn/keys/server.crt
key /etc/openvpn/keys/server.key
dh /etc/openvpn/keys/dh2048.pem
# 虚拟局域网段
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 10.8.0.0 255.255.255.0"
# 如果客户端都是用一个证书和密钥连接VPN,需要打开这个选项
client-to-client
duplicate-cn
keepalive 10 120
tls-auth /etc/openvpn/keys/ta.key 0
cipher AES-256-CBC
compress lz4-v2
comp-lzo
persist-key
persist-tun
# 状态日志路径
status openvpn-status.log
# 运行日志路径
log openvpn.log
log-append openvpn.log
# 日志级别
verb 3
如果配置了 iptables ,需要开启 iptables 策略
代码语言:javascript复制iptables -P FORWARD ACCEPT
iptables -I INPUT -p udp --dport 1194 -m comment --comment "openvpn" -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j MASQUERADE
启动 openvpn 服务
客户端测试
修改客户端配置文件
代码语言:javascript复制cp /data/openvpn-2.5.4/sample/sample-config-files/client.conf ./chen.ovpn
vim chen.ovpn
client
dev tun
proto udp
remote 139.198.15.121 1194 # 服务器外网 IP
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert chen.crt # 用户的证书文件
key chen.key # 用户的证书文件
tls-auth ta.key 1
cipher AES-256-CBC
comp-lzo
verb 3
导出证书文件
代码语言:javascript复制sz chen.ovpn
sz /etc/openvpn/keys/ca.crt
sz /etc/openvpn/keys/ta.crt
sz /usr/local/easy-rsa-old-master/easy-rsa/2.0/keys/chen.crt
sz /usr/local/easy-rsa-old-master/easy-rsa/2.0/keys/chen.key
以后添加用户时,只需要到 /usr/local/easy-rsa-old-master/easy-rsa/2.0/ 目录下,执行 ./build-key 用户名,在把 keys 目录下的 用户名.crt 和 用户名.key 导出,最后修改 client.ovpn 文件中的 用户名.crt 和 用户名.key
windows 测试
把刚才导出的证书放到下面的目录中
也可以把证书内容放到一个文件中,格式如下: vim chen.ovpn
代码语言:javascript复制chen.ovpn
<key>
chen.key
</key>
<cert>
chen.cert
</cert>
<ca>
ca.crt
</ca>
<tls-auth>
ta.key
</tls-auth>