Centos7部署open*** (tun)

为君一笑 提交于 2020-03-26 22:52:38

添加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
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!