創建單IP的×××網絡

一、架構

1.1現有網絡

  現有網絡架構如圖一所示,其中服務器網段爲192.168.0.x使用專門線路接入internet,192.168.88.x爲網絡設備網段,其它都是辦公網段使用另外的線路接入internet。

圖一、現有網絡結構圖

1.2 ×××架構

  在圖一所示的網絡架構中搭建一臺×××服務器(192.168.0.x網段),在專門的安全設備上映射該服務器的內網地址(外部×××撥入輸入外網地址)。遠程用戶成功撥入後,辦公網絡的用戶可以正常訪問已撥入的×××客戶端。如圖二所示。

×××服務器配置如下:

  1、單網卡:192.168.0.47

  2、×××客戶段:172.16.0.0

  3、Office辦公網段:192.168.10.x-192.168.17.x

圖二、×××網絡結構圖

1.3 ×××方案

  通過使用CentOS6.3(64bit) +Open×××(×××服務器)+OpenSSL(CA證書)+MySQL(驗證)的方式組建×××方案。

二、安裝配置linux系統

2.1安裝CentOS系統

  通過正常方式安裝CentOS6.3的64位版本。可以不安裝圖形界面,字符界面的組件中建議選上基本的開發工具。可通過以下指令查看系統版本,如圖三所示。

cat/etc/issue
cat /proc/version

圖三、linux系統版本

2.2配置系統yum源

  完成安裝後配置系統的yum源有助於後續軟件的安裝配置,結合國內實際情況採用163.com的更新源,速度和效率上都有保證。163的開源服務器地址爲http://mirrors.163.com,各版本的linux在這裏都有收集。

wgethttp://mirrors.163.com/.help/CentOS6-Base-163.repo
mv CentOS6-Base-163.repo/etc/yum.repos.d/
mv/etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.orig
mv/etc/yum.repos.d/CentOS6-Base-163.repo /etc/yum.reops.d/CentOS-Base.repo
wgethttp://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh epel-release-6-7.noarch.rpm

圖四、yum源設置

2.3配置系統時間

  系統的時區和時間設置不準確會導致SQL查詢和流量控制腳本運行不正常,因些在安裝系統後需正確設定系統的時區和時間。輸入以下指令設置正確的系統時間。

hwclock --set--date="07/07/06 10:19"
hwclock --hctosys

  其中第一條語句是設定硬件時鐘,第二條語句是設定系統時鐘和硬件時鐘同步。同時,時區的設定也很重要,如果系統及硬件時鐘正確而時區設定不正確的話會導致時間相差幾個小時,因些調整好時區也是一個重要的步驟。

tzselect

圖五、時區設置

  查找系統文件etc/sysconfig/clock並修改爲:

ZONE="Asia/Shanghai"
UTC=true
ARC=false

圖六、時區設置

  找到系統文件/usr/share/zoneinfo/Asia/Shanghai用這個文件替換當前的/etc/localtime文件

cp/usr/share/zoneinfo/Asia/Shanghai /etc/localtime

圖七、時區設置

2.4禁用selinux

  selinux 確實提高了系統的安全性,但另一方面也給應用程序增加了很多的不確定性。我在安裝配置完zabbix後曾出現過始終無法打開瀏覽頁面無法進入web安裝界 面的情況,後來禁用selinux後問題解決。對於selinux的啓用與否個人見仁見智可以根據自已的需求決定是否開啓。

vi /etc/selinux/config
SELINUX=disabled
SELINUXTYPE=targeted

圖八、selinux設置

三、安裝相關組件

3.1安裝系統依賴組件

yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibcglibc-devel glib2 glib2-devel bzip2bzip2-devel ncurses ncurses-devel curl curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn libidn-devel opensslopenssl-devel

圖九、相關依賴組件安裝

3.2安裝open***組件

yum install open*** pam_krb5 pam_mysql pam pam-devel

圖十、open***組件安裝

3.3安裝MySQL組件

yum install mysql mysql-devel libgcrypt-devel lzo-mini lzo lzolzo-devel mysql-server  mysql-libs

圖十一、MySQL組件安裝

