***的分類:
PPTP ***:小區寬帶,家庭路由器會有連接不上的情況。
IPsec ***:主要開源軟件有openswan,適用於點對點網絡,比如公司總部和分部。
open ***:主要適用出差辦公連接公司內部網絡,以及跨機房連接,遠程維護。
---------------------------------------------------------------------------------------------------------------------------------------
Open***部署:
open*** yum安裝:
1.關閉防火牆和selinux
chkconfig iptables off /etc/init.d/iptables stop
2.配置時間同步:
ntpdate pool.ntp.org echo '*/5 * * * * /usr/sbin/ntpdate pool.ntp.org >/dev/null 2>&1' >>/var/spool/cron/root
3.開啓內核轉發
sed -i 's/ net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conf
4.更改yum源:
rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
5.安裝open***
yum install open*** -y yum install easy-rsa -y
6.備份配置文件:
cp server.conf server.conf.bak
vi /etc/open***/server.conf
local 10.86.10.18 port 1194 proto tcp dev tun ca /etc/open***/keys/ca.crt cert /etc/open***/keys/server.crt key /etc/open***/keys/server.key dh /etc/open***/keys/dh2048.pem #注意2.3版本以後是2048.pem不再是1024.pem server 10.8.0.0 255.255.255.0 push "route 192.168.100.0 255.255.255.0" client-to-client duplicate-cn keepalive 10 120 comp-lzo max-clients 100 persist-key persist-tun tls-auth ta.key 0 #開啓TLS,使用ta.key防禦***。服務器端的第二個參數值爲0,客戶端的爲1。 status open***-status.log log /var/log/open***.log verb 3
7.創建CA、服務器key、客戶端key
cd /usr/share/easy-rsa/2.0/ cp vars vars.bak
vi vars #找到以下改成這樣既可
export KEY_COUNTRY="CN" export KEY_PROVINCE="ShanDong" export KEY_CITY="QingDao" export KEY_ORG="Darren" export KEY_EMAIL="[email protected]" export KEY_OU="darren-unit"
source vars ./clean-all
創建ca:
./build-ca #一路回車既可
創建server:
./build-key-server server
創建客戶端test:
./build-key test
創建dh:
./build-dh
創建防ddos***:
open*** --genkey --secret keys/ta.key
拷貝key到服務端和客戶端:
cp -ap keys/ /etc/open***/
客戶端配置:
##################### client dev tun proto tcp remote 192.168.1.115 1194 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert test.crt key test.key tls-auth ta.key 1 ns-cert-type server comp-lzo verb 3 #########################################
open*** 源碼安裝:
實驗環境:
open*** server:eth0 10.86.10.18 eth1 10.1.1.18
配置時間同步:
echo '*/5 * * ** /usr/sbin/ntpdate pool.ntp.org' >>/var/spool/cron/root
開啓內核轉發功能:
net.ipv4.ip_forward= 1
安裝open***所需要的插件:
yum install -y lzo lzo-devel pam pam-devel
安裝open***軟件:
mkdir -p /home/darren/toolshttp://swupdate.open***.org/community/releases/open***-2.2.2.tar.gz cd /home/darren/tools/ tar zxf open***-2.2.2.tar.gz ./configure --with-lzo-headers=/usr/local/include/ --with-lzo-lib=/usr/local/lib make make install
#如果出錯,則安裝: yum install openssl openssl-devel #安裝依賴包
配置open*** server建立CA證書:
服務端和客戶端共用一個CA證書,客戶端有自己的祕鑰,服務端也有自己的祕鑰。後面會生成服務端和客戶端的祕鑰。此處是生成公共的CA證書。
cd /home/darren/tools/ cd open***-2.2.2/easy-rsa/2.0/ cp vars vars.bak
-----------------------
vi vars
export KEY_COUNTRY="CN" exportKEY_PROVINCE="shandong" exportKEY_CITY="qingdao" exportKEY_ORG="darren" exportKEY_EMAIL="[email protected]" [email protected] exportKEY_CN=CN exportKEY_NAME=darren exportKEY_OU=darren exportPKCS11_MODULE_PATH=changeme exportPKCS11_PIN=1234 --------------
source vars #使上面的配置文件生效
./clean-all #此命令會刪除2.0下的keys
重新建立證書:
./build-ca #生成新的ca證書的命令,一路回車即可。
生成服務端證書和祕鑰key文件:
./build-key-serverserver #生成服務端祕鑰的命令,一路回車。
生成客戶端證書和祕鑰key文件:
在open***中,每一個登錄open***的客戶端都要生成一個client證書和key文件,每個證書在同一時刻只允許一個客戶端連接,若建立多個客戶端證書,則重複執行如下步驟即可。
./build-key cuijie #生成客戶端祕鑰的命令,如果想要客戶端連接時需要密碼,則用./build-key-pass cuijie 代替,同樣一路回車即可。
生成一個帶密碼的客戶端:
./build-key-pass cuijie EnterPEM pass phrase: #此處的密碼就是客戶端連接***時需要輸入的密碼,其餘一路回車即可。
生成傳輸進行祕鑰交換時用到的交換祕鑰協議文件:
./build-dh #時間較長,不可強行停止。
生成一個防火牆的文件(爲防止惡意***,如DOS、UDP)
open*** --genkey --secret keys/ta.key
服務端*** server.conf重要參數:
拷貝keys及配置文件:
mkdir /etc/open*** cd /home/darren/tools/ cd open***-2.2.2/easy-rsa/2.0/ cp -ap keys/ /etc/open***/ #拷貝所有的keys cd ../../sample-config-files/ cp client.conf server.conf /etc/open***/
編輯配置文件:
vi /etc/open***/server.conf
local 10.86.10.18 #本地監聽的地址,一般爲eth0網卡IP地址。 port 1194 #默認端口號,改成別的更安全。 proto tcp #默認使用udp協議,生產中建議改爲tcp協議。 dev tun #採用路由的模式,可選tap或tun,這裏設爲默認。 ca keys/ca.crt #公共的ca證書,keys要和server.conf在一個目錄下。 cert keys/server.crt #這裏使用全局路徑,不然啓動時總是自動退出。 key keys/server.key dh keys/dh2048.pem server 10.8.0.0 255.255.255.0 #這是server分配給client的虛擬地址池,不能與其他網段衝突。 push "route 192.168.100.0 255.255.255.0" #此處設爲server內網網段,能夠確保客戶端和***所在內網網段通信。 client-to-client #允許撥號的多個client之間相互通信 duplicate-cn #允許多個客戶端使用同一賬號連接。 keepalive10 120 #每10秒ping一次,120秒未收到則斷開連接。 comp-lzo #開啓壓縮功能 max-clients100 #設置最大允許的client數量,默認是不限制。 persist-key #***超時後,當重啓***時,保持上一次使用的私鑰,而不需重新讀取私鑰。 persist-tun #如果連接超時,重新啓動後,保持tun設備自動連接狀態。 status open***-status.log log open***.log #日誌文件。 verb 3 #指定日誌文件冗餘。
啓動open***:
/usr/local/sbin/open*** --config /etc/open***/server.conf & echo '/usr/local/sbin/open*** --config /etc/open***/server.conf &' >>/etc/rc.local
錯誤:啓動時總是自動退出:然後在相對路徑下去沒有問題。
我第一懷疑的是 配置文件證書和祕鑰的路徑問題,果然改成全局路徑就好了。
或者
cd /home/darren/tools/ cp open***-2.2.2/sample-scripts/open***.init/etc/init.d/open*** chmod 755 /etc/init.d/open*** chkconfig --add open*** chkconfig open*** on /etc/init.d/open*** start
window安裝open***軟件:
下載windows客戶端軟件然後安裝:
https://open***.net/index.php/open-source/downloads.html
下載server端證書和祕鑰:
ca.crt test.key test.crt
拷貝下載的祕鑰文件到安裝open***的config目錄下:
C:\ProgramFiles\Open***\config
在config新建一個文件,命令爲test.o***(注意文件的擴展名不能有其他的)
client dev tun proto tcp remote 10.86.10.18 1194 resolv-retry infinite nobind persist-key persist-tun ca ca.crt cert test.crt key test.key ns-cert-type server comp-lzo verb 3
window右下角點擊connect,成功!
注意:一不小心碰到許多大坑,一定要細心耐心排查。安裝open***時,要選擇對應的版本下載,windows打開軟件時要右鍵以管理員身份運行,不然後報錯。push路由的時候,一定要檢查是否爲***server內網的網段。再就是網關不能有多個,可以添加默認路由,但一般不要這麼做。遇到問題時,一定要思路清晰,冷靜下來看日誌,日誌中出錯的部分可以google大部分問題自己都能解決,不要問別人,靠別人永遠不如靠自己來的可靠。
解決客戶端ping不通服務端所在的內網段地址:
1)更改所有和open*** server同一局域網的網關,網關改爲open***的內網ip地址(此種不太現實)route add default gw 10.1.1.18 2)添加一個網段路由(所有內網服務器都需要添加,也不太現實):route add –net 10.8.0.0/24 gw 10.1.1.18 3)nat方式把10.8.0.0的網段轉換爲10.1.1.0網段:iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth1 -j SNAT --to-source 10.1.1.18
客戶端增加證書:
爲每一個client增加證書:
cd /home/darren/tools/ cd open***-2.2.2/easy-rsa/2.0/ source vars ./build-key-passclient……N 注意:此處不要執行./clean-all
客戶端吊銷證書:
吊銷單個證書:
cd /home/darren/tools/ cdopen***-2.2.2/easy-rsa/2.0/ sourcevars viopenssl-1.0.0.cnf #新版本不用管,舊版本需要註釋後7行。 ./revoke-fulltest #吊銷用戶test證書 llkeys/crl.pem #查看吊銷的證書 catkeys/index.txt #查看吊銷的結果 cpkeys/crl.pem /etc/open***/keys/ #拷貝吊銷的證書到配置文件目錄下 echo ‘crl-verify /etc/open***/keys/crl.pem’>>/etc/open***/server.conf #把吊銷的證書路徑放到配置文件中。 #重啓生效!
吊銷多個證書:
#重複以上步驟即可,覆蓋式類型。
Linux版客戶端安裝:
和服務端安裝步驟一樣,配置如下:
mkdir –p/etc/open***/
vi /etc/open***/client.conf
client devtun prototcp remote10.86.10.18 1194 resolv-retryinfinite nobind persist-key persist-tun ca /etc/open***/keys/ca.crt #注意,客戶端此處要接全路徑 cert /etc/open***/keys/test.crt key /etc/open***/keys/test.key ns-cert-typeserver comp-lzo verb 3
拷貝證書:
cp ca.crt test.key test.crt /etc/open***/
啓動client:
/usr/local/sbin/open***--config /etc/open***/client.conf & echo '/usr/local/sbin/open***--config /etc/open***/client.conf &' >>/etc/rc.local
或者:
cd /home/darren/tools/ cp open***-2.2.2/sample-scripts/open***.init/etc/init.d/open*** chmod755 /etc/init.d/open*** chkconfig–add open*** chkconfigopen*** on /etc/init.d/open***start
########################################################################
#############################open *** 結束###############################
########################################################################
open***跨機房連接:
要求兩端所在的內網相互之間ping通。
A--------------->client .............................server <----------------B
1.兩端內網不能在相同的網段:A: 172.16.10.10 , B :192.168.10.10
2.編輯配置文件,增加一行:echo 'client-config-dir /etc/open***/ccd' >>/etc/open***/server.conf
3.找到open***客戶端的key名字,test.key 把客戶端內網的網段加入到test中:
echo 'iroute 172.16.10.0 255.255.255.0 ' >/etc/open***/test
4.在open*** server.conf中添加一條路由:
echo 'route 172.16.10.0 255.255.255.0' >>/etc/open***/server.conf
5.確保open*** server.conf中打開以下兩項:
client-to-client
push "route 172.16.10.0 255.255.255.0" #此處有疑問,感覺應該是服務端所在內網的路由。
6.在open*** server.conf中需要註釋一行:
#duplicate-cn
這樣就實現了客戶端內網和服務端內網相互之間可以訪問。
----------------------------------------------------------------------------------
open***代理訪問:
配置***通過服務器代理出網實踐:
和之前的server.conf配置相比,需要增加的內容:
push "redirect-gateway def1 bypass-dhcp bypass-dns" push "dhcp-option DNS 8.8.8.8" push "dhcp-option DNS 8.8.4.4"
添加一條nat映射:
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
這樣訪問網站走的就是***線路。
----------------------------------------------------------------------------------------------------------------------------
open***負載均衡和高可用:
1) 首先需要把服務器端keys拷貝到另一臺機器上,然後再將客戶端本地的xxx.o***複製一份,可以命令爲xxx-1.o***、xxx-2.o***,這兩個配置文件需要指定不同的server ip地址。(服務端server.conf中也需要修改ip地址)
注意:如果服務起不來可以嘗試用全局路徑: /usr/local/sbin/open*** --config /etc/open***/server.conf & 如果還不行,把所有open***的服務kill。
2) 首先拷貝服務端keys到另一臺機器上,然後修改客戶端的配置文件:
編輯tracy.o***,添加如下內容:
remote 10.86.10.11 1194 remote 10.86.10.13 1194 remote 10.86.10.14 1194 remote-random #輪詢連接 resolv-retry 60 #60秒重試一次。
open***通過用戶名和密碼登陸:
編輯配置文件server.conf添加如下3行:
auth-user-pass-verify /etc/open***/checkpsw.sh via-env #認證用戶通過腳本
client-cert-not-required #不使用客戶端證書,用戶名和密碼驗證
username-as-common-name #使用客戶端的name做爲common name
獲取checkpsw.sh腳本:
cd /etc/open*** wget http://open***.se/files/other/checkpsw.sh vi checkpsw.sh
#!/bin/sh ########################################################### # checkpsw.sh (C) 2004 Mathias Sundman <mathias@open***.se> # # This script will authenticate Open*** users against # a plain text file. The passfile should simply contain # one row per user with the username first followed by # one or more space(s) or tab(s) and then the password. PASSFILE="/etc/open***/psw-file" LOG_FILE="/var/log/open***-password.log" TIME_STAMP=`date "+%Y-%m-%d %T"` ########################################################### if [ ! -r "${PASSFILE}" ]; then echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE} exit 1 fi CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}` if [ "${CORRECT_PASSWORD}" = "" ]; then echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE} exit 1 fi if [ "${password}" = "${CORRECT_PASSWORD}" ]; then echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE} exit 0 fi echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE} exit 1
----------------------------------------------------------------
chmod +x checkpsw.sh
創建密碼文件:
vi psw-file darren darren123 test test123
在客戶端註釋證書相關的配置,添加如下:
auth-user-pass
完整版客戶端配置:
client dev tun proto tcp remote 10.86.10.14 1194 resolv-retry infinite nobind persist-key persist-tun ca /etc/open***/keys/ca.crt #cert /etc/open***/keys/tracy.crt #去掉此項 #key /etc/open***/keys/tracy.key #去掉此項 ns-cert-type server comp-lzo verb 3 auth-user-pass
open*** 2.2.2故障:客戶端總是彈出用戶名和密碼。
解決:在服務端配置文件中添加:--script-security 3
--------------------------------------------------------------------------------
記錄一次排錯思路:電腦連接***以後,能訪問*** server的內網段,但不能訪問外網段。
解決:首先想到的是push 路由的問題,驗證發現已經push了內網段的路由,外網段不push,client就無法訪問外網段。如果push的路由不正確也會出現無法訪問外網段的問題。比如外網段是10.86.10.0/23,而push的卻是10.86.10./24.