安装
yum install openvpn easy-rsa lzo lzo-devel openssl openssl-devel -y
或编译安装openvpn
mkdir –p /usr/local/openvpn && cd /usr/local/openvpn/
./configure —with-lzo-headers=/usr/local/include —with-lzo-lib=/usr/local/lib
make
make install
生成证书
目标
服务器: ca.crt、server.key、server.crt、dh.pem
客户端: ca.crt、client.key、client.crt
查找模板
find / -name “vars.example” -type f # vars文件
find / -name “server.conf” -type f # server.conf文件
进入目录easy-rsa
cd /usr/local/openvpn/openvpn-2.0.9/easy-rsa/2.0/
cd /usr/share/easy-rsa/3.0.3/
设置vars
cp vars.example vars
vars文件
set_var KEY_COUNTRY=“CN”
set_var KEY_PROVINCE=“BJ”
set_var KEY_CITY=“Beijing”
set_var KEY_ORG=“linux”
set_var KEY_EMAIL=“test@example.net ”
set_var EASYRSA_NS_SUPPORT “yes” # 客户端配置ns-cert-type server时配置
生成server文件
配置文件在/etc/easy-rsa或 …/openvpn/easy-rsa
rm -rf pki
./easyrsa init-pki # pki目录
./easyrsa build-ca nopass # 回车过, 生成ca.crt
./easyrsa gen-req vpnserver nopass # 回车过, 生成vpnserver.key, vpnserver.req(密钥对、证书请求文件)
./easyrsa sign server vpnserver # 生成vpnserver.crt(ca.crt与vpnserver.req签名)
./easyrsa gen-dh # 生成dh.pem(diffie hellman)
cp -r ../3.0.3/ ~
生成client文件
rm -rf pki
./easyrsa init-pki
./easyrsa gen-req client nopass # 回车过, 生成client.key, client.req
cp pki/reqs/client.req ~/3.0.3/pki/reqs/
cp pki/private/client.key ~/3.0.3/pki/private/
cd ~/3.0.3
./easyrsa sign client client # 生成client.crt(ca.crt与client.req签名)
移动server文件到openvpn配置目录
cp pki/{ca.crt,dh.pem} /etc/openvpn/server/
cp pki/private/vpnserver.key /etc/openvpn/server/
cp pki/issued/vpnserver.crt /etc/openvpn/server/
cp server.conf /etc/openvpn/server
下载client文件
pki/ca.crt
pki/private/client.key
pki/issued/client.crt
server.conf
cp -p ../../sample-config-files/server.conf /etc/openvpn
o→ server.conf
;local 172.21.223.196
port 1194
proto udp
dev tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key
dh /etc/openvpn/dh1024.pem
server 192.168.200.0 255.255.255.0
ifconfig-pool-persist ipp.txt
;client-config-dir "C:\\Program Files\\OpenVPN\\ccd" # 支持TLS client
push "route 0.0.0.0 0.0.0.0"
keepalive 10 120
cipher AES-256-CBC
comp-lzo # 减少带宽
persist-key
persist-tun
status openvpn-status.log
log /var/log/openvpn.log
verb 3
explicit-exit-notify 1
sudo openvpn —config /etc/openvpn/server.conf —daemon
netstat -anulp | grep 1194
linux配置
iptables
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1 # 开启路由转发
sysctl -p
iptables -t nat -A POSTROUTING -s 192.168.200.0/24 -j SNAT —to-source 45.55.56.16
firewall
firewall-cmd —add-service=openvpn —zone=public —permanent
firewall-cmd —reload
client配置
o→ client.ovpn
client
dev tun
proto udp
remote 45.55.56.16 1194
resolv-retry infinite
nobind
ca ca.crt
cert client.crt
key client.key
;ns-cert-type server
cipher AES-256-CBC
comp-lzo
persist-key
persist-tun
verb 3
mute 20
sudo openvpn —config client.ovpn
—user outrun
—auth-nocache
askpass pass.txt 放密码到文件
o→ 免密码连接
#!/usr/bin/expect -f
spawn sudo openvpn --config /home/outrun/.openvpn/a-vpn-ldap.ovpn
# match_max 100000
expect "*?assword*:*"
send -- "1234\n"
expect "*Username:*"
send -- "outrun\n"
expect "*Password:*"
expect "#"
案例
代理http上网 # tcp连接国内服务器会被reset
server.conf
dev tap
proto tcp
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 114.114.114.114"
push "dhcp-option DNS 8.8.8.8"
client-to-client
;explicit-exit-notify 1
client.ovpn
改成用户名密码认证
服务器
server.conf
auth-user-pass-verify /etc/openvpn/server/checkpsw.sh via-env
verify-client-cert none
username-as-common-name
tls-auth /etc/openvpn/server/ta.key 0
script-security 3
checkpsw.sh
#!/bin/sh
PASSFILE = "/etc/openvpn/server/user/psw-file"
LOG_FILE = "/etc/openvpn/server/log/openvpn-password.log"
TIME_STAMP = ` date "+%Y-%m-%d %T"`
if [ ! -r "${ PASSFILE }" ]; then
echo "${ TIME_STAMP }: Could not open password file \" ${ PASSFILE } \" for reading." >> ${LOG_FILE}
exit 1
fi
CORRECT_PASSWORD = ` awk '!/^;/&&!/^#/&&$1=="'${ username }'"{print $2;exit}' ${ PASSFILE }`
if [ "${ CORRECT_PASSWORD }" = "" ]; then
echo "${ TIME_STAMP }: User does not exist: username= \" ${ username } \" , password= \" ${ password } \" ." >> ${LOG_FILE}
exit 1
fi
if [ "${ password }" = "${ CORRECT_PASSWORD }" ]; then
echo "${ TIME_STAMP }: Successful authentication: username= \" ${ username } \" ." >> ${LOG_FILE}
exit 0
fi
echo "${ TIME_STAMP }: Incorrect password: username= \" ${ username } \" , password= \" ${ password } \" ." >> ${LOG_FILE}
exit 1
chmod 645 checkpsw.sh
mkdir user
mkdir log
user/psw-file
openvpn —genkey —secret ta.key
客户端
下载ta.key
client.ovpn
;cert client.crt
;key client.key
auth-user-pass
tls-auth ta.key 1