四、配置證書

  Open×××可以使用PKI證書體系進行雙向的認證操作,也就是在建立×××連接的同時,除了服務器端要驗證客戶端的證書外,客戶端也要確認服務器端的證書。

  當服務器端及客戶端在相互認證時,會利用根證書(RootCA)公鑰進行對方證書的驗證,然後會再進行一些其它信息的測試,例如,驗證對方證書上的common name或是其它類別。

這樣的機制有以下好處:

  1、服務端只需要知道它自已的憑證及私鑰,無需知道個別可能會連進來的客戶端的證書及私鑰。

  2、服務端只接受由同一個根證書(Root CA)所簽發的客戶端證書。服務端不需要根證書的私鑰即可進行驗證。所以根證書(RootCA)的私鑰,可以安全保存到其它的機器上。

  3、如果客戶端的私鑰有問題的話,可以把它加入失效列表,這樣可以在連接時,拒絕×××連接。

4.1複製證書模板

圖十二、證書配置

4.2生成根證書(Root CA)

  先×××生成變量文件,保存退出,然後開始清理。

vi/etc/open***/easy-rsa/2.0/vars
export KEY_COUNTRY="CN"#國家
export KEY_PROVINCE="GD"#省
export KEY_CITY="DongGuan" #城市
export KEY_ORG="myj"#組織
export KEY_EMAIL="[email protected]"
export [email protected]
export KEY_CN=changeme
export KEY_NAME=changeme
export KEY_OU=changeme
export PKCS11_MODULE_PATH=changeme
export PKCS11_PIN=1234
/etc/open***/easy-rsa/2.0/clean-all#清理
/etc/open***/easy-rsa/2.0/build-ca#生成根證書

4.3生成服務端(server)客戶端(client)證書及DH交換參數

  DH密鑰交換參數(Diffie Hellman parameters)主要用於加密通道未建立前,在不安全的通道下建立一個密鑰,可以用這個密鑰在第一次證書交換時加密使用。這個密鑰只使用一次,下次要用時會重新生成。

/etc/open***/easy-rsa/2.0/build-key-serverserver#生成服務器證書
/etc/open***/easy-rsa/2.0/build-keyclient1#生成客戶端證書
/etc/open***/easy-rsa/2.0/build-dh#生成DH交換參數

  證書生成完畢後會在“/etc/open***/easy-rsa/2.0/keys/”下生成以下文件,如表一所示。

Filename   Needed By   Purpose   Secret
ca.crt   server + all clients   Root CA certificate   NO
ca.key   key signing machine only   Root CA key   YES
Dh1024.pem   server only   Diffie Hellman parameters   NO
server.crt   server only   Server Certificate   NO
server.key   server only   Server Key   YES
client1.crt   client1 only   Client1 Certificate   NO
client1.key   client1 only   Client1 Key   YES

Filename

Needed By

Purpose

Secret

ca.crt

server + all clients

Root CA certificate

NO

ca.key

key signing machine only

Root CA key

YES

Dh1024.pem

server only

Diffie Hellman parameters

NO

server.crt

server only

Server Certificate

NO

server.key

server only

Server Key

YES

client1.crt

client1 only

Client1 Certificate

NO

client1.key

client1 only

Client1 Key

YES

表一、證書列表

五、配置數據庫

  數據庫使用MySQL,主要用於存儲×××客戶端撥入的用戶名和密碼,在×××撥入時進行驗證操作,MySQL的詳細設定可以參考相關文檔,這裏僅列出必須的指令。

5.1配置啓動數據庫

service mysqld start#啓動數據庫
mysql_secure_installation#數據庫密碼重設

5.2新建數據庫

mysql -uroot -p
CREATE DATABASE open***;
GRANT ALL ON open***.* TO'open***'@'localhost' IDENTIFIED BY 'password';

5.3創建用戶數據表

