Docker实战CentOS7下基于密码认证的OpenVPN搭建与使用

OpenVPN

测试环境描述

  • 模拟外网: 172.25.1.0/24
  • 模拟内网: 172.25.2.0/24
  • 服务端双网卡,外网为 172.25.1.2, 内网为 127.25.2.2
  • 内网一主机为 172.25.2.3
  • 客户端在外网,ip 设为 172.25.1.3

Docker搭建测试环境

  • 创建测试网络
# 创建外网
docker network create --driver bridge --subnet 172.25.1.0/24 --gateway 172.25.1.1 test_bridge_1
# 创建内网
docker network create --driver bridge --subnet 172.25.2.0/24 --gateway 172.25.2.1 test_bridge_2
  • 创建测试容器
# 创建服务端,命名为 centos7_vpn_server1,连接两个网络,外网为 172.25.1.2, 内网为 127.25.2.2
docker run -itd --privileged --name centos7_vpn_server1 --network test_bridge_1 --ip 172.25.1.2 centos:7.9.2009 /usr/sbin/init
docker network connect test_bridge_2 --ip 172.25.2.2 centos7_vpn_server1

# 创建一外网客户端,命名为 centos7_vpn_client1,ip 为 172.25.1.3
docker run -itd --privileged --name centos7_vpn_client1 --network test_bridge_1 --ip 172.25.1.3 centos:7.9.2009 /usr/sbin/init

# 创建一内网主机,命名为 centos7_252_inet1,ip 为 172.25.2.3
docker run -itd --privileged --name centos7_252_inet1 --network test_bridge_2 --ip 172.25.2.3 centos:7.9.2009 /usr/sbin/init
创建与启动容器
  • 分别用新窗口进入容器
# 进入服务端
docker exec -it centos7_vpn_server1 bash
# 进入客户端
docker exec -it centos7_vpn_client1 bash
# 进入内网主机
docker exec -it centos7_252_inet1 bash
  • 全都安装 net-tools ,然后进行 ping 测试;内网主机什么事都不用干,启动就行
yum -y install net-tools
服务端连接测试

客户端连接测试

内网主机IP地址

CentOS7下基于密码认证的OpenVPN服务端搭建与客户端的使用

服务端搭建

在本例中,服务端搭建将在 centos7_vpn_server1 中进行

服务端

安装 openvpn 与 easy-rsa

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

# 创建一个日志目录,后面我们会设置让 openvpn 直接以 root 用户运行
mkdir -p /var/log/openvpn

配置证书

  • 创建根证书与服务器证书
# copy easy-rsa 至 openvpn 目录下, easy-rsa版本(3.0.8)可以不一样,用 3.0 以上的就行
cp -r /usr/share/easy-rsa/3.0.8 /etc/openvpn/server/easy-rsa
cd /etc/openvpn/server/easy-rsa

# 初始化PKI目录
./easyrsa init-pki
# 根证书, 不设密码,(会被要求输入 Common Name,测试时随便输一个后按回车即可)
./easyrsa build-ca nopass
# 服务器证书,本例创建一个并命名为 server1,不设密码
./easyrsa build-server-full server1 nopass
# 创建Diffie-Hellman
./easyrsa gen-dh
  • 在 server 目录下生成 ta.key
cd /etc/openvpn/server
openvpn --genkey --secret ta.key
配置证书

用户管理

  • 创建目录
mkdir /etc/openvpn/server/user
  • 创建用户与密码文件, 本例定义为 users.txt, 格式为每一用户占一行,[用户名][空格或tab][密码]
touch /etc/openvpn/server/user/users.txt
# 创建一个测试用户,方便测试
echo "chongwen wen" >> /etc/openvpn/server/user/users.txt
  • 创建用户验证脚本,本例简单做下用户名密码判断,记下访问日志
touch /etc/openvpn/server/user/user_velify.sh
chmod +x /etc/openvpn/server/user/user_velify.sh
vi /etc/openvpn/server/user/user_velify.sh
#!/bin/bash

PASSFILE="/etc/openvpn/server/user/users.txt" # 用户文件
LOG_FILE="/var/log/openvpn/user_velify.log"

TIME_STAMP=`date "+%F %T"`

if [ ! -r "$PASSFILE" ]; then
    echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >>  $LOG_FILE
    exit 1
fi

CORRECT=`awk -v username="$username" -v password="$password" '$1==username && $2==password{print $0; exit}' "$PASSFILE"`

if [ -n "$CORRECT" ]; 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
:wq # vim 中保存退出
用户验证脚本

创建服务端配置文件

  • 服务端启动的命令为 systemctl start [email protected],服务将读取 /etc/openvpn/server/.service.conf 为配置文件,即与@后面的.service是对应的。为了方便管理,我们可以创建任意名文件,然后复制份配置就行,比如本例创建server1
touch /etc/openvpn/server/server1.conf
cp /usr/lib/systemd/system/openvpn-server\@.service  /usr/lib/systemd/system/openvpn-server\@server1.service
vi /etc/openvpn/server/server1.conf
port 1194
proto tcp
dev tun
#dev tap0

# 运行用户与组,直接以root用户运行
user root
group root

