Linux中如何使用Openswan建立站點到站點的IPsec VPN隧道?
譯文虛擬專用網(VPN)隧道用來通過基于互聯網的一條隧道,將兩個不同的物理網絡安全地互聯起來。不同的網絡是擁有全局非路由專用IP地址的專用以太網子網時,就需要隧道機制,因為這些子網無法通過基于互聯網的傳統路由連接到對方。比如說,常常建立VPN隧道,連接屬于同一家機構的使用網絡地址轉換(NAT)技術的不同分支機構網絡。
有時候,還可能僅僅為了安全方面的考慮而使用VPN隧道機制。服務提供商或私營公司以這樣一種方式來設計其網絡:關鍵的服務器(比如數據庫、VoIP或銀行業務服務器)部署在只有可信賴的人員通過VPN隧道才能訪問的子網中。需要安全的VPN隧道時,IPsec常常是一個優先的選擇,因為IPsec VPN隧道采用了多層安全機制來加以保護。
本教程將演示我們在Linux中使用Openswan建立站點到站點的VPN隧道有多容易。
拓撲結構
本教程將著重介紹用于建立IPsec隧道的下列拓撲結構。
安裝軟件包和準備VPN服務器
通常情況下,你只要管理站點A,但是根據實際需要,你有可能同時管理站點A和站點B。我們先從安裝Openswan開始入手。
在基于紅帽的系統上(CentOS、Fedora或RHEL):
- # yum install openswan lsof
在基于Debian的系統上(Debian、Ubuntu或Linux Mint):
- # apt-get install openswan
現在,我們使用下面這些命令,禁用服務器中的VPN重定向,如果有VPN重定向的話:
- # for vpn in /proc/sys/net/ipv4/conf/*;
- # do echo 0 > $vpn/accept_redirects;
- # echo 0 > $vpn/send_redirects;
- # done
下一步,我們改動內核參數,允許IP轉發、永久性禁止重定向。
- # 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
我們開啟防火墻的必要端口。務必確保規則與現有的防火墻規則沒有沖突。
- # 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
最后,我們為NAT創建防火墻規則。
- # iptables -t nat -A POSTROUTING -s site-A-private-subnet -d site-B-private-subnet -j SNAT --to site-A-Public-IP
務必確保防火墻規則具有持續性。
注意:
•你可以使用MASQUERADE來代替SNAT。按道理來說它應該可以,但在過去導致我的虛擬專用服務器(VPS)出現過問題。所以,如果我是你,就會使用SNAT。
•如果你同時在管理站點B,就在站點B服務器中創建類似的規則。
•直接路由不需要SNAT。
準備配置文件
我們將要處理的第一個配置文件是ipsec.conf。無論你配置的是哪臺服務器,總是將你的站點想成“left”,將遠程站點想成“right”。下列配置在站點A的VPN服務器中完成。
- # vim /etc/ipsec.conf
- ## 基本的配置參數##
- 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
- ## 禁用紅帽中的隨機加密## oe=off
- ## 禁用Debian中的隨機加密##
- ## 注意:這是一個單獨的聲明語句## include /etc/ipsec.d/examples/no_oe.conf
- ## 紅帽中的連接定義## conn demo-connection-redhat
- authby=secret
- auto=start
- ike=3des-md5
- ## 第1個階段## keyexchange=ike
- ## 第2個階段## phase2=esp
- phase2alg=3des-md5
- compress=no
- pfs=yes
- type=tunnel
- left=<siteA-public-IP>
- leftsourceip=<siteA-public-IP>
- leftsubnet=<siteA-private-subnet>/netmask
- ## 針對直接路由## 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個階段 ## keyexchange=ike
- ## 第2個階段 ## esp=3des-md5
- pfs=yes
- type=tunnel
- left=<siteA-public-IP>
- leftsourceip=<siteA-public-IP>
- leftsubnet=<siteA-private-subnet>/netmask
- ## 針對直接路由## leftsubnet=<siteA-public-IP>/32
- leftnexthop=%defaultroute
- right=<siteB-public-IP>
- rightsubnet=<siteB-private-subnet>/netmask
可以通過幾種不同的方式來進行驗證。本教程將探討預共享密鑰的使用,該密鑰被添加到文件/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"
開啟服務和故障排查
服務器現在應該準備好建立站點到站點的VPN隧道了。要是你還管理站點B,務必確保已配置好了站點B服務器的必要參數。如果是基于紅帽的系統,務必確保你使用chkconfig命令,將服務添加到啟動項中。
- # /etc/init.d/ipsec restart
要是兩端的服務器都沒有錯誤,現在隧道應該已建立起來。考慮到下列因素,你可以使用ping命令來測試隧道了。
1. 站點B專用子網應該無法從站點A來訪問;也就是說,要是隧道未建立起來,ping應該不管用。
2. 隧道建立起來后,試著從站點A用ping連通站點B專用子網。這應該管用。
另外,通向目的地專用子網的路由應該出現在服務器的路由表中。
- # ip route
- [siteB-private-subnet] via [siteA-gateway] dev
- eth0 src [siteA-public-IP]
- default via [siteA-gateway] dev eth0
此外,我們可以使用下面這些實用命令,檢查隧道的狀態。
- # service ipsec status
- IPsec running - pluto pid: 20754
- pluto pid 20754
- 1 tunnels up
- some eroutes exist
- # ipsec auto --status
- ## 輸出被截斷##
- 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;
- ## 輸出被截斷##
- 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
- ## 輸出被截斷##
- 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還應該含有驗證、密鑰交換方面的實用信息,以及隧道不同階段方面的信息。要是你的隧道沒有出現,還應該檢查日志文件。.
如果你確信所有配置正確無誤,如果你的隧道仍然沒有出現,就應該檢查下列方面。
- 1. 許多互聯網服務提供商(ISP)對IPsec端口進行過濾。確保你的ISP允許UDP 500端口和TCP/UDP 4500端口。你可以通過telnet,試著從遠程位置連接至你服務器的IPsec端口。
- 2. 確保服務器的防火墻中允許必要的端口。
- 3. 確保預共享密鑰在兩端的服務器中一模一樣。
- 4. left和right參數在兩端的服務器上都應該合理配置。
- 5. 如果你在NAT方面遇到了問題,試著使用SNAT,而不是MASQUERADING。
總之,本教程著重介紹了在Linux中使用Openswan建立站點到站點的IPSec VPN隧道這個過程。VPN隧道在增強安全性方面非常有用,因為它們讓管理員們可以做到只通過隧道才能訪問關鍵資源。另外,VPN隧道確保了傳輸中數據安全可靠,不會被人竊聽或截獲。
但愿本文有所幫助。歡迎交流心得。
英文原文:http://xmodulo.com/2014/08/create-site-to-site-ipsec-vpn-tunnel-openswan-linux.html