一、案例1 

针对不同的客户端指定不同的等级和权限。 通常的方法是:

1、每个客户端分配不同的IP地址;

2、利用防火墙对不同的IP地址进行控制;

例如:

1、公司内部网段是10.66.4.0/24;

2、所有人允许访问Email服务器为10.66.4.4,但不能访问其他服务器;

3、特定的客户组允许访问Samba服务器为10.66.4.12,不能访问其他服务器;

4、管理员能访问所有公司内网服务器。

根据上述的要求,我们可以对OpenVPN服务端进行配置:(而不需要修改客户端配置文件)

server.conf增加:

#10.8.0.0是给所有VPN客户端的IP段;

server 10.8.0.0 255.255.255.0

#10.8.1.0是给管理员分配的IP段;

server 10.8.1.0 255.255.255.0

#10.8.2.0就是给特定用户组分配的IP段;

server 10.8.2.0 255.255.255.0

#下面是定义服务器读取特殊客户端配置文件的目录为ccd;

client-config-dir ccd

通过上面的配置,今后我们就可以对指定的客户进行特殊的定义了。配置文件应该放在ccd目录下:

ccd/sysadmin1:

ifconfig-push 10.8.1.1 10.8.1.2

ccd/contractor1:

ifconfig-push 10.8.2.1 10.8.2.2

ccd/contractor2:

ifconfig-push 10.8.2.5 10.8.2.6

注意:

1、文件名就是客户的Common Name,OpenVPN是根据该名称来获得指定客户端的;

2、客户端的IP地址不是任意指定的,由于Windows的TAP驱动必须采用/30网段的IP,为兼容该协议,应从特定的IP地址中选择,而且是成组出现的;(可参考第一份文章附录介绍)

那最后,剩下的就是用iptables防火墙做限制即可:(假设PLOICY为Deny)

iptables -A FORWARD -i tun0 -s 10.8.0.0/24 -d 10.66.4.4 -j ACCEPT

iptables -A FORWARD -i tun0 -s 10.8.1.0/24 -d 10.66.4.0/24 -j ACCEPT

iptables -A FORWARD -i tun0 -s 10.8.2.0/24 -d 10.66.4.12 -j ACCEPT

二、案例2 

让客户端内部子网可与服务端内部网互通,其实也就是实现点对点互连了。

引用

要求如下:

1、客户端的子网网段必须唯一;

2、客户端的Common Name要唯一,而且不能在服务器的配置文件中配置有duplicate-cn;

3、客户端打开IP Forward(路由转发)和允许TUN、TAP进入;

OK,那假设客户端子网为192.168.4.0,并且客户端网关和客户端OpenVPN是同一服务器,那可以这样配置:

server.conf增加:

#下面是定义服务器读取特殊客户端配置文件的目录为ccd;

client-config-dir ccd

#服务器增加到192.168.4.0/24的路由

route 192.168.4.0 255.255.255.0

#允许客户端子网互通

client-to-client

#让所有客户端都增加到192.168.4.0/24的路由

push "route 192.168.4.0 255.255.255.0"

然后,对指定的客户端建立配置文件。

mkdir /etc/openvpn/ccd

在ccd目录下建立一个与客户端Common Name相同名字的文件名,并加入:

#这是告诉服务器,我(客户端)的子网网段是192.168.4.0/24;

iroute 192.168.4.0 255.255.255.0

注意:

1、若OpenVPN Server不是服务端子网的网关,则必须在服务端子网网关加入指向192.168.4.0/24的路由;

2、若客户端的OpenVPN Client也不是客户端子网的网关,同样的,也必须加入对应的路由,如:

route add -net 192.168.4.0 netmask 255.255.255.0 gw 10.8.0.5 dev eth0

总而言之,就是必须让网关通过VPN服务器,可路由到所有的VPN子网,这无论是对于服务端还是客户端都是必须定义的。

三、案例3 

OpenVPN内部提供了DHCP的服务,而不需要依赖外部的DHCP服务器。同样,也提供了DHCP服务的一些配置参数:

server.conf配置:

#定义客户端的DNS服务器地址

push "dhcp-options DNS 192.168.228.1"

#定义客户端的WINS服务器地址

push "dhcp-options WINS 192.168.228.1"

#让客户端发起的所有IP请求都通过OpenVPN服务器

push "redirect-gateway def1"

其中,最后一项配置会修改客户端的默认路由为OpenVPN服务器。这样,通常还必须加入NAT转换:

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

这样,所有客户端当和OpenVPN服务器连接后,就可以把该服务器作为对外的路由服务器使用了。(类似Proxy)

四、案例4 

前面案例提到的,都是由服务端先生成客户端证书,然后分发到客户端,让客户端通过证书连接到服务器上。但有时候,这样的分发是比较麻烦的(也不安全)。这样,我们可以考虑另外一种方式:

