OpenVPN是不同於PPTP、L2TP的另一種VPN軟體包,基於SSL的VPN。OpenVPN使用需要用戶端支援。這裡系統為CentOS6.4。
一、檢查OpenVPN所需環境
OpenVPN需要TUN裝置支援,還需要iptables的nat模組支援。
1、檢查TUN模組:
modinfo tun
顯示如下:
如果報錯則不支援TUN裝置。 2、在OpenVZ虛擬化的VPS上,需要管理員在母雞上開啟TUN/TAP裝置。
cat /dev/net/tun
如果返回:
cat: /dev/net/tun: File descriptor in bad state
VPS的TUN/TAP已經可以使用。
如果返回:
cat: /dev/net/tun: No such device
或者其它,說明TUN/TAP裝置沒有被正確配置,需要與客服溝通開通TUN/TAP。
3、檢查OpenVZ的VPS上iptables是否支援:
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o venet0 -j MASQUERADE
如果返回:
iptables: Unknown error 4294967295
說明支援。
二、編譯安裝OpenVPN
1、安裝依賴環境
yum install -y openssl openssl-devel lzo lzo-devel pam pam-devel automake pkgconfig
2、安裝OpenVPN
wget -c http://swupdate.openvpn.org/community/releases/openvpn-2.3.0.tar.gz tar zxvf openvpn-2.3.0.tar.gz cd openvpn-2.3.0 ./configure make make install mkdir –p /etc/openvpn cp -Rf sample /etc/openvpn/ cd ..
單獨下載easy-rsa,製作ca認證,服務端認證,用戶端認證
#openvpn-2.3.0.tar.gz 該版本源碼不包含easy-rsa,所以需要單獨下載安裝 easy-rsa wget -c https://github.com/OpenVPN/easy-rsa/archive/master.zip unzip master mv easy-rsa-master easy-rsa cp -Rf easy-rsa /etc/openvpn cd /etc/openvpn/easy-rsa/easy-rsa/2.0
三、產生密鑰和認證
vim vars #調到最後找到一下代碼 export KEY_COUNTRY="CN" export KEY_PROVINCE="JN" export KEY_CITY="DZ" export KEY_ORG="lvtao" export KEY_EMAIL="admin@lvtao.net" export KEY_OU="lvtao" #x!儲存退出 ln -s openssl-1.0.0.cnf openssl.cnf chmod +x vars source ./vars ./clean-all #製作ca認證 ./build-ca #製作服務端認證 ./build-key-server server #製作用戶端認證 ./build-key client1 ./build-dh #打包keys tar zcvf keys.tar.gz keys/ #終端發送到用戶端備用 sz keys.tar.gz
#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 |
dh{n}.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 |
cd /etc/openvpn/sample/sample-config-files/ cp server.conf ../../ #配置server.conf,具體參數不再累述 vi ../../server.conf #複製keys cd /etc/openvpn/easy-rsa/easy-rsa/2.0/keys cp -Rf ca.crt server.crt server.key dh2048.pem /etc/openvpn/ # 編輯/etc/sysctl.conf,找到net.ipv4.ip_forward = 0改成net.ipv4.ip_forward = 1儲存。然後執行: sysctl –p #設定nat轉寄.注意最後192.168.122.180改成你的伺服器的IP地址。 iptables -t nat -A POSTROUTING -s 10.8.8.0/24 -j SNAT --to-source 192.168.122.180 /etc/init.d/iptables save /etc/init.d/iptables restart
PS:如果iptables save報錯
iptables: Saving firewall rules to /etc/sysconfig/iptables: /etc/init.d/iptables: line 268: restorecon: command not found
要安裝一個軟體包:
yum install policycoreutils 設定OpenVPN開機自啟動
echo "/usr/local/sbin/openvpn --config /etc/openvpn/easy-rsa/2.0/conf/server.conf &" >> /etc/rc.local
啟動OpenVPN
/usr/local/sbin/openvpn --config /etc/openvpn/easy-rsa/2.0/conf/server.conf >/dev/null 2>&1 &
使用密碼登入配置
修改openvpn服務主設定檔,添加如下內容;如果加上client-cert-not-required則代表只使用使用者名稱密碼方式驗證登入,如果不加,則代表需要認證和使用者名稱密碼雙步驟驗證登入!
tail -3 /etc/openvpn/server.conf auth-user-pass-verify /etc/openvpn/checkpsw.sh via-env client-cert-not-required username-as-common-name
驗證使用者登入指令檔並進行相應的修改,主要改PASSFILE和LOG_FILE兩個變數
#!/bin/sh ########################################################### # checkpsw.sh (C) 2004 Mathias Sundman <mathias@openvpn.se> # # This script will authenticate OpenVPN 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/openvpn/psw-file" LOG_FILE="/var/log/openvpn-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
準備使用者名稱和密碼認證檔案,使用者名稱和密碼用空格隔開,同時確保openvpn啟動使用者可讀取該檔案
vi psw-file lvtao 954270
配置許可權
chmod 400 psw-file chown nobody.nobody psw-file
修改用戶端設定檔
注釋掉
;cert lvtao.crt ;key lvtao.key
增加詢問使用者名稱和密碼
auth-user-pass