總算又可以來寫我的OpenVPN 了,自從上一次寫了OpenVPN(1-6)集,獲得了廣大網友,不錯的迴響。本來想接著把後面的其它應用,再寫出來,但無奈被派外出差,整個人泡在酒裏,思緒不是那麼清楚,不敢隨便寫技術資料,怕寫錯了,誤人子弟囉!現在頭腦有清楚一點,就接著把後面小瑞對OpenVPN 的應用,接著分享出來^_^

OpenVPN Logo
Logo Ref Open VPN Project
前情提要:OpenVPN 建置筆記(第6集)

這一集,要分享些什麼呢?

1.將VPN User 分不同的群組,給不同的IP Range ,以方便做權限控管。
2.對VPN User 除了使用憑證的認證外,另外再加入User / Password 的認證機制。
3.將VPN User 登入及登出的時間點,做記錄,以便後續稽核人員,要查資料可以用。

先針對不同的VPN User 分不同的群組,設定不同的權限。這個我覺得還蠻有用的,一般在公司的環境中,會有些正式環境,及測試環境;通常我們會開放正式的環境給公司的使用者使用,但對於外部的人員,例如:外部的軟體公司,有幫我們公司做一些專案的開發,需要連到我們公司的測試環境,那就可以對外部的使用者做一些Service 或機器的訪問限制,減少一些不必要的資安風險。

在這個應用上,小瑞模擬兩個群組,一個是VIP 群組,使用10.10.0.0/24 的網段,可以訪問袐密花園的所有服務;另一個群組為 Guest 群組,使用10.20.0.0/24的網段,只可以訪問袐密花園的Web 服務,也就是只有80 port 可以訪問。

OpenVPN 使用者分組

要實現這個作業,必須再搭配iptables 這個工具,做一些IP , 封包的限制。
首先,必須修改Server.conf 的設定:

vi /etc/openvpn/server.conf

mode server
tls-server
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/dh2048.pem
persist-key
persist-tun
ifconfig 10.8.0.1 10.8.0.2
push "route 10.8.0.1"
push "route 192.168.100.0 255.255.255.0"
client-config-dir ccd
route 10.10.0.0 255.255.255.0
route 10.20.0.0 255.255.255.0
ccd-exclusive
keepalive 10 120
tls-auth ta.key 0
comp-lzo
status openvpn-status.log
log openvpn.log
verb 3

其中比較重要的是那個 ccd ,必須先建立好ccd 的目錄,這個目錄下,會針對不同的user 登入時,給予不同的IP ,以利後面做相關的限制!

mkdir /etc/openvpn/ccd

規劃如下:

client1 這個user 登入時設定為VIP 群組,取得 10.10.0.5 的IP
client2 這個user 登入時設定為Guest 群組,取得 10.20.0.5 的IP

接著建立 client1 的設定檔:
vi /etc/openvpn/ccd/client1

ifconfig-push 10.10.0.5 10.10.0.6

接著建立 client2 的設定檔:
vi /etc/openvpn/ccd/client2

ifconfig-push 10.20.0.5 10.20.0.6

OpenVPN Server 的設定完成,接著要設定 iptables 進行封包的轉送及限制!
修改一下我們的firewall.sh
vi /etc/openvpn/firewall.sh

#!/bin/bash
echo "1" > /proc/sys/net/ipv4/ip_forward
PRIVATE=192.168.100.0/24
VIP=10.10.0.0/24
GUEST=10.20.0.0/24
LOOP=127.0.0.1

iptables -P OUTPUT DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -F

iptables -P OUTPUT ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP

iptables -A INPUT -i eth0 -s $LOOP -j DROP
iptables -A FORWARD -i eth0 -s $LOOP -j DROP
iptables -A INPUT -i eth0 -d $LOOP -j DROP
iptables -A FORWARD -i eth0 -d $LOOP -j DROP

#limit some ip traffic
iptables -A FORWARD -p tcp -s $GUEST -d 192.168.100.100 --dport ! 80 -j DROP

