文档章节

CentOS配置openvpn服务器 账号密码验证 固定IP地址

stache
 stache
发布于 2017/08/18 11:06
字数 7281
阅读 599
收藏 1

导读:本篇博客包括如下内容,按顺序方式书写

  1. openvpn server端和client端的安装和配置
  2. 配置防火墙及路由转发
  3. 采用账号密码方式验证,并给每个账号分配固定的IP地址
  4. server端配置文件详解
  5. client端配置文件详解
  6. 报错及解决方法

 

一、安装和配置

1、YUM安装

#关闭selinux
vi /etc/selinux/config
将SELINUX=enforcing修改为SELINUX=disabled

setenforce 0

#因为centos默认的源没有openvpn的包,所以先增加epel源
yum -y install epel-release

#yum安装
yum install -y gcc openssl-devel lzo-devel pam-devel easy-rsa openvpn

2、生成各种证书

安装OpenVPN完毕后,接下来就应该配置OpenVPN,生成服务器和客户端所需的各种证书

#使用easy-rsa生成Server端CA证书,步骤如下
cd /usr/share/easy-rsa/2.0/

#vars文件存储的是一些用户变量设置信息,每次生成证书都会使用到其中的某些变量
#我们可以提前编辑该文件,根据你的情况设置好这些信息

vi vars
export KEY_SIZE=2048 #表示密钥的长度,一般为1024或2048,长度越长,性能耗费越多
export KEY_COUNTRY="CN" #所在国家
export KEY_PROVINCE="JiangXi" #所在省
export KEY_CITY="NanChang" #所在城市
export KEY_ORG="test" #所在组织
export KEY_EMAIL="test@mail.com" #邮箱地址
export KEY_OU="test" #机构单位或部门名称

#初始化命令,用于设置后续命令所需的相关变量信息
./vars

#清除之前创建的所有证书和密钥
./clean-all

#生成CA证书和密钥,输入如下命令后一直按回车即可
./build-ca

#注意:证书的用户信息可以根据需要自行输入。如果不输入直接回车,则表示该字段使用"[]"中的默认值
#也就是前面vars文件中设置的参数值;如果输入".",则表示该字段留空。
#在这里需要注意Common Name字段相当于证书的"用户名",请确保每个证书的Common Name字段是唯一的

#生成Server端所需的证书和密钥,与创建CA证书一样,一直按回车并在最后输入两次"y"确认生成即可
./build-key-server server

#生成客户端证书和密钥
#这一步是可选的,如果你打算用账号密码来做验证则跳过此步骤
#我们可以使用命令./build-key clientName来生成客户端证书和密钥,其中clientName为自定义的客户端名称
#例如:client1、client2、jim、tom如果需要为多个客户端生成证书,只需要分别执行多次即可
./build-key client1 #生成client1客户端的证书
./build-key client2 #生成client2客户端的证书

#注意:如果你以后想要再次生成新的客户端证书密钥或者执行其他操作,
#只需要先执行命令 ./vars 然后执行相应的命令即可,例如:新增一个client3客户端
./vars
./build-key client3

#生成迪菲·赫尔曼交换密钥,命令为./build-dh 
#无需额外输入,耐心等待生成完毕即可,迪菲·赫尔曼交换密钥是一种安全协议,用以对数据进行加密
./build-dh

#生成TLS-auth密钥
#这一步骤是可选操作,OpenVPN提供了TLS-auth功能,可以用来抵御Dos、UDP端口淹没攻击,出于安全考虑,你可以启用该功能
#启用该功能你需要执行命令openvpn --genkey --secret keys/ta.key来生成TLS-auth所需的密钥文件
openvpn --genkey --secret keys/ta.key

#最后,我们来看看我们一共生成了哪些证书和密钥
1、CA证书和密钥
2、Server端的证书和密钥
3、客户端client1的证书和密钥,
4、迪菲·赫尔曼交换密钥 (如果你的KEY_SIZE=1024,则该文件名称为dh1024.pem)
5、启用tls-auth所需的文件ta.key

3、编写Server端的配置文件

众所周知,OpenVPN虽然可以分为客户端和服务器,不过它们的安装程序是完全一样的,只是通过不同的证书和配置文件来进行区分

#服务器端需要用到的文件有:
ca.crt
ca.key
dh2048.pem (如果最初的变量KEY_SIZE设为1024,这里就是dh1024.pem)
server.crt
server.key
ta.key (如果不开启tls-auth,则无需该文件)

#我们将上面操作生成的Server端所需文件全部拷贝到OpenVPN的配置目录
cp -a keys/{ca.crt,ca.key,dh2048.pem,server.csr,server.key} /etc/openvpn/

#拷贝一个Server端配置模板,到OpenVPN的配置目录
cp /usr/share/doc/openvpn-2.4.3/sample/sample-config-files/server.conf /etc/openvpn/