只在服务端制作客户端证书,而客户端只需要有ca.crt文件,而不需要拿到客户端证书,当登陆服务器的时候是通过用户名和密码即可登陆OpenVPN服务器。

◎服务端配置:(以Linux版为例)

OpenVPN可以通过插件(plugin)方式支持上述的用户名认证,在Linux下以PAM为例,必须先增加用户:

useradd -M test

passwd test

然后修改server.conf增加:

#使用PAM插件

plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so login

#客户端可以不提供证书

client-cert-not-required

#用户登陆的用户名就是Common Name

username-as-common-name

注意:

1、若不增加client-cert-not-required语句,默认PAM认证和证书验证是需要同时通过才能建立连接的;

2、OpenVPN是基于SSL连接,所以,上述设置只是让客户端不用提供证书,但却必须提供ca.crt;

3、而且OpenVPN服务器也必须用客户端使用的登陆名(如:test)建立相同Common Name的证书,否则客户端登陆的时候,服务器会提示找不到对应证书,而不能建立连接。

◎客户端配置:

client.conf增加:

#激活登陆认证方式

auth-user-pass

#修改认证证书,保留ca.crt即可,客户端证书可以不要了

ca ./easy-rsa/keys/ca.crt

#cert ./easy-rsa/keys/client1.crt

#key ./easy-rsa/keys/client1.key

这样,当手动启动客户端的时候,即会提示用户名和密码。(用户名和密码为登陆服务器PAM认证,通过后,OpenVPN会提取用户名作为Common Name,并验证客户端证书,若也通过,则连接搭建成功)

※问题:若采用该方式,如何使用后台服务启动客户端?

答:可以先建立一个文件author-keys(用户名和密码各一行),然后修改配置文件

auth-user-pass author-keys

另其从中读取该文件以通过验证。

但前提是必须在编译的时候增加--enable-password-save参数。

五、其他 

1)若客户端不能访问OpenVPN使用的1194端口,可通过HTTP Proxy,但有要求:

1、OpenVPN连接要使用tcp方式,而不能使用udp方式;

2、客户端配置加入:

http-proxy ip port

2)OpenVPN负载均衡

要使用OpenVPN负载均衡,可以这样做:

1、可以建立多台服务器,除server配置不同外,其余相同:

server1

server 10.8.0.0 255.255.255.0

server2

server 10.8.1.0 255.255.255.0

server3

server 10.8.2.0 255.255.255.0

2、客户端可以用多点尝试进行配置:

#默认从上往下尝试

remote server1 port

remote server2 port

#也可以改为随机连接

remote-random

#为防止DNS解析错误导致不进行后续的尝试,可以加入下面的语句

resolv-retry 60

3)撤回证书

前面已经提到,可以单方面的通过服务器撤回客户端证书,在easy-rsa目录下:

source ./vars

./revoke-full client2

会生成crl.pem文件。把文件拷入对应目录,如keys。然后修改server.conf:

引用

crl-verify ./easy-rsa/keys/crl.pem

即可。(CRL List对于新客户是马上生效的,而且不需要重启服务器)

六、加强OpenVPN的安全性 

1、创建tls-auth

openvpn --genkey --secret ta.key

server.conf:

tls-auth ta.key 0

client.conf:

tls-auth ta.key 1

2、使用UDP协议

因为UDP一般不会有DoS攻击,而且能能防止端口被扫描,能保证更安全。

3、使用nobody用户和组运行服务

对于非Win的服务器,可以在配置中加入:

user nobody

group nobody

4、使用chroot

5、使用Large RSA keys

可以通过修改./easy-rsa/vars中的KEY_SIZE,增加到2048。但要注意,该修改必须重建所有的keys、以及配置文件。

6、使用Large symmetric keys

可以在配置文件中加入:

cipher AES-256-CBC

7、把ca.key单独存放

最后,也是最重要的一点。从前面的配置文件可以看到,无论是服务端,还是客户端都不需要使用ca.key文件的。但该文件却很重要,所以,我们应该把它另外保存好,而不是放在服务器上哦!

8、还有一种安全问题,就是Man-in-the-Middle攻击。

也就是模拟server连接另一个client。

参考:

http://blog.csdn.net/cnbird2008/article/details/6037243(以上内容转自此篇文章)

http://blog.csdn.net/chenghuikai/article/details/62891112