iptables -A INPUT -s $LOOP -j ACCEPT
iptables -A INPUT -d $LOOP -j ACCEPT

iptables -A INPUT -p udp --dport 1194 -j ACCEPT

iptables -A INPUT -i tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -j ACCEPT
iptables -A INPUT -i tap+ -j ACCEPT
iptables -A FORWARD -i tap+ -j ACCEPT

iptables -A INPUT -i eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -j ACCEPT

# Keep state of connections from local machine and private subnets
iptables -A OUTPUT -m state --state NEW -o eth0 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state NEW -o eth0 -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

因為 VIP 群組,可以進行所有的Service 訪問,所以就不特別寫入firewall 了,直接寫入限制條件,如果來源為GUEST 的IP ,目的為PRIVATE (192.168.100.0/24),且port 不是 80(web) 則禁止防問。

firewall 設定完成後,重啟OpenVPN Server 及 新的 firewall。

/etc/init.d/openvpn restart
sh /etc/openvpn/firewall.sh

接著先使用 client1 連入我們的測試VPN 主機!

登入 client1,同時得到 10.10.0.5 IP

connect client1

get 10.10.0.5 IP

檢視一下 Route Table ,果然使用 10.8.0.1 當做 192.168.100.100 的GateWay

Route Print

接著使用Ping 及 Tracert 檢視一下到 192.168.100.100 的路徑通不通! (通的)

Ping and tracert

接著在本機端使用SSH 登入 192.168.100.100 ,成功登入,上次登入的IP 10.10.0.5

Use SSH

接著於本機端使用WWW服務,可成功使用,顯示IP 為 10.10.0.5

Use WWW

client1 的測試己經完成,斷開client1 的VPN 連線!

disconnect client1

接著做 client2 的測試,使用Client2 做連線,並成功取得 10.20.0.5 的IP !

connect client2

get client2 IP

使用 Client2 的IP 進行SSH 連線,結果--無法取得連線!

can not use ssh service

接著使用WEB 服務,結果,可以成功連入Web Service ,並顯示連入IP 為10.20.0.5

can use www service

綜合以上的測試結果,小瑞非常滿意,完成了另一個好玩的任務!基本上各位網友可以自行延申,自己所需求的不同VPN User 群組,再加上iptables 的限制,應該可以實現自己特殊的群組限制功能!

至於本篇筆記原本要做帳號密碼認證及,Log 的記錄,要留待下一篇再寫了,不好意思啦!

OpenVPN 建置筆記(第8集)

日期:2010/06/07 | 留言:6 個 | 作者:Rico | 瀏覽:
分類:MIS易筋經,網路篇
標籤:, ,
  1. 2010/11/06 at 08:43:31 | 1

    搜索过来的,这个还是挺有帮助的,谢了

  2. 2012/01/23 at 15:05:47 | 2
    jy

    great~ you are so nice~

  3. 2012/11/07 at 10:58:59 | 3
    ben

    透過CCD機制,讓不同使用者取得不同網段IP。可是試用過後感覺只有一個憑證對映一個IP,另一個使用者使用相同憑證就會相衝。

  4. 2012/11/07 at 11:45:25 | 4
    Rico

    可以試試在server.conf 中使用 duplicate-cn 這個選項, 只是我們沒有這樣使用!
    在正式的環境中, 都是一個User 配發一個憑證加一個IP , 當某一個User 離職時,
    只要作廢該User 的憑證即可防止他登入VPN , 也不會影響其它的user , 參考看看!

  1. |
    2010/06/07 at 17:57:09 | 1

    […] OpenVPN 建置筆記(第7集) 日期:2010/04/07 | 留言:7 個 | 作者:Rico | 瀏覽:123人次 分類:MIS易筋經, 網路篇 標籤:CentOS 5.4, Open VPN, OpenVPN, ping, site to site, tracert, Xen 留言 (5) 引用 (2) […]

  2. |
    2012/09/14 at 14:22:24 | 2

    […] 前情提要:OpenVPN 建置筆記(第7集) […]

*

Copyright -0001 紐菲斯的部落格