Open Private Network安装和配置
OpenVPN安装和配置
以前(20191008)的配置记录,从别的笔记搬过来,当时的系统环境应该是CentOS6,其他系统类似。
信息:
- 服务器公网ip: xxx.xxx.xxx.xxx
- 服务器端口: 1194
- 服务器内网ip: yyy.yyy.yyy.yyy
1 安装软件
使用yum安装即可(需要配置epel源)
yum -y install pam-devel lzo openvpn openssl*
# 查看版本
openvpn --version

2 配置软件
2.1 server端证书生成
使用 easy-rsa 生成证书
yum install -y easy-rsa
cd /usr/share/easy-rsa/3
cp /usr/share/doc/easy-rsa-3.0.6/vars.example .
mv vars.example vars
ls

创建空的pki
./easyrsa init-pki

创建CA证书(不要密码,懒得重新截图了)
./easyrsa build-ca nopass

创建服务端证书
./easyrsa gen-req server nopass

签约服务端证书
./easyrsa sign server server
# 这里要输入前面ca证书的密码(如果前面有设置的话)

创建 Diffie-Hellman
./easyrsa gen-dh

到这里服务端的证书就创建完了,然后创建客户端的证书。
2.2 客户端证书
新建的目录来操作
mkdir -p client
cp -r /usr/share/easy-rsa/ client/
cd /client/easy-rsa/3/
rm -rf pki
# 创建新的pki
./easyrsa init-pki

创建客户证书 名字为dyvpn(名字可以修改为自己的)
./easyrsa gen-req dyvpn # 这里设置证书密码, 客户端登录的时候使用

签约客户端证书
cd /usr/share/easy-rsa/3/
./easyrsa import-req ../client/easy-rsa/3/pki/reqs/dyvpn.req dyvpn

./easyrsa sign client dyvpn # 要输入前面ca证书的密码

