KAME-tools kullanan Linux 2.6 Çekirdeği

Bu bölümde Linux çekirdeğinin ≥2.5.47 ve 2.6.* serilerinde doğal IPsec yığınının (stack) nasıl kullanılacağı açıklanacaktır. Bu IPsec yığınının kurulumu ve yapıladırması FreeS/WAN'dan oldukça farklıdır ve FreeBSD, NetBSD ve OpenBSD gibi *BSD türevlerine benzer.

İlk olarak Linux çekirdeğinin ve kullanıcı araçlarının kurulum ve yapılandırmalarından bahsedeceğim. Daha sonra taşıma ve tünel modlarında elle yapılandırılan bağlantıların ayarlanmasını anlatacağım. Son olarak, önceden paylaşılmış anahtarlar ve X.509 sertifikalrı kullanan otomatik anahtarlamalı bağlantıların kurulmasının üzerinden geçeceğiz. Roadwarriors için destekle bu bölüm sonlanacak.

Kurulum

Kurulum için kullanacağınız Linux çekirdeği en azından 2.5.47 veya 2.6.* olmalıdır. Çekirdeğin kaynak kodlarını http://www.kernel.org adresinden indirebilirsiniz. İndirdikten sonra açıp, yapılandırıp derlemeniz gerekecektir.

cd /usr/local/src
tar xvjf /path-to-source/linux-<version>.tar.bz2
cd linux-<version>
make xconfig
make bzImage
make modules
make modules_install
make install

Bunlar Linux çekirdeğinin yapılandırılıp derlenmesinde en sık kullanılan çekirdek parametreleridir. Eğer özel bir kuruluma ihtiyacınız varsa Çekirdek NASIL belgesinden yararlanabilirsiniz.

Çekirdeği yapılandırırken aşağıdaki özellikleri aktif hale getirmek önemldir:

Networking support (NET) [Y/n/?] y
*
* Networking options
*
PF_KEY sockets (NET_KEY) [Y/n/m/?] y
IP: AH transformation (INET_AH) [Y/n/m/?] y
IP: ESP transformation (INET_ESP) [Y/n/m/?] y
IP: IPsec user configuration interface (XFRM_USER) [Y/n/m/?] y

Cryptographic API (CRYPTO) [Y/n/?] y
HMAC support (CRYPTO_HMAC) [Y/n/?] y
Null algorithms (CRYPTO_NULL) [Y/n/m/?] y
MD5 digest algorithm (CRYPTO_MD5) [Y/n/m/?] y
SHA1 digest algorithm (CRYPTO_SHA1) [Y/n/m/?] y
DES and Triple DES EDE cipher algorithms (CRYPTO_DES) [Y/n/m/?] y
AES cipher algorithms (CRYPTO_AES) [Y/n/m/?] y

Kullandığınız çekirdeğin sürümüne bağlı olarak IPv6 desteğini de açmanız gerekebilir.

Çekirdek derlenip kuruduktan sonra kullanıcı araçlarının kurulumuna geçilebilir. Bu araçları http://ipsec-tools.sourceforge.net/ adresinden indirebilirsiniz. Paketi elle derlerken çekirdek başlıklarının (kernel headers) nerede olduğunu belirtmeniz gerekebilir. Çekirdek başlıklarının en azından 2.5.47 sürümüne ait olması gereklidir.

Uyarı
Eğer çekirdek sürümünüz >= 2.6.10 ise kullanacağınız ipsec-tools da >= 0.5 olmak zorundadır, çünkü bu çekirdeğe daha eski ipsec-tools sürümlerindeki racoon için tanımlı olmayan yeni yönlendirme politikaları eklenmiştir. Bazı Linux dağıtımlarının eski çekirdekler kullansalar bile çokça yama yapıyor olabileceklerini hesaba katın. Bunun için çekirdeğinizdeki yönlendirme politikalarına bakmanız yeterli olacaktır.
./configure --with-kernel-headers=/lib/modules/2.6.X/build/include
make
make install

Artık devam etmek için herşey hazır olmalıdır.

setkey kullanan elle anahtarlanmış bağlantılar

Elle anahtarlanmış bağlantı derken bağlantının kurulumu için gerekli tüm parametrelerin bir yönetici tarafından atandığı bağlantıları kastediyorum. IKE protokolü tarafların kimlik kanıtlamasını otomatik olarak yapmaz ve gerekli parametreleri belirlemez. Güvenlik anlaşmasının tesisinde hangi protokolün, algoritmanın ve anahtarın kullanacağına ve uygun şekilde güvenlik anlaşması veritabanına (SAD) yazılacağına yönetici karar verir.

Taşıma Modu

