部署open***和控制訪問權限vim
說明:
windows
客戶端採用密鑰登錄***服務端
安全
安裝部署:
bash
軟件下載地址:https://swupdate.open***.org/community/releases/ 服務器
一、安裝依賴包:app
yum install -y openssl openssl-devel lzo lzo-devel pam pam-devel automake pkgconfig
二、安裝open***ide
cd /usr/local/src/ tar -zxf open***-2.3.8.tar.gz cd open***-2.3.8 ./configure --prefix=/opt/open*** make && make install cp -a sample/sample-config-files/server.conf /opt/open***/ #最好放在/opt/open***/下 cp -a distro/rpm/open***.init.d.rhel /etc/init.d/open*** #建立啓動腳本 ln -s /opt/open***/sbin/open*** /usr/sbin/open*** #啓動腳本中會用到,也能夠不執行此命令,直接在啓動腳本中修改 vi /etc/init.d/open*** #在85行,修改成:work=/opt/open*** cd /opt/open***/ && mv server.conf server.conf.bak vi server.conf #修改配置文件; ';'爲註釋 port 1194 proto udp dev tun ca keys/ca.crt cert keys/server.crt key keys/server.key dh keys/dh2048.pem tls-auth keys/ta.key 0 server 10.8.0.0 255.255.255.0 #默認就好 ifconfig-pool-persist ipp.txt #正在鏈接的用戶會被寫到這個文件裏 push "route 10.10.0.0 255.255.0.0" #推送路由 push "dhcp-option DNS 8.8.8.8" keepalive 10 120 comp-lzo user nobody group nobody persist-key persist-tun status logs/open***-status.log log logs/open***.log log-append logs/open***.log verb 3
mkdir logs #建立日誌目錄 mkdir keys #建立key目錄
三、安裝easy-rsa,用來生成證書和密鑰:ui
cd /usr/local/src/ tar -zxf easy-rsa-2.2.0_master.tar.gz cp -a easy-rsa-2.2.0_master/easy-rsa /opt/open***/ cd /opt/open***/easy-rsa/2.0/ mv vars vars.bak vi vars #修改配置文件 export EASY_RSA="`pwd`" export OPENSSL="openssl" export PKCS11TOOL="pkcs11-tool" export GREP="grep" export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA` export KEY_DIR="$EASY_RSA/keys" echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR export PKCS11_MODULE_PATH="dummy" export PKCS11_PIN="dummy" export KEY_SIZE=2048 #修改成2048 export CA_EXPIRE=3650 export KEY_EXPIRE=3650 export KEY_COUNTRY="CN" #如下根據本身狀況修改 export KEY_PROVINCE="ShangHai" export KEY_CITY="ShangHai" export KEY_ORG="jinzhuan" export KEY_EMAIL="shencj@jinzhuanch.com" export KEY_CN=jinzhuan export KEY_NAME=jinzhuan export KEY_OU=jinzhuan
ln -s openssl-1.0.0.cnf openssl.cnf source vars #全局變量 ##生成證書,如下命令所有一直回車 ./clean-all #清空全部證書(keys目錄下) ./build-ca #生成服務器ca證書 ./build-key-server server #生成服務端證書 ./build-dh #生成DH驗證文件(dh2048.pem) open*** --genkey --secret ta.key #下降DDoS風險 ./build-key client #生成客戶端證書(隨便命名)
四、啓動服務this
cd /opt/open***/easy-rsa/2.0/keys/ cp -a ca.crt ta.key server.crt dh2048.pem server.key /opt/open***/keys #拷貝證書到/opt/open***/keys目錄下 /etc/init.d/open*** start chkconfig open*** on
五、設置外網訪問:spa
vim /etc/sysctl.conf #將net.ipv4.ip_forward = 0 改成 1 sysctl -p 配置nat表將***網段IP轉發到server內網:(很重要) iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE #注意接口(eth0)是內網的接口,其它選項不要修改 iptables -A INPUT -p TCP --dport 1194 -j ACCEPT #開啓防火牆1194端口 service iptables restart #POSTROUTING須要保存並重啓服務才能生效 chkconfig iptables on
六、windows客戶端配置:
下載:open***-2.2.2-install.exe 下載地址:http://vdisk.weibo.com/s/z5vWLo13rACAe 點擊安裝,一直next,默認目錄安裝便可 通常會安裝到 C:/Program Files/Open×××/ 目錄下
建立client.o***文件: client dev tun proto udp remote 192.168.1.106 1194 #***服務端ip ca ca.crt cert client.crt key client.key tls-auth ta.key 1 comp-lzo persist-key persist-tun status open***-status.log
將client.o***文件放到C:/Program Files/Open×××/config目錄下 從***服務端下載ca.crt,client.crt,client.key,ta.key證書 將ca.crt,client.crt,client.key,ta.key證書放到C:/Program Files/Open×××/config目錄下 點擊桌面open***圖標便可
七、吊銷客戶端證書:
cd /opt/open***/easy-rsa/2.0/ source vars #全局變量 ./revoke-full client #會在keys目錄下生成一個crl.pem文件 cp keys/crl.pem /opt/open***/keys/ #每次吊銷一個客戶端證書,都要從新拷貝覆蓋crl.pem文件 vim /opt/open***/server.conf #在最後添加:crl-verify keys/crl.pem /etc/init.d/open*** restart
八、控制訪問權限:
說明:有多個客戶端用戶,client用戶能夠訪問全部的內網服務器,client1用戶只能訪問10.10.1.0網段的服務器
參考:http://backreference.org/2010/06/18/open***s-built-in-packet-filter/
方案:採用minimal_pf.so模塊和包過濾
編譯minimal_pf.so模塊:
cd /usr/local/src/open***-2.3.8
vi minimal_pf.c #建立minimal_pf.c文件 /* minimal_pf.c * ultra-minimal Open××× plugin to enable internal packet filter */ #include <stdio.h> #include <stdlib.h> #include "include/open***-plugin.h" /* dummy context, as we need no state */ struct plugin_context { int dummy; }; /* Initialization function */ OPEN×××_EXPORT open***_plugin_handle_t open***_plugin_open_v1 (unsigned int *type_mask, const char *argv[], const char *envp[]) { struct plugin_context *context; /* Allocate our context */ context = (struct plugin_context *) calloc (1, sizeof (struct plugin_context)); /* Which callbacks to intercept. */ *type_mask = OPEN×××_PLUGIN_MASK (OPEN×××_PLUGIN_ENABLE_PF); return (open***_plugin_handle_t) context; } /* Worker function */ OPEN×××_EXPORT int open***_plugin_func_v2 (open***_plugin_handle_t handle, const int type, const char *argv[], const char *envp[], void *per_client_context, struct open***_plugin_string_list **return_list) { if (type == OPEN×××_PLUGIN_ENABLE_PF) { return OPEN×××_PLUGIN_FUNC_SUCCESS; } else { /* should not happen! */ return OPEN×××_PLUGIN_FUNC_ERROR; } } /* Cleanup function */ OPEN×××_EXPORT void open***_plugin_close_v1 (open***_plugin_handle_t handle) { struct plugin_context *context = (struct plugin_context *) handle; free (context); }
編譯步驟:
INCLUDE="-I/usr/local/src/open***-2.3.8/" CC_FLAGS="-O2 -Wall -g" NAME=minimal_pf gcc $CC_FLAGS -fPIC -c $INCLUDE $NAME.c && gcc $CC_FLAGS -fPIC -shared -Wl,-soname,$NAME.so -o $NAME.so $NAME.o -lc cp -a minimal_pf.so /opt/open***/lib/open***/plugins/
建立包過濾文件:
mkdir /opt/open***/ccd cd /opt/open***/ccd vi client1.pf #客戶client1,只對10.10.1.0網段有權限 [CLIENTS ACCEPT] [SUBNETS DROP] +10.10.1.0/24 [END] vi client.pf #客戶client,對全部內網服務器都有權限 [CLIENTS ACCEPT] [SUBNETS ACCEPT] [END]
包過濾文件補充:
包過濾文件格式: [CLIENTS DROP|ACCEPT] {+|-}common_name1 {+|-}common_name2 . . . [SUBNETS DROP|ACCEPT] {+|-}subnet1 {+|-}subnet2 . . . [END] 過濾文件語法: CLIENTS部分用於定義common name; SUBNETS部分用於定義IP地址、IP網段; DROP|ACCEPT用於設置默認規則,就是沒有明確指明的common name,那麼他們將會使用; {+|-}用於設置是否容許,若是是「+」,那麼表示容許,若是是「-」則表示不容許; [END]表示策略文件的結束 cat client10.pf [CLIENTS ACCEPT] [SUBNETS ACCEPT] -192.168.9.7 +192.168.9.0/24 [END]
建立客戶端鏈接腳本:
cd /opt/open*** vi client-connect.sh #!/bin/sh # /etc/open***/client-connect.sh: sample client-connect script using pf rule files # rules template file template="/opt/open***/ccd/${common_name}.pf" # create the file Open××× wants with the rules for this client if [ -f "$template" ] && [ ! -z "$pf_file" ]; then cp -- "$template" "$pf_file" else # if anything is not as expected, fail exit 1 fi chmod +x client-connect.sh #加執行權限
修改***配置文件:
vim /opt/open***/server.conf port 1194 proto udp dev tun ca keys/ca.crt cert keys/server.crt key keys/server.key dh keys/dh2048.pem tls-auth keys/ta.key 0 plugin /opt/open***/lib/open***/plugins/minimal_pf.so #添加 client-connect /opt/open***/client-connect.sh #添加 server 10.8.0.0 255.255.255.0 ifconfig-pool-persist ipp.txt push "route 10.10.0.0 255.255.0.0" push "dhcp-option DNS 8.8.8.8" client-config-dir /opt/open***/ccd #添加 client-to-client #添加 keepalive 10 120 comp-lzo user nobody group nobody persist-key persist-tun status logs/open***-status.log log logs/open***.log log-append logs/open***.log verb 3 script-security 3 #添加,腳本安全級別2及以上 ##補充: [root@localhost ~]# open*** --help | grep -A 5 script-security --script-security level: Where level can be: 0 -- strictly no calling of external programs 1 -- (default) only call built-ins such as ifconfig 2 -- allow calling of built-ins and scripts 3 -- allow password to be passed to scripts via env --shaper n : Restrict output to peer to n bytes per second.
重啓服務:
/etc/init.d/open*** restart
九、添加***客戶端帳號:
cd /opt/open***/easy-rsa/2.0/ source vars ./build-key client2 cd /opt/open***/ccd/ vim client2.pf /etc/init.d/open*** restart #必須重啓服務