CREATE TABLE IF NOT EXISTS`user` (
`username` char(32) COLLATEutf8_unicode_ci NOT NULL,
`password` char(128) COLLATEutf8_unicode_ci DEFAULT NULL,
`active` int(10) NOT NULLDEFAULT '1',
`creation` timestamp NOT NULLDEFAULT CURRENT_TIMESTAMP,
`name` varchar(32) COLLATEutf8_unicode_ci NOT NULL,
`email` char(128) COLLATEutf8_unicode_ci DEFAULT NULL,
`note` text COLLATEutf8_unicode_ci,
`quota_cycle` int(10) NOT NULLDEFAULT '30',
`quota_bytes` bigint(20) NOTNULL DEFAULT '10737418240',
`enabled` int(10) NOT NULLDEFAULT '1',
PRIMARY KEY (`username`),
KEY `idx_active` (`active`),
KEY `idx_enabled` (`enabled`)
) DEFAULT CHARSET=utf8COLLATE=utf8_unicode_ci;

5.4創建日誌數據表

CREATE TABLE IF NOT EXISTS`log` (
`username` varchar(32) COLLATEutf8_unicode_ci NOT NULL,
`start_time` timestamp NOTNULL DEFAULT CURRENT_TIMESTAMP,
`end_time` timestamp NOT NULLDEFAULT '0000-00-00 00:00:00',
`trusted_ip` varchar(64)COLLATE utf8_unicode_ci DEFAULT NULL,
`trusted_port` int(10) DEFAULTNULL,
`protocol` varchar(16) COLLATEutf8_unicode_ci DEFAULT NULL,
`remote_ip` varchar(64)COLLATE utf8_unicode_ci DEFAULT NULL,
`remote_netmask` varchar(64)COLLATE utf8_unicode_ci DEFAULT NULL,
`bytes_received` bigint(20)DEFAULT '0',
`bytes_sent` bigint(20)DEFAULT '0',
`status` int(10) NOT NULLDEFAULT '1',
KEY `idx_username`(`username`),
KEY `idx_start_time`(`start_time`),
KEY `idx_end_time`(`end_time`)
) DEFAULT CHARSET=utf8COLLATE=utf8_unicode_ci;
exit;#退出數據庫

六、配置pam支持MySQL驗證

  用戶的驗證信息(用戶名、密碼)保存在MySQL數據庫中,驗證模塊則是利用pam功能的新增pam_mysql.so插件來實現。需要注意的是32位和64位操作系統所引用的地址是有區別的。

6.1安裝pam.so組件

cd /usr/src
wget http://prdownloads.sourceforge.net/pam-mysql/pam_mysql-0.7RC1.tar.gz
tar zxvf pam_mysql-0.7RC1.tar.gz
cd pam_mysql-0.7RC1
vi patch.in
--- Makefile.in.chold2008-07-14 10:25:53.000000000 +0200
+++ Makefile.in 2008-07-1410:26:06.000000000 +0200
@@ -110,7 +110,7 @@
CPPFLAGS = @CPPFLAGS@
LDFLAGS = @LDFLAGS@
LIBS = @LIBS@
-pam_mysql_la_LIBADD =
+pam_mysql_la_LIBADD = -lpam
pam_mysql_la_OBJECTS=pam_mysql.lo
CFLAGS = @CFLAGS@
COMPILE = $(CC) $(DEFS) $(INCLUDES)$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
patch -p0 < patch.in
./configure
make
make install
cp /usr/lib64/open***/plugin/lib/open***-auth-pam.so/etc/open***/

6.2修改open***讓其支持MySQL驗證

crypt 表示密碼在數據庫中加密存儲的方式,含義如下:

Ø0 (or “plain”):不加密,明文存儲。不推薦使用。

Ø1 (or “Y”):使用crypt(3)函數,相當於MySQL 中的ENCRYPT()函數。

Ø2 (or “mysql”):使用MySQL 的PASSWORD()函數。PAM可能與MySQL 的函數不同,不推薦使用。

Ø3 (or “md5″):使用MD5。

Ø4 (or “sha1″):使用SHA1。

vi /etc/pam.d/open***
auth sufficient /lib64/security/pam_mysql.so user=open***passwd=www.myj123.com host=localhostdb=open*** table=user usercolumn=usernamepasswdcolumn=password where=active=1 sqllog=1 crypt=1
account required /lib64/security/pam_mysql.so user=open***passwd=www.myj123.com host=localhostdb=open*** table=user usercolumn=usernamepasswdcolumn=password where=active=1 sqllog=1 crypt=1

