歡迎您光臨本站 註冊首頁

基於IPsec的虛擬專用網在Linux上的實現--安裝配置篇

←手機掃碼閱讀     火星人 @ 2014-03-12 , reply:0
  --------------------------------------------------------------------------------
2001年2月14日 討論區 新聞中心 技術文獻 軟體中心 關於本站 聯繫本站
首頁>>技術文獻



基於IPsec的虛擬專用網在Linux上的實現--安裝配置篇
2000-12-29 6:31

發布者:Crystal 閱讀次數:215
上一篇我們介紹了基於IPsec的VPN的基本原理, 現在我們來看看具體怎麼配置自己的虛擬專用網.

1. VPN的類型

關於如何組建VPN, 有的公司付費購買專門的軟體, 而有的公司用自己的路由器來實現, 因為很多路由器內嵌VPN功能. 這些VPN可以像SSH隧道一樣簡單, 也可以做的很複雜. 所有的方案都有一個共同點, 那就是必須在不安全的互連網創建一個虛擬的安全的隧道. VPN主要有以下類型:

IPsec

VPND

SSH

諸如一些CISCO路由器(內嵌VPN功能)

2. 我推薦的選擇 FreeS/WAN

上面如此多的選擇, 為什麼我要選擇Linux上的FreeS/WAN(基於IPsec)來實現VPN呢?

因為從目前的應用情況看, FreeS/WAN是目前最安全的在Linux上的實現方案. 它基於3DES等加密演算法. 另外, 試驗表明SSH和VPND方案缺少FreeS/WAN的某些功能, 而且IPsec被越來越多的其他軟體所支持, 以後的兼容性更好. 例如, NAI的PGPnet就和FreeS/WAN一起工作得很好. 但是, 我認為真正重要的一點是, 它是免費的(Linux也是免費的), 這對於我們國內用戶來說, 不用花大價錢去買專門的軟體, 您只需要向ISP支付一點上網費, 就可以組建自己的廉價的VPN.

3. 它的用途

通過Internet連接2個甚至更多的辦公室(當然是兩地分居的那種);

允許公司的某個職員在千里之外遠程登錄到公司內部網路;

在Internet上, 數據是在一個虛擬的安全通道內傳播;

4. 安裝和配置IPsec和FreeS/WAN1.5

(1)安裝;

如果你的內核版本低於2.2.14, 那麼我強烈建議你升級到2.2.14; 可以從http://www.kernel.org/下載. 按照你自己的要求編譯內核, 開始最好不要IPsec支持(以後再做).

然後到http://www.freeswan.org/ 上下載freeswan-1.5.tar.gz(七月二號出的最新版), 把這個文件放到/usr/src/目錄下, 運行tar zxvf freeswan-1.5.tar.gz解開, 這時候會出現一個新的目錄/usr/src/freeswan-1.5/, 所有的freeswan的源代碼和各種文件都在這個目錄下.

這時候切記當前目錄是/usr/src/freeswan-1.5/, 運行make menugo; 在網路部分, 確定所有IPsec的部分都被選上. 退出菜單, 保存新內核的設置, 注意!!!即使你什麼也沒改, 也必須save, 否則IPsec不會啟動.

現在你需要用新的內核啟動, 運行

cp /usr/src/linux-2.2.14/arch/i386/boot/bzImage /boot/vmlinuz-2.2.14 將bzImage移到

/boot目錄下. 然後運行cp /usr/src/linux-2.2.14/System.map /boot/System.map-2.2.14來創

建新的System.map文件. 最後在/usr/src/linux-2.2.14/下運行make modules; make

modules_install. 編輯/etc/lilo.conf, 將新的內核放到最前面, 運行lilo使之生效.

重新啟動, 你將會看到

IPSec running under FreeS/WAN 1.5 will start up

ipsec0 start up

等字樣, 如果沒有的話, 說明安裝不正確, 需要重新安裝.