#编辑Server端配置文件
vi /etc/openvpn/server.conf
local 192.168.17.13 #指定监听的本机IP(因为有些计算机具备多个IP地址),该命令是可选的,默认监听所有IP地址
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
server 10.10.10.0 255.255.255.0
tls-auth ta.key 0
ifconfig-pool-persist ipp.txt
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 223.5.5.5"
push "dhcp-option DNS 180.76.76.76"
client-to-client
keepalive 10 120
cipher AES-256-CBC
comp-lzo
persist-key
persist-tun
status /var/log/openvpn-status.log
log /var/log/openvpn.log
verb 3

#启动
service openvpn start

#开机启动
chkconfig openvpn on

4、client端配置和使用

#客户端client1需要用到的文件有:
ca.crt
client1.crt
client1.key #名称client1根据个人设置可能有所不同
ta.key #如果不开启tls-auth,则无需该文件
/usr/share/doc/openvpn-2.4.3/sample/sample-config-files/client.conf #client端配置文件模板

#基于linux系统client端的使用
#安装方法和服务端的安装是一样的
#将client端所需文件全部复制到OpenVPN配置目录/etc/openvpn

vi /etc/openvpn/client.conf
client
dev tun
proto udp
remote 192.168.17.13 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
tls-auth ta.key 1
remote-cert-tls server
cipher AES-256-CBC
comp-lzo
verb 3

#启动client端
/usr/sbin/openvpn /etc/openvpn/client.conf

#放到后台运行
/usr/sbin/openvpn /etc/openvpn/client.conf &>/dev/null &

#开机启动
echo '/usr/sbin/openvpn /etc/openvpn/client.conf &>/dev/null &' >> /etc/rc.local

#基于Windows下client端的使用
#安装,到这个网站(http://openvpn.ustc.edu.cn/)下载对应系统的安装包安装即可

#我这里下载了,openvpn-install-2.3.10-I601-x86_64.exe 安装到了C盘
#那么配置目录就在 C:\Program Files\OpenVPN\config 这个目录下
#将所有client端所需文件复制到该目录下,然后启动客户端,点击Connect即可链接