6.3啓動saslauthd

servicesaslauthd start

6.4添加測試用戶


mysql -u open***–p
USE open***;
INSERTINTO user(username, password) VALUES('test', ENCRYPT('test'));
exit;

6.5測試MySQL驗證

testsaslauthd -u test -p test-s open***

如果提“0: OK "Success."表示成功。

七、配置open***

7.1配置open***服務端

  開始建立Open***的配置文件,Open××× 服務啓動時,會掃描/etc/open*** 目錄中的.conf 文件,對於每個文件,啓動一個daemon。本系統要實現UDP、TCP 登錄的同時支持,可以寫兩份配置文件,如tcp.conf,udp.conf,即啓動兩個daemon,分別負責TCP和UDP協議。以下以udp爲例。

vi /etc/open***/server.conf
port 1194#使用1194端口
proto udp#使用UDP協議
devtun#使用tunn方式
ca /etc/open***/easy-rsa/2.0/keys/ca.crt#根證書
cert /etc/open***/easy-rsa/2.0/keys/server.crt#服務端證書
key /etc/open***/easy-rsa/2.0/keys/server.key#服務端key
dh /etc/open***/easy-rsa/2.0/keys/dh1024.pem#DH交換密鑰
server 172.16.0.0 255.255.255.0#×××撥入後分配的地址
ifconfig-pool-persist ipp.txt#×××撥入後IP信息
push "route 172.16.0.0 255.255.255.0"
push "route 192.168.0.0 255.255.255.0"
push "route 192.168.16.0 255.255.255.0"
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 202.96.128.166"
push "dhcp-option DNS 202.96.128.86"
push "dhcp-option DNS 172.16.0.1"
keepalive 20 120#連接時間
plugin /etc/open***/open***-auth-pam.so open***#mysql驗證方式
username-as-common-name#用戶名驗證
comp-lzo#壓縮傳輸
max-clients 30
user nobody
group nobody
persist-key
persist-tun
status/var/log/open***/open***-status.log
log-append /var/log/open***/open***.log
verb 3
mute 5
script-security 2
client-connect ./connect.sh#連接時啓用的腳本
client-disconnect ./disconnect.sh#斷開連接時的腳本

7.2配置open***流量控制

  open***流量控制的主要作用是在用戶連接時,在數據庫log 表中新建一條記錄,記錄用戶的IP 地址、端口號、連接時間等信息。在用戶斷開連接時,更新剛纔添加的記錄,記下用戶的斷開連接時間、發送數據量、接收數據量等。然後,對用戶的流量進行判斷,若超過配額,則將用戶鎖定(active=0)。

  user 表中的quota_cycle 是用戶的流量計算週期,quota_bytes 是用戶每個週期內最多允許的流量。connect.sh 和disconnect.sh 腳本文件中調用了Open××× 的環境變量。Open××× 在執行腳本時,自動各種設置了環境變量,供腳本使用。

vi /etc/open***/connect.sh#連接腳本
#!/bin/bash
DB='open***'
DBADMIN='open***'
DBPASSWD='password'
mysql -u$DBADMIN -p$DBPASSWD -e "INSERT INTOlog(username,start_time,trusted_ip,trusted_port,protocol,remote_ip,remote_netmask,status) VALUES('$common_name',now(),'$trusted_ip',$trusted_port,'$proto_1','$ifconfig_pool_remote_ip','$route_netmask_1',1)"$DB
vi /etc/open***/disconnect.sh#斷開連接時腳本
#!/bin/bash
DB='open***'
DBADMIN='open***'
DBPASSWD='password'
mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE log SETend_time=now(),bytes_received=$bytes_received,bytes_sent=$bytes_sent,status=0WHERE trusted_ip='$trusted_ip' AND trusted_port=$trusted_port ANDremote_ip='$ifconfig_pool_remote_ip' AND username='$common_name' ANDstatus=1" $DB
mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SETactive=0 WHERE user.username IN (SELECT username FROM (SELECT log.username ASusername, quota_bytes FROM user, log WHERE log.username='$common_name' ANDlog.username=user.username AND log.status=0 ANDTO_DAYS(NOW())-TO_DAYS(start_time)< =quota_cycle GROUP BY log.usernameHAVING SUM(bytes_received)+SUM(bytes_sent)>=quota_bytes) AS u);" $DB
chmod +x /etc/open***/connect.sh
chmod +x/etc/open***/disconnect.sh

  使用cron 每天對用戶進行檢查以上操作在用戶超過流量時自動將用戶鎖定。每天還應該執行一次檢查,把已經恢復流量的用戶解鎖。可以通過cron實現此功能。