(2). VPN的配置

一。 ipsec.conf 文件 (/etc/ipsec.conf)

現在IPsec已經裝好了, 我們需要用它來配置VPN. 典型的, 我們需要兩個網關, 不必

關心那個是左邊的, 那個是右邊的, 只要記住它們是一對, 就好像兩個克隆人. 讓我們看看下面的例子:

Left Net ===== Left Gate --------------------------- Right Gate ===== Right Net
Internet

有關信息如下:

Left Net: 192.168.1.0/24

Left Gate (internal): 192.168.1.1

Left Gate (external): 100.100.100.100

Left Name: North



Right Net: 192.168.2.0/24

Right Gate (internal): 192.168.2.254

Right Gate (external): 200.200.200.200

Right Name: South



現在需要在ipsec.conf文件里創建連接. 注意通信有很多種情況: Net to Net, Left

Gate to Right Net, Left Net to Right Gate, and Gate to Gate. 每一個情況都必須有一個連

接來處理. 我推薦你在對這些連接命名的時候最好能夠反映通信情況. 本例中需要5個

連接, 分別是%default, NorthNet-SouthNet, NorthGate-SouthNet, NorthNet-SouthGate和

NorthGate-SouthGate. 注意名字中不能有空格.配置文件中加入下面內容:

注意%default在文件中已經存在, 它說明了以後的連接所用的加密或認證演算法以及密鑰和spi等, 一般密鑰需要改動. 如下

# defaults for subsequent connection descriptions

conn %default

# How persistent to be in (re)keying negotiations (0 means very).

keyingtries=0

# Parameters for manual-keying testing (DON\T USE OPERATIONALLY).

spi=0x200

esp=3des-md5-96

espenckey=0x01234567_89abcdef_02468ace_13579bdf_12345678_9abcdef0

espauthkey=0x12345678_9abcdef0_2468ace0_13579bdf

然後加入下面的新連接

conn NorthNet-SouthNet

left=100.100.100.100

leftsubnet=192.168.1.0/24

leftfirewall=yes

right=200.200.200.200

rightsubnet=192.168.2.0/24

rightfirewall=yes



conn NorthGate-SouthNet

left=100.100.100.100

right=200.200.200.200

rightsubnet=192.168.2.0/24

rightfirewall=yes



conn NorthNet-SouthGate

left=100.100.100.100

leftsubnet=192.168.1.0/24

leftfirewall=yes

right=200.200.200.200



conn SouthGate-NorthGate

left=100.100.100.100

right=200.200.200.200



注意本文件中在兩個網關設置了防火牆, 這是應該的, 幾乎沒有一個VPN不用防火牆的.

現在我們確定一下在config.setup部分中的變數設置是否正確, 它是如下形式

config setup

interfaces=%defaultroute

klipsdebug=none

plutodebug=none

interfaces選項當用IPsec收發數據包是從哪個網路介面走, 如果設為%defaultroute, 將根據機器的路由表中的路由表項來走. 當然, 你也可以指定網路介面, 例如

interfaces="ipsec0=eth1" (設為第二塊網卡, 偏不從第一塊走).

Klipsdebug和plutodebug是用來打開或關閉調試選項, 即出了問題到/var/log/messages中加入出錯信息.

非常重要的一點!!!兩個網關的ipsec.conf的內容必須完全一致(除了config setup部分允許有差異, 如網卡的選則, conn * 部分必須克隆), 否則IPsec不能處理.

二。ipsec.secrets文件

它是兩個網關之間的對稱加密演算法的密鑰. 兩個網關的這個文件必須完全一致. 如何在兩個網關之間傳輸密鑰呢, 這有點像雞和蛋的問題, 但是不用擔心, 數學家發明了更高級的加密演算法(非對稱加密如RSA), 它是雙方有自己的私鑰和共同的公鑰(壞人可以知道公鑰), 但是雙方都不知道對方的私鑰, 壞人當然也不知道了. 傳送密鑰的時候, 用自己的私鑰和公鑰加密, 對方用對方的私鑰和公鑰解密. 不相信, 去看看RSA演算法. 就是這麼神奇. 當然, 也可以有別的方法, A地網關的管理人員考到小盤上, 送到B地, 不過嘛, 有點可笑.

