Centos7使用docke搭建openV
Background 公司目前没有VPN,有时在家办公只能通过向日葵或者TeamView来远程公司的电脑工作。最近自己搭了个openVPN服务器(使用的docker方式,方便快捷,另一种方式配置太麻烦了),具体搭建过程记录下。OpenVPN的工作原理 在Linux2.4版本以上,操作系统支持一个名为
- Background
公司目前没有V,有时在家办公只能通过向日葵或者TeamView来远程公司的电脑工作。最近自己搭了个openV服务器(使用的docker方式,方便快捷,另一种方式配置太麻烦了),具体搭建过程记录下。
- OpenV的工作原理
在Linux2.4版本以上,操作系统支持一个名为tun的设备,tun设备的驱动程序中包含两个部分,一部分是字符设备驱动,一部分是网卡驱动。网卡的驱动把从TCP/IP协议栈收到的数据包结构skb放于tun设备的读取队列,用户进程通过调用字符设备接口read获得完整的IP数据包,字符驱动read函数的功能是从设备的读取队列读取数据,将核心态的skb传递给用户;反过来字符驱动write函数给用户提供了把用户态的数据写入核心态的接口,write函数把用户数据写入核心空间并穿入TCP/IP协议栈。该设备既能以字符设备的方式被读写,作为系统的虚拟网卡,也具有和物理网卡相同的特点:能够配置IP地址和路由。对虚拟网卡的使用是OpenV实现其SSL V功能的关键。
OpenV服务器一般需要配置一个虚拟IP地址池和一个自用的静态虚拟IP地址(静态地址和地址池必须在同一个子网中),然后为每一个成功建立SSL连接的客户端动态分配一个虚拟IP地址池中未分配的地址。这样,物理网络中的客户端和OpenVPN服务器就连接成一个虚拟网络上的星型结构局域网,OpenV服务器成为每个客户端在虚拟网络上的网关。OpenV服务器同时提供对客户端虚拟网卡的路由管理。当客户端对OpenV服务器后端的应用服务器的任何访问时,数据包都会经过路由流经虚拟网卡,OpenV程序在虚拟网卡上截获数据IP报文,然后使用SSL协议将这些IP报文封装起来,再经过物理网卡发送出去。OpenVPN的服务器和客户端在虚拟网卡之上建立起一个虚拟的局域网络,这个虚拟的局域网对系统的用户来说是透明的。
OpenV的服务器和客户端支持tcp和udp两种连接方式,只需在服务端和客户端预先定义好使用的连接方式(tcp或udp)和端口号,客户端和服务端在这个连接的基础上进行SSL握手。连接过程包括SSL的握手以及虚拟网络上的管理信息,OpenV将虚拟网上的网段、地址、路由发送给客户端。连接成功后,客户端和服务端建立起SSL安全连接,客户端和服务端的数据都流入虚拟网卡做SSL的处理,再在tcp或udp的连接上从物理网卡发送出去
配置阿里yum源及docker镜像加速
- 依赖包安装
yum install -y yum-utils device-mapper-persistent-data lvm2 bash-completion
- 添加软件仓库源信息
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
- 更新仓库源缓存并安装最新稳定的docker-ce版本
yum makecache all
安装docker并启动
yum -y install docker-ce docker-ce-selinux
systemctl start docker
systemctl enable docker
- 镜像加速与日志驱动配置
tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://yeuphhaz.mirror.aliyuncs.com"]
}
EOF
- 更改默认端口2375为2377,原先的注掉
vi /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2377 -H fd:// --containerd=/run/containerd/containerd.sock
- 重启docker服务
systemctl daemon-reload
systemctl restart docker
使用portainer可视化管理docker Swarm 集群
- 下载portainer镜像
mkdir -p /docker/portainer_data
cd /docker
docker volume create portainer_data
docker pull portainer/portainer:1.21.0
- 启动portainer
docker run -d -p 9000:9000 --name portainer-wlf --restart always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer:1.21.0
- 初始化Swarm,
192.168.8.130
为本机IP
docker swarm init --advertise-addr 192.168.8.130
命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值。
- 浏览器访问 9000端口访问Web界面
首先要设置登录密码,至少8位,登录进去看到下面的界面
- Swarm 集群添加节点(搭建docker集群时才需要使用)
在其他机器上(被添加节点上)执行以下命令,以下代码要与初始化时生成的token完全一致,当不清楚该命令时,可在部署的管理机上通过
docker swarm join-token worker
命令来查看。
docker swarm join --token SWMTKN-1-2k5odts5j9ackj013kq03qo9p3cps98b9w28p2rztohjvkkj1c-ar8a1tkq4niopb1o6ophc152a 192.168.8.130:2377
- 可以在Endpoints中新增Docker节点
拉取openv镜像
docker pull kylemanna/openvpn:2.4
创建一个目录
mkdir -p /data/openvpn
生成配置文件
39.104.162.245这个ip是我当前服务器的公网IP,也就是openV服务器的IP。
docker run -v /data/openvpn:/etc/openvpn --rm kylemanna/openvpn:2.4 ovpn_genconfig -u udp://39.104.162.245
生成密钥文件
docker run -v /data/openvpn:/etc/openvpn --rm -it kylemanna/openvpn:2.4 ovpn_initpki
输入私钥密码(输入时是看不见的):
Enter PEM pass phrase:12345678
再输入一遍
Verifying - Enter PEM pass phrase:12345678
输入一个CA名称(我这里直接回车)
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:
输入刚才设置的私钥密码(输入完成后会再让输入一次)
Enter pass phrase for /etc/openvpn/pki/private/ca.key:12345678
生成客户端证书(这里的whsir改成你想要的名字)
docker run -v /data/openvpn:/etc/openvpn --rm -it kylemanna/openvpn:2.4 easyrsa build-client-full whsir nopass
导出客户端配置
mkdir -p /data/openvpn/conf
docker run -v /data/openvpn:/etc/openvpn --rm kylemanna/openvpn:2.4 ovpn_getclient whsir > /data/openvpn/conf/whsir.ovpn
生成的
whsir.ovpn
就是我们后面客户端要用到的,需要放到客户端的config
目录下。
启动OpenV服务
docker run --name openvpn-wlf -v /data/openvpn:/etc/openvpn -d -p 1194:1194/udp --cap-add=NET_ADMIN kylemanna/openvpn:2.4
PS:
停止 openvpn
docker stop openvpn
启动 openvpn
docker start openvpn
保存防火墙规则
iptables-save > /etc/sysconfig/iptables
设置防火墙
- 关闭
firewalld
防火墙,关闭开机自启
systemctl stop firewalld.service
systemctl disable firewalld.service
- 安装
iptables
,并设置开机自启
yum -y install iptables-services net-tools
systemctl enable iptables.service
- 编辑防火墙配置
vi /etc/sysconfig/iptables
- 在
filter
最后COMMIT前添加以下规则
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
- 下面是一个完整的示例(这里只是个示例,根据自身情况对防火墙进行调整)
*nat
:PREROUTING ACCEPT [0:0]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [3:228]
:POSTROUTING ACCEPT [3:228]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
-A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p udp -m udp --dport 1194 -j MASQUERADE
-A DOCKER -i docker0 -j RETURN
-A DOCKER ! -i docker0 -p udp -m udp --dport 1194 -j DNAT --to-destination 172.17.0.2:1194
COMMIT
*filter
:INPUT ACCEPT [60:4900]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [50:4784]
:DOCKER - [0:0]
:DOCKER-ISOLATION - [0:0]
-A FORWARD -j DOCKER-ISOLATION
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p udp -m udp --dport 1194 -j ACCEPT
-A DOCKER-ISOLATION -j RETURN
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
重启防火墙
systemctl restart iptables
将登录的证书下载到本地
yum install lrzsz -y
sz /data/openvpn/conf/whsir.ovpn
openV windows客户端配置
- openvpn客户端下载:http://down.whsir.com/downloads/openvpn-install-2.4.4-I601.exe
- 配置openV
在openv的安装目录下,有个config目录,将服务器上的whsir.ovpn,放在该目录下,运行OpenV GUI,右键whsir连接connect
- 最后验证,打开百度输入ip
修改客户端配置
最后一行改成如下图所示。
#redirect-gateway def1
comp-lzo no
另附客户端下载链接
其他版本有没有问题我不知道,这里我给个没问题的。
客户端下载地址,提取码:king
另附服务端配置文件样例
# 指定客户端分配的ip范围
server 110.110.110.0 255.255.255.0
verb 3
key /etc/openvpn/pki/private/youropenvserverip.key
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/youropenvserverip.crt
dh /etc/openvpn/pki/dh.pem
tls-auth /etc/openvpn/pki/ta.key
key-direction 0
keepalive 10 60
persist-key
persist-tun
proto udp
# Rely on Docker to do port mapping, internally always 1194
port 1194
dev tun0
status /tmp/openvpn-status.log
user nobody
group nogroup
comp-lzo no
# 允许客户端之间通信
client-to-client
### Route Configurations Below
route 110.110.110.0 255.255.255.0
### Push Configurations Below
push "block-outside-dns"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 8.8.4.4"
push "comp-lzo no"
另附用户操作脚本 ovpn-user-operate.sh
#!/bin/bash
:<<!
【脚本说明】
1、此脚本适用操作openvpn用户;
2、支持用户创建、删除;
!
# openvpn配置目录
cfdir=/data/.openvpn
# openvpn 服务名
ovname=openvpn-wlf
# 设置的私钥密码
spwd=12345678
# 提示信息,需手动复制私钥密码
msg="Pass phrase: $spwd"
# 服务基本信息
operate=$1
username=$2
# 提示信息
msg="Please input the param 【<new|del> <username>】"
# 定制化shell输出
function custom_print(){
echo -e "\033[5;34m ***** \033[0m"
echo -e "\033[32m $@ ! \033[0m"
echo -e "\033[5;34m ***** \033[0m"
}
# 判断输入参数
if [[ -z $operate || -z $username ]]; then
custom_print $msg
# 启动服务
elif [[ $operate = "new" || $operate = "create" ]]; then
custom_print $msg
docker run -v $cfdir:/etc/openvpn --rm -it kylemanna/openvpn:2.4 easyrsa build-client-full $username nopass
docker run -v $cfdir:/etc/openvpn --rm kylemanna/openvpn:2.4 ovpn_getclient $username > $cfdir/conf/"$username".ovpn
sed -i '$s/.*/comp-lzo no/' $cfdir/conf/"$username".ovpn
docker restart $ovname > /dev/null
msg="Create user 【$username】 success"
custom_print $msg
msg="The user conf is 【$cfdir/conf/"$username".ovpn】"
custom_print $msg
# 停止服务
elif [[ $operate = "del" || $operate = "delete" ]]; then
custom_print $msg
docker run -v $cfdir:/etc/openvpn --rm -it kylemanna/openvpn:2.4 easyrsa revoke $username
docker run -v $cfdir:/etc/openvpn --rm -it kylemanna/openvpn:2.4 easyrsa gen-crl
docker run -v $cfdir:/etc/openvpn --rm -it kylemanna/openvpn:2.4 rm -f /etc/openvpn/pki/reqs/"$username".req
docker run -v $cfdir:/etc/openvpn --rm -it kylemanna/openvpn:2.4 rm -f /etc/openvpn/pki/private/"$username".key
docker run -v $cfdir:/etc/openvpn --rm -it kylemanna/openvpn:2.4 rm -f /etc/openvpn/pki/issued/"$username".crt
rm -rf $cfdir/conf/"$username".ovpn
docker restart $ovname > /dev/null
msg="Delete user 【$username】 success"
custom_print $msg
else
custom_print $msg
fi
另附配置文件说明
- 服务端配置文件
#################################################
# 多客户端服务器的OpenVPN 2.0配置文件示例 #
# #
# 本文件用于多客户端<->单服务器端的 #
# OpenVPN服务器端配置 #
# #
# OpenVPN也支持单机<->单机的配置 #
# (在网站上的示例页面更多信息) #
# #
# 这个配置可以在Windows或Linux/BSD系统上工作。 #
# Windows的路径名需要加双引号并使用双反斜杠,如: #
# "C:\\Program Files\\OpenVPN\\config\\foo.key" #
# #
# 前面加'#'或';'的是注释 #
#################################################
# OpenVPN应该监听哪个本地IP地址(可选)
# 如果不设置,默认监听所有IP
;local a.b.c.d
# OpenVPN应该监听哪个端口(TCP/UDP)
# 如果想在同一台计算机上运行多个OpenVPN实例,可以使用不同的端口号来区分它们
# 在防火墙上打开这个端口
port 1194
# 服务器使用TCP还是UDP协议
;proto tcp
proto udp
# 指定OpenVPN创建的通信隧道类型
# "dev tun"将会创建一个路由IP隧道
# "dev tap"将会创建一个以太网隧道
# 如果是以太网桥接模式,并且提前创建了一个名为"tap0"的与以太网接口进行桥接的虚拟接口,则你可以使用"dev tap0"
# 如果想控制VPN的访问策略,必须为TUN/TAP接口创建防火墙规则
# 在非Windows系统中,可以给出明确的单位编号,如"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 dh2048.pem 2048
dh dh2048.pem
# 网络拓扑结构
# 应该为子网(通过IP寻址)
# 除非必须支持Windows客户端v2.0.9及更低版本(net30即每个客户端/30)
# 默认为"net30"(不建议)
;topology subnet
# 设置服务器端模式,并提供一个VPN子网,以从中为客户端分配IP地址
# 本例中服务器端自身占用10.8.0.1,其他的将分配给客户端使用
# 每个客户端将能够通过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客户端(如Windows),并且该客户端的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子目录
# 请参阅手册页获取更多信息
# 示例1:假设有个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"指令
# 示例1:假设要给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 # 该文件应该保密
# 选择一个密码加密算法,该配置项也必须复制到每个客户端配置文件中
# 注意,v2.4客户端/服务器将自动以TLS模式协商AES-256-GCM,请参阅手册中的ncp-cipher选项
cipher AES-256-CBC
# 在VPN链接上启用压缩并将选项推送到客户端(仅适用于v2.4 +,对于早期版本,请参阅下文)
;compress lz4-v2
;push "compress lz4-v2"
# 对于与旧客户端兼容的压缩,使用comp-lzo
# 如果在此启用,还必须在客户端配置文件中启用它
;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
# 通知客户端,当服务器重新启动时,可以自动重新连接
# 只能是UDP协议使用,TCP使用的话不能启动服务
explicit-exit-notify 1
# (如果不添加该指令则)默认值3600,也就是一个小时进行一次TSL重新协商
# 这个参数在服务端和客户端设置都有效
# 如果两边都设置了,就按照时间短的设定优先
# 当两边同时设置成0,表示禁用TSL重协商。使用OTP认证需要禁用
reneg-sec 0
- 客户端配置文件
##############################################
# 多客户端的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
# 通过检查证书具有正确的密钥使用设置来验证服务器证书
# 这是防止此处讨论的潜在攻击的重要预防措施:
# http://openvpn.net/howto.html#mitm
#
# 要使用此功能,EasyRSA生成服务器证书的时候进行相关设置
remote-cert-tls server
# 如果在服务器上使用tls-auth密钥,那么每个客户端也必须拥有密钥
tls-auth ta.key 1
# 选择一个加密算法,服务器使用的算法选项,也必须在这里指定它
# 注意,v2.4客户端/服务器将自动以TLS模式协商AES-256-GCM。
# 另请参阅手册中的ncp-cipher选项
cipher AES-256-CBC
# 在VPN连接中启用压缩
# 除非在服务器配置文件中启用,否则不要启用它
;comp-lzo
# 设置日志文件冗余级别(0~9)
# 0 表示静默运行,只记录致命错误
# 4 表示合理的常规用法
# 5和6 可以帮助调试连接错误
# 9 表示极度冗余,输出非常详细的日志信息
verb 3
# 忽略过多的重复信息
# 相同类别的信息只有前20条会输出到日志文件中
;mute 20
# (如果不添加该指令则)默认值3600,也就是一个小时进行一次TSL重新协商
# 这个参数在服务端和客户端设置都有效
# 如果两边都设置了,就按照时间短的设定优先
# 当两边同时设置成0,表示禁用TSL重协商。使用OTP认证需要禁用
reneg-sec 0
- 客户端路由配置
# 当客户端加入这个参数后,openvpn 连接后不会添加路由,也就是不会有任何网络请求走 openvpn
route-nopull
# 当客户端加入 route-nopull 后,所有出去的访问都不从 Openvpn 出去,但可通过添加 vpn_gateway 参数使部分IP访问走 Openvpn 出去
route 192.168.1.0 255.255.0.0 vpn_gateway
# 这个参数和 vpn_gateway 相反,表示在默认出去的访问全部走 Openvpn 时,强行指定部分IP访问不通过 Openvpn 出去. max-routes 参数表示可以添加路由的条数,默认只允许添加100条路由,如果少于100条路由可不加这个参数
# 比较常用做法是在客户端配置文件中加上 route-nopull 再使用 vpn-gateway 逐条添加需要走 Openvpn 的 ip
# block-outside-dns
route-nopull
#以下路由根据自己实际情况进行添加调整
route 172.16.0.0 255.255.0.0 vpn_gateway
route 172.17.0.0 255.255.0.0 vpn_gateway
更多推荐
所有评论(0)