Bu bölümde önce taşıma modunda nasıl elle anahtarlanmış bağlantının kurulacağını göreceğiz. Bu başlangıç için en iyi yöntemdir çünkü kurulabilecek en basit bağlantı budur. Örnek olarak 192.168.1.100 ve 192.168.2.100 adreslerine sahip iki bilgisayarın IPsec ile haberleştiğini varsayacağız.

SAD ve SPD'de bulunan bütün parametreler setkey komutuyla değiştirilebilir. Bu komutun kılavuz belgesi oldukça açıklayıcı olduğundan burada sadece taşıma modunda bir bağlantı kurulması için ihtiyaç duyulan parametreler açıklanacaktır. setkey eğer setkey -f /etc/setkey.conf şeklinde kullanılırsa istediğiniz bir yapılandırma dosyasını kullanabilir. Uygun bir /etc/setkey.conf dosyası aşağıda verilmiştir.

#!/usr/sbin/setkey -f

# Configuration for 192.168.1.100

# Flush the SAD and SPD
flush;
spdflush;

# Attention: Use this keys only for testing purposes!
# Generate your own keys!

# AH SAs using 128 bit long keys
add 192.168.1.100 192.168.2.100 ah 0x200 -A hmac-md5 
0xc0291ff014dccdd03874d9e8e4cdf3e6;
add 192.168.2.100 192.168.1.100 ah 0x300 -A hmac-md5 
0x96358c90783bbfa3d7b196ceabe0536b;

# ESP SAs using 192 bit long keys (168 + 24 parity)
add 192.168.1.100 192.168.2.100 esp 0x201 -E 3des-cbc 
0x7aeaca3f87d060a12f4a4487d5a5c3355920fae69a96c831;
add 192.168.2.100 192.168.1.100 esp 0x301 -E 3des-cbc 
0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df;

# Security policies
spdadd 192.168.1.100 192.168.2.100 any -P out ipsec
esp/transport//require
ah/transport//require;

spdadd 192.168.2.100 192.168.1.100 any -P in ipsec
esp/transport//require
ah/transport//require;

Elle anahtarlanan bağlantınızı test amacı dışında herhangi bir iş için kullanacaksanız yukarıdaki betikteki anahtarları değiştirmeniz gerekir. Kendi anahtarlarınızı aşağıdaki komutla yaratabilirsiniz:

$ # 128 Bit long key
$ dd if=/dev/random count=16 bs=1| xxd -ps
16+0 Records ein
16+0 Records aus
cd0456eff95c5529ea9e918043e19cbe

$ # 192 Bit long key
$ dd if=/dev/random count=24 bs=1| xxd -ps
24+0 Records ein
24+0 Records aus
9d6c4a8275ab12fbfdcaf01f0ba9dcfb5f424c878e97f888

Anahtarlarınızı yaratırken lütfen gerçekten rasgele anahtar ürettiğinden emin olabileceğiniz /dev/random aygıtını kullanın.

Betik ilk olarak güvenlik anlaşması veritabanını (SAD) ve güvenlik politikası veritabanını (SPD) temizler. Daha sonra AH SA ve ESP SA'ları oluşturur. Bir güvenlik anlaşması SAD'a add komutu ile eklenir. Bu komut parametre olarak kaynak ve hedef IP adreslerine, IPsec protokolüne (ah), SPI (0x200) ve algoritma bilgilerine ihtiyaç duyar. Kimlik denetleme algoritması -A ile belirtilir (şifreleme için -E, sıkıştırma için -C kullanılır, henüz IP sıkıştırması desteklenmemektedir). Algoritma içinde anahtar mutlaka belirtilmelidir. Anahtar çift tırnak içinde “ASCII” veya 0x'i takip eden heksadesimal biçimde yazılabilir.

Linux AH ve ESP için şu algoritmaları destekler: hmac-md5 and hmac-sha, des-cbc ve 3des-cbc. Kısa bir zaman sonra şu algoritmalar da muhtemelen desteklenecektir: basit (şifrelemesiz), blowfish-cbc, aes-cbc, hmac-sha2-256 ve hmac-sha2-512.

SPD'ye güvenlik politikaları spdadd komutu ile eklenir. Hangi paketlerin IPsec ile korunacağı ve hangi protokol ve anahtarların kullanılacağını bu politikalar belirler. Bu komut da parametre olarak korunacak paketlerin kaynak ve hedef IP adresine, korunacak (herhangi bir) protokole (ve porta) ve kullanılacak politikaya (-P) ihtiyaç duyar. Politika yönü (içeri/dışarı), uygulanacak işlemi (ipsec/discard/none), protokolü (ah/esp/ipcomp), modu (transport) ve seviyeyi (use/require) belirler.