#连接日志,当看到Initialization Sequence Completed表示连接成功
Mon Aug 21 11:40:12 2017 OpenVPN 2.3.10 x86_64-w64-mingw32 [SSL (OpenSSL)] [LZO] [PKCS11] [IPv6] built on Jan  4 2016
Mon Aug 21 11:40:12 2017 Windows version 6.1 (Windows 7)
Mon Aug 21 11:40:12 2017 library versions: OpenSSL 1.0.1q 3 Dec 2015, LZO 2.09
Mon Aug 21 11:40:12 2017 MANAGEMENT: TCP Socket listening on [AF_INET]127.0.0.1:25340
Mon Aug 21 11:40:12 2017 Need hold release from management interface, waiting...
Mon Aug 21 11:40:13 2017 MANAGEMENT: Client connected from [AF_INET]127.0.0.1:25340
Mon Aug 21 11:40:13 2017 MANAGEMENT: CMD 'state on'
Mon Aug 21 11:40:13 2017 MANAGEMENT: CMD 'log all on'
Mon Aug 21 11:40:13 2017 MANAGEMENT: CMD 'hold off'
Mon Aug 21 11:40:13 2017 MANAGEMENT: CMD 'hold release'
Mon Aug 21 11:40:13 2017 Control Channel Authentication: using 'ta.key' as a OpenVPN static key file
Mon Aug 21 11:40:13 2017 Outgoing Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Aug 21 11:40:13 2017 Incoming Control Channel Authentication: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Aug 21 11:40:13 2017 Socket Buffers: R=[8192->8192] S=[8192->8192]
Mon Aug 21 11:40:13 2017 UDPv4 link local: [undef]
Mon Aug 21 11:40:13 2017 UDPv4 link remote: [AF_INET]192.168.17.13:1194
Mon Aug 21 11:40:13 2017 MANAGEMENT: >STATE:1503286813,WAIT,,,
Mon Aug 21 11:40:13 2017 MANAGEMENT: >STATE:1503286813,AUTH,,,
Mon Aug 21 11:40:13 2017 TLS: Initial packet from [AF_INET]192.168.17.13:1194, sid=4ae22835 db609a6e
Mon Aug 21 11:40:13 2017 WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Mon Aug 21 11:40:13 2017 VERIFY OK: depth=1, C=CN, ST=JiangXi, L=NanChang, O=qingyunpu, OU=stache, CN=qingyunpu CA, name=EasyRSA, emailAddress=stache@mail.com
Mon Aug 21 11:40:13 2017 Validating certificate key usage
Mon Aug 21 11:40:13 2017 ++ Certificate has key usage  00a0, expects 00a0
Mon Aug 21 11:40:13 2017 VERIFY KU OK
Mon Aug 21 11:40:13 2017 Validating certificate extended key usage
Mon Aug 21 11:40:13 2017 ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication
Mon Aug 21 11:40:13 2017 VERIFY EKU OK
Mon Aug 21 11:40:13 2017 VERIFY OK: depth=0, C=CN, ST=JiangXi, L=NanChang, O=qingyunpu, OU=stache, CN=server, name=EasyRSA, emailAddress=stache@mail.com
Mon Aug 21 11:40:13 2017 Data Channel Encrypt: Cipher 'AES-256-CBC' initialized with 256 bit key
Mon Aug 21 11:40:13 2017 Data Channel Encrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Aug 21 11:40:13 2017 Data Channel Decrypt: Cipher 'AES-256-CBC' initialized with 256 bit key
Mon Aug 21 11:40:13 2017 Data Channel Decrypt: Using 160 bit message hash 'SHA1' for HMAC authentication
Mon Aug 21 11:40:13 2017 Control Channel: TLSv1.2, cipher TLSv1/SSLv3 ECDHE-RSA-AES256-GCM-SHA384, 2048 bit RSA
Mon Aug 21 11:40:13 2017 [server] Peer Connection Initiated with [AF_INET]192.168.17.13:1194
Mon Aug 21 11:40:14 2017 MANAGEMENT: >STATE:1503286814,GET_CONFIG,,,
Mon Aug 21 11:40:15 2017 SENT CONTROL [server]: 'PUSH_REQUEST' (status=1)
Mon Aug 21 11:40:15 2017 PUSH: Received control message: 'PUSH_REPLY,redirect-gateway local def1,dhcp-option DNS 10.10.10.1,route 10.10.10.0 255.255.255.0,topology net30,ping 10,ping-restart 120,ifconfig 10.10.10.9 10.10.10.10,peer-id 0'
Mon Aug 21 11:40:15 2017 OPTIONS IMPORT: timers and/or timeouts modified
Mon Aug 21 11:40:15 2017 OPTIONS IMPORT: --ifconfig/up options modified
Mon Aug 21 11:40:15 2017 OPTIONS IMPORT: route options modified
Mon Aug 21 11:40:15 2017 OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified
Mon Aug 21 11:40:15 2017 OPTIONS IMPORT: peer-id set
Mon Aug 21 11:40:15 2017 OPTIONS IMPORT: adjusting link_mtu to 1561
Mon Aug 21 11:40:15 2017 ROUTE_GATEWAY 192.168.17.1/255.255.255.0 I=14 HWADDR=e0:db:55:b9:73:95
Mon Aug 21 11:40:15 2017 do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0
Mon Aug 21 11:40:15 2017 MANAGEMENT: >STATE:1503286815,ASSIGN_IP,,10.10.10.9,
Mon Aug 21 11:40:15 2017 open_tun, tt->ipv6=0
Mon Aug 21 11:40:15 2017 TAP-WIN32 device [本地连接 2] opened: \\.\Global\{F8156F98-432A-4892-A5EE-F3A5FD2C6D40}.tap
Mon Aug 21 11:40:15 2017 TAP-Windows Driver Version 9.21 
Mon Aug 21 11:40:15 2017 Notified TAP-Windows driver to set a DHCP IP/netmask of 10.10.10.9/255.255.255.252 on interface {F8156F98-432A-4892-A5EE-F3A5FD2C6D40} [DHCP-serv: 10.10.10.10, lease-time: 31536000]
Mon Aug 21 11:40:15 2017 Successful ARP Flush on interface [25] {F8156F98-432A-4892-A5EE-F3A5FD2C6D40}
Mon Aug 21 11:40:20 2017 TEST ROUTES: 2/2 succeeded len=1 ret=1 a=0 u/d=up
Mon Aug 21 11:40:20 2017 C:\Windows\system32\route.exe ADD 0.0.0.0 MASK 128.0.0.0 10.10.10.10
Mon Aug 21 11:40:20 2017 ROUTE: CreateIpForwardEntry succeeded with dwForwardMetric1=20 and dwForwardType=4
Mon Aug 21 11:40:20 2017 Route addition via IPAPI succeeded [adaptive]
Mon Aug 21 11:40:20 2017 C:\Windows\system32\route.exe ADD 128.0.0.0 MASK 128.0.0.0 10.10.10.10
Mon Aug 21 11:40:20 2017 ROUTE: CreateIpForwardEntry succeeded with dwForwardMetric1=20 and dwForwardType=4
Mon Aug 21 11:40:20 2017 Route addition via IPAPI succeeded [adaptive]
Mon Aug 21 11:40:20 2017 MANAGEMENT: >STATE:1503286820,ADD_ROUTES,,,
Mon Aug 21 11:40:20 2017 C:\Windows\system32\route.exe ADD 10.10.10.0 MASK 255.255.255.0 10.10.10.10
Mon Aug 21 11:40:20 2017 ROUTE: CreateIpForwardEntry succeeded with dwForwardMetric1=20 and dwForwardType=4
Mon Aug 21 11:40:20 2017 Route addition via IPAPI succeeded [adaptive]
Mon Aug 21 11:40:20 2017 Initialization Sequence Completed
Mon Aug 21 11:40:20 2017 MANAGEMENT: >STATE:1503286820,CONNECTED,SUCCESS,10.10.10.9,192.168.17.13

 