# 配置证书信息
ca /etc/openvpn/server/easy-rsa/pki/ca.crt
cert /etc/openvpn/server/easy-rsa/pki/issued/server1.crt
key /etc/openvpn/server/easy-rsa/pki/private/server1.key
dh /etc/openvpn/server/easy-rsa/pki/dh.pem
tls-auth /etc/openvpn/server/ta.key 0

# 配置账号密码的认证方式
script-security 3
auth-user-pass-verify "/etc/openvpn/server/user/user_velify.sh" via-env  # 认证脚本
verify-client-cert none
username-as-common-name
client-to-client
duplicate-cn

# 配置网络信息
server 10.8.0.0 255.255.255.0
#server-bridge
client-to-client
# push "dhcp-option DNS 10.24.11.250"
# push "dhcp-option DNS 114.114.114.114"
# 这里开始配置你要连接的内网,本例要开的内网为 172.25.2.0/24,可以开多个,本例只开一个
push "route 172.25.2.0 255.255.255.0"

compress lzo
cipher AES-256-CBC
keepalive 10 120
persist-key
persist-tun
verb 3

# 日志
log /var/log/openvpn/server.log
log-append /var/log/openvpn/server.log
status /var/log/openvpn/status.log
:wq # vim 保存退出
服务端配置

启动 openvpn 服务端

  • 配置防火墙
# 如果没有安装防火墙,必须安装
yum -y install firewalld
systemctl start firewalld
systemctl enable firewalld

# 允许地址伪装SNAT
firewall-cmd --permanent --add-masquerade
# 添加1194端口(上面开放什么这里就开什么,本例配置的为 port 1194)
firewall-cmd --permanent --add-port=1194/tcp
# 防火墙重新加载配置
systemctl restart firewalld
# 或 firewall-cmd --reload
  • 启动与关闭
# 启动刚刚创建的 server1 服务
systemctl start openvpn-server@server1
# 开机启动(可选)
systemctl enable openvpn-server@server1
  • 查看
systemctl status openvpn-server@server1
netstat -ntpl | grep 1194
查看OpenVPN Server 状态
  • 关闭请使用 systemctl stop openvpn-server@server1 ,本例无需关闭,为下面的客户端提供服务。

客户端使用

在本例中,客户端搭建将在 centos7_vpn_client1 中进行

服务端

安装 openvpn

yum -y install epel-release
yum -y install openvpn

配置

  • 我们可以为不同服务器创建不同文件夹,用来存放对应服务器配置文件,方便管理,本例便为 server1 创建一个文件夹
mkdir /etc/openvpn/client/server1
  • 将服务端生成的一列文件复制到客户端中,本例用docker cp命令在宿主机中操作
    • cp 服务器的/etc/openvpn/server/easy-rsa/pki/ca.crt 到 客户端的/etc/openvpn/client/server1/ca.crt 下
    • cp 服务器的/etc/openvpn/server/ta.key 到 客户端的/etc/openvpn/client/server1/ta.key 下
    docker cp centos7_vpn_server1:/etc/openvpn/server/easy-rsa/pki/ca.crt ./
    docker cp centos7_vpn_server1:/etc/openvpn/server/ta.key ./
    docker cp ./ca.crt centos7_vpn_client1:/etc/openvpn/client/server1/
    docker cp ./ta.key centos7_vpn_client1:/etc/openvpn/client/server1/
    
    复制ca文件
  • 创建配置文件, 名字随意,本例使用 client
  • 客户端启动的命令为 systemctl start [email protected],原理和上面服务器的差不多。为了方便管理,我们可以创建任意名文件,然后复制份配置就行,比如本例创建 client_for_server1.conf
touch /etc/openvpn/client/server1/client.conf
ln -sf /etc/openvpn/client/server1/client.conf /etc/openvpn/client/client_for_server1.conf
cp /usr/lib/systemd/system/openvpn-client\@.service /usr/lib/systemd/system/openvpn-client\@client_for_server1.service
vi /etc/openvpn/client/server1/client.conf
client

proto tcp
dev tun
auth-user-pass

remote 172.25.1.2 1194  # 写服务器的ip及端口,本例的服务器为 172.25.1.2

ca /etc/openvpn/client/server1/ca.crt
tls-auth /etc/openvpn/client/server1/ta.key 1

remote-cert-tls server
cipher AES-256-CBC
auth-nocache
persist-tun
persist-key
comp-lzo
verb 3
mute 10
:wq  # vim 保存退出
OpenVPN 客户端配置

启动与关闭

  • 启动时会要求输入用户名和密码,输入刚刚服务器搭建时设置的测试号 (panchongwen wen)
# 启动刚刚创建的 client_for_server1
systemctl start openvpn-client@client_for_server1
# 自己判断是否需要开机启动
# systemctl enable openvpn-client@client_for_server1
客户端启动与登录
  • 查看
systemctl status openvpn-client@client_for_server1
ps -ef | grep openvpn | grep -v grep
查看客户端状态
  • 启动成功后会网卡设置也就变了
ifconfig
查看客户端状态
  • 这时就可以 ping 通内网主机了
ping -c1 172.25.2.3 &> /dev/null && echo "yes" || echo "no"
ping 172.25.2.3
客户端连接内网
  • 关闭命令
systemctl stop openvpn-client@client_for_server1

你可能感兴趣的:(Docker实战CentOS7下基于密码认证的OpenVPN搭建与使用)