Bu yapılandırma dosyası IPsec iletişiminde yer alacak her iki tarafta da oluşturulmalıdır. Yukarıdaki dosya 192.168.1.100 adresli tarafta hiç bir değişikliğe ihtiyaç duymadan çalışırken 192.168.2.100 adresine sahip tarafta paketlerinin yönünün değiştiğini göstermek üzere hafifçe değiştirilmelidir. Bunun en kolay yolu güvenlik politikalarındaki yönleri değiştirmektir: -P in ile -P out'nin yerlerini değiştirmektir. Aşağıda örnek bir dosya var:

#!/usr/sbin/setkey -f

# Configuration for 192.168.2.100

# Flush the SAD and SPD
flush;
spdflush;

# Attention: Use this keys only for testing purposes!
# Generate your own keys!

# AH SAs using 128 bit long keys
add 192.168.1.100 192.168.2.100 ah 0x200 -A hmac-md5 
0xc0291ff014dccdd03874d9e8e4cdf3e6;
add 192.168.2.100 192.168.1.100 ah 0x300 -A hmac-md5 
0x96358c90783bbfa3d7b196ceabe0536b;

# ESP SAs using 192 bit long keys (168 + 24 parity)
add 192.168.1.100 192.168.2.100 esp 0x201 -E 3des-cbc 
0x7aeaca3f87d060a12f4a4487d5a5c3355920fae69a96c831;
add 192.168.2.100 192.168.1.100 esp 0x301 -E 3des-cbc 
0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df;

# Security policies
spdadd 192.168.1.100 192.168.2.100 any -P in ipsec
esp/transport//require
ah/transport//require;

spdadd 192.168.2.100 192.168.1.100 any -P out ipsec
esp/transport//require
ah/transport//require;

Yapılandırma dosyası taraflardaki yerini aldığında setkey -f /etc/setkey.conf komutuyla yüklenebilir. Yüklemenin başarılı olup olmadığı SAD ve SPD görüntülenerek test edilebilir:

# setkey -D
# setkey -DP

Kurulum Şekil 5.11'te gösterilmektedir.

Şekil 5.11. Taşıma modunda AH ve ESP kullanan iki bilgisayar

Taraflardan birinden diğerine ping paketi gönderdiğinizde trafik şifrelenecek ve tcpdump aşağıdaki paketleri gösterecektir:

12:45:39.373005 192.168.1.100 > 192.168.2.100: AH(spi=0x00000200,seq=0x1): 
ESP(spi=0x00000201,seq=0x1) (DF)
12:45:39.448636 192.168.2.100 > 192.168.1.100: AH(spi=0x00000300,seq=0x1): 
ESP(spi=0x00000301,seq=0x1)
12:45:40.542430 192.168.1.100 > 192.168.2.100: AH(spi=0x00000200,seq=0x2): 
ESP(spi=0x00000201,seq=0x2) (DF)
12:45:40.569414 192.168.2.100 > 192.168.1.100: AH(spi=0x00000300,seq=0x2): 
ESP(spi=0x00000301,seq=0x2)

Tünel Modu

Tünel modu her iki taraf da ağ geçidi olarak çalıştığında ve iki ağ arasındaki trafiği koruduğunda kullanılır (Şekil 5.12). Orjinal IP paketleri bir ağ geçidinden diğerine gönderilirken şifrelenir ve kapsüllenir. Karşı taraf ise paketin kapsülünü açar ve orjinal korumasız paketin geçişine izin verir.

Şekil 5.12. İki ağ arasındaki trafiği koruyan iki bilgisayar

Güvenlik anlaşmalarının ve politikaların yapılandırması taşıma moduna çok benzer. Aşağıda bir örneği bulunmaktadır:

#!/usr/sbin/setkey -f

# Flush the SAD and SPD
flush;
spdflush;

# ESP SAs doing encryption using 192 bit long keys (168 + 24 parity)
# and authentication using 128 bit long keys
add 192.168.1.100 192.168.2.100 esp 0x201 -m tunnel -E 3des-cbc 
0x7aeaca3f87d060a12f4a4487d5a5c3355920fae69a96c831 
-A hmac-md5 0xc0291ff014dccdd03874d9e8e4cdf3e6;

add 192.168.2.100 192.168.1.100 esp 0x301 -m tunnel -E 3des-cbc 
0xf6ddb555acfd9d77b03ea3843f2653255afe8eb5573965df 
-A hmac-md5 0x96358c90783bbfa3d7b196ceabe0536b;

# Security policies
spdadd 172.16.1.0/24 172.16.2.0/24 any -P out ipsec
esp/tunnel/192.168.1.100-192.168.2.100/require;