典型案例收集-OpenVPN不同网段的访问控制(转)的更多相关文章

  1. 典型案例收集-使用OpenVPN连通多个机房内网(转)(静态路由)

    说明: 1.这篇文章主要是使用静态路由表实现的多个机房通过VPN连接后的子网机房互通. 2.OpenVPN使用的是桥接模式(server-bridge和dev tap),这个是关键点,只有这样设置才可 ...

  2. 典型案例收集-使用OpenVPN连通多个机房内网(iptables+静态路由)

    说明: 1.这个方案是我最初实现的方案,目的在于OpenVPN连通后使其能访问各自的子网,实现互通. 2.主要以iptables为主,这个是关键点,并且这种方式配置iptables十分复杂,最后加入了 ...

  3. NB-IoT的相关资料整理(基本概念,技术优势,典型案例和当前的进展)

            人与人之间的通讯规模已近天花板,物与物的则刚刚进入增长快车道.随着可穿戴.车联网.智能抄表等新兴市场的开启,工业4.0.智慧城市.智慧农业等理念照进现实,万物互联的时代正加速到来. 一 ...

  4. HBase基本知识介绍及典型案例分析

    本次分享的内容主要分为以下五点: HBase基本知识: HBase读写流程: RowKey设计要点: HBase生态介绍: HBase典型案例分析. 首先我们简单介绍一下 HBase 是什么. HBa ...

  5. elasticsearch中的mapping映射配置与查询典型案例

    elasticsearch中的mapping映射配置与查询典型案例 elasticsearch中的mapping映射配置示例比如要搭建个中文新闻信息的搜索引擎,新闻有"标题".&q ...

  6. 【Java新特性】Lambda表达式典型案例,你想要的的都在这儿了!!

    写在前面 不得不说,有些小伙伴的学习热情真高,学完了Lambda表达式的语法,想来几个典型案例再强化下.于是问冰河能否给几个Lambda表达式的典型使用示例.于是乎,便有了这篇文章. 案例一 需求 调 ...

  7. 一个典型案例为你解读TDSQL 全时态数据库系统

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯技术工程官方号发表在腾讯云+社区 经典案例 增量抽取.增量计算等都是T-TDSQL的经典案例.如下以增量计算为例,来分析T-TDS ...

  8. Active Directory渗透测试典型案例

    0x01 前言 我有几个客户在渗透测试之前来找我,说他们的系统安全做得非常好,因为他们的漏洞扫描显示没有严重的漏洞并且已准备好进行安全测试,这使我在15分钟内利用AD中的错误配置获得了域管理员权限. ...

  9. CSS典型案例实践

    CSS案例实践 一.层布局:定位元素重叠 在CSS中可以通过z-index属性来确定定位元素的层叠等级.需要注意的是: z-index属性只有在元素的position属性取值为relative.abs ...

随机推荐

  1. python基础===如何在列表,字典,集合中根据条件筛选数据

    #常见的操作如下: data = [1, 5, -3, -2, 6, 0, 9] res = [] for x in data: if x>=0: res.append(x) print(res ...

  2. skb_reserve(skb,2)中的2的意义

    skb_reserve() skb_reserve()在数据缓存区头部预留一定的空间,通常被用来在数据缓存区中插入协议首部或者在某个边界上对齐.它并没有把数据移出或移入数据缓存区,而只是简单地更新了数 ...

  3. React 16 源码瞎几把解读 【前戏】 为啥组件外面非得包个标签?

    〇.看前准备 1.自行clone react最新代码 2.自行搭建一个能跑react的test项目 一.看表面:那些插件 如何解析JSX 有如下一段代码: // ---- hearder.jsx 组件 ...

  4. C基础 time.h 简单思路扩展

    前言 - time 简单需求 时间业务相关代码. 基本属于框架的最底层. 涉及的变动都很小. 以前参与游戏研发时候, 这方面需求不少, 各种被策划花式吊打. 转行开发互联网服务之后很少遇到这方面需求. ...

  5. oracle客户端不需要配置tnsnames.ora文件直接连接服务器数据库

    在以前的oracle使用过程中,想要在客户端连接到服务器时,都是在客户端中的tnsnames.ora文件配置如以下内容: adb = (DESCRIPTION = (ADDRESS_LIST = (A ...

  6. (MHA+MYSQL-5.7增强半同步)高可用架构设计与实现

           架构使用mysql5.7版本基于GTD增强半同步并行复制配置 reploication 一主两从,使用MHA套件管理整个复制架构,实现故障自动切换高可用        优势:       ...

  7. POJ 2348 Euclid's Game(辗转相除博弈+自由度分析)

    题目链接:http://poj.org/problem?id=2348 题目大意:给你两个数a,b,Stan和Ollie轮流操作,每次可以将较大的数减去较小的数的整数倍,相减后结果不能小于0,谁先将其 ...

  8. 简单优化:Zipalign

    Android SDK中包含一个“zipalign”的工具,它能够对打包的应用程序进行优化.在你的应用程序上运行zipalign,使得在运行时Android与应用程序间的交互更加有效率.因此,这种方式 ...

  9. 利用Fidder工具抓取App数据包

    第一步:下载神器Fiddler,下载链接: http://fiddler2.com/get-fiddler 下载完成之后,傻瓜式的安装一下了! 第二步:设置Fiddler打开Fiddler,     ...

  10. covariance matrix 和数据分布情况估计

    how to get data covariance matrix: http://stattrek.com/matrix-algebra/covariance-matrix.aspx meaning ...