Wednesday, 2026-04-01, 8:14 PM
Main » 2010 » April » 8 » 深入OpenVPN的配置(不同網段的訪問控制)
9:37 PM 深入OpenVPN的配置(不同網段的訪問控制) |
| 本文來源於http://blog.chinaunix.net/u1/36506/showart_454904.html 有空试试^_^ 前面已经比较详细的说明了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的配置就不会再有任何问题了。
|
|
Views: 2558 |
Added by: forestrex
| Rating: 0.0/0 |
|