spdadd 172.16.2.0/24 172.16.1.0/24 any -P in ipsec
esp/tunnel/192.168.2.100-192.168.1.100/require;
Uyarı
Kullandığınız Linux çekirdeği 2.6.10 veya daha üstü ise ve paketlerin bilgisayardan dışarı yönlendirilmesi gerekiyorsa ayrıca yönlendirme politikasını da belirtmeniz gerekir. Eğer ipsec-tools'un 0.5 sürümünü kullanırsanız bu politika otomatik olarak yüklenir aksi halde eski araçları kullanarak kendiniz eklemeniz gerekir. setkey komutunu Çekirdek modunda (-k) çalıştırıyprsanız yönlendirme politikasını da elle eklemeniz gerekir.
spdadd 172.16.2.0/24 172.16.1.0/24 any -P fwd ipsec
esp/tunnel/192.168.2.100-192.168.1.100/require;

Bu örnekte sadece ESP protokolü kullanılmıştır. ESP protokolü bütünlüğü ve gizliliği garanti eder. Bu durumda ESP algoritmalarının sırası önemlidir. İlk olarak şifreleme algoritmasını ve anahtarını, ardından ise kimlik kanıtlama algoritmasını ve anahtarını tanımlamanız gereklidir.

Tünelin iki tarafına da bu dosyayı kopyalamanız ve politikaların yönünü (in yerine out) değiştirmeniz gerekir. Yönlendirme politikanız da varsa IP adreslerinin yönlerini de ters çevirmeniz gerekir.

BSD IPsec gerleştirimine benzemeyen bir şekilde Linux'daki bir güvenlik anlaşması tünel ve taşıma mıdlarından sadece biri için kullanılabilir. Taşıma modu öntanımlı mod olduğundan tünel moduna ihtiyaç duyulduğunda güvenlik anlaşması -m tunnel ile tanımlanmalıdır.

Artık güvenlik politikaları korunacak ağların IP adreslerini göstermektedir. Bu adreslerini kaynak ve hedef olarak kullanacak paketler IPsec tarafından korunacaktır. Tünel modu kullanıldığında güvenlik politikası güvenliği gerçekleştirecek tarafların IP adreslerini ve tüneli belirtmelidir. Bu bilgileruygun IPsecSA'yı bulmak için gereklidir.

Tüneliniz çalışmadığında yönlendirmenizi kontrol etmelisiniz. İstemcileriniz diğer ağa gönderecekleri paketleri vpn ağ geçidine göndermeleri gerektiğini bilmelidir. Bunun en kolay çözümü vpn ağ geçidini öntanımlı ağ geçidi yapmaktır.

racoon kullanan otomatik anahtarlamalı bağlantılar

KAME IKE altalan süreci racoon Linux'a da uyarlanmıştır. Bu süreç otomatik anahtarlamalı IPsec bağlantıları kurabilmektedir. Racoon kimlik denetiminde önceden paylaşılan anahtarların, X.509 sertifikaların ve Kerberos'un kullanımını desteklemektedir. Temel, saldırgan ve asıl modlarda kullanılabilir. Bu bölümde racoon yapılandırması önceden paylaşılan anahtar ve X.509 sertifikasıyla nasıl yapıldığı gösterilecektir (Kerberos ile ilgili bölümü yazmayı planlıyorum). Bölüm sonunda bir roadwarrior yapılandırma senaryosu özet olarak verilecektir.

Not

