测试环境描述
- 模拟外网: 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
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 openvpn-server@.service.service
,服务将读取 /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
- 关闭请使用
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/
- 创建配置文件, 名字随意,本例使用 client
- 客户端启动的命令为
systemctl start openvpn-client@.service
,原理和上面服务器的差不多。为了方便管理,我们可以创建任意名文件,然后复制份配置就行,比如本例创建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 保存退出
启动与关闭
- 启动时会要求输入用户名和密码,输入刚刚服务器搭建时设置的测试号 (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