vi /etc/cron.daily/open***#每天定時執行腳本
#!/bin/bash
DB='open***'
DBADMIN='open***'
DBPASSWD='password'
mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SETactive=1" $DB
mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SETactive=0 WHERE user.username IN (SELECT username FROM (SELECT log.username ASusername, quota_bytes FROM user, log WHERE log.username=user.username ANDlog.status=0 AND TO_DAYS(NOW())-TO_DAYS(start_time)< =quota_cycle GROUP BYlog.username HAVING SUM(bytes_received)+SUM(bytes_sent)>=quota_bytes) ASu);" $DB
mysql -u$DBADMIN -p$DBPASSWD -e "UPDATE user SETactive=0 WHERE enabled=0" $DB
chmod +x /etc/cron.daily/open***

7.3配置open***客戶端(windows)

  需要先安裝windows下的客戶端,客戶端分爲32位版本和64位兩種,下載後正常安裝。安裝完成後在“C:\Program Files\Open×××\config\”下將client1.key、client1.crt和ca.crt放入該文件夾,同時建立以下客戶端配置文件如myopen***.o***,詳情如下所示。

client
devtun
protoudp
remote 遠程IP 1194
resolv-retry infinite
nobind
persist-key
persist-tun
--ca ca.crt
--cert client1.crt
--key client1.key
auth-user-pass
ns-cert-type server
keepalive 20 60
comp-lzo
verb 3
mute 20
route-method exe
route-delay 2

  客戶端啓動open***後選擇連接(connect)後輸入用戶驗證的用戶名和密碼,撥入成功後如圖十二、十三、十四所示。

圖十二、open***客戶端

圖十三、open***客戶端

圖十四、open***客戶端

7.4配置open***客戶端(ubuntu)

sudo apt-get open***
sudocp/usr/share/doc/open***/examples/sample-config-files/client.conf /etc/open***/
sudocp /home/hd123/ca.crt ./
sudocp /home/hd123/client1.*./
sudo vi/etc/open***/client.conf
sudoopen*** --config/etc/open***/client.conf#啓動客戶端

八、啓動並測試open***

8.1啓動open***

  在服務器端啓動open***服務。運行以下指令後open***服務器端會啓動相應服務,服務啓動後可查看配置文件中設定的日誌定位存在的問題,啓動成功後會在系統中生成一塊tun0網卡,如圖十五所示。

serviceopen*** start

圖十五、MySQL組件安裝

8.2啓用系統路由轉發

vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_redirects = 0
sysctl -p

8.3配置防火牆

:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [11:874]
-A INPUT -m state --stateRELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p udp -m udp--dport 1194 -j ACCEPT
-A INPUT -itun+ -j ACCEPT
-A INPUT -p tcp -m state--state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p udp -m state--state NEW -m udp --dport 1194 -j ACCEPT
-A INPUT -j REJECT--reject-with icmp-host-prohibited
-A FORWARD -itun+ -o eth0 -jACCEPT
-A FORWARD -i eth0 -o tun+ -jACCEPT
-A FORWARD -j REJECT--reject-with icmp-host-prohibited
-A OUTPUT -o eth0 -p udp -mudp --sport 1194 -j ACCEPT
-A OUTPUT -o tun+ -j ACCEPT
-A FORWARD -j REJECT--reject-with icmp-host-prohibited
-A OUTPUT -o eth0 -p udp -mudp --sport 1194 -j ACCEPT
-A OUTPUT -o tun+ -j ACCEPT
-A OUTPUT -o eth0 -p icmp -jACCEPT
-A OUTPUT -o eth0 -p tcp -mtcp --sport 22 -j ACCEPT
COMMIT




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章