Eğer Linux 2.6.10 (ya da dağıtımınız tarafından yamalanmış 2.6.9 çekirdeği kullanıyorsanız ipsec-tools'un 0.5 sürümüne ihtiyacınız vardır.

Önceden paylaşılmış anahtarlar

racoon kullanarak kimlik denetimi yapmanın en kolay yolu önceden paylaşılmış anahtarları kullanmaktır. Bu anahtarlar /etc/psk.txt dosyasında belirtilmelidir. Yetkisi olmayan kullanıcıların okuyamamaları gereken bu dosya (chmod 400 /etc/psk.txt aşağıdakine benzer olmalıdır:

# IPv4 Adresi
192.168.2.100          simple psk
5.0.0.1                0xe10bd52b0529b54aac97db63462850f3
# USER_FQDN
ralf@spenneberg.net    This is a psk for an email address
# FQDN
www.spenneberg.net     This is a psk

Bu dosya sütunlar halinde organize edilmiştir. İlk sütun önceden paylaşılan anahtar (PSK) ile kimlik knaıtlaması yapılmış olan tarafın kimliğini barındırır. İkinci sütündaki herşey PSK'dır.

racoon yapılandırması dosyadan kolaylıkla anlaşılabilir. Aşağıdaki sıradan bir racoon yapılandırma dosyası /etc/racoon.conf bulacaksınız:

path pre_shared_key "/etc/psk.txt";

remote 192.168.2.100 {
	exchange_mode main;
	proposal {
		encryption_algorithm 3des;
		hash_algorithm md5;
		authentication_method pre_shared_key;
		dh_group modp1024;
		}
}

sainfo address 172.16.1.0/24 any address 172.16.2.0/24 any {
	pfs_group modp768;
	encryption_algorithm 3des;
	authentication_algorithm hmac_md5;
	compression_algorithm deflate;
}

Yapılandırma dosyasında ilk olarak racoon'un önceden paylaşılmış anahtarları nerede bulacağı belirtilir. Daha sonra 192.168.2.100 adresli tarafı ve IKE görüşmesinde kullanılacak parametreleri belirtmek gereklidir. İkinci paragraf ise güvenlik anlaşmasının oluşturulmasında kullanılabilecek parametreleri barındırır. Bu parametreler belirli bir IP adresine özel olabileceği gibi anonim adresler için de olabilir. Bu parametreler arsında SA için kullnaılacak şifreleme, kimlik kanıtlama ve sıkıştırma algoritmaları da bulunur. Bu üç algoritmanın tanımlanması racoon'un hatasız başlayabilmesi için gereklidir.

racoon'un çalıştırıldığında hemen tünel görüşmelerine başlamaz. Bunun yerine bir tünele ihtiyaç duyulana kadar bekler. Bu bilgiyi verebilmesi için çekirdeğin racoon'u nasıl bilgilendireceğini bilmesi gerekir. Bunun için sistem yöneticisi güvenlik anlaşması olmadan güvenlik politikalarını tanımlamalıdır. Linux çekirdeği ne zaman bir paketi güvenlik politikası gereği korumak durumunda kalır ve uygun güvenlik anlaşması bulamazsa, ihtiyaç duyduğu güvenlik anlaşması için racoon'u çağırır. Racoon IKE görüşmelerini başlatır ve sonuçta SA'ları oluşturur. Artık Linux çekirdeği paketleri göndermeye hazırdır.

Varsayılan kurulum için 192.168.1.100 üzerinde aşağıdaki politikalara ihtiyaç vardır:

#!/usr/sbin/setkey -f
#
# Flush SAD and SPD
flush;
spdflush;

# Create policies for racoon
spdadd 172.16.1.0/24 172.16.2.0/24 any -P out ipsec
esp/tunnel/192.168.1.100-192.168.2.100/require;

spdadd 172.16.2.0/24 172.16.1.0/24 any -P in ipsec
esp/tunnel/192.168.2.100-192.168.1.100/require;

Politikalar setkey -f /etc/setkey.conf komutuyla yüklendikten sonra racoon başlatılabilir. racoon deneme amacıyla kullanılacaksa racoon -F -f /etc/racoon.conf ile başlatılmalıdır. Diğer tarafın yapılandırması ters yönleri gösterecek şekilde yeniden düzenlenmelidir. /etc/psk.txt, /etc/setkey.conf ve /etc/racoon.conf dosyalarındaki IP adresleri değiştirilmelidir.

Tünelin kurulduğu aşağıdaki gibi günlüklerden (log) takip edilebilir:

2003-02-21 18:11:17: INFO: main.c:170:main(): @(#)racoon 20001216 20001216
 sakane@kame.net
2003-02-21 18:11:17: INFO: main.c:171:main(): @(#)This product linked Open
SSL 0.9.6b [engine] 9 Jul 2001 (http://www.openssl.org/)
2003-02-21 18:11:17: INFO: isakmp.c:1365:isakmp_open(): 127.0.0.1[500] use
 d as isakmp port (fd=7)
2003-02-21 18:11:17: INFO: isakmp.c:1365:isakmp_open(): 192.168.1.100[500]
 used as isakmp port (fd=9)
2003-02-21 18:11:37: INFO: isakmp.c:1689:isakmp_post_acquire(): IPsec-SA r
equest for 192.168.2.100 queued due to no phase1 found.
2003-02-21 18:11:37: INFO: isakmp.c:794:isakmp_ph1begin_i(): initiate new 
phase 1 negotiation: 192.168.1.100[500]<=>192.168.2.100[500]
2003-02-21 18:11:37: INFO: isakmp.c:799:isakmp_ph1begin_i(): begin Identit
y Protection mode.
2003-02-21 18:11:37: INFO: vendorid.c:128:check_vendorid(): received Vendor
 ID: KAME/racoon
2003-02-21 18:11:37: INFO: vendorid.c:128:check_vendorid(): received Vendor
 ID: KAME/racoon
2003-02-21 18:11:38: INFO: isakmp.c:2417:log_ph1established(): ISAKMP-SA es
tablished 192.168.1.100[500]-192.168.2.100[500] spi:6a01ea039be7bac2:bd288f
f60eed54d0
2003-02-21 18:11:39: INFO: isakmp.c:938:isakmp_ph2begin_i(): initiate new p
hase 2 negotiation: 192.168.1.100[0]<=>192.168.2.100[0]
2003-02-21 18:11:39: INFO: pfkey.c:1106:pk_recvupdate(): IPsec-SA establish
ed: ESP/Tunnel 192.168.2.100->192.168.1.100 spi=68291959(0x4120d77)
2003-02-21 18:11:39: INFO: pfkey.c:1318:pk_recvadd(): IPsec-SA established:
 ESP/Tunnel 192.168.1.100->192.168.2.100 spi=223693870(0xd554c2e)

X.509 Sertifikaları

Racoon kimlik denetimi için X.509 sertifikalarının kullanımını destekler. Bu sertifikalar bir sertifika otoritesinden (CA) kontrol edilebilirler. Yapılandırma PSK yapılandırmasına çok benzer, sadece kimlik kanıtlama bölümü farklıdır:

path certificate "/etc/certs";

remote 192.168.2.100 {
	exchange_mode main;
	certificate_type x509 "my_certificate.pem" "my_private_key.pem";
	verify_cert on;
	my_identifier asn1dn;
	peers_identifier asn1dn;
	proposal {
		encryption_algorithm 3des;
		hash_algorithm md5;
		authentication_method rsasig;
		dh_group modp1024;
	}
}
					
sainfo address 172.16.1.0/24 any address 172.16.2.0/24 any {
	pfs_group modp768;
	encryption_algorithm 3des;
	authentication_algorithm hmac_md5;
	compression_algorithm deflate;
}

Sertifika ve özel anahtar /etc/certs dizininde bulunur. Bu dizinin yolu yapılandırma dosyasında path certificate değişkeninde belirtilir. Sertifikalar ve sertifika iptal listeleri openssl ile oluşturulan PEM dosya biçiminde saklanırlar. Bu sertifikaların oluşturulmasıyla ilgili bilgileri X.509 Sertifikaları Oluşturmak bölümünde bulabilirsiniz. Eğer tarafların sertifikaları bir sertifika otoritesinden kontrol edilecekse (öntanımlı değer olan verify_cert on ise) CA'nın sertifikası da bu dizinde bulundurulmalıdır. OpenSSL'in sertifikayı bulabilmesi için ya adı değiştirilmeli ya da hash'i alınmış (hashed) dosyaya sembolik bağ oluşturulmalıdır:

ln -s CAfile.pem `openssl x509 -noout -hash < CAfile.pem`.0

Eğer sertifika bir CRL dosyası ile de kontrol edilecekse bu CRL dosyası da aynı dizinde, yukarıdaki gibi bir isimle bulundurulmalıdır:

ln -s CRLfile.pem `openssl x509 -noout -hash < CAfile.pem`.r0

Sertifikaları ve özel anahtarı saklarken racoon'un özel anahtarı deşifreleyemeyeceğini unutmamak gerekir. Bu yüzden özel anahtar deşifrelenmiş düz metin formunda saklanmalıdır. Şifrelenmiş bir özel anahtarı aşağıdaki gibi deşifreleyebilirsiniz:

# openssl rsa -in my_private_key.pem -out my_private_key.pem
read RSA key
Enter PEM pass phrase: password
writing RSA key

Roadwarrior

Roadwarrior bir VPN ağ geçidine bağlanmak için bilinmeyen dinamik IP adreslerini kullanan istemcilerdir. racoon ile birlikte kullanımında iki problem ortaya çıkar:

  • IP adresi bilinmediğinden racoon yapılandırma dosyasında veya /etc/psk.txt dosyasında belirtilemez. İstemcinin kimliğini belirlemenin başka bir yolu bulunmalıdır. Önceden paylaşılmış anahtarlar kullanıldığında saldırgan mod seçilmelidir.En iyi çözüm X.509 sertifikalarını kullanmak olacaktır.
  • Hedef IP adresi belirsiz olduğundan racoon için bir güvenlik politikası yaratılamaz. racoon güvenlik politikasını ve güvenlik anlaşmasını bağlantı başlatıldığında oluşturmalıdır.

Bunu yapabilmek için /etc/racoon.conf yapılandırma dosyasında bazı düzenlemelerin yapılması gereklidir:

path certificate "/etc/certs";
	
remote anonymous {
	exchange_mode main;
	generate_policy on;
	passive on;
	certificate_type x509 "my_certificate.pem" "my_private_key.pem";
	my_identifier asn1dn;
	peers_identifier asn1dn;
	proposal {
	encryption_algorithm 3des;
	hash_algorithm md5;
	authentication_method rsasig;
	dh_group modp1024;
	}
}
	
	
sainfo anonymous {
	pfs_group modp1024;
	encryption_algorithm 3des;
	authentication_algorithm hmac_md5;
	compression_algorithm deflate;
}

generate_policy on seçeneği racoon'a yeni bir bağlantı başlatıldığında uygun bir politika yaratması gerekitiğini bildirir. passive on seçeneği ise racoon'un dışarıdan yeni bir bağlatı başlatılana dek pasif halde kalmasını söyler. racoon bir bağlantı başlatmamalıdır.

Yine de en önemli değişiklik remote ve sainfo satırlarındaki anonymous tanımlamasıdır. Bu sayede racoon her yerden gelen bağlantıları kabul edecektir.

Aykırı NAT

Linux 2.6 çekirdeği tünel modunda aykırı NAT yapabilme kapasitesine sahiptir. Transfer modu henüz desteklenmemektedir. Bu ipsec-tools'un 0.3.3 sürümünden itibaren Racoon ile yapılabilir.

Racooon'un aykırı NAT için yapılandırılabilmesi için yapılandırma dosyasına bir çok seçenek eklenmiştir. Bunlar: natt_keepalive, isakmp_natt, nat_traversal dir.

En önemli seçenek nat_traversal'dir. Bu seçeneğe değer olarak on, off veya force değerleri atanabilir. On atandığında, yol üzerinde bir NAT aygıtı algılanır algılanmaz aykırı NAT kullanılmaya başlanır. Off bu özelliğin kullanılmasını iptal eder. force kullanıldığında ise bir NAT aygıtı bulunsun veya bulunmasın aykırı NAT kullanılacaktır.

NAT aygıtlarının çoğu bir trafik olmadığında hızlı bir şekilde kendi iç tablolarındaki girdileri unuttuklarından, racoon ağdan keepalive paketleri göndermeyi önerir. Bu paketler ön tanımlı olarak her 20 saniyede bir gönderilirler. Bu değeri natt_keepalive değişkenini kullanarak değiştirebilirsiniz. Eğer değer olarak 0 verirseniz bu özelliği kapatmış olursunuz.

Aykırı NAT kullanmak isterseniz racoon'un yapılandırma dosyasının listen bölümünde kullanılacak IP adresini ve portu belirtmeniz gerekir. Bu isakmp_natt kullanılarak yapılır.

Örnek olması için aşağıda 192.168.2.100 adresli tarafın 192.168.1.1 adresine sahip NAT aygıtı arkasında olduğu bir durumun yapılandırma dosyası verilmektedir:s

path pre_shared_key "/etc/psk.txt";
			
timer  {
	natt_keepalive 10sec;
	}

listen {
	isakmp 192.168.1.100 [500];
	isakmp_natt 192.168.1.100 [4500];
}
			
remote 192.168.1.1 {
	exchange_mode main;
	nat_traversal on;
	proposal {
		encryption_algorithm 3des;
		hash_algorithm md5;
		authentication_method pre_shared_key;
		dh_group modp1024;
	}
}
			
sainfo address 172.16.1.0/24 any address 172.16.2.0/24 any {
	pfs_group modp768;
	encryption_algorithm 3des;
	authentication_algorithm hmac_md5;
	compression_algorithm deflate;
}

Herşeyi doğru yapılandırmışsanız NAT otomatik olarak algılanacaktır:

2004-12-22 07:34:53: INFO: @(#)ipsec-tools 0.4 (http://ipsec-tools.sourceforge.net)
2004-12-22 07:34:53: INFO: @(#)This product linked OpenSSL 0.9.7a Feb 19 2003 (http://www.openssl.org/)
2004-12-22 07:34:53: INFO: 192.168.1.100[4500] used as isakmp port (fd=6)
2004-12-22 07:34:53: INFO: 192.168.1.100[4500] used for NAT-T
2004-12-22 07:34:53: INFO: 192.168.1.100[500] used as isakmp port (fd=7)
2004-12-22 07:35:09: INFO: respond new phase 1 negotiation: 192.168.1.100[500]<->192.168.1.1[500]
2004-12-22 07:35:09: INFO: begin Identity Protection mode.
2004-12-22 07:35:09: INFO: received Vendor ID: draft-ietf-ipsec-nat-t-ike-02
2004-12-22 07:35:09: INFO: received Vendor ID: RFC XXXX
2004-12-22 07:35:09: INFO: Selected NAT-T version: RFC XXXX
2004-12-22 07:35:09: INFO: Hashing 192.168.1.100[500] with algo #1 
2004-12-22 07:35:09: INFO: NAT-D payload #0 verified
2004-12-22 07:35:09: INFO: Hashing 192.168.1.1[500] with algo #1 
2004-12-22 07:35:09: INFO: NAT-D payload #1 doesn't match
2004-12-22 07:35:09: INFO: NAT detected: PEER
2004-12-22 07:35:10: INFO: Hashing 192.168.1.1[500] with algo #1 
2004-12-22 07:35:10: INFO: Hashing 192.168.1.100[500] with algo #1 
2004-12-22 07:35:10: INFO: Adding remote and local NAT-D payloads.
2004-12-22 07:35:10: INFO: NAT-T: ports changed to: 192.168.1.1[4500]<->192.168.1.100[4500]
2004-12-22 07:35:10: INFO: KA list add: 192.168.1.100[4500]->192.168.1.1[4500]
2004-12-22 07:35:10: INFO: ISAKMP-SA established 192.168.1.100[4500]-192.168.1.1[4500] spi:0613dc09c4ccc828:9cc9dfc9acc82eb5
2004-12-22 07:35:11: INFO: respond new phase 2 negotiation: 192.168.1.100[0]<->192.168.1.1[0]
2004-12-22 07:35:11: INFO: Adjusting my encmode UDP-Tunnel->Tunnel
2004-12-22 07:35:11: INFO: Adjusting peer's encmode UDP-Tunnel(3)->Tunnel(1)
2004-12-22 07:35:11: INFO: IPsec-SA established: ESP/Tunnel 192.168.1.1->192.168.1.100 spi=95762109(0x5b536bd)
2004-12-22 07:35:11: INFO: IPsec-SA established: ESP/Tunnel 192.168.1.100->192.168.1.1 spi=222871470(0xd48bfae)

Hattaki paketlere baktığınızda UDP trafiğinin geriye ve öne çapraz gittiğini göreceksiniz:

[root@bibo root]# tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tap1, link-type EN10MB (Ethernet), capture size 96 bytes
13:37:41.920621 IP 192.168.1.1.isakmp > 192.168.1.100.isakmp: isakmp: phase 1 I ident
13:37:41.941296 IP 192.168.1.100.isakmp > 192.168.1.1.isakmp: isakmp: phase 1 R ident
13:37:42.051826 IP 192.168.1.1.isakmp > 192.168.1.100.isakmp: isakmp: phase 1 I ident
13:37:42.157134 IP 192.168.1.100.isakmp > 192.168.1.1.isakmp: isakmp: phase 1 R ident
13:37:42.353942 IP 192.168.1.1.4500 > 192.168.1.100.4500: UDP, length 72
13:37:42.361530 IP 192.168.1.100.4500 > 192.168.1.1.4500: UDP, length 72
13:37:42.373799 IP 192.168.1.1.4500 > 192.168.1.100.4500: UDP, length 88
13:37:43.374630 IP 192.168.1.100.4500 > 192.168.1.1.4500: UDP, length 1
13:37:43.384476 IP 192.168.1.1.4500 > 192.168.1.100.4500: UDP, length 256
13:37:43.431219 IP 192.168.1.100.4500 > 192.168.1.1.4500: UDP, length 256
13:37:43.436680 IP 192.168.1.1.4500 > 192.168.1.100.4500: UDP, length 56
13:37:44.492976 IP 192.168.1.1.4500 > 192.168.1.100.4500: UDP, length 1
13:37:45.390137 IP 192.168.1.1.4500 > 192.168.1.100.4500: UDP, length 116
13:37:45.390612 IP 192.168.1.100.4500 > 192.168.1.1.4500: UDP, length 116
13:37:46.395603 IP 192.168.1.1.4500 > 192.168.1.100.4500: UDP, length 116
13:37:46.396009 IP 192.168.1.100.4500 > 192.168.1.1.4500: UDP, length 116

Eğer Racoon'u roadwarrior kurulu olmadan sabit adreslerle kullanıyorsanız yukarıdaki gibi güvenlik politikalarınızı da düzenlemeniz gerekir. Yaılacak değişiklikler nat işlemi yapıldıktan sonraki adresleri göstermek olmalıdır. Bu senaryoya uygun politikalar şöyle olmalıdır:

#!/usr/sbin/setkey -f
#
# Flush SAD and SPD
flush;
spdflush;

# Create policies for racoon
spdadd 172.16.1.0/24 172.16.2.0/24 any -P out ipsec
esp/tunnel/192.168.1.100-192.168.1.1/require;

spdadd 172.16.2.0/24 172.16.1.0/24 any -P in ipsec
esp/tunnel/192.168.1.1-192.168.1.100/require;

Racoon yapılandırmanızda generate_policy on yapmışsanız bu politikalar otomatik olarak oluşturulacaktır.