如果安裝好 OpenVPN 其實可以使用他預設的製作金鑰來連線,但是要新增帳號或者管理帳號這部分就比較麻煩,所以還是用帳號密碼做管理比較容易

首先先安裝以下編譯程式需要的日常庫

yum -y install gcc gcc-c++ autoconf libjpeg libjpeg-devel \
libpng libpng-devel freetype freetype-devel libxml2 \
libxml2-devel zlib zlib-devel glibc glibc-devel glib2 \
glib2-devel bzip2 bzip2-devel ncurses ncurses-devel curl \
curl-devel e2fsprogs e2fsprogs-devel krb5 krb5-devel libidn \
libidn-devel openssl openssl-devel openldap openldap-devel \
nss_ldap openldap-clients openldap-servers -y

下面安装 pam 组件

yum install pam_krb5 pam_mysql pam pam-devel -y

我們需要安裝 mysql 服務器

yum install mysql mysql-server mysql-devel mysql-libs -y

登錄 mysql 建立一個驗證用的測試數據庫,添加使用者帳號

mysql -u root -p
mysql> create database vpn;
mysql> GRANT ALL ON vpn.* TO vpn@localhost IDENTIFIED BY ‘vpn123’;
mysql> flush privileges;mysql> use vpn;
mysql> CREATE TABLE vpnuser (
-> name char(20) NOT NULL,
-> password char(128) default NULL,
-> active int(10) NOT NULL DEFAULT 1,
-> PRIMARY KEY (name)
-> );
mysql> insert into vpnuser (name,password) values(‘user1’,password(‘123456’));

在 /etc/pam.d/ 下建立一個配置文件

vim /etc/pam.d/openvpn

輸入以下內容並保存

auth sufficient pam_mysql.so user=vpn passwd=vpn123 host=localhost db=vpn table=vpnuser usercolumn=name passwdcolumn=password where=active=1 sqllog=0 crypt=2
account required pam_mysql.so user=vpn passwd=vpn123 host=localhost db=vpn table=vpnuser usercolumn=name passwdcolumn=password where=active=1 sqllog=0 crypt=2
#crypt(0) — Used to decide to use MySQL’s PASSWORD() function or crypt()
#0 = No encryption. Passwords in database in plaintext. NOT recommended!
#1 = Use crypt
#2 = Use MySQL PASSWORD() function

現在可以測試 pam_mysql 是否工作正常,但這個動作之前需要安裝 sasl

yum install cyrus-sasl cyrus-sasl-plain cyrus-sasl-devel cyrus-sasl-lib cyrus-sasl-gssapi -y

測試是否成功

saslauthd -a pam
saslauthd -a pamtestsaslauthd -u user1 -p 123456 -s openvpn

如果成功,顯示 0: OK 「Success.」,pam_mysql 工作正常了

下面可以開始配置 OpenVPN 服務器了。

這裡需要有一部非常重要的步驟,2.1 以上的 OpenVPN 的 openvpn-auth-pam.so 都會出現驗證錯誤的問題,這裡需要我們重新編譯一個低版本的,我這裡用 2.0.7 的,大家也可以使用 2.0.9 版本的。

cd /etc/openvpn
mkdir tmp
cd tmp
wget http://kttsite.com/download/openvpn-2.0.7.tar.gz
tar zxvf openvpn-2.0.7.tar.gz
cd openvpn-2.0.7
./configure
cd plugin/auth-pam/
make
cp openvpn-auth-pam.so /etc/openvpn/

之後在伺服器端的 conf 檔中加入以下

client-cert-not-required
username-as-common-name
#這裡是指定 openvpn-auth-pam.so 這個插件
plugin ./openvpn-auth-pam.so openvpn

客戶端的 conf 檔

client
dev tun
proto udp
remote (伺服器IP) (伺服器port)
cipher (所使用的加密)
resolv-retry infinite
nobind
persist-key
persist-tun
ca ca.crt
auth-user-pass
comp-lzo
verb 3

如果要讓客戶端連線時自動輸入帳號密碼可以在客戶端 conf 中的 auth-user-pass 結尾加上 檔案名稱+副檔名
auth-user-pass account.txt
並在同一個目錄底下新增一個 account 的 txt 檔
在第一行打上帳號,第二行打上密碼儲存即可