Aug 28

[原]深入OpenVPN的配置 晴

linuxing , 12:32 , 网络服务 » 安全相关 , 评论(17) , 引用(0) , 阅读(152926) , Via 本站原创 | |
 前面已经比较详细的说明了OpenVPN的使用和配置,但在实际使用中,可能还会遇到很多网络上的问题,今天就再举几个例子说明一下。

一、案例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参数。(可以使用这里的rpm包,点击

五、其他
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。可以参考官方文档

※相信通过这些例子,今后对于OpenVPN的配置就不会再有任何问题了。
Carson Email
2015/09/11 19:31
博主,我按你方式2中,win client没问题,linuxclient,访问局域网就没走对应client的路由
菜菜
2012/12/10 10:53
博主好,这文章太给力了,写的很好,解决了我很多问题,我看了有个地方不怎么明白,不知是不是写错了 。。就是文章的 案例2 中server.conf的这句:#让所有客户端都增加到192.168.4.0/24的路由push "route 192.168.4.0 255.255.255.0"push 应该是让客户端知道去服务端的路由吧 ,你这个4.0网段是客户端子网,为啥还要push ,我感觉是写错了貌似应该push "route 10.8.0.0 255.255.255.0" 把服务端网段路由告诉客户端 。。。求解  ~~
jakc
2011/09/19 09:00
飘扬哥:

    你好!  请教一个问题,我在做好了SITE-TO-SITE OPENVPN后,想在OPENVPN 两端跑动态路由协议。是否能做到呢? 望指教。谢谢!
SPIDER
2011/09/14 23:17
请教linuxfly:
   服务端子网到达不了客户端子网。反过来是正常的。个人感觉是ccd文件没有起作用。但从日志分析上没看来具体什么原因。
   麻烦给解答一下。谢谢! 这个问题困扰了我一个多星期了。
ccw
2011/08/11 20:49
博主人在哪里,我有问题想请教,能给我发个邮件我们私下沟通吗?我的邮件是:caichaowei@gmail.com
linuxing 回复于 2011/08/13 11:28
可以发邮件到emos#linuxfly.org联系我。
tabris
2011/06/30 16:32
嗯,后来搞定了。

我是发现访问外网空白页才把iptables关了,后来才发现是本地win2008r2不支持这个软件客户端,用2003好用;
谢谢

=================
另:
能不能说说vps多个ip的话,如果想让他接收所有ip连入vpn怎么设置

比如服务器有
1.1.1.1
2.2.2.2
3.3.3.3
想让客户端分别用不同的ip登入vpn怎么设置呢?
linuxing 回复于 2011/07/04 15:04
在配置文件中用local可指定监听那个IP。若有多个IP,但客户端登陆不同的IP,那可以写多个配置文件就可以了。当然,这时获取的各内部网段需要用路由来解决。
tabris
2011/06/28 13:34
请问,我现在能连接vpn,但是不能访问外网,开网页都是空白页
本地查vpn网卡没有默认网关
服务器iptables stop了
ip forward=1

附上配置文件
local *.*.*.*
port 1194
proto udp

dev tun

ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/server.crt
key /etc/openvpn/easy-rsa/2.0/keys/server.key
dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem

server 10.8.0.0 255.255.255.0
client-config-dir ccd
client-to-client off
keepalive 10 120

comp-lzo

persist-key
persist-tun
status /usr/local/etc/openvpn-status.log
log /usr/local/etc/log/openvpn.log
verb 4

push "dhcp-option DNS 10.8.0.1"
push "dhcp-option DNS 4.2.2.1"
push "dhcp-option DNS 4.2.2.2"
link-mtu 1500

另: 两个搞不明白的提示
NOTE: OpenVPN 2.1 requires '--script-security 2' or higher to call user-defined scripts or executables

WARNING: normally if you use --mssfix and/or --fragment, you should also set --tun-mtu 1500 (currently it is 1458)
linuxing 回复于 2011/06/29 11:21
你的iptables stop了,怎么把你的IP nat出去外网呢?
ym Email
2011/06/25 00:14
plugin /usr/share/openvpn/plugin/lib/openvpn-auth-pam.so login
这段话里的login的内容是什么?login文件保存在
/etc/pam.d/下吗
linuxing 回复于 2011/06/27 14:03
这是配置的写法,openvpn-auth-pam.so是OpenVPN带的,不是pam的文件。
key Email Homepage
2011/02/22 16:01
博主的文章条理清晰,很受用,谢谢
aa
2010/11/26 17:31
如果想同时使用证书方式认证呢? 有些服务器用证书认证不输入密码,有些用户需要用密码验证。可以实现吗? neter.aa@gmail.com
linuxing 回复于 2010/11/30 13:17
当前的版本估计比较困难,在OpenVPN中只有二选一的设定,若要实现你的功能,估计要修改源码。
分页: 1/2 第一页 1 2 下页 最后页
发表评论
表情
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
记住我
昵称   密码   游客无需密码
网址   电邮   [注册]