二、配置防火墙及路由转发

vi /etc/sysctl.conf
将net.ipv4.ip_forward = 0 改为 net.ipv4.ip_forward = 1

sysctl -p

#配置IPtables规则,我们需要做的就是把所有来自10.10.10.0/24网段的请求
#全部通过openvpn服务器的eth0网卡转发出去,也就是我们平时所说的IPtables的NAT规则
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE

#放行OpenVPN端口
-A INPUT -p udp --dport 1194 -j ACCEPT

#详细IPtables规则如下所示
*nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE 
COMMIT

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 
-A INPUT -p icmp -j ACCEPT 
-A INPUT -i lo -j ACCEPT 
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT 
-A INPUT -p udp -m udp --dport 1194 -j ACCEPT 
-A INPUT -j REJECT --reject-with icmp-host-prohibited 
-A FORWARD -j REJECT --reject-with icmp-host-prohibited 
COMMIT

 

三、使用账号密码验证,并为每个账号设置固定的IP地址

OpenVPN是有三种验证方式,一是证书验证,二是证书加账号密码双重验证,三是账号密码验证,这里我采用单独的账号密码验证,如下所示

#首先我们要下载一个验证脚本
wget -o /etc/openvpn/checkpsw.sh http://openvpn.se/files/other/checkpsw.sh
chmod +x /etc/openvpn/checkpsw.sh

#创建账号密码文件,并设置账号和密码,每一行一个账号密码,账号和密码之间用空格隔开
touch /etc/openvpn/psw-file
chmod 400 /etc/openvpn/psw-file  
chown nobody.nobody /etc/openvpn/psw-file 
vi /etc/openvpn/psw-file
admin1 password1
admin2 password2

#修改Server.conf增加如下配置
client-config-dir ccd #每个账号的单独配置目录
script-security 3 #使用脚本验证账号密码时必须加此项
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env #开启账号密码验证脚本
client-cert-not-required #加上这行表示禁用客户端证书,如果不加的话表示证书和账号密码双重认证
username-as-common-name #将用户名作为Common Name

#创建用户端单独配置目录
mkdir /etc/openvpn/ccd

#为admin1账号设置固定IP地址为10.10.10.5
vi /etc/openvpn/ccd/admin1
ifconfig-push 10.10.10.5 10.10.10.6

#为admin2账号设置固定IP地址10.10.10.9
vi /etc/openvpn/ccd/admin2
ifconfig-push 10.10.10.9 10.10.10.10

#ifconfig-push中的每一对IP地址表示虚拟客户端和服务器的IP端点
#它们必须从连续的/30子网网段中获取(这里是/30表示xxx.xxx.xxx.xxx/30,即子网掩码位数为30)
#以便于与Windows客户端和TAP-Windows驱动兼容。明确地说,每个端点的IP地址对的最后8位字节必须取自下面的集合:

[  1,  2]   [  5,  6]   [  9, 10]   [ 13, 14]   [ 17, 18]
[ 21, 22]   [ 25, 26]   [ 29, 30]   [ 33, 34]   [ 37, 38]
[ 41, 42]   [ 45, 46]   [ 49, 50]   [ 53, 54]   [ 57, 58]
[ 61, 62]   [ 65, 66]   [ 69, 70]   [ 73, 74]   [ 77, 78]
[ 81, 82]   [ 85, 86]   [ 89, 90]   [ 93, 94]   [ 97, 98]
[101,102]   [105,106]   [109,110]   [113,114]   [117,118]
[121,122]   [125,126]   [129,130]   [133,134]   [137,138]
[141,142]   [145,146]   [149,150]   [153,154]   [157,158]
[161,162]   [165,166]   [169,170]   [173,174]   [177,178]
[181,182]   [185,186]   [189,190]   [193,194]   [197,198]
[201,202]   [205,206]   [209,210]   [213,214]   [217,218]
[221,222]   [225,226]   [229,230]   [233,234]   [237,238]
[241,242]   [245,246]   [249,250]   [253,254]

#client端的配置需要注释以下两条配置
#cert client01.crt
#key client01.key

#client端另外需增加如下配置
auth-user-pass #添加这行,启动连接时就会提示输入用户名和密码

#若是不想client端每次都要输入密码,则可以把密码保存到文件中,如保存到pass.txt文件中,账号和密码单独一行
auth-user-pass pass.txt

