Open Private Network安装和配置

本文详细记录了在CentOS6系统上安装和配置OpenVPN的过程,包括服务器端和客户端证书的生成,OpenVPN服务的配置,以及防火墙规则和系统设置。同时,文章还涉及了密码和证书双认证、端口转发、DNS设置、客户端配置及问题解决策略,如SELinux端口添加、内网域名解析和账号控制等。

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 参考

参考顺序不分先后,时间太久,有些可能已无法访问

  1. OpenVPN客户端设置方法
  2. centos7.4通过easy-rsa3搭建open Virtual Private Network
  3. easy-rsa-3.0 在 openvpn 下的配置
  4. OpenVPN的DNS设置
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值