1 服务端配置
主机规划与架构
服务器名称 | 操作系统版 | 内网IP | 外网IP(模拟) | 角色 |
---|---|---|---|---|
test01 | Ubuntu | 192.168.20.1 | 无 | 被访问机器 |
test02 | Ubuntu | 192.168.20.3 | 无 | 被访问机器 |
openvpn-server | Ubuntu | 192.168.20.1 | 10.0.0.200 | Openvpn-Server |
openvpn-client | Ubuntu | 无 | 10.0.0.210 | Openvpn-Client |
本地 | Windows10 | 无 | 10.0.0.X | Openvpn-Client |
1.1 编译安装
openvpn源码下载地址:
https://github.com/OpenVPN/openvpn
easy-rsa下载地址:
https://github.com/OpenVPN/easy-rsa
windows安装:
https://openvpn.en.softonic.com/
1.2 系统配置
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p /etc/sysctl.conf
cat /proc/sys/net/ipv4/ip_forward
### centos
yum install -y openssl-devel lzo{,-devel} pam-devel
### ubuntu
apt install -y libssl-dev liblz4-dev liblzo2-dev libpam0g-dev
- 源文件下载在/data/soft/目录下,进入该目录操作
tar xfv openvpn-2.5.2.tar.gz
cd openvpn-2.5.2
./configure --prefix=/usr/local/openvpn-2.5.2
make -j$(nproc)
make install
1.3 证书生成
- 使用easy-rsa3签发证书
tar xfv EasyRSA-3.0.8.tgz
cd EasyRSA-3.0.8/
mkdir /usr/local/openvpn-2.5.2/easy-rsa
cp -r easyrsa openssl-easyrsa.cnf vars.example x509-types /usr/local/openvpn-2.5.2/easy-rsa/
cd /usr/local/openvpn-2.5.2/easy-rsa/
cp vars.example vars
- 修改vars文件以下配置
set_var EASYRSA_REQ_COUNTRY "CN"
set_var EASYRSA_REQ_PROVINCE "ShangHai"
set_var EASYRSA_REQ_CITY "ShangHai"
set_var EASYRSA_REQ_ORG "ShangHai Co"
set_var EASYRSA_REQ_EMAIL "admin@example.com"
set_var EASYRSA_REQ_OU "ShangHai"
- 创建ca证书
./easyrsa init-pki
./easyrsa build-ca nopass
- 申请server端证书;名称为server,没有密码
./easyrsa gen-req server nopass
# 以下为输出内容
# 交互式操作回车即可;注意输出的名称
Keypair and certificate request completed. Your files are:
req: /usr/local/openvpn-2.5.2/easy-rsa/pki/reqs/server.req
key: /usr/local/openvpn-2.5.2/easy-rsa/pki/private/server.key
- 签发,第一个server为签发类型;第二个server即为上面命令申请证书时使用的名称,务必对应上面申请的证书名称
./easyrsa sign server server
# 以下为输出内容
# 交互式操作回车即可;签发的服务证书
Certificate created at: /usr/local/openvpn-2.5.2/easy-rsa/pki/issued/server.crt
- 生成dh证书
./easyrsa gen-dh
- 生成ta密钥
cd ../
./sbin/openvpn --genkey tls-auth ta.key
1.4 创建客户端证书请求
cd /usr/local/openvpn-2.5.2/
mkdir client
cp -r /data/soft/EasyRSA-3.0.8/{easyrsa,openssl-easyrsa.cnf,x509-types,vars.example} ./client/
cd ./client && cp vars.example vars
./easyrsa init-pki
- 生成证书请求;名称为myuser1(CN Name)
./easyrsa gen-req myuser1 nopass
# 以下为输出内容
# 交互式操作回车即可;注意输出的名称保存位置
Keypair and certificate request completed. Your files are:
req: /usr/local/openvpn-2.5.2/client/pki/reqs/myuser1.req
key: /usr/local/openvpn-2.5.2/client/pki/private/myuser1.key
cd /usr/local/openvpn-2.5.2/easy-rsa/
- 导入证书请求,指定证书请求文件,即前面输出的名称与位置;此命令中最后的myuser1为申请时的名称
./easyrsa import-req /usr/local/openvpn-2.5.2/client/pki/reqs/myuser1.req myuser1
- 签发
此命令中第二个参数client的为签发类型;第三个参数myuser1为申请时的名称
./easyrsa sign client myuser1
# 输出内容;签发的client证书位置
Certificate created at: /usr/local/openvpn-2.5.2/easy-rsa/pki/issued/myuser1.crt
- 吊销客户端证书
吊销的证书名称为myuser1;并生成一份吊销证书名单
cd /usr/local/openvpn-2.5.2/easy-rsa/
./easyrsa revoke myuser1
./easyrsa gen-crl
- 服务端配置文件
准备服务端使用到的证书文件
cd /usr/local/openvpn-2.5.2/ && mkdir -p conf/cert
cp easy-rsa/pki/ca.crt conf/cert/
cp easy-rsa/pki/private/server.key conf/cert/
cp easy-rsa/pki/issued/server.crt conf/cert/
cp easy-rsa/pki/dh.pem conf/cert/
mv ta.key conf/cert/
- 修改配置文件
从源码包中复制配置文件
cp /data/soft/openvpn-2.5.2/sample/sample-config-files/server.conf ./conf/
- 配置文件内容
local 10.2.3.110 # 监听地址
port 31234 # 端口
proto udp
dev tun
ca cert/ca.crt
cert cert/server.crt
key cert/server.key
dh cert/dh.pem
server 10.8.0.0 255.255.255.0 # 为Client分配的网段
ifconfig-pool-persist ipp.txt
push "route 192.168.50.0 255.255.255.0" # 为Client推送的路由,可以是范围也可以是单个IP(掩码为255.255.255.255)
keepalive 30 120
tls-auth cert/ta.key 0
cipher AES-256-GCM
compress lz4-v2 # v2.4+支持此选项,Enable compression on the VPN link
push "compress lz4-v2"
persist-key
persist-tun
status /usr/local/openvpn-2.5.2/logs/openvpn-status.log # 状态文件
log-append /usr/local/openvpn-2.5.2/logs/openvpn.log # 日志文件
verb 3
explicit-exit-notify 1
注意:使用脚本启动停止;无法启动可去掉–daemon参数进行调试
启动脚本 vim ./sbin/openvpn-startup.sh
#!/bin/bash
dir=/usr/local/openvpn-2.5.2
${dir}/sbin/openvpn --cd ${dir} --daemon --config ${dir}/conf/server.conf
停止脚本 vim ./sbin/openvpn-shutdown.sh
#!/bin/bash
killall -TERM openvpn
1.5 iptables配置
配置openvpn后,且客户端可以连接到openvpn服务器,客户端仅能访问openvpn服务器上的资源,想要访问其他openvpn服务器能够访问的内网资源需要如下条件:
需要openvpn服务端有这个资源的push "route xxx xxx"路由推送
需要有iptables为其做源地址转换
将openvpn client分配的网段来源IP转换为本机的IP,否则无法通过本机访问其他内部网络
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to-source 10.2.3.110
- 假设eth0 IP地址为动态情况下使用
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
- 如果服务端有Docker,FORWARD可能会被更改为DROP,则还需要添加FORWARD规则
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT
如果还有其他规则表为DROP,则按需添加放行规则。
2 客户端配置
2.1 配置文件
注意:以下为客户端配置文件,Windows、Linux通用
- 从以下路径下载证书文件到客户端机器
/usr/local/openvpn-2.5.2/conf/cert/ca.crt
/usr/local/openvpn-2.5.2/conf/cert/ta.key
/usr/local/openvpn-2.5.2/easy-rsa/pki/issued/myuser1.crt
/usr/local/openvpn-2.5.2/client/pki/private/myuser1.key
默认证书文件为配置文件同目录中,否则请写完整路径;
remote即服务端地址
client
dev tun
proto udp
remote 10.2.3.110 31234
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert myuser1.crt
key myuser1.key
tls-auth ta.key 1
remote-cert-tls server
comp-lzo
allow-compression yes
keysize 256
verb 3
2.2 Linux客户端
同服务端一样,编译完成后使用客户端的配置文件直接启动即可
2.3 Windows客户端
- 该网络可能需要科学上网。
- windows配置文件以.ovpn后缀结尾,配置文件可存放于openvpn程序的config目录下或任意位置,通过启动的程序->选项->高级->配置文件指定路径
- 程序安装点击下一步即可(记得勾选TAP网卡安装)。
2.4 配置固定IP
给客户端配置固定的IP地址。第一个IP为Client IP,第二个IP为服务端IP端点,此IP必须在服务端的vpn地址分配范围内,且属于255.255.255.252掩码范围中的可用地址;如当前配置,10.8.0.9/30,其网络为10.8.0.8,可用IP 10.8.0.9-10,广播 10.8.0.11。
- ccd目录中的文件名称要和客户端使用的证书中CN名称一致
- 在服务端conf/server.conf文件中配置此选项
client-config-dir conf/ccd
- 创建ccd,为client(CN Name)用户固定IP地址
cd /usr/local/openvpn-2.5.2/ && mkdir conf/ccd
echo 'ifconfig-push 10.8.0.9 10.8.0.10' > conf/ccd/client