cat pass.txt
admin1
password1

#以上便是账号密码验证并固定IP地址所需要修改的配置,下面我贴出完整的配置

cat server.conf
local 192.168.17.13
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key
dh dh2048.pem
server 10.10.10.0 255.255.255.0
tls-auth ta.key 0

client-config-dir ccd
script-security 3
auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env
client-cert-not-required
username-as-common-name

push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 223.5.5.5"
client-to-client
keepalive 10 120
cipher AES-256-CBC
comp-lzo
persist-key
persist-tun
status /var/log/openvpn-status.log
log /var/log/openvpn.log
verb 3

cat client.conf
client
dev tun
proto udp
remote 192.168.17.13 1194
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
tls-auth ta.key 1
auth-user-pass pass.txt
remote-cert-tls server
cipher AES-256-CBC
comp-lzo
verb 3

 

四、server端配置详解

#################################################
# 针对多客户端的OpenVPN 2.0 的服务器端配置文件示例
#
# 本文件用于多客户端<->单服务器端的OpenVPN服务器端配置
#
# OpenVPN也支持单机<->单机的配置(更多信息请查看网站上的示例页面)
#
# 该配置支持Windows或者Linux/BSD系统。此外,在Windows上,记得将路径加上双引号,
# 并且使用两个反斜杠,例如:"C:\\Program Files\\OpenVPN\\config\\foo.key"
#
# '#' or ';'开头的均为注释内容
#################################################

#OpenVPN应该监听本机的哪些IP地址?
#该命令是可选的,如果不设置,则默认监听本机的所有IP地址。
;local a.b.c.d

# OpenVPN应该监听哪个TCP/UDP端口?
# 如果你想在同一台计算机上运行多个OpenVPN实例,你可以使用不同的端口号来区分它们。
# 此外,你需要在防火墙上开放这些端口。
port 1194

#OpenVPN使用TCP还是UDP协议?
;proto tcp
proto udp

# 指定OpenVPN创建的通信隧道类型。
# "dev tun"将会创建一个路由IP隧道,
# "dev tap"将会创建一个以太网隧道。
#
# 如果你是以太网桥接模式,并且提前创建了一个名为"tap0"的与以太网接口进行桥接的虚拟接口,则你可以使用"dev tap0"
#
# 如果你想控制VPN的访问策略,你必须为TUN/TAP接口创建防火墙规则。
#
# 在非Windows系统中,你可以给出明确的单位编号(unit number),例如"tun0"。
# 在Windows中,你也可以使用"dev-node"。
# 在多数系统中,除非你部分禁用或者完全禁用了TUN/TAP接口的防火墙,否则VPN将不起作用。
;dev tap
dev tun

# 如果你想配置多个隧道,你需要用到网络连接面板中TAP-Win32适配器的名称(例如"MyTap")。
# 在XP SP2或更高版本的系统中,你可能需要有选择地禁用掉针对TAP适配器的防火墙
# 通常情况下,非Windows系统则不需要该指令。
;dev-node MyTap

# 设置SSL/TLS根证书(ca)、证书(cert)和私钥(key)。
# 每个客户端和服务器端都需要它们各自的证书和私钥文件。
# 服务器端和所有的客户端都将使用相同的CA证书文件。
#
# 通过easy-rsa目录下的一系列脚本可以生成所需的证书和私钥。
# 记住,服务器端和每个客户端的证书必须使用唯一的Common Name。
#
# 你也可以使用遵循X509标准的任何密钥管理系统来生成证书和私钥。
# OpenVPN 也支持使用一个PKCS #12格式的密钥文件(详情查看站点手册页面的"pkcs12"指令)
ca ca.crt
cert server.crt
key server.key  # 该文件应该保密

# 指定迪菲·赫尔曼参数。
# 你可以使用如下名称命令生成你的参数:
#   openssl dhparam -out dh1024.pem 1024
# 如果你使用的是2048位密钥,使用2048替换其中的1024。
dh dh1024.pem

# 设置服务器端模式,并提供一个VPN子网,以便于从中为客户端分配IP地址。
# 在此处的示例中,服务器端自身将占用10.8.0.1,其他的将提供客户端使用。
# 如果你使用的是以太网桥接模式,请注释掉该行。更多信息请查看官方手册页面。
server 10.8.0.0 255.255.255.0

# 指定用于记录客户端和虚拟IP地址的关联关系的文件。
# 当重启OpenVPN时,再次连接的客户端将分配到与上一次分配相同的虚拟IP地址
ifconfig-pool-persist ipp.txt