2.3 整理证书
现在所有的证书都已经生成完了,下面来整理一下。
-
服务端所需要的文件(openvpn对四个文件要有读权限,644)
mkdir /etc/openvpn/certs cd /etc/openvpn/certs/ cp /usr/share/easy-rsa/3/pki/dh.pem . cp /usr/share/easy-rsa/3/pki/ca.crt . cp /usr/share/easy-rsa/3/pki/issued/server.crt . cp /usr/share/easy-rsa/3/pki/private/server.key . chown openvpn:openvpn ./*
-
客户端所需的文件
mkdir -p /etc/openvpn/client/dyvpn cd /etc/openvpn/client/dyvpn/ cp /usr/share/easy-rsa/3/pki/ca.crt . cp /usr/share/easy-rsa/3/pki/issued/dyvpn.crt . cp /usr/share/easy-rsa/client/easy-rsa/3/pki/private/dyvpn.key . chown openvpn:openvpn ./*
3 配置openvpn密码和证书双认证
vi /etc/openvpn/server.conf
local xxx.xxx.xxx.xxx # OPENVPN的服务器所在IP
port 1194
# proto udp
# 20191024 修改协议为tcp
proto tcp
dev tun
ca /etc/openvpn/certs/ca.crt
cert /etc/openvpn/certs/server.crt
key /etc/openvpn/certs/server.key
dh /etc/openvpn/certs/dh.pem
auth SHA512
topology subnet
# 当重启OpenVPN时,再次连接的客户端将分配到与上一次分配相同的虚拟IP地址
ifconfig-pool-persist /etc/openvpn/ipp.txt
# 设置服务器端模式,并提供一个VPN子网,以便于从中为客户端分配IP地址。
# 在此处的示例中,服务器端自身将占用172.26.132.1,其他的将提供客户端使用。
server 172.26.132.0 255.255.255.0
# 推送路由信息到客户端,以允许客户端能够连接到服务器背后的其他私有子网。
# (简而言之,就是允许客户端访问VPN服务器自身所在的其他局域网)
push "route 10.0.0.0 255.0.0.0"
# push "redirect-gateway def1 bypass-dhcp"
# push "dhcp-option DNS 223.5.5.5"
client-to-client #多个终端可以互相访问
keepalive 20 120
cipher AES-256-CBC
comp-lzo
user openvpn
group openvpn
duplicate-cn
tls-server
remote-cert-tls client
mode server
#status openvpn-status.log
#log-append openvpn.log
max-clients 100
script-security 3
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env
username-as-common-name
# 持久化选项可以尽量避免访问那些在重启之后由于用户权限降低而无法访问的某些资源。
persist-key
persist-tun
status openvpn-status.log
lob /var/log/openvpn.log
verb 3
创建密码验证脚本 (后期我改成了python版,对接内网认证系统)
vi /etc/openvpn/checkpsw.sh
#!/bin/sh
PASSFILE="/etc/openvpn/psw-file"
LOG_FILE="/var/log/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 +x /etc/openvpn/checkpsw.sh
touch /var/log/openvpn-password.log
chown openvpn:openvpn /var/log/openvpn-password.log
创建密码文件
echo "yanglu Yl-ju3j6" > /etc/openvpn/psw-file
chown openvpn:openvpn /etc/openvpn/psw-file
4 系统相关配置
4.1 配置防火墙
开启openvpn端口
vi /etc/sysconfig/iptables(以下仅列出修改项)
*filter
# 开启对应的tcp和udp端口
-A INPUT -m state --state NEW -m udp -p udp --dport 1194 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 1194 -j ACCEPT
# 允许转发
-A FORWARD -j ACCEPT
*nat
# 仅访问10网段时使用snat
-A POSTROUTING -d 10.0.0.0/8 -j SNAT --to-source yyy.yyy.yyy.yyy
重启防火墙
service iptables restart
4.2 配置转发功能
设置net.ipv4.ip_forward为1.
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
使配置生效
sysctl -p

4.3 启动服务
# 启动服务
service openvpn start
# 设置开机启动
chkconfig openvpn on
5 客户端配置
dyvpn.ovpn
client
dev tun
proto udp # 和服务端保持一致
remote xxx.xxx.xxx.xxx 1194 # 服务器公网ip和端口
resolv-retry infinite
nobind
auth-user-pass
auth-nocache
persist-key
persist-tun
tls-client
remote-cert-tls server
auth SHA512
cipher AES-256-CBC
comp-lzo
setenv opt block-outside-dns
key-direction 1
verb 3
ca C:\\Users\\yl\\OpenVPN\\config\\client\\ca.crt
cert C:\\Users\\yl\\OpenVPN\\config\\client\\dyvpn.crt
key C:\\Users\\yl\\OpenVPN\\config\\client\\dyvpn.key
注意修改上面ca、cert、key的位置。
随后就可使用客户端登录vpn了。
6 其他记录
6.1 sysctl -p报错error: "net.ipv4.conf.eth0.arp_notify" is an unknown key
以及error: "net.bridge.bridge-nf-call-iptables" is an unknown key等,如图

由于系统网卡为eth1和eth2,因此修改/etc/sysctl.conf中的arp_notify为对应新网卡
至于bridge那个,运行以下命令
modprobe bridge
lsmod | grep bridge
报错消失

6.2 修改端口后客户端无法正常登录
原因是新端口没有添加到selinux配置
# 安装管理工具
yum install -y policycoreutils-python
# 查看selinux允许端口
semanage port -l | grep openvpn
# 添加新端口
semanage port -a -t openvpn_port_t -p tcp 11194
semanage port -a -t openvpn_port_t -p udp 11194
6.3 连接成功后,可以ping通服务器内网ip(yyy.yyy.yyy.yyy),但是无法ping通对应网络(yyy.yyy.yyy.0/24)。
(之前vpn网络为172.16.)
原因在于,iptables没有允许转发。以为配置了nat就行了,没想到还要设置允许转发。
之前ping的回复都是“无法访问目标主机”,看了下iptables的配置,正好是reject-with icmp-host-prohibited,于是将-A FORWARD -j REJECT --reject-with icmp-host-prohibited修改为-A FORWARD -j ACCEPT
6.4 使用vpn后,可以ping通外网,但无法解析域名

【原因】服务端取消push redirect-gateway 和 push dhcp-option,客户端取消 setenv opt block-outside-dns 可以解决

6.5 内网域名解析
使能解析内网域名,从服务端配置推送dns到客户端,下面配置了3条dns,前两条是内网dns,第3条是cnnic的
vi /etc/openvpn/server.conf
push “dhcp-option DNS 10.xyz.xyz.xyy”
push “dhcp-option DNS 10.xyz.xyz.xyz”
push “dhcp-option DNS 1.2.4.8”
6.6 配置账号分级控制,为不同客户配置指定的IP
OpenVPN设置客户端固定IP 这个文章说:用户名应该为证书的CN名才对,若是想要不一样的客户端不一样的IP的方法,只能申请不一样的CN名的证书,否则没法实现。【可能我的理解没对,在使用client-config-dir 的时候 用户名是登录名,可能和配置 username-as-common-name有关系】
最终账号控制实现方式
我不想配置多个网段,平时感觉没多少人用所以计划对允许后面32个ip访问内网某些网址即可。
在server.conf 中添加以下配置
client-config-dir /etc/openvpn/client-ip-config
然后比如我要设置用户yanglu的固定ip,在上述目录中新建文件 yanglu (这种配置只支持一个ip呢, 不能重复登录)
ifconfig-push 172.26.132.224 255.255.255.0
这样使用yanglu登录时分配的ip就是224了

然后配置 iptables 仅允许后32个ip访问内网某些地址
*nat
:PREROUTING ACCEPT [16:1370]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
# 允许后32个ip访问 eip
-A POSTROUTING -s 172.26.132.224/27 -d 10.xyz.xyz.0/24 -j SNAT --to-source yyy.yyy.yyy.yyy
# 其他地址禁止访问目标网段,因为上面的两个在前面所以先匹配到会放行 这样就实现了限制224以下的ip
-A POSTROUTING -s 172.26.132.0/24 -d 10.xyz.xyz.0/24 -j SNAT --to-source 127.0.0.1
# 允许访问内网其他地址
-A POSTROUTING -s 172.26.132.0/24 -j SNAT --to-source yyy.yyy.yyy.yyy
COMMIT
7 参考
参考顺序不分先后,时间太久,有些可能已无法访问
本文详细记录了在CentOS6系统上安装和配置OpenVPN的过程,包括服务器端和客户端证书的生成,OpenVPN服务的配置,以及防火墙规则和系统设置。同时,文章还涉及了密码和证书双认证、端口转发、DNS设置、客户端配置及问题解决策略,如SELinux端口添加、内网域名解析和账号控制等。

521

被折叠的 条评论
为什么被折叠?



