记一次安装openvpn

672次阅读
没有评论
记一次安装 openvpn

配置服务端

安装 epel 源、openvpn、easyRsa

yum -y install epel-release
yum -y install openvpn easy-rsa

生成证书和密钥

mkdir -p /etc/openvpn/easy-rsa/
cp -r /usr/share/easy-rsa/3.0.8/* /etc/openvpn/easy-rsa/
cp /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa/vars

生成 CA 根证书

cd /etc/openvpn/easy-rsa/
./easyrsa init-pki
#执行完成会生成 /etc/openvpn/easy-rsa/pki
./easyrsa build-ca nopass
#nopass 指的是证书不需要密码验证
#这里会让你输入一个 common name,可以近似理解为你的域名,随便写 

生成 OpenVPN 服务器证书和密钥

./easyrsa build-server-full server nopass     #第一个参数 server 为证书名称
./easyrsa gen-dh
openvpn --genkey --secret ta.key

把生成的证书复制到 openvpn 配置文件夹

cd /etc/openvpn/
cp /etc/openvpn/easy-rsa/{pki/dh.pem,pki/ca.crt,ta.key,pki/issued/server.crt,pki/private/server.key} /etc/openvpn

配置 OpenVPN 服务端配置

# 这个文件官方给出了例子:/usr/share/doc/openvpn-2.4.12/sample/sample-config-files/server.conf
vim /etc/openvpn/server.conf

#local 123.57.237.225 #指定监听的本机 IP(因为有些计算机具备多个网卡),该命令是可选的,默认监听所有 IP 地址
port 1194 #服务端端口号
proto tcp #通过 tcp 协议来连接,也可以通过 udp
dev tun #路由模式,注意 windows 下必须使用 dev tap
ca ca.crt #ca 证书存放位置
cert server.crt #服务器证书存放位置
key server.key  # #服务器密钥存放位置
dh dh.pem #dh.pem 存放位置
tls-auth ta.key 0  #ta.key 存放位置
server 10.8.0.0 255.255.255.0 #虚拟局域网网段设置
ifconfig-pool-persist ipp.txt
client-to-client                         #开启客户端互访
#duplicate-cn                    #支持一个证书 / 用户多个客户端登录使用,建议不启用
keepalive 10 120
cipher AES-128-CBC
#comp-lzo
max-clients 100                          #最大客户端并发连接数量
user nobody
group nobody
persist-key
persist-tun
status openvpn-status.log
verb 3
log         /var/log/openvpn/openvpn.log
log-append  /var/log/openvpn/openvpn.log
push "route 172.16.214.0 255.255.255.0" #实际内网 ip 网段

建立一个日志目录

#
mkdir  -p /var/log/openvpn/
systemctl stop firewalld && systemctl mask firewalld
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config

配置 iptables

iptables -F   # 清理所有防火墙规则
iptables -t nat -A POSTROUTING -s 10.8.0.0/16 -j MASQUERADE
iptables-save > /etc/sysconfig/iptables   # iptables 规则持久化保存 

地址转发

echo -e "###OpenVPN ADD\nnet.ipv4.conf.default.accept_source_route = 1\nnet.ipv4.conf.default.rp_filter = 0\nnet.ipv4.ip_forward = 1" >> /etc/sysctl.conf
sysctl -p

启动命令

systemctl start openvpn@server #启动 OpenVPN 服务
systemctl restart openvpn@server #重启 OpenVPN 服务
systemctl stop openvpn@server #停止 OpenVPN 服务 

配置客户端 (生成客户端配置)

vim /etc/openvpn/client/sample.ovpn

client
remote OPENVPN 服务端公网 IP 1194    #例:remote 106.12.1.1 1194
dev tun
proto tcp
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key 1
remote-cert-tls server
resolv-retry infinite
nobind
persist-key
persist-tun
#comp-lzo
verb 3
mute-replay-warnings
redirect-gateway def1 bypass-dns #这个是设置默认流量走向 注释掉就走本地外网 不注释掉就走 vpn 流量 

用户添加脚本

vim ovpn_user.sh
#! /bin/bash
 
set -e
 
OVPN_USER_KEYS_DIR=/etc/openvpn/client/keys
EASY_RSA_DIR=/etc/openvpn/easy-rsa/
PKI_DIR=$EASY_RSA_DIR/pki
 
for user in "$@"
do
  if [ -d "$OVPN_USER_KEYS_DIR/$user" ]; then
    rm -rf $OVPN_USER_KEYS_DIR/$user
    rm -rf  $PKI_DIR/reqs/$user.req
    sed -i '/'"$user"'/d' $PKI_DIR/index.txt
  fi
  cd $EASY_RSA_DIR
  # 生成客户端 SSL 证书文件
  ./easyrsa build-client-full $user nopass
  # 整理下生成的文件
  mkdir -p  $OVPN_USER_KEYS_DIR/$user
  cp $PKI_DIR/ca.crt $OVPN_USER_KEYS_DIR/$user/   # CA 根证书
  cp $PKI_DIR/issued/$user.crt $OVPN_USER_KEYS_DIR/$user/   # 客户端证书
  cp $PKI_DIR/private/$user.key $OVPN_USER_KEYS_DIR/$user/  # 客户端证书密钥
  cp /etc/openvpn/client/sample.ovpn $OVPN_USER_KEYS_DIR/$user/$user.ovpn # 客户端配置文件
  sed -i 's/client.crt/'"$user".crt'/g' $OVPN_USER_KEYS_DIR/$user/$user.ovpn
  sed -i 's/client.key/'"$user".key'/g' $OVPN_USER_KEYS_DIR/$user/$user.ovpn
  cp $EASY_RSA_DIR/ta.key $OVPN_USER_KEYS_DIR/$user/ta.key  # auth-tls 文件
  cd $OVPN_USER_KEYS_DIR
  zip -r $user.zip $user
done
exit 0

用户删除脚本

vim del_ovpn_user.sh

#! /bin/bash
 
set -e
 
OVPN_USER_KEYS_DIR=/etc/openvpn/client/keys
EASY_RSA_DIR=/etc/openvpn/easy-rsa/
PKI_DIR=$EASY_RSA_DIR/pki
 
for user in "$@"
do
  if [ -d "$OVPN_USER_KEYS_DIR/$user" ]; then
    rm -rf $OVPN_USER_KEYS_DIR/$user
    rm -rf  $PKI_DIR/reqs/$user.req
    sed -i '/'"$user"'/d' $PKI_DIR/index.txt
  fi
  cd $EASY_RSA_DIR
  # 生成客户端 SSL 证书文件
  ./easyrsa build-client-full $user nopass
  # 整理下生成的文件
  mkdir -p  $OVPN_USER_KEYS_DIR/$user
  cp $PKI_DIR/ca.crt $OVPN_USER_KEYS_DIR/$user/   # CA 根证书
  cp $PKI_DIR/issued/$user.crt $OVPN_USER_KEYS_DIR/$user/   # 客户端证书
  cp $PKI_DIR/private/$user.key $OVPN_USER_KEYS_DIR/$user/  # 客户端证书密钥
  cp /etc/openvpn/client/sample.ovpn $OVPN_USER_KEYS_DIR/$user/$user.ovpn # 客户端配置文件
  sed -i 's/client.crt/'"$user".crt'/g' $OVPN_USER_KEYS_DIR/$user/$user.ovpn
  sed -i 's/client.key/'"$user".key'/g' $OVPN_USER_KEYS_DIR/$user/$user.ovpn
  cp $EASY_RSA_DIR/ta.key $OVPN_USER_KEYS_DIR/$user/ta.key  # auth-tls 文件
  cd $OVPN_USER_KEYS_DIR
  zip -r $user.zip $user
done
exit 0

配置账号密码登录

验证脚本

vim /etc/openvpn/checkpsw.sh 
#!/bin/sh
###########################################################
# checkpsw.sh (C) 2004 Mathias Sundman 
#
# This script will authenticate OpenVPN users against
# a plain text file. The passfile should simply contain
# one row per user with the username first followed by
# one or more space(s) or tab(s) and then the password.
 
PASSFILE="/etc/openvpn/psw-file"
LOG_FILE="/etc/openvpn/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 755 /etc/openvpn/checkpsw.sh

配置用户和密码

vim /etc/openvpn/psw-file
test test
openvpn password

服务端配置

cat >>/etc/openvpn/server.conf<<EOF
script-security 3
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env    #指定用户认证脚本
username-as-common-name
verify-client-cert none
EOF

客户端配置

# 注释两行,添加一行即可
;cert cyh.crt      #注释
;key cyh.key      #注释
auth-user-pass

重启服务端

 systemctl restart openvpn@server

openvpn 客户端配置文件 | 合并配置

 将对应文件内容复制到 ovpn 文件中的对应位置,如下:<ca>

</ca>

<cert>

</cert>

<key>

</key>

key-direction 1
<tls-auth>

</tls-auth>

需要注意的是必须要加上面红色的一行,否则会失败。

密码验证的话,只配置 ca 和 tls-auth 就可以。

参考链接:http://babamumu.com/archives/openvpn

https://i4t.com/4481.html

https://i4t.com/4485.html

正文完
 1
评论(没有评论)