# 该指令仅针对以太网桥接模式。
# 首先,你必须使用操作系统的桥接能力将以太网网卡接口和TAP接口进行桥接。
# 然后,你需要手动设置桥接接口的IP地址、子网掩码;
# 在这里,我们假设为10.8.0.4和255.255.255.0。
# 最后,我们必须指定子网的一个IP范围(例如从10.8.0.50开始,到10.8.0.100结束),以便于分配给连接的客户端。
# 如果你不是以太网桥接模式,直接注释掉这行指令即可。
;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100

# 该指令仅针对使用DHCP代理的以太网桥接模式,
# 此时客户端将请求服务器端的DHCP服务器,从而获得分配给它的IP地址和DNS服务器地址。
#
# 在此之前,你也需要先将以太网网卡接口和TAP接口进行桥接。
# 注意:该指令仅用于OpenVPN客户端,并且该客户端的TAP适配器需要绑定到一个DHCP客户端上。
;server-bridge

# 推送路由信息到客户端,以允许客户端能够连接到服务器背后的其他私有子网。
# (简而言之,就是允许客户端访问VPN服务器自身所在的其他局域网)
# 记住,这些私有子网也要将OpenVPN客户端的地址池(10.8.0.0/255.255.255.0)反馈回OpenVPN服务器。
;push "route 192.168.10.0 255.255.255.0"
;push "route 192.168.20.0 255.255.255.0"

# 为指定的客户端分配指定的IP地址,或者客户端背后也有一个私有子网想要访问VPN,
# 那么你可以针对该客户端的配置文件使用ccd子目录。
# (简而言之,就是允许客户端所在的局域网成员也能够访问VPN)

# 举个例子:假设有个Common Name为"Thelonious"的客户端背后也有一个小型子网想要连接到VPN,
# 该子网为192.168.40.128/255.255.255.248。
# 首先,你需要去掉下面两行指令的注释:
;client-config-dir ccd
;route 192.168.40.128 255.255.255.248
# 然后创建一个文件ccd/Thelonious,该文件的内容为:
#     iroute 192.168.40.128 255.255.255.248
#这样客户端所在的局域网就可以访问VPN了。
# 注意,这个指令只能在你是基于路由、而不是基于桥接的模式下才能生效。
# 比如,你使用了"dev tun"和"server"指令。

# 再举个例子:假设你想给Thelonious分配一个固定的IP地址10.9.0.1。
# 首先,你需要去掉下面两行指令的注释:
;client-config-dir ccd
;route 10.9.0.0 255.255.255.252
# 然后在文件ccd/Thelonious中添加如下指令:
#   ifconfig-push 10.9.0.1 10.9.0.2

# 如果你想要为不同群组的客户端启用不同的防火墙访问策略,你可以使用如下两种方法:
# (1)运行多个OpenVPN守护进程,每个进程对应一个群组,并为每个进程(群组)启用适当的防火墙规则。
# (2) (进阶)创建一个脚本来动态地修改响应于来自不同客户的防火墙规则。
# 关于learn-address脚本的更多信息请参考官方手册页面。
;learn-address ./script

# 如果启用该指令,所有客户端的默认网关都将重定向到VPN,这将导致诸如web浏览器、DNS查询等所有客户端流量都经过VPN。
# (为确保能正常工作,OpenVPN服务器所在计算机可能需要在TUN/TAP接口与以太网之间使用NAT或桥接技术进行连接)
;push "redirect-gateway def1 bypass-dhcp"

# 某些具体的Windows网络设置可以被推送到客户端,例如DNS或WINS服务器地址。
# 下列地址来自opendns.com提供的Public DNS 服务器。
;push "dhcp-option DNS 208.67.222.222"
;push "dhcp-option DNS 208.67.220.220"

# 去掉该指令的注释将允许不同的客户端之间相互"可见"(允许客户端之间互相访问)。
# 默认情况下,客户端只能"看见"服务器。为了确保客户端只能看见服务器,
# 你还可以在服务器端的TUN/TAP接口上设置适当的防火墙规则。
;client-to-client

# 如果多个客户端可能使用相同的证书/私钥文件或Common Name进行连接,那么你可以取消该指令的注释。
# 建议该指令仅用于测试目的。对于生产使用环境而言,每个客户端都应该拥有自己的证书和私钥。
# 如果你没有为每个客户端分别生成Common Name唯一的证书/私钥,你可以取消该行的注释(但不推荐这样做)。
;duplicate-cn

# keepalive指令将导致类似于ping命令的消息被来回发送,以便于服务器端和客户端知道对方何时被关闭。
# 每10秒钟ping一次,如果120秒内都没有收到对方的回复,则表示远程连接已经关闭。
keepalive 10 120

# 出于SSL/TLS之外更多的安全考虑,创建一个"HMAC 防火墙"可以帮助抵御DoS攻击和UDP端口淹没攻击。
# 你可以使用以下命令来生成:
#   openvpn --genkey --secret ta.key
#
# 服务器和每个客户端都需要拥有该密钥的一个拷贝。
# 第二个参数在服务器端应该为'0',在客户端应该为'1'。
;tls-auth ta.key 0 # 该文件应该保密

