1. 程式人生 > >深入OpenVPN的配置(不同網段的訪問控制)

深入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的配置就不會再有任何問題了。