這個文件應該如下樣子的:

100.100.100.100 200.200.200.200 "jxj52SjRmUu3nVW521Wu135R5k44uU5lR2V3kujT24U1lVumWSkT52Tu11W

Vnm1Vu25lV52k4"

不用解釋, 你可以看出怎麼配置它了.

三。防火牆設置

假設用ipchains, 下面是左邊網關的例子:

ipchains -A input -s 100.100.100.100 -d 0/0 -j ACCEPT

ipchains -A input -s 100.100.100.100 -d 192.168.2.0/24 -j ACCEPT

ipchains -A input -s 192.168.1.0/24 -d 192.168.2.0/24 -j ACCEPT

它允許從自己發向Internet和右邊子網的包, 同時允許從左邊子網發往右邊子網的包.



注意, ipsec.secrets 和 ipsec.conf 的文件必須設為只有root可讀, 普通用戶不能訪問, 以保證安全.

(3)測試

以上說的手工密鑰的加密方式, 自動密鑰加密方式以後再說.

首先啟動我們加的連接, 如下

[root@Tiger /etc]# ipsec manual --up NorthGate-SouthGate

[root@Tiger /etc]# ipsec manual --up NorthGate-SouthNet

[root@Tiger /etc]# ipsec manual --up NorthNet-SouthGate

[root@Tiger /etc]# ipsec manual --up NorthNet-SouthNet

做完上面的, 然後運行下面的命令:

[root@Tiger /etc]# ipsec look 看看其輸出, 如果跟下面的類似就正確了, 否則有問題.

. cs.mynet.net Wed July 8 22:51:45 GAT 2000 -------------------------

192.168.1.0/24 -> 192.168.2.0/24 => tun0x200@192.168.2.254 esp0x202@192.168.2.254

-------------------------

tun0x200@192.168.2.254 IPv4_Encapsulation: dir=out 192.168.1.1 -> 192.168.2.254

esp0x203@192.168.1.1 3DES-MD5-96_Encryption: dir=in iv=0xc2cbca5ba42ffbb6 seq=0 bit=0x00000000 win=0 flags=0x0<>

esp0x202@192.168.2.254 3DES-MD5-96_Encryption: dir=out iv=0xc2cbca5ba42ffbb6 seq=0 bit=0x00000000 win=0 flags=0x0<>

Destination Gateway Genmask Flags MSS Window irtt Iface

192.0.0.0 0.0.0.0 255.255.255.0 U 1500 0 0 eth1

192.168.2.0 192.168.2.254 255.255.255.0 UG 1404 0 0 ipsec0

想知道更多的話, 運行ipsec barf 看看.

現在來檢測我們的工作:通過ping另一端的內部網的機器, 用tcpdump來看介面ipsec0的情況.

假設我們在192.168.2.15上, 執行ping 192.168.1.25, 顯示

64 bytes from 192.168.1.25: icmp_seq=0 ttl=127 time=45.7 ms

64 bytes from 192.168.1.25: icmp_seq=1 ttl=127 time=45.2 ms

64 bytes from 192.168.1.25: icmp_seq=2 ttl=127 time=45.5 ms

64 bytes from 192.168.1.25: icmp_seq=3 ttl=127 time=43.0 ms

……

說明網通了.

在200.200.200.200上執行tcpdump -i ipsec0

tcpdump: listening on ipsec0

21:02:52.873587 > 200.200.200.200 > 192.168.1.25: icmp: echo request

21:02:52.921596 < 192.168.1.25 > 200.200.200.200: icmp: echo reply