# 选择一个密码加密算法。
# 该配置项也必须复制到每个客户端配置文件中。
;cipher BF-CBC        # Blowfish (默认)
;cipher AES-128-CBC   # AES
;cipher DES-EDE3-CBC  # Triple-DES

# 在VPN连接上启用压缩。
# 如果你在此处启用了该指令,那么也应该在每个客户端配置文件中启用它。
comp-lzo

# 允许并发连接的客户端的最大数量
;max-clients 100

# 在完成初始化工作之后,降低OpenVPN守护进程的权限是个不错的主意。
# 该指令仅限于非Windows系统中使用。
;user nobody
;group nobody

# 持久化选项可以尽量避免访问那些在重启之后由于用户权限降低而无法访问的某些资源。
persist-key
persist-tun

# 输出一个简短的状态文件,用于显示当前的连接状态,该文件每分钟都会清空并重写一次。
status openvpn-status.log

# 默认情况下,日志消息将写入syslog(在Windows系统中,如果以服务方式运行,日志消息将写入OpenVPN安装目录的log文件夹中)。
# 你可以使用log或者log-append来改变这种默认情况。
# "log"方式在每次启动时都会清空之前的日志文件。
# "log-append"这是在之前的日志内容后进行追加。
# 你可以使用两种方式之一(但不要同时使用)。
;log         openvpn.log
;log-append  openvpn.log

# 为日志文件设置适当的冗余级别(0~9)。冗余级别越高,输出的信息越详细。
#
# 0 表示静默运行,只记录致命错误。
# 4 表示合理的常规用法。
# 5 和 6 可以帮助调试连接错误。
# 9 表示极度冗余,输出非常详细的日志信息。
verb 3

# 重复信息的沉默度。
# 相同类别的信息只有前20条会输出到日志文件中。
;mute 20

client-config-dir ccd #每个账号的单独配置目录

script-security 3 #使用脚本验证账号密码时必须加此项

auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env #开启账号密码验证脚本

client-cert-not-required #加上这行表示禁用客户端证书,如果不加的话表示证书和账号密码双重认证

username-as-common-name #将用户名作为Common Name

 

五、client端配置详解

##############################################
# 针对多个客户端的OpenVPN 2.0 的客户端配置文件示例
#
# 该配置文件可以被多个客户端使用,当然每个客户端都应该有自己的证书和密钥文件
#
# 在Windows上此配置文件的后缀应该是".ovpn",在Linux/BSD系统中则是".conf"
##############################################

# 指定这是一个客户端,我们将从服务器获取某些配置文件指令
client

# 在大多数系统中,除非你部分禁用或者完全禁用了TUN/TAP接口的防火墙,否则VPN将不起作用。
;dev tap
dev tun

# 在Windows系统中,如果你想配置多个隧道,则需要该指令。
# 你需要用到网络连接面板中TAP-Win32适配器的名称(例如"MyTap")。
# 在XP SP2或更高版本的系统中,你可能需要禁用掉针对TAP适配器的防火墙。
;dev-node MyTap

# 指定连接的服务器是采用TCP还是UDP协议。
# 这里需要使用与服务器端相同的设置。
;proto tcp
proto udp

# 指定服务器的主机名(或IP)以及端口号。
# 如果有多个VPN服务器,为了实现负载均衡,你可以设置多个remote指令。
remote my-server-1 1194
;remote my-server-2 1194

# 如果指定了多个remote指令,启用该指令将随机连接其中的一台服务器,
# 否则,客户端将按照指定的先后顺序依次尝试连接服务器。
;remote-random

# 启用该指令,与服务器连接中断后将自动重新连接,这在网络不稳定的情况下(例如:笔记本电脑无线网络)非常有用。
resolv-retry infinite

# 大多数客户端不需要绑定本机特定的端口号
nobind

# 在初始化完毕后,降低OpenVPN的权限(该指令仅限于非Windows系统中使用)
;user nobody
;group nobody

# 持久化选项可以尽量避免访问在重启时由于用户权限降低而无法访问的某些资源。
persist-key
persist-tun

