Linux中如何使用Openswan建立站點(diǎn)到站點(diǎn)的IPsec VPN隧道?
譯文虛擬專用網(wǎng)(VPN)隧道用來(lái)通過(guò)基于互聯(lián)網(wǎng)的一條隧道,將兩個(gè)不同的物理網(wǎng)絡(luò)安全地互聯(lián)起來(lái)。不同的網(wǎng)絡(luò)是擁有全局非路由專用IP地址的專用以太網(wǎng)子網(wǎng)時(shí),就需要隧道機(jī)制,因?yàn)檫@些子網(wǎng)無(wú)法通過(guò)基于互聯(lián)網(wǎng)的傳統(tǒng)路由連接到對(duì)方。比如說(shuō),常常建立VPN隧道,連接屬于同一家機(jī)構(gòu)的使用網(wǎng)絡(luò)地址轉(zhuǎn)換(NAT)技術(shù)的不同分支機(jī)構(gòu)網(wǎng)絡(luò)。
有時(shí)候,還可能僅僅為了安全方面的考慮而使用VPN隧道機(jī)制。服務(wù)提供商或私營(yíng)公司以這樣一種方式來(lái)設(shè)計(jì)其網(wǎng)絡(luò):關(guān)鍵的服務(wù)器(比如數(shù)據(jù)庫(kù)、VoIP或銀行業(yè)務(wù)服務(wù)器)部署在只有可信賴的人員通過(guò)VPN隧道才能訪問(wèn)的子網(wǎng)中。需要安全的VPN隧道時(shí),IPsec常常是一個(gè)優(yōu)先的選擇,因?yàn)镮Psec VPN隧道采用了多層安全機(jī)制來(lái)加以保護(hù)。
本教程將演示我們?cè)贚inux中使用Openswan建立站點(diǎn)到站點(diǎn)的VPN隧道有多容易。
拓?fù)浣Y(jié)構(gòu)
本教程將著重介紹用于建立IPsec隧道的下列拓?fù)浣Y(jié)構(gòu)。
安裝軟件包和準(zhǔn)備VPN服務(wù)器
通常情況下,你只要管理站點(diǎn)A,但是根據(jù)實(shí)際需要,你有可能同時(shí)管理站點(diǎn)A和站點(diǎn)B。我們先從安裝Openswan開始入手。
在基于紅帽的系統(tǒng)上(CentOS、Fedora或RHEL):
- # yum install openswan lsof
在基于Debian的系統(tǒng)上(Debian、Ubuntu或Linux Mint):
- # apt-get install openswan
現(xiàn)在,我們使用下面這些命令,禁用服務(wù)器中的VPN重定向,如果有VPN重定向的話:
- # for vpn in /proc/sys/net/ipv4/conf/*;
- # do echo 0 > $vpn/accept_redirects;
- # echo 0 > $vpn/send_redirects;
- # done
下一步,我們改動(dòng)內(nèi)核參數(shù),允許IP轉(zhuǎn)發(fā)、永久性禁止重定向。
- # vim /etc/sysctl.conf
- net.ipv4.ip_forward = 1
- net.ipv4.conf.all.accept_redirects = 0
- net.ipv4.conf.all.send_redirects = 0
重新裝入/etc/sysctl.conf:
- # sysctl -p
我們開啟防火墻的必要端口。務(wù)必確保規(guī)則與現(xiàn)有的防火墻規(guī)則沒(méi)有沖突。
- # iptables -A INPUT -p udp --dport 500 -j ACCEPT
- # iptables -A INPUT -p tcp --dport 4500 -j ACCEPT
- # iptables -A INPUT -p udp --dport 4500 -j ACCEPT
最后,我們?yōu)镹AT創(chuàng)建防火墻規(guī)則。
- # iptables -t nat -A POSTROUTING -s site-A-private-subnet -d site-B-private-subnet -j SNAT --to site-A-Public-IP
務(wù)必確保防火墻規(guī)則具有持續(xù)性。
注意:
•你可以使用MASQUERADE來(lái)代替SNAT。按道理來(lái)說(shuō)它應(yīng)該可以,但在過(guò)去導(dǎo)致我的虛擬專用服務(wù)器(VPS)出現(xiàn)過(guò)問(wèn)題。所以,如果我是你,就會(huì)使用SNAT。
•如果你同時(shí)在管理站點(diǎn)B,就在站點(diǎn)B服務(wù)器中創(chuàng)建類似的規(guī)則。
•直接路由不需要SNAT。
準(zhǔn)備配置文件
我們將要處理的第一個(gè)配置文件是ipsec.conf。無(wú)論你配置的是哪臺(tái)服務(wù)器,總是將你的站點(diǎn)想成“left”,將遠(yuǎn)程站點(diǎn)想成“right”。下列配置在站點(diǎn)A的VPN服務(wù)器中完成。
- # vim /etc/ipsec.conf
- ## 基本的配置參數(shù)##
- config setup
- plutodebug=all
- plutostderrlog=/var/log/pluto.log
- protostack=netkey
- nat_traversal=yes
- virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/16
- ## 禁用紅帽中的隨機(jī)加密## oe=off
- ## 禁用Debian中的隨機(jī)加密##
- ## 注意:這是一個(gè)單獨(dú)的聲明語(yǔ)句## include /etc/ipsec.d/examples/no_oe.conf
- ## 紅帽中的連接定義## conn demo-connection-redhat
- authby=secret
- auto=start
- ike=3des-md5
- ## 第1個(gè)階段## keyexchange=ike
- ## 第2個(gè)階段## phase2=esp
- phase2alg=3des-md5
- compress=no
- pfs=yes
- type=tunnel
- left=<siteA-public-IP>
- leftsourceip=<siteA-public-IP>
- leftsubnet=<siteA-private-subnet>/netmask
- ## 針對(duì)直接路由## leftsubnet=<siteA-public-IP>/32
- leftnexthop=%defaultroute
- right=<siteB-public-IP>
- rightsubnet=<siteB-private-subnet>/netmask
- ## Debian中的連接定義## conn demo-connection-debian
- authby=secret
- auto=start
- ## 第1個(gè)階段 ## keyexchange=ike
- ## 第2個(gè)階段 ## esp=3des-md5
- pfs=yes
- type=tunnel
- left=<siteA-public-IP>
- leftsourceip=<siteA-public-IP>
- leftsubnet=<siteA-private-subnet>/netmask
- ## 針對(duì)直接路由## leftsubnet=<siteA-public-IP>/32
- leftnexthop=%defaultroute
- right=<siteB-public-IP>
- rightsubnet=<siteB-private-subnet>/netmask
可以通過(guò)幾種不同的方式來(lái)進(jìn)行驗(yàn)證。本教程將探討預(yù)共享密鑰的使用,該密鑰被添加到文件/etc/ipsec.secrets中。
- # vim /etc/ipsec.secrets
- siteA-public-IP siteB-public-IP: PSK "pre-shared-key" ## in case of multiple sites ## siteA-public-IP siteC-public-IP: PSK "corresponding-pre-shared-key"
開啟服務(wù)和故障排查
服務(wù)器現(xiàn)在應(yīng)該準(zhǔn)備好建立站點(diǎn)到站點(diǎn)的VPN隧道了。要是你還管理站點(diǎn)B,務(wù)必確保已配置好了站點(diǎn)B服務(wù)器的必要參數(shù)。如果是基于紅帽的系統(tǒng),務(wù)必確保你使用chkconfig命令,將服務(wù)添加到啟動(dòng)項(xiàng)中。
- # /etc/init.d/ipsec restart
要是兩端的服務(wù)器都沒(méi)有錯(cuò)誤,現(xiàn)在隧道應(yīng)該已建立起來(lái)。考慮到下列因素,你可以使用ping命令來(lái)測(cè)試隧道了。
1. 站點(diǎn)B專用子網(wǎng)應(yīng)該無(wú)法從站點(diǎn)A來(lái)訪問(wèn);也就是說(shuō),要是隧道未建立起來(lái),ping應(yīng)該不管用。
2. 隧道建立起來(lái)后,試著從站點(diǎn)A用ping連通站點(diǎn)B專用子網(wǎng)。這應(yīng)該管用。
另外,通向目的地專用子網(wǎng)的路由應(yīng)該出現(xiàn)在服務(wù)器的路由表中。
- # ip route
- [siteB-private-subnet] via [siteA-gateway] dev
- eth0 src [siteA-public-IP]
- default via [siteA-gateway] dev eth0
此外,我們可以使用下面這些實(shí)用命令,檢查隧道的狀態(tài)。
- # service ipsec status
- IPsec running - pluto pid: 20754
- pluto pid 20754
- 1 tunnels up
- some eroutes exist
- # ipsec auto --status
- ## 輸出被截?cái)?#
- 000 "demo-connection-debian": myip=<siteA-
- public-IP>; hisip=unset;
- 000 "demo-connection-debian": ike_life: 3600s;
- ipsec_life: 28800s; rekey_margin: 540s;
- rekey_fuzz: 100%; keyingtries: 0; nat_keepalive:
- yes
- 000 "demo-connection-debian": policy:
- PSK+ENCRYPT+TUNNEL+PFS+UP+IKEv2ALLOW+SAREFTRACK+lKOD+rKO
- D; prio: 32,28; interface: eth0;
- ## 輸出被截?cái)?#
- 000 #184: "demo-connection-debian":500
- STATE_QUICK_R2 (IPsec SA established);
- EVENT_SA_REPLACE in 1653s; newest IPSEC; eroute
- owner; isakmp#183; idle; import:not set
- ## 輸出被截?cái)?#
- 000 #183: "demo-connection-debian":500
- STATE_MAIN_I4 (ISAKMP SA established);
- EVENT_SA_REPLACE in 1093s; newest ISAKMP; lastdpd=-
- 1s(seq in:0 out:0); idle; import:not set
日志文件/var/log/pluto.log還應(yīng)該含有驗(yàn)證、密鑰交換方面的實(shí)用信息,以及隧道不同階段方面的信息。要是你的隧道沒(méi)有出現(xiàn),還應(yīng)該檢查日志文件。.
如果你確信所有配置正確無(wú)誤,如果你的隧道仍然沒(méi)有出現(xiàn),就應(yīng)該檢查下列方面。
- 1. 許多互聯(lián)網(wǎng)服務(wù)提供商(ISP)對(duì)IPsec端口進(jìn)行過(guò)濾。確保你的ISP允許UDP 500端口和TCP/UDP 4500端口。你可以通過(guò)telnet,試著從遠(yuǎn)程位置連接至你服務(wù)器的IPsec端口。
- 2. 確保服務(wù)器的防火墻中允許必要的端口。
- 3. 確保預(yù)共享密鑰在兩端的服務(wù)器中一模一樣。
- 4. left和right參數(shù)在兩端的服務(wù)器上都應(yīng)該合理配置。
- 5. 如果你在NAT方面遇到了問(wèn)題,試著使用SNAT,而不是MASQUERADING。
總之,本教程著重介紹了在Linux中使用Openswan建立站點(diǎn)到站點(diǎn)的IPSec VPN隧道這個(gè)過(guò)程。VPN隧道在增強(qiáng)安全性方面非常有用,因?yàn)樗鼈冏尮芾韱T們可以做到只通過(guò)隧道才能訪問(wèn)關(guān)鍵資源。另外,VPN隧道確保了傳輸中數(shù)據(jù)安全可靠,不會(huì)被人竊聽(tīng)或截獲。
但愿本文有所幫助。歡迎交流心得。
英文原文:http://xmodulo.com/2014/08/create-site-to-site-ipsec-vpn-tunnel-openswan-linux.html