21:02:53.890317 > 200.200.200.200 > 192.168.1.25: icmp: echo request

21:02:53.935618 < 192.168.1.25 > 200.200.200.200: icmp: echo reply

21:02:54.890277 > 200.200.200.200 > 192.168.1.25: icmp: echo request

21:02:54.936592 < 192.168.1.25 > 200.200.200.200: icmp: echo reply

21:02:55.890284 > 200.200.200.200 > 192.168.1.25: icmp: echo request

21:02:55.934099 < 192.168.1.25 > 200.200.200.200: icmp: echo reply

……

如果這樣, 表示你的VPN已經初步搭起來了, 你可以做進一步的測試, 比如在某個網關內部網上起一個Web Server, 在另一端的內部網訪問, 同時試著在Internet上截獲數據包, 看看內容有沒有加密.

(4)在啟動機器時啟動連接

因為我們既然設置了VPN, 就希望IPsec連接在網關啟動是自動啟動. 很簡單, 你只需要在

ipsec.conf的config.setup部分加入下面幾行:

pluto=yes

plutoload="NorthGate-SouthGate NorthGate-SouthNet NorthNet-SouthGate NorthNet-SouthNet"

plutostart="NorthGate-SouthGate NorthGate-SouthNet NorthNet-SouthGate NorthNet-SouthNet"

plutowait=no

pluto是freeswan的守護進程.

加入這幾行之後, 運行ipsec setup restart就生效了, 顯示如下:

ipsec_setup: Stopping FreeS/WAN IPSEC... ipsec_setup: Shutting down Pluto:

ipsec_setup: Taking ipsec0 down: ipsec_setup: Misc cleanout:

ipsec_setup: ...FreeS/WAN IPSEC stopped

ipsec_setup: Starting FreeS/WAN IPSEC 1.5... ipsec_setup: KLIPS debug `none\

ipsec_setup: KLIPS ipsec0 on eth0 200.200.200.200/255.255.255.0 broadcast 200.200.200.255

ipsec_setup: Disabling core dumps:

ipsec_setup: Starting Pluto (debug `none\):

ipsec_setup: Loading Pluto database `NorthGate-SouthGate NorthGate-SouthNet NorthNet-SouthGate NorthNet-SouthNet\:

ipsec_setup: Enabling Pluto negotiation:

ipsec_setup: Routing for Pluto conns `NorthGate-SouthGate NorthGate-SouthNet NorthNet-SouthGate NorthNet-SouthNet\:

ipsec_setup: Initiating Pluto tunnel `NorthGate-SouthGate\ (asynchronously):

ipsec_setup: Initiating Pluto tunnel `NorthGate-SouthNet\ (asynchronously):

ipsec_setup: Initiating Pluto tunnel `NorthNet-SouthGate\ (asynchronously):

ipsec_\ (asynchronously):

ipsec_setup: ...FreeS/WAN IPSEC started

如果這樣, 那麼已經成功了. 在每次啟動Pluto守護進程時, 連接自動啟動.

(5)產生真正可用的密鑰

前面用的是一個不安全的測試用的key, 這是很不安全的. 因此, 這個key必須在測試結束后改變掉. 一個叫ranbits的程序產生隨機字元串, 如下運行:

[root@ Tiger /etc]# ipsec ranbits 192 >> ipsec.secrets

它產生一個192個字元的字元串, 然後在ipsec.secrets加上兩個網關的地址就可以了.

5. 參考資料

1) FreeS/Wan Documentation

http://www.freeswan.org/freeswan_trees/freeswan-1.5/doc/

2) O\REILLY Virtual Private Networks 2nd Edition

Charlie Scott, Paul Wolfe & Mike Erwin

3) Linux-IPSEC Mailing List

http://www.freeswan.org/mail.html


[火星人 ] 基於IPsec的虛擬專用網在Linux上的實現--安裝配置篇已經有563次圍觀

http://coctec.com/docs/security/show-post-73013.html