# 如果你是通过HTTP代理方式来连接到实际的VPN服务器,请在此处指定代理服务器的主机名(或IP)和端口号。
# 如果你的代理服务器需要身份认证,请参考官方手册页面。
;http-proxy-retry # 连接失败时自动重试
;http-proxy [proxy server] [proxy port #]

# 无线网络通常会产生大量的重复数据包。设置此标识将忽略掉重复数据包的警告信息。
;mute-replay-warnings

# SSL/TLS 参数配置。
# 更多描述信息请参考服务器端配置文件。
# 最好为每个客户端单独分配.crt/.key文件对。
# 单个CA证书可以供所有客户端使用。
ca ca.crt
cert client.crt
key client.key

# 指定通过检查证书的nsCertType字段是否为"server"来验证服务器端证书。
# 这是预防潜在攻击的一种重要措施。
#
# 为了使用该功能,你需要在生成服务器端证书时,将其中的nsCertType字段设为"server"
# easy-rsa文件夹中的build-key-server脚本文件可以达到该目的。
ns-cert-type server

# 如果服务器端使用了tls-auth密钥,那么每个客户端也都应该有该密钥。
;tls-auth ta.key 1

# 指定密码的加密算法。
# 如果服务器端启用了cipher指令选项,那么你必须也在这里指定它。
;cipher x

# 在VPN连接中启用压缩。
# 该指令的启用/禁用应该与服务器端保持一致。
comp-lzo

# 设置日志文件冗余级别(0~9)。
# 0 表示静默运行,只记录致命错误。
# 4 表示合理的常规用法。
# 5 和 6 可以帮助调试连接错误。
# 9 表示极度冗余,输出非常详细的日志信息。
verb 3

# 忽略过多的重复信息。
# 相同类别的信息只有前20条会输出到日志文件中。
;mute 20

 

六、报错及解决方法

#待续

 

参考文档

http://www.softown.cn/post/138.html

http://ylw6006.blog.51cto.com/470441/1009004/

© 著作权归作者所有

共有 人打赏支持
上一篇: CentOS安装FreeSWITCH
下一篇: systemd使用详解
stache
粉丝 2
博文 14
码字总数 17640
作品 0
南昌
私信 提问
centos 6 yum 安装 openvpn

centos 6 yum 安装 openvpn 2012-04-10 21:31

龙上
2012/05/08
0
0
大用户量下Openvpn部署方案(一)

前段时间公司有个项目需要数以千计的客户端都连入一个vpn下,并且有一部分需要获得固定的ip地址。 思路:简单的openvpn服务器部署起来并不难,但是大量的用户,如果采用简单的证书方式,批量...

技术小胖子
2017/11/01
0
0
Linux自学笔记——模拟搭建openvpn

VPN直译就是虚拟专用通道,是提供给企业之间或者个人与公司之间安全数据传输的隧道,openvpn无疑是linux开源vpn的先锋,提供了良好的性能和友好的用户GUI。 OpenVPN是一个基于OpenSSL库的应用...

claude_liu
04/26
0
0
烂泥:ubuntu 14.04搭建OpenVPN服务器

本文由秀依林枫提供友情赞助,首发于烂泥行天下 公司分部需要连接公司内部的服务器,但是该服务器只允许公司内部的网络访问。 为了解决这个问题,打算使用VPN。对于VPN以前使用最多的是PPTP这...

烂泥行天下
2015/07/28
0
4
搭建基于证书认证登录的OpenVPN服务器

一、OpenVPN简介 OpenVPN 是一个基于 OpenSSL 库的应用层 VPN 实现。和传统 VPN 相比,它的优点是简单易用。 OpenVPN允许参与建立VPN的单点使用共享金钥,电子证书,或者用户名/密码来进行身...

技术小胖子
2017/11/02
0
0

没有更多内容

加载失败,请刷新页面

加载更多

十万个为什么之为什么大家都说dubbo

Dubbo是什么? 使用背景 dubbo为什么这么流行, 为什么大家都这么喜欢用dubbo; 通过了解分布式开发了解到, 为适应访问量暴增,业务拆分后, 子应用部署在多台服务器上,而多台服务器通过可以通过d...

尾生
37分钟前
2
0
Docker搭建代码质量检测平台-SonarQube(中文版)

Sonar是一个用于代码质量管理的开源平台,用于管理源代码的质量,可以从七个维度检测代码质量。通过插件形式,可以支持包括java,C#,C/C++,PL/SQL,Cobol,JavaScrip,Groovy等等二十几种编程语言...

Jacktanger
44分钟前
2
0
Windows / Linux / MacOS 设置代理上网的方法汇总

本文汇总了 Windows / Linux / MacOS 设置代理上网的各种方法,总结如下: 1、设置系统代理(Windows、Linux、MacOS) 2、设置代理插件(Chrome、Chromium、Firefox、Opera、QQ等浏览器) 3、...

sunboy2050
昨天
4
0
自定义 Maven 的 repositories

有时,应用中需要一些比较新的依赖,而这些依赖并没有正式发布,还是处于milestone或者是snapshot阶段,并不能从中央仓库或者镜像站上下载到。此时,就需要 自定义Maven的<repositories>。 ...

waylau
昨天
3
0
徒手写一个es6代码库

mkdir democd demonpm initnpm install -g babelnpm install -g babel-clinpm install --save-dev babel-preset-es2015-node5 在项目目录创建两个文件夹 functional-playground ......

lilugirl
昨天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部