添加EPEL源
yum install epel-release -y
替换阿里的源
sed -e 's,^#baseurl,baseurl,g' \
-e 's,^metalink,#metalink,g' \
-e 's,^mirrorlist=,#mirrorlist=,g' \
-e 's,http://download.fedoraproject.org/pub,https://mirrors.aliyun.com,g' \
-i /etc/yum.repos.d/epel.repo
更新软件
yum makecache
yum update -y
修改sysctl参数
cat > /etc/sysctl.d/99-net.conf <<EOF
# 二层的网桥在转发包时也会被iptables的FORWARD规则所过滤
net.bridge.bridge-nf-call-arptables=1
net.bridge.bridge-nf-call-iptables=1
net.bridge.bridge-nf-call-ip6tables=1
# 关闭严格校验数据包的反向路径,默认值1
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0
# 设置 conntrack 的上限
net.netfilter.nf_conntrack_max=1048576
# 端口最大的监听队列的长度
net.core.somaxconn=21644
# TCP阻塞控制算法BBR,Linux内核版本4.9开始内置BBR算法
#net.ipv4.tcp_congestion_control=bbr
#net.core.default_qdisc=fq
# 打开ipv4数据包转发
net.ipv4.ip_forward=1
# TCP FastOpen
# 0:关闭 ; 1:作为客户端时使用 ; 2:作为服务器端时使用 ; 3:无论作为客户端还是服务器端都使用
net.ipv4.tcp_fastopen=3
EOF
修改limits参数
cat > /etc/security/limits.d/99-centos.conf <<EOF
* - nproc 1048576
* - nofile 1048576
EOF
安装open***软件
yum install -y open*** easy-rsa lrzsz iptables-services
配置服务器证书
统一目录
cp -r /usr/share/easy-rsa/3.0.6 /etc/open***/easy-rsa
cp /usr/share/doc/easy-rsa-3.0.6/vars.example /etc/open***/easy-rsa/vars
修改vars
vim /etc/open***/easy-rsa/vars
set_var EASYRSA_REQ_COUNTRY "US"
set_var EASYRSA_REQ_PROVINCE "California"
set_var EASYRSA_REQ_CITY "San Francisco"
set_var EASYRSA_REQ_ORG "Copyleft Certificate Co"
set_var EASYRSA_REQ_EMAIL "me@example.net"
set_var EASYRSA_REQ_OU "My Organizational Unit"
创建PKI
cd /etc/open***/easy-rsa
./easyrsa init-pki
创建CA
./easyrsa build-ca nopass
创建服务器证书
./easyrsa build-server-full open***-server nopass
创建DH证书
./easyrsa gen-dh
拷贝证书
mkdir -p /etc/open***/pki
cp /etc/open***/easy-rsa/pki/ca.crt \
/etc/open***/easy-rsa/pki/dh.pem \
/etc/open***/easy-rsa/pki/issued/open***-server.crt \
/etc/open***/easy-rsa/pki/private/open***-server.key \
/etc/open***/pki/
ln -sv /etc/open***/easy-rsa/pki/crl.pem /etc/open***/pki/crl.pem
chown -R root:open*** /etc/open***/pki
创建ta.key
open*** --genkey --secret /etc/open***/pki/ta.key
配置open***服务端
vim /etc/open***/server/srv.conf
# 监听地址
#local 0.0.0.0
# 监听端口
port 8443
# 通信协议
proto tcp
# TUN模式还是TAP模式
dev tun
# 证书
ca /etc/open***/pki/ca.crt
cert /etc/open***/pki/open***-server.crt
key /etc/open***/pki/open***-server.key
dh /etc/open***/pki/dh.pem
#crl-verify /etc/open***/pki/crl.pem
# 禁用Open***自定义缓冲区大小,由操作系统控制
sndbuf 0
rcvbuf 0
# TLS rules “client” | “server”
#remote-cert-tls "client"
# TLS认证
tls-auth /etc/open***/pki/ta.key
# TLS最小版本
#tls-version-min "1.2"
# 重新协商数据交换的key,默认3600
#reneg-sec 3600
# 在此文件中维护客户端与虚拟IP地址之间的关联记录
# 如果Open***重启,重新连接的客户端可以被分配到先前分配的虚拟IP地址
ifconfig-pool-persist /etc/open***/ipp.txt
# 配置client配置文件
client-config-dir /etc/open***/client/config
# 该网段为 open *** 虚拟网卡网段,不要和内网网段冲突即可。
server 10.8.0.0 255.255.255.0
# 配置网桥模式,需要在Open***服务添加启动关闭脚本,将tap设备桥接到物理网口
# 假定内网地址为192.168.0.0/24,内网网关是192.168.0.1
# 分配192.168.0.200-250给***使用
#server-bridge 192.168.0.1 255.255.255.0 192.168.0.200 192.168.0.250
# 给客户端推送自定义路由
push "route 192.168.5.0 255.255.255.0"
push "route 192.168.100.0 255.255.255.0"
# 所有客户端的默认网关都将重定向到***
push "redirect-gateway def1 bypass-dhcp"
# 向客户端推送DNS配置
push "dhcp-option DNS 192.168.100.1"
#push "dhcp-option DNS 114.114.114.114"
# 允许客户端之间互相访问
client-to-client
# 限制最大客户端数量
#max-clients 10
# 客户端连接时运行脚本
#client-connect o***s.script
# 客户端断开连接时运行脚本
#client-disconnect o***s.script
# 保持连接时间
keepalive 20 120
# 开启***压缩
comp-lzo
# 允许多人使用同一个证书连接***,不建议使用,注释状态
#duplicate-cn
# 运行用户
user open***
#运行组
group open***
# 持久化选项可以尽量避免访问那些在重启之后由于用户权限降低而无法访问的某些资源
persist-key
persist-tun
# 显示当前的连接状态
status /var/log/open***/open***-status.log
# 日志路径,不指定文件路径时输出到控制台
# log代表每次启动时清空日志文件
#log /var/log/open***/open***.log
# log-append代表追加写入到日志文件
log-append /var/log/open***/open***.log
# 日志级别
verb 4
# 忽略过多的重复信息,相同类别的信息只有前20条会输出到日志文件中
mute 20
script-security 3
auth-user-pass-verify /etc/open***/checkpsw.sh via-env
#指定用户认证脚本
username-as-common-name
verify-client-cert none
启动open***
chown -R root:open*** /etc/open***
systemctl enable open***-server@srv.service
systemctl start open***-server@srv.service
添加MASQUERADE
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o ens192 -j MASQUERADE
配置open***客户端
客户端配置模板
vim /etc/open***/templates/o***.template
# 配置为客户端模式
client
# 与服务器端保持一致
proto tcp
# 与服务器端保持一致
dev tun
# 配置服务器端的地址和端口
remote 192.168.5.111 443
resolv-retry infinite
nobind
persist-key
persist-tun
comp-lzo
nice 0
verb 3
mute 10
# 禁用Open***自定义缓冲区大小,由操作系统控制
sndbuf 0
rcvbuf 0
# 禁止在内存中缓存password
auth-nocache
# 密码认证
客户端推送配置模板
vim /etc/open***/templates/ipconfig_push.template
# 给客户端推送固定的IP地址
ifconfig-push 10.8.0.IP1 10.8.0.IP2
# 给客户端推送路由
iroute 192.168.5.0 255.255.255.0
# 为客户端开启压缩
comp-lzo yes
# 推送客户端配置
push "comp-lzo yes"
用户管理脚本
vim /usr/local/bin/o***_mgmt.sh
chmod +x /usr/local/bin/o***_mgmt.sh
#!/bin/bash
# 定义环境变量
EASY_RSA_DIR="/etc/open***/easy-rsa"
CLIENT_CONFIG_DIR="/etc/open***/client/config"
PKI_DIR="${EASY_RSA_DIR}/pki"
TEMPLATES_DIR="/etc/open***/templates"
CLIENT_USER_DIR="/etc/open***/client/user"
CLIENT_DIR="/etc/open***/client"
PASSFILE="/etc/open***/psw.file"
LOG_FILE="/var/log/open***/open***-psw.log"
TIMES_FILE="/etc/open***/times.file"
TIME_STAMP=`date "+%Y-%m-%d %T"`
# 创建o***配置
generate_o***() {
USER_O***="${CLIENT_USER_DIR}/${EXPIRED}-${USER}.o***"
# 根据证书生成对应的o***文件
mkdir -p ${CLIENT_USER_DIR}/
cp -f ${TEMPLATES_DIR}/o***.template ${USER_O***}
echo "<ca>" >> ${USER_O***}
cat ${PKI_DIR}/ca.crt >> ${USER_O***}
echo "</ca>" >> ${USER_O***}
echo "<cert>" >> ${USER_O***}
cat ${PKI_DIR}/issued/${USER}.crt >> ${USER_O***}
echo "</cert>" >> ${USER_O***}
echo "<key>" >> ${USER_O***}
cat ${PKI_DIR}/private/${USER}.key >> ${USER_O***}
echo "</key>" >> ${USER_O***}
echo "<tls-auth>" >> ${USER_O***}
cat /etc/open***/pki/ta.key >> ${USER_O***}
echo "</tls-auth>" >> ${USER_O***}
sz --binary ${USER_O***}
}
# 创建o***配置
generate_common_o***() {
GM_O***="${CLIENT_DIR}/client.o***"
# 根据证书生成对应的o***文件
mkdir -p ${CLIENT_DIR}/
cp -f ${TEMPLATES_DIR}/o***.template ${GM_O***}
echo "auth-user-pass" >> ${GM_O***}
echo "<ca>" >> ${GM_O***}
cat ${PKI_DIR}/ca.crt >> ${GM_O***}
echo "</ca>" >> ${GM_O***}
echo "<tls-auth>" >> ${GM_O***}
cat /etc/open***/pki/ta.key >> ${GM_O***}
echo "</tls-auth>" >> ${GM_O***}
sz --binary ${GM_O***}
}
# 添加客户端IP
client_ip_config() {
BASENUM=1
IPNUM1=$(expr 4 \* $TIMES)
IPNUM2=$(expr $IPNUM1 + 1)
sed -e "s,IP1,${IPNUM1},g" \
${TEMPLATES_DIR}/ipconfig_push.template \
> ${CLIENT_CONFIG_DIR}/${USER}
sed -i "s,IP2,${IPNUM2},g" ${CLIENT_CONFIG_DIR}/${USER}
}
# 判断用户IP是否被占用
times_is_exist() {
STAT=$(cat $TIMES_FILE | grep -E "\ ${TIMES}$")
if [ -n "$STAT" ];then
echo "TIMES已经被使用, 请使用其他TIMES"
exit 1
else
echo "$USER $TIMES" >> $TIMES_FILE
fi
}
# 生成客户端证书
add_cert() {
# 切换到easy-rsa目录
cd ${EASY_RSA_DIR}
${EASY_RSA_DIR}/easyrsa build-client-full ${USER} nopass
}
# 注销客户端证书
revoke_cert() {
# 切换到easy-rsa目录
cd ${EASY_RSA_DIR}
echo "yes" | ${EASY_RSA_DIR}/easyrsa revoke ${USER}
${EASY_RSA_DIR}/easyrsa gen-crl
}
# 更新客户端证书
renew_cert() {
# 切换到easy-rsa目录
cd ${EASY_RSA_DIR}
echo "yes" | ${EASY_RSA_DIR}/easyrsa renew ${USER} nopass
}
# 检查证书过期时间
check_cert_expired() {
export EXPIRED=$(date --date="$(openssl x509 -enddate -noout -in ${PKI_DIR}/issued/${USER}.crt |cut -d= -f 2)" --iso-8601)
}
# 创建用户
add_user() {
if [[ -e "${EASY_RSA_DIR}/pki/reqs/${USER}.req" ]];then
read -p"此用户已经申请证书,是否重新生成?[y/n]:" ANSWER
case ${ANSWER} in
y|Y)
revoke_cert
check_cert_expired
client_ip_config
add_cert
generate_o***
exit 0
;;
n|N)
check_cert_expired
client_ip_config
generate_o***
;;
esac
else
add_cert
check_cert_expired
client_ip_config
generate_o***
fi
}
# 删除用户
del_user() {
revoke_cert
rm -rf ${CLIENT_USER_DIR}/*${USER}.o***
rm -rf ${CLIENT_CONFIG_DIR}/${USER}
}
# 用户旧证过期重新生成证书
renew_user() {
if [[ -e "${EASY_RSA_DIR}/pki/reqs/${USER}.req" ]];then
renew_cert
check_cert_expired
generate_o***
else
echo "用户证书不存在!"
exit 1
fi
}
# 删除用户账号
del_user_psw() {
sed -i "/${USER}/d" ${PASSFILE}
sed -i "/${USER}/d" ${TIMES_FILE}
rm -f ${CLIENT_CONFIG_DIR}/${USER}
}
# 添加用户账号密码
add_user_psw() {
times_is_exist
STAT=$(cat ${PASSFILE}|grep ${USER})
if [[ -z "${STAT}" ]];then
echo "${USER} ${PASSWORD}" >> ${PASSFILE}
else
sed -i "s/${USER}.*/${USER}\ ${PASSWORD}/g" ${PASSFILE}
fi
client_ip_config
}
main() {
# 切换到easy-rsa目录
cd ${EASY_RSA_DIR}
# 根据传入的method运行对应函数
${METHOD}
}
# 获取参数
while getopts 'm:u:i:p:t:r' OPT;do
case $OPT in
u)
USER="$OPTARG"
echo "USER=${USER}"
;;
i)
IPADDRESS="$OPTARG"
echo "IPADDRESS=${IPADDRESS}"
;;
m)
METHOD="$OPTARG"
echo "METHOD=${METHOD}"
;;
p)
PASSWORD="$OPTARG"
echo "PASSWORD=${PASSWORD}"
;;
t)
TIMES="$OPTARG"
echo "TIMES=${TIMES}"
;;
?)
echo "Usage: $(base \"$0\") -m [add_user|del_user|renew_user] -u USER -i IPADDRESS"
exit 0
;;
esac
done
main
使用方法
# 参数解释
-u user
-p password
-i ipaddress
-m method
-t times
# 生成client.o***
/usr/local/bin/o***_mgmt.sh -m generate_common_o***
# 添加用户
/usr/local/bin/o***_mgmt.sh -m add_user_psw -u huwei -p zozo2019 -t 3
# 删除用户
/usr/local/bin/o***_mgmt.sh -m del_user_psw -u huwei
来源:51CTO
作者:wx5e7c8323c00c5
链接:https://blog.51cto.com/14769501/2482238