作者 主題: 安裝及架設VPN-CIPE  (閱讀 8552 次)

0 會員 與 1 訪客 正在閱讀本文。

zoob

  • 鑽研的研究生
  • *****
  • 文章數: 776
    • 檢視個人資料
    • http://www.myunix.idv.tw
安裝及架設VPN-CIPE
« 於: 2003-03-03 17:01 »
安裝及架設VPN-CIPE

作者: zoob (vincent@myunix.adsldns.org)

版權聲明:可以任意轉載,轉載時請務必標明原始出處和作者資訊

前言

目前在不同的LAN Node之間,如果要存取彼此之間的內部資料時,最常用的就是互相用專線將2個Node連接起來,來防止透過Internet來存取機密資料時所導致的安全問題。而利用專線來連接的話,也是有被ISP不肖人士來竊取機密資料的風險。透過VPN(Virtual Private Networks)來存取資料,就可以避免此問題,又可透過Internet來存取,藉此節省昂貴的專線費用。此文章則介紹利用目前VPN Solution其中的一種----CIPE(Crypto IP Encapsulation)。

簡介

CIPE是利用UDP協定來傳送編碼後的資料。從 CIPE 1.5版之後,它也可以透過"Public key"的方式來相互驗證(pkcipe)。

CIPE主要分為兩部份:Kernel module和User space daemon

Kernel Module:主要在控制IP封包,傳送及接收編碼後的封包,Kernel module名稱取決於編碼方式和使用的協定。以cipcb.o這個kernel module來說,c代表 CIPE protocol version 3,b代表 使用Blowfish的編碼方式。

User space daemon:主要在管理VPN tunnel的設定。此daemon負責client的認證和交換使用在編碼用途上的key。

CIPE支援了Blowfish、IDEA、CRC-32等編碼及checksum方式。

環境:

OS:RedHat 8.0、RedHat 7.2
CIPE 1.4.xx、CIPE 1.5.4
openssl 0.9.6x

準備工作

CIPE是在i386上所開發完成的。根據作者的說法,它在其他的架構之下"應該"可以運作。CIPE支援了Linux以下的Kernel版本:2.0.*(2.0.12以後)、2.1.*(2.1.103以後)、2.2.*、2.3.*(2.3.48之後)、2.4.*。

如果你要compile CIPE的Source檔案的話,請將你kernel版本的Source(必須和你目前所使用的版本一致!!)假設放置在 /usr/src/linux 目錄下。如果是使用rpm來安裝,則不用此動作。

(1)啟動 IP Forwarding/Gatewaying
代碼: [選擇]
echo 1 > /proc/sysnet/ipv4/ip_forward

(2)檢查是否有CIPE的kernel module(cipcb.o)
Redhat 7.2:/lib/modules/`uname -r`/kernel/drivers/net/cipe/cipcb.o
Redhat 8.0:/lib/modules/`uname -r`/kernel/drivers/addon/cipe/cipcb.o

(3)如果你要使用CIPE 1.5版裡面的PKCIPE的話,你還必須安裝openssl 0.9.6x之後的版本

安裝

安裝部份我分為兩部份來說明:

一、rpm

很簡單的只要直接rpm -ivh cipe-1.x.x.i386.rpm即可安裝完畢

二、compile source code

(1)Download tarball file( http://sites.inka.de/~W1011/devel/cipe.html )

(2)解壓縮至tmp目錄

代碼: [選擇]
tar zxvf cipe-1.x.x.tar.gz

(3)執行compile及install

代碼: [選擇]
./configure --with-linux=/usr/src/linux-`uname -r`;make;make install

configure有許多的選項,你可以執行 ./configure --help來查閱選項或是參考註1

註:
1.你可以從CVS取得最新的版本,敘述如下:

代碼: [選擇]
cvs -d:pserver:anonymous@cvs.cipe-linux.sourceforge.net:/cvsroot/cipe-linux login
cvs -d:pserver:anonymous@cvs.cipe-linux.sourceforge.net:/cvsroot/cipe-linux co cipe-linux


2.Win32部份你可以從 http://cipe-win32.sourceforge.net/ 取得程式

設定

首先假設架構如下圖(Site to Site)



設定部份我分為三種模式來說明:

一、ciped rpm(1.4.x)

(1)首先產生static key:(Router A和Router B的Static Key需相同)

代碼: [選擇]
echo "key `ps aux|md5sum`" > /etc/cipe/options.cipcb0

chmod 400 /etc/cipe/options.cipcb0


註:1.4版或是更新的版本所產生出來的key會與1.4版之前的版本不符合。為解決此問題可用以下敘述來解決,不過最好的辦法就是更新舊版本。

方法1:
代碼: [選擇]
(ps aux|md5sum; ps alx|md5sum) | tr -cd 0-9

方法2:在confiugre時加上 --enable-bug-compatible 即可。

(2)編輯ifcfg-cipcb0

1.從/usr/share/doc/cipe-1.4.5/samples目錄下複製redhat-ifcfg-cipcb0至/etc/sysconfig/network-scripts目錄下,並更名為ifcfg-cipcb0

2.此處所需設定選項請看檔案說明,範例如下:

[Router A]

代碼: [選擇]

#指定CIPE使用的Device Name
DEVICE=cipcb0
#指定是否自動啟動
ONBOOT=yes
#指定使用者是否可以自訂
USERCTL=no
#指定本地端CIPE使用的UDP port
MYPORT=1234
#指定對方的真實ip及CIPE使用的UDP port
PEER=100.0.20.1:1234
#指定遠端的virtaul ip
PTPADDR=192.168.20.1
#指定本地端的virtual ip
IPADDR=192.168.10.1


[Router B]

代碼: [選擇]

#指定CIPE使用的Device Name
DEVICE=cipcb0
#指定是否自動啟動
ONBOOT=yes
#指定使用者是否可以自定
USERCTL=no
#指定本地端CIPE使用的UDP port
MYPORT=1234
#指定對方的真實ip及CIPE使用的UDP port
PEER=100.0.10.1:1234
#指定遠端的virtaul ip
PTPADDR=192.168.10.1
#指定本地端的virtual ip
IPADDR=192.168.20.1


註:注意兩端的Firewall是否有允許彼此之間的UDP連接

(3)啟動ifcfg-cipcb0

代碼: [選擇]
ifup cipcb0

查看cipcb0是否有啟動成功,互相ping看看。

(4)增加route table

如果互相連通LAN底下的(Host X、Host Y),請在Router A和B上增加對方的route table。

Router A

代碼: [選擇]
route add -net 192.168.20.0 netmask 255.255.255.0 gw 192.168.20.1

Router B

代碼: [選擇]
route add -net 192.168.10.0 netmask 255.255.255.0 gw 192.168.10.1

此時請在Host X和Host Y機器上彼此ping看看是否有回應。有的話,恭禧你成功了

二、ciped-cb Tarball file(1.5.x)

(1)請先複製所需的檔案,並將options權限設定為400

代碼: [選擇]
cp /tmp/cipe-1.5.x/samples/* /etc/cipe/
chmod 400 /et/cipe/options


(2)編輯options

此處所需設定選項請看檔案說明或是參考註2,範例如下:

[Router A]

代碼: [選擇]

ptpaddr 192.168.20.1
ipaddr 192.168.10.1
me 100.0.10.1:1234
peer 10.0.20.1:1234
key xxxxxxxxxxxxxxxxxx (xx部份可執行 ps aux|md5sum即可得到範例。


註: 最後面的" - "忽略不要複製,Router A和Router B的Static Key需相同)

[Router B]

代碼: [選擇]

#指定對方的virtual ip
ptpaddr 192.168.10.1
#指定本地端的virtual ip
ipaddr 192.168.20.1
#指定本地端的真實IP及CIPE所使用的UDP port
me 100.0.20.1:1234
#指定對方的真實IP及CIPE所使用的UDP port
peer 100.0.10.1:1234
key xxxxxxxxxxxxxxxxxx (xx部份可執行 ps aux|md5sum即可得到範例。


註:

1.最後面的" - "忽略不要複製,Router A和Router B的Static Key需相同)

2.注意兩端的Firewall是否有允許彼此之間的UDP連接

3.註:1.5版或是更新的版本所產生出來的key會與1.4版之前的版本不符合。為解決此問題可用以下敘述來解決,不過最好的辦法就是更新舊版本。

方法1:
代碼: [選擇]
(ps aux|md5sum; ps alx|md5sum) | tr -cd 0-9

方法2:在confiugre時加上 --enable-bug-compatible 即可。

(3)啟動ciped-cb daemon

代碼: [選擇]
ciped-cb -o /etc/cipe/options

查看cipcb0是否有啟動成功,互相ping看看。

註:
1.如果在啟動時出現/etc/cipe/options: incorrect permissions的訊息,則代表你 -o 後面未指定options的絕對路徑。
2.如果出現kernel: cipcb0: ciped version mismatch f3d2234c -> 25bed682的訊息的話,則代表你的kernel module和cipe daemon的版本不相符,此時,請將/tmp/cipe-1.5.x/`uname -r`-i386-cb/cipcb.o複製至原kernel module的目錄下即可。之後需重新開機

(4)增加route table

如果互相連通LAN底下的(Host X、Host Y),請在Router A和B上增加對方的route table。

Router A

代碼: [選擇]
route add -net 192.168.20.0 netmask 255.255.255.0 gw 192.168.20.1

Router B

代碼: [選擇]
route add -net 192.168.10.0 netmask 255.255.255.0 gw 192.168.10.1

此時請在Host X和Host Y機器上彼此ping看看是否有回應。有的話,恭禧你成功了

(5)增加/usr/local/sbin/ciped-cb -o /etc/cipe/options的敘述至/etc/rc.local裡,使得開機時會自動啟動

三、pkcipe Tarball file(1.5.x)

pkcipe是1.5版以上才提供的工具,它可以提供使用者用public/private key pair的方式來驗證,以避免static key的缺點

(1)設定public key option,範例如下

Router A, /etc/cipe/pk/routerb 內容如下:

代碼: [選擇]
    -----BEGIN PUBLIC KEY-----
     (這裡是Route B的public key)
     -----END PUBLIC KEY-----
     ipaddr  100.0.10.1
     ptpaddr 100.0.20.1


Router B, /etc/cipe/pk/routera 內容如下:

代碼: [選擇]
    -----BEGIN PUBLIC KEY-----
     (這裡是Route A的public key)
     -----END PUBLIC KEY-----
     ipaddr  100.0.20.1
     ptpaddr 100.0.10.1


以上是基本設定。注意: me 和 peer 的選項不必設定。

public/private可由rsa-keygen程式來產生,範例如下:

代碼: [選擇]
rsa-keygen -p keyname

(2)pkcipe主要分為server mode和client mode
在server mode的伺服器上,pkcipe需透過 inetd或是xinetd來啟動。設定步驟如下:
  1. 選擇建立連線的TCP port (這裡我選擇使用TCP 1234.) 範例如下:

     在server端和client端的 /etc/services 裡面增加以下敘述:

代碼: [選擇]
         pkcipe       1234/tcp

[inetd]
  1. /etc/inetd.conf:

代碼: [選擇]
         pkcipe stream tcp nowait root /usr/local/sbin/pkcipe pkcipe

     或是如果你想使用TCP Wrapper來做Access Control的話:

代碼: [選擇]
         pkcipe stream tcp nowait root /usr/sbin/tcpd /usr/local/sbin/pkcipe

  2.重新啟動inetd service

[xinetd]
  1. 請在/etc/xinetd.d目錄下新增一pkcipe檔案,檔案內容如下:

代碼: [選擇]


service pkcipe
{
        disable = no
        socket_type             = stream
        wait                    = no
        user                    = root
        server                  = /usr/local/sbin/pkcipe
        log_on_success  += HOST DURATION
        log_on_failure  += HOST
}



  2.重新啟動xinetd service

(3)在client端部份可透過以下步驟來建立連線

代碼: [選擇]
    pkcipe -c SERVER.MACHINE:pkcipe

在SOCKS模式下,client端要使用 -r SERVER.MACHINE 選項來回報client ip給伺服器端

(4)查看pkcipe是否有啟動成功,互相ping看看。

(5)增加route table

如果互相連通LAN底下的(Host X、Host Y),請在Router A和B上增加對方的route table。

Router A

代碼: [選擇]
route add -net 192.168.20.0 netmask 255.255.255.0 gw 192.168.20.1

Router B

代碼: [選擇]
route add -net 192.168.10.0 netmask 255.255.255.0 gw 192.168.10.1

此時請在Host X和Host Y機器上彼此ping看看是否有回應。有的話,恭禧你成功了

註1:Configure 選項
`--with-linux=dir' Path to the Linux source tree (e.g., `/usr/src/linux').

`--with-linux-include=dir'     Path to the Linux include tree, if you don't have the complete source.  This include tree must still contain all files generated by the kernel configuration process. Using a complete source tree is preferred (necessary on some architectures) because in that case the kernel `Makefile' parameters are also used.

`--with-ssl-includes=dir' Path to the OpenSSL includes, if the script can not find it.

`--with-ssl-libs=dir' Path to the OpenSSL libraries, if the script can not find it.

`--enable-protocol=n' Use encapsulation protocol `n'. The supported values in CIPE 1.5 are 3 and 4. *Note Protocols and ciphers::, for how to choose the right one.  The default is 3.

`--enable-idea' Use the IDEA cipher (default is Blowfish).

`--disable-debug' Disable debugging code in kernel module. Not really useful.

`--disable-dyndev' Disable dynamic device allocation. Not really useful.

`--enable-logfacility=x' Set syslog facility for `ciped' and `pkcipe' (default and usually right is LOG_DAEMON).

`--disable-asm' Disable use of assembler code. Not really useful.

`--enable-name=n' Set a name suffix for the compilation directory.

`--enable-bug-compatible' Use old, broken interpretation of keys. *Note Keys in older CIPE::.

`--disable-send-config' Do not send configuration information to the peer. This is normally sent on startup to help diagnose mismatches, but it is sent
 unencrypted, which may be unwanted.

`--disable-pkcipe' Do not compile and install the PKCIPE tool.

註2:options選項

`device' Name of the CIPE device. If not given, the system picks a free one.
`debug' Don't go background, use stderr instead of syslog. (Independent of the kernel driver debug option.)
`ipaddr' IP address of the CIPE device.
`ptpaddr' IP address of the peer device (i.e. the CIPE device on the other  end). For protocol 3.
`mask' Netmask of the CIPE device. For protocol 4.
`bcast' Broadcast address of the CIPE device. For protocol 4.
`mtu' Device MTU (default: ethernet standard MTU minus all necessary headers)
`metric' Device metric (not sure if this is used anywhere...)
`cttl' Carrier TTL value. If not specified or 0, use the payload packet's  TTL. Default recommendation is 64.
`me' Our carrier UDP address. If either IP or port are not given, the  system picks one and reports it via `ip-up'.
`peer' The other end's carrier UDP address.
`key' The link key. For security reasons, the key has to be set via an  options file, subject to the restrictions described above. The key
should be 128 bits in hexadecimal encoding. (To generate such a beast  from random, try `ps -auxw | md5sum'.)
`nokey' Don't encrypt at all, just encapsulate in UDP. Only with this option,  `key' is not needed.
`socks' Address (port required!) of the SOCKS5 server. *Note SOCKS::.(GSSAPI/Kerberos authentication is not supported)
`tokxc' Timeout (seconds) for key exchange. Default: 10.
`tokey' Dynamic key lifetime. Default: 600 (10 minutes).
`ipup' Script to run instead of `/etc/cipe/ip-up'.
`ipdown' Script to run instead of `/etc/cipe/ip-down'.
`arg' Argument to supply to `ip-up', `ip-down'.
`maxerr' Maximum number of errors before ciped exits. *Note Error handling::.
`tokxts' Key exchange timestamp timeout. Default: 0 (no timestamps).   Set this to 30 to prevent key exchange replay attacks, but only if the peer runs CIPE 1.2 or later and both system clocks are reasonably synchronized.
`ping' Frequency (in seconds) for keep-alive pings. Default is don't send any pings.   The "ping" used here is internal to CIPE, not ICMP ping.
`toping' Timeout for pings. If no answer is received on a keep-alive ping in  this time, it counts as an error, *Note Error handling::. Default is no check for answers.
`dynip' Assume the carrier is on a dynamic IP address. *Note Dynamic carrier::.
`hwaddr' Set the dummy MAC address used in Ethernet mode (protocol 4).
`ifconfig' Require an external `ifconfig' call to configure the interface.
`checksum' Use checksummed UDP carrier packets. Only necessary if the network  does not like unchecksummed packets.

註3:其中一端為dynamic ip,該如何處理?

此問題已可以在CIPE 1.4.0以上的版本可解決。當一端為static ip,一端為dynamic ip時,在dynamic端你必須指定正確的 peer 選項(static ip),並且需指定 ping 選項,dynamic端的ping 選項會在dynamic 端啟動時,告訴static 端目前的dynamic端的ip。而static 端必須為 peer 指定一個無效的ip,並且需指定 maxerr = -1 選項。

如果兩端都為dynamic ip時,你必須使用PKCIPE來解決。

olderboy

  • 憂鬱的高中生
  • ***
  • 文章數: 100
    • 檢視個人資料
安裝及架設VPN-CIPE
« 回覆 #1 於: 2004-01-28 22:00 »
看了大大的大作,小弟我也馬上實作了起來
那我的OS為RedHat 8.0
我升級Kernel至.2.4.20-28-8...

那也上網抓了cipe-1.5.4.tar.gz 抓了下來~
安裝步驟:
tar zxvf cipe-1.5.4.tar.gz
cd cipe-1.5.4
./configure
make
打了make,就出現了下面的訊息了~
/usr/src/linux-2.4.20-28.8/include/asm/string.h:416: warning: function declaration isn't a prototype
gmake[1]: *** [bf.o] Error 1
gmake[1]: Leaving directory `/home/nick/cipe-1.5.4/2.4.20-28.8-i386-cb'
make: *** [all] Error 2


那如改為:
./configure --with-linux=/usr/src/linux-2.4.20-28.8
make
打了make,又出現了下面的訊息:
/usr/src/linux-2.4.20-28.8/include/asm/string.h:416: warning: function declaration isn't a prototype
gmake[1]: *** [bf.o] Error 1
gmake[1]: Leaving directory `/home/nick/cipe-1.5.4/2.4.20-28.8-i386-cb'
make: *** [all] Error 2


在改為:
./configure --with-linux-include=/usr/src/linux-2.4.20-28.8/include
make
make install
這次到了 make install,反又出現下面的訊息:
chmod 700 /etc/cipe /etc/cipe/pk /var/run/cipe
gmake[1]: Leaving directory `/home/nick/cipe-1.5.4/pkcipe'
make: *** No rule to make target `cipe.texinfo', needed by `cipe.info'.  Stop.


不知道為什麼小弟我一直安裝不起來,還請大大指點一下了,謝謝~~