最近發現openvpn老不穩定,於是決定使用ipsec的試一下,
折騰了一下,還算可以,也終於在android手機,OS X和WIN7上測試沒問題。
記錄一下,大部分都是網上搜來的,小部分自己試出來的,供參考,有問題歡迎留 言討論,
網上大體有兩種版本,一種是舊版stongswan,基本是六大部,配置也不一樣,我這版是基於5.0以上的,要注意。
測試的機器是cent os 6.5 final
內核版本:
[root@li707-153 etc]# uname -a
Linux li707-153 4.5.0-x86_64-linode65 #2 SMP Mon Mar 14 18:01:58 EDT 2016 x86_64 x86_64 x86_64 GNU/Linux
慮擬機是Xen的,其實不同的慮擬機術區別不大,只是Open VZ的在編譯stongwan時,要加上:enable-kernel-libipsec:
下載最新穩定版strongswan:
wget http://download.strongswan.org/strongswan.tar.gz
我的編譯參數如下:
./configure --enable-eap-identity --enable-eap-md5 --enable-eap-mschapv2 --enable-eap-tls --enable-eap-ttls --enable-eap-peap --enable-eap-tnc --enable-eap-dynamic --enable-eap-radius --enable-xauth-eap --enable-xauth-pam --enable-dhcp --enable-openssl --enable-addrblock --enable-unity --enable-certexpire --enable-radattr --enable-tools --disable-gmp
不過有報錯:
configure: WARNING: unrecognized options: --enable-tools
勿略不管了。
make & make install
安裝一切順利
ipsec version
可以檢測安裝是否成功,如果出現版本號,說明安裝成功
然後就進入製作證書階段:
1.生成CA證書的私鑰
ipsec pki --gen --outform pem > ca.pem
2.使用私鑰,簽名CA證書
ipsec pki --self --in ca.pem --dn "C=com, O=sdmvpn,CN=VPN CA" --ca --outform pem>ca.cert.pem
3.生成服務器證書所需的私鑰:,ipsec pki --gen --outform pem > server.pem
4.用CA證書籤發服務器證書(把這裏的IP地址換成實際的IP,以後連接時,就用此IP地址連接,改成域名也可以)ipsec pki --pub --in server.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=com,O=sdmvpn,CN=1.2.3.4" --san="1.2.3.4" --flag serverAuth --flag ikeIntermediate --outform pem > server.cert.pem
注意以上命令中的”C=”和”O=”的值要與第2步CA中的C,O的值保持一致.5.生成客戶端證書所需的私鑰:
ipsec pki --gen --outform pem > client.pem
6.用CA簽名客戶端證書(C,O的值要與上面第2步CA的值一致,CN的值隨意):
ipsec pki --pub --in client.pem | ipsec pki --issue --cacert ca.cert.pem --cakey ca.pem --dn "C=com, O=myvpn,CN=VPN Client" --outform pem >client.cert.pem
7.生成pkcs12證書:
openssl pkcs12 -export -inkey client.pem -in client.cert.pem -name "client" -certfile ca.cert.pem -caname "VPN CA" -out client.cert.p12
注意以上命令中的”-caname”後面的引號裏的值必須要與第2步CA中的”CN=”的值保持一致.
生成完證書後,開始安裝證書,
其實 就是把證書拷到對應目錄裏,我本來想不拷,然後在配置裏指定絕對路徑,但連接時總連不上,可能有些證書不光是要在配置文件裏配吧
cp -r ca.cert.pem /usr/local/etc/ipsec.d/cacerts/
cp -r server.cert.pem /usr/local/etc/ipsec.d/certs/
cp -r server.pem /usr/local/etc/ipsec.d/private/
cp -r client.cert.pem /usr/local/etc/ipsec.d/certs/
cp -r client.pem /usr/local/etc/ipsec.d/private/
證書安裝完成,接下來配置strongswan,編輯
/usr/local/etc/ipsec.conf
config setup
uniqueids=never
conn iOS_cert
keyexchange=ikev1
# strongswan version >= 5.0.2, compatible with iOS 6.0,6.0.1
fragmentation=yes
left=%defaultroute
leftauth=pubkey
leftsubnet=0.0.0.0/0
leftcert=server.cert.pem
right=%any
rightauth=pubkey
rightauth2=xauth
rightsourceip=10.31.2.0/24
rightcert=client.cert.pem
auto=add
conn android_xauth_psk
keyexchange=ikev1
left=%defaultroute
leftauth=psk
leftsubnet=0.0.0.0/0
right=%any
rightauth=psk
rightauth2=xauth
rightsourceip=10.31.2.0/24
auto=add
conn networkmanager-strongswan
keyexchange=ikev2
left=%defaultroute
leftauth=pubkey
leftsubnet=0.0.0.0/0
leftcert=server.cert.pem
right=%any
rightauth=pubkey
rightsourceip=10.31.2.0/24
rightcert=client.cert.pem
auto=add
conn windows7
keyexchange=ikev2
ike=aes256-sha1-modp1024!
rekey=no
left=%defaultroute
leftauth=pubkey
leftsubnet=0.0.0.0/0
leftcert=server.cert.pem
right=%any
rightauth=eap-mschapv2
rightsourceip=10.31.2.0/24
rightsendcert=never
eap_identity=%any
auto=add
注意:把上面的rightsourceip裏的IP地址換成你想要在客戶端連接後所得到的IP地址段。
編輯/usr/local/etc/strongswan.conf
charon {
duplicheck.enable = no
dns1 = 8.8.8.8
dns2 = 8.8.4.4
nbns1 = 8.8.8.8
nbns2 = 8.8.4.4
filelog {
/var/log/strongswan.charon.log {
time_format = %b %e %T
default=2
append = no
flush_line = yes
}
}
}
配置日誌和DNS
編輯/usr/local/etc/ipsec.secrets
中的用戶名、密碼
: RSA server.pem
: PSK "mykey"
[用戶名] %any : EAP "[密碼]"
<pre name="code" class="plain">[用戶名] %any : XAUTH "[密碼]"
注意,以上配置的意思是指指定RSA的認證證書,PSK方式的認證密鑰(即預共享密鑰)以使組合認證中的EAP的用戶名和密碼以及XAUTH的用戶名和密碼。
本置完後啓動ipsec:
ipsec start
配置IPTABLES腳本:
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.31.0.0/24 -j ACCEPT
iptables -A FORWARD -s 10.31.1.0/24 -j ACCEPT
iptables -A FORWARD -s 10.31.2.0/24 -j ACCEPT
iptables -A INPUT -i eth0 -p esp -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 500 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 500 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 4500 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 1701 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 1723 -j ACCEPT
iptables -A FORWARD -j REJECT
iptables -t nat -A POSTROUTING -s 10.31.0.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.31.1.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.31.2.0/24 -o eth0 -j MASQUERADE
編輯
/etc/sysctl.conf
,將net.ipv4.ip_forward=1
一行前面的#
號去掉,保存後執行sysctl -p
。經過以上配置,使用windows7連接沒有問題,
但用MAC OS X 或手機連後,上不了網,我在
/usr/local/etc/ipsec.conf
又增加了一個conn(這個可以隨便增加,我的理解時,加接時,會根據客戶機請求的類型來匹配最合適的配置)
conn macOSX
keyexchange=ikev1
# strongswan version >= 5.0.2, compatible with iOS 6.0,6.0.1
fragmentation=yes
left=%defaultroute
leftauth=psk
leftsubnet=0.0.0.0/0
right=%any
rightauth=psk
rightauth2=xauth
rightsourceip=10.8.0.0/24
auto=add
這樣都可以連接了,
參孝連接:
https://hjc.im/shi-yong-strongswanda-jian-ipsecikev2-vpn/
http://www.centoscn.com/image-text/config/2015/0815/6011.html
https://zh.opensuse.org/index.php?title=SDB:Setup_Ipsec_VPN_with_Strongswan&variant=zh
最後這個參考的文章寫了很多原理的東西,很不錯,也就是看了他的文章,纔有增加macOSX的配置,詳細的原理,大家參考他的文章吧,我在這就不抄了。