IPsec/Гарын авлага

## 1 IPsec-ийг ойлгох нь 
Энэ хэсэг IPsec-ийг тохируулах процессийг тайлбарлаж FreeBSD болон Microsoft® Windows® 2000/XP машинуудаас тогтох орчинд түүнийг ашиглан тэдгээрийг өөр хоорондоо аюулгүйгээр холбогдох нөхцөлийг бүрдүүлэх талаар зааварлах болно. IPsec-ийг тохируулахын тулд та өөрчлөн тохируулсан цөм бүтээх ухагдахууныг мэдсэн байх шаардлагатай. (http://docs.freebsd.org/doc/6.3-RELEASE/usr/share/doc/mn_MN.UTF-8/books/handbook/kernelconfig.html#KERNELCONFIG-SYNOPSIS-г үзнэ үү)

IPsec нь Интернэт Протокол (IP) давхаргын дээр суудаг протокол юм. Энэ нь хоёр буюу хэд хэдэн хостуудыг аюулгүй байдлаар (нэрээс нь харах юм бол) холбох боломжийг олгодог. FreeBSD IPsec “сүлжээний стек” нь IPv4 болон IPv6 протоколуудыг хоёуланг дэмждэг http://www.kame.net/ шийдэл дээр үндэслэсэн.

Note: FreeBSD нь OpenBSD-ээс авсан “Fast IPsec буюу Хурдан IPsec” гэгддэг “тоног төхөөрөмжөөр хурдасгасан” IPsec стектэй. Энэ нь IPsec-ийн ажиллагааг оновчтой болгохын тулд http://www.freebsd.org/cgi/man.cgi?query=crypto&sektion=4 дэд системийн тусламжтайгаар криптограф тоног төхөөрөмжийг (аль болох бүх газар) хэрэглэдэг. Энэ нь шинэ дэд систем бөгөөд IPsec-ийн KAME хувилбарт байдаг бүх боломжуудыг дэмждэггүй. Гэхдээ тоног төхөөрөмжөөр хурдасгасан IPsec-ийг идэвхжүүлэхийн тулд өөрийн цөмийн тохиргооны файлдаа дараах цөмийн тохируулгыг нэмэх хэрэгтэй:
options  FAST_IPSEC  # new IPsec (cannot define w/ IPSEC)     
IPsec-ийн KAME шийдлийн оронд “Fast IPsec” дэд системийг ашиглах боломж одоогоор байхгүйг тэмдэглэе. Дэлгэрэнгүй мэдээллийг http://www.freebsd.org/cgi/man.cgi?query=fast_ipsec&sektion=4 гарын авлагын хуудаснаас лавлана уу.

Note: Галт хануудад gif(4) туннелийн төлөвийг бас зөв дагаж мөрдөх боломжийг олгохын тулд та өөрийн цөмийн тохиргооны файлдаа IPSEC_FILTERGIF тохируулгыг идэвхжүүлэх хэрэгтэй:

 options   IPSEC_FILTERGIF  #filter ipsec packets from a tunnel

IPsec-ийн KAME шийдлийн оронд “Fast IPsec” дэд системийг ашиглах боломж одоогоор байхгүйг тэмдэглэе. Дэлгэрэнгүй мэдээллийг fast_ipsec(4) гарын авлагын хуудаснаас лавлана уу.

Note: Галт хануудад gif(4) туннелийн төлөвийг бас зөв дагаж мөрдөх боломжийг олгохын тулд та өөрийн цөмийн тохиргооны файлдаа IPSEC_FILTERGIF тохируулгыг идэвхжүүлэх хэрэгтэй:

 options   IPSEC_FILTERGIF  #filter ipsec packets from a tunnel
   
IPsec нь хоёр дэд протоколоос тогтоно:

# Encapsulated Security Payload (ESP) буюу Хайрцаглагдсан Аюулгүй байдлын ачаа нь гуравдагчийн нөлөөллөөс тэгш хэмт криптограф алгоритмийг (Blowfish, 3DES-тэй адил) ашиглан агуулгыг нь шифрлэж IP пакетийн өгөгдлийг хамгаалдаг.

# Authentication Header (AH) буюу Нэвтрэлт Танилтын Толгой нь аюулгүй хэш хийх функцаар IP пакетийн толгойн талбаруудыг хэш хийн криптограф хянах нийлбэрийг тооцоолон гуравдагч этгээдийн нөлөөлөл болон хууран мэхлэлтээс IP пакетийн толгойг хамгаалдаг. Үүний дараа пакет дахь мэдээллийг таниулахыг зөвшөөрөх хэшийг агуулсан нэмэлт толгой байдаг.
ESP болон AH нь орчноосоо хамаараад хоёулаа цуг эсвэл тусдаа ашиглагдаж болно.

IPsec нь хоёр хостын хоорондох урсгалыг шууд шифрлэх (Transport Mode буюу Тээвэрлэх Горим гэгддэг) буюу эсвэл хоёр корпорацийн сүлжээний хооронд аюулгүй холбоонд ашиглагдаж болох “виртуал туннелиуд” (Tunnel Mode буюу Туннелийн Горим гэгддэг) бүтээхэд хэрэглэгдэж болох юм. Сүүлийнх нь ерөнхийдөө Виртуал Хувийн Сүлжээ (VPN) гэгддэг. FreeBSD-ийн IPsec дэд системийн талаар дэлгэрэнгүй мэдээллийг ipsec(4) гарын авлагын хуудаснаас лавлах хэрэгтэй.

Өөрийн цөмдөө IPsec дэмжлэгийг нэмэхийн тулд та дараах тохируулгуудыг цөмийн тохиргоондоо нэмээрэй:

 options   IPSEC        #IP security
 options   IPSEC_ESP    #IP security (crypto; define w/ IPSEC)
     
Хэрэв IPsec дибаг хийх дэмжлэг заавал хэрэгтэй бол дараах цөмийн тохируулга бас нэмэгдсэн байх шаардлагатай:

 options   IPSEC_DEBUG  #debug for IP security
## 2 Асуудал
# VPN-ийг байгуулахад ямар нэг стандарт байхгүй. VPN-үүд нь өөр өөрийн давуу болон сул талуудтай төрөл бүрийн технологиудыг ашиглан хийгдэж болно. Энэ хэсэг нь нэг тохиолдлын загвар үзүүлэх бөгөөд энэ тохиолдол дахь VPN-ийг хийхэд хэрэглэгдэх стратегиудыг харуулах болно.
## 3 Тохиолдол: Интернэтэд холбогдсон, нэг юм шиг ажиллах хоёр сүлжээ
Угтвар нөхцөл дараах маягийн байна:

# Та хамгийн багадаа хоёр сайттай байна

# Хоёр сайт хоёулаа IP-г дотооддоо ашигладаг

# FreeBSD дээр нь ажилладаг гарц компьютераар хоёр сайт хоёулаа Интернэтэд холбогдсон.

# Хоёр сүлжээний гарц компьютер бүр хамгийн багаар бодоход нэг нийтийн IP хаягтай.

# Хоёр сүлжээний дотоод хаягууд нь нийтийн эсвэл хувийн IP хаягууд байж болох юм, энэ нь хамаагүй. Та гарц машин дээр хэрэв шаардлагатай бол NAT ажиллуулсан байж болох юм.

# Хоёр сүлжээний дотоод IP хаягууд мөргөлдөхгүй. Үүнийг ажиллуулахын тулд VPN технологи болон NAT-ийн хослолыг ашиглах нь онолын хувьд боломжтой боловч би үүнийг хар дарсан зүүд шигээр тохиргоо их төвөгтэй байх болов уу гэж бодож байна.

Хоёр сүлжээ дотооддоо хоёулаа адилхан хувийн IP хаягийн хүрээ (өөрөөр хэлбэл хоёулаа 192.168.1.x) ашиглаж байгаа хоёр сүлжээг холбохыг оролдож байгаагаа хэрэв та мэдэх юм бол аль нэг сүлжээний IP-г дахин дугаарлах шаардлагатай болно.

Сүлжээний бүтэц иймэрхүү харагдаж болох юм:

Хоёр нийтийн IP хаяг байгааг анзаарна уу. Нийтлэлийн туршид би эдгээрийг үсгээр орлуулан ашиглах болно. Энэ нийтлэлийн туршид тохиолдох эдгээр үсэгнүүдийн оронд өөрийн нийтийн хаягаар орлуулж тавиарай. Мөн дотроо хоёр гарц машин маань .1 IP хаягтай бөгөөд хоёр сүлжээ маань өөр өөр хувийн IP хаягийн хүрээтэйг (192.168.1.x болон 192.168.2.x) анхаарна уу. Хувийн сүлжээнүүд дэх бүх машинууд өөрсдийн анхдагч гарцдаа .1 машиныг ашиглахаар тохируулсан байгаа болно.

Гол зорилго нь сүлжээ талаасаа авч үзэх юм бол сүлжээ болгон нөгөө сүлжээнийхээ машинуудыг яг л нэг чиглүүлэгчид холбоотой юм шиг харж чадан ажиллаж байх ёстой -- гэвч энэ чиглүүлэгч нь хааяа пакетуудыг гээдэг илүү удаан чиглүүлэгч байх юм.

Энэ нь (жишээ нь) 192.168.1.20 машин дараах тушаалыг ажиллуулж

 ping 192.168.2.34
нэвт ажиллаж чадах ёстой гэсэн үг юм. Windows машинууд өөр сүлжээн дээр байх машинуудыг харж файлын хуваалцал санг үзэх зэргийг хийж локал сүлжээн дээр байгаа машинуудыг харж үзэж чаддаг шигээр ажиллаж чадаж байх ёстой.

Тэгээд бүх юм аюулгүй байх хэрэгтэй. Энэ нь хоёр сүлжээний хоорондох урсгал шифрлэгдэх ёстой гэсэн үг юм.

Эдгээр хоёр сүлжээний хооронд VPN үүсгэх нь олон алхамтай процесс юм. Эдгээр нь:

# 1.Интернэтийн дагуу хоёр сүлжээний хооронд “виртуал” сүлжээний холболт үүсгэнэ. Ажиллаж байгааг нь шалгаж ping(8) зэрэг багажуудыг ашиглаж тест хийгээрэй.

# 2.Хоёр сүлжээний хоорондох урсгал харагдахгүйгээр шифрлэгдэж шаардлагатай бол буцаан шифрлэгдэх тэр боломжийг бүрдүүлэх аюулгүй байдлын бодлогуудыг зааж өгөөрэй. Урсгал шифрлэгдэж байгааг эсэхийг шалгаж tcpdump(1) зэрэг багажууд ашиглан тест хийгээрэй.

# 3.VPN-ийн дагуу Windows машинууд нэг нь нөгөөгөө харж байхыг зөвшөөрөх нэмэлт програм хангамжийг FreeBSD гарц машинууд дээр тохируулаарай.

## Алхам 1: “виртуал” сүлжээний холболт үүсгэн тест хийх 
Сүлжээ #1 дээрх гарц машин (A.B.C.D нийтийн IP хаягтай, 192.168.1.1 хувийн IP хаягтай) уруу та нэвтрэн орсон бөгөөд W.X.Y.Z IP хаягтай машины хувийн хаяг уруу нь ping 192.168.2.1 гэж тушаал ажиллуулъя гэж бодъё. Ингэж ажиллахын тулд юу болох ёстой вэ?

# 1.Гарц машин 192.168.2.1 уруу яаж хүрэхээ мэдэх ёстой. Өөрөөр хэлбэл энэ нь 192.168.2.1 уруу хийгдсэн чиглүүлэлттэй байх хэрэгтэй.

# 2.192.168.x зэрэг хувийн IP хаягууд Интернэт дээр бараг үзэгдэх ёсгүй. Харин 192.168.2.1 уруу таны илгээсэн пакет бүр өөр пакет дотор орсон байх ёстой. Энэ пакет нь A.B.C.D машинаас ирсэн маягаар байх ёстой бөгөөд W.X.Y.Z уруу илгээгдэх ёстой. Энэ процессийг encapsulation буюу хайрцаглалт гэж нэрлэдэг.

# 3.Энэ пакет нь W.X.Y.Z дээр ирээд “unencapsulated” буюу буцааж ялгагдан 192.168.2.1 уруу хүргэгдэх хэрэгтэй.

Та үүнийг хоёр сүлжээний хоорондох “туннель” гэж ойлгож болно. “Туннелийн хоёр амсар” нь A.B.C.D болон W.X.Y.Z IP хаягууд бөгөөд туннельд түүгээр дамжин өнгөрөх хувийн IP хаягуудыг мэдэгдсэн байх шаардлагатай. Туннель нь нийтийн Интернэтээр хувийн IP хаягтай урсгалыг дамжуулахад хэрэглэгдэнэ.

Энэ туннель нь ерөнхий интерфэйс эсвэл FreeBSD дээрх gif төхөөрөмж ашиглан үүсгэгддэг. Таны бодсоноор гарц машин бүр дээрх gif интерфэйс нь дөрвөн IP хаягтай байхаар тохируулагдсан байх шаардлагатай; хоёр нь нийтийн IP хаяг, хоёр нь хувийн IP хаяг.

Хоёр машины хувьд gif төхөөрөмжийн дэмжлэг FreeBSD-ийн цөмд эмхэтгэгдсэн байх шаардлагатай. Та дараах мөрийг:

 device gif
хоёр машины цөмийн тохиргооны файлд хийн дараа нь эмхэтгэн суулгаж дахин ачаалснаар үүнийг хийж болно.

Туннелийг тохируулах нь хоёр алхамтай процесс юм. Эхлээд туннельд ямар гадаад (эсвэл нийтийн) IP хаягууд байгааг ifconfig(8) ашиглан мэдэгдэх ёстой. Тэгээд дараа нь хувийн IP хаягуудыг ifconfig(8) тушаал ашиглан тохируулах ёстой.

Сүлжээ #1 дэх гарц машин дээр туннелийг тохируулахын тулд та дараах тушаалуудыг ашиглах болно.

# ifconfig gif0 create
# ifconfig gif0 tunnel A.B.C.D W.X.Y.Z
# ifconfig gif0 inet 192.168.1.1 192.168.2.1 netmask 0xffffffff
     
Нөгөө нэг гарц машин дээр та адил тушаалуудыг гэхдээ IP хаягуудын дарааллыг эсрэгээр тавин ажиллуулна.

 # ifconfig gif0 create
 # ifconfig gif0 tunnel W.X.Y.Z A.B.C.D
 # ifconfig gif0 inet 192.168.2.1 192.168.1.1 netmask 0xffffffff
     
Та дараа нь:

 ifconfig gif0
ажиллуулж тохиргоог харж болно. Жишээ нь сүлжээ #1 дээрх гарц машин дээр та үүнийг харах болно:

 # ifconfig gif0
 gif0: flags=8051 mtu 1280
         tunnel inet A.B.C.D --> W.X.Y.Z
         inet 192.168.1.1 --> 192.168.2.1 netmask 0xffffffff
     
Эндээс харахад A.B.C.D болон W.X.Y.Z физик хаягуудын хооронд туннель үүссэн бөгөөд туннелээр зөвшөөрөгдөх урсгал нь 192.168.1.1 болон 192.168.2.1-ийн хооронд байна.

Энэ нь бас хоёр машин дээрх чиглүүлэлтийн хүснэгтэд бас оруулга нэмсэн байх бөгөөд та үүнийг netstat -rn тушаал ашиглан шалгаж болно. Доорх гаралт нь сүлжээ #1 дэх гарц машиных юм.

 # netstat -rn
 Routing tables
  
 Internet:
 Destination      Gateway       Flags    Refs    Use    Netif  Expire
 ...
 192.168.2.1      192.168.1.1   UH        0        0    gif0
 ...
     
“Flags” утгын харуулж байгаагаар энэ нь хостын чиглүүлэлт бөгөөд энэ нь гарц бүр нөгөө гарц уруу хэрхэн хүрэхээ мэдэх боловч тэд харин өөрсдийнхөө харгалзах сүлжээнүүд уруу хэрхэн хүрэхээ мэдэхгүй гэсэн үг юм. Энэ асуудлыг удахгүй засварлах болно.

Энэ нь хоёр машин дээр хоёулан дээр нь галт хана ажиллаж гэсэн үг юм. Таны VPN урсгалын хувьд үүнийг тойрон гарах шаардлагатай. Та хоёр сүлжээний хоорондох бүх урсгалыг зөвшөөрөх юм уу эсвэл VPN-ий хоёр төгсгөлийг нэгээс нөгөөг хамгаалах галт ханын дүрмүүдийг оруулж болох юм.

Хэрэв VPN-ээр өнгөрөх бүх урсгалыг зөвшөөрөхөөр галт ханыг тохируулах юм бол энэ нь тест хийхийг ихээхэн амарчлах болно. Та дараа нь хэзээ ч галт ханаа илүү чангаруулж болно. Хэрэв та ipfw(8) тушаалыг гарц машинууд дээр ашиглаж байгаа бол дараах

 ipfw add 1 allow ip from any to any via gif0
тушаал нь хоёр төгсгөлийн цэгийн хоорондох бүх урсгалыг таны галт ханын бусад дүрмүүдийг хөндөлгүйгээр зөвшөөрөх болно. Мэдээж та энэ тушаалыг хоёр гарц хост дээр хоёулан дээр ажиллуулах хэрэгтэй болно.

Нэг гарц машинаас нөгөө уруугаа ping хийхийг зөвшөөрөхөд хангалттай. 192.168.1.1 дээр та дараах

 ping 192.168.2.1
тушаалыг ажиллуулж хариу хүлээж авахаас гадна мөн нөгөө гарц машин дээрээс бас ингэж хийж чадаж байх ёстой.

Гэхдээ та хоёр сүлжээний дотоод машинууд уруу арай хүрч чадахгүй байх ёстой. Энэ нь чиглүүлэлтээс болж байгаа юм -- гарц машинууд бие бие уруугаа хэрхэн хүрэхээ мэдэж байгаа боловч нэг нэгнийнхээ цаана байгаа сүлжээнд хэрхэн хүрэхийг мэдэхгүй.

Энэ асуудлыг шийдэхийн тулд та гарц машин бүр дээр статик чиглүүлэлт нэмэх хэрэгтэй. Эхний гарц дээр хийх тушаал нь:

 route add 192.168.2.0 192.168.2.1 netmask 0xffffff00
     
Энэ нь “192.168.2.0 сүлжээний хостуудад хүрэхийн тулд пакетуудыг 192.168.2.1 хост уруу илгээ” гэж байна. Та үүнтэй адил тушаалыг нөгөө гарц дээр бас ажиллуулах хэрэгтэй бөгөөд гэхдээ 192.168.1.x хаягуудыг ашиглах ёстой.

Одоо нэг сүлжээн дэх хостуудын IP урсгал нөгөө сүлжээний хостуудад хүрэх боломжтой болно.

Энэ нь одоо хоёр сүлжээний хооронд VPN-ий гуравны хоёрыг үүсгэж байгаа бөгөөд аль болох “виртуал”аар үүсгэгдсэн “сүлжээ” юм. Энэ нь одоохондоо хувийн биш байгаа. Та үүнийг ping(8) болон tcpdump(1) ашиглан тест хийж болно. Гарц хост уруу нэвтрэн орж дараах тушаалыг ажиллуулна

 tcpdump dst host 192.168.2.1
Тэр хост дээрээ өөр сессээр дараах тушаалыг ажиллуулна

 ping 192.168.2.1
Та иймэрхүү гаралтыг харах болно:

 16:10:24.018080 192.168.1.1 > 192.168.2.1: icmp: echo request
 16:10:24.018109 192.168.1.1 > 192.168.2.1: icmp: echo reply
 16:10:25.018814 192.168.1.1 > 192.168.2.1: icmp: echo request
 16:10:25.018847 192.168.1.1 > 192.168.2.1: icmp: echo reply
 16:10:26.028896 192.168.1.1 > 192.168.2.1: icmp: echo request
 16:10:26.029112 192.168.1.1 > 192.168.2.1: icmp: echo reply
     
Эндээс харахад ICMP мэдэгдлүүд нааш цааш шифрлэгдэлгүй явж байна. Хэрэв та пакетуудаас өгөгдлийн байтуудыг илүүтэйгээр авахын тулд tcpdump(1) уруу -s параметрийг өгч ашигласан бол илүү мэдээлэл та харж болох юм.

Энэ нь мэдээж хүлээн авах боломжгүй зүйл юм. Дараагийн хэсэгт хоёр сүлжээний хоорондох холболтыг бүх урсгал нь автоматаар шифрлэгдэхээр аюулгүй болгох талаар хэлэлцэх болно.
Дүгнэн хэлэхэд:
#     Хоёр цөмийг “device gif” мөртэйгөөр тохируулна.

#     Гарц хост #1 дээрх /etc/rc.conf файлд засвар хийн дараах мөрүүдийг нэмнэ (шаардлагатай тохиолдолд IP хаягуудыг сольно).

#    gif_interfaces="gif0"
#    gifconfig_gif0="A.B.C.D W.X.Y.Z"
#    ifconfig_gif0="inet 192.168.1.1 192.168.2.1 netmask 0xffffffff"
#    static_routes="vpn"
#    route_vpn="192.168.2.0 192.168.2.1 netmask 0xffffff00"
         
# Хоёр хост дээрх гарц скриптийг (/etc/rc.firewall, эсвэл үүнтэй адил) засварлаж доор дурдсаныг нэмнэ.

 ipfw add 1 allow ip from any to any via gif0
# IP хаягуудын дарааллыг эсрэгээр болгон гарц хост #2 дээрх /etc/rc.conf файлд адил өөрчлөлтийг хийнэ.

## Алхам 2: Холболтыг аюулгүй болгох
Холболтыг аюулгүй болгохын тулд бид IPsec-ийг ашиглах болно. IPsec нь хоёр хостыг шифрлэлтийн түлхүүр дээр зөвшилцүүлж дараа нь уг хоёр хостын хооронд өгөгдлийг шифрлэхийн тулд энэ түлхүүрийг ашиглах арга замыг өгдөг.

Энд тохиргооны хоёр талбарыг бодолцох хэрэгтэй.

# 1.Ашиглах шифрлэлтийн арга зам дээр хоёр хост зөвшилцөх тийм арга зам байх ёстой. Хоёр хост энэ арга зам дээр зөвшилцсөний дараа тэдгээрийн хооронд “аюулгүй байдлын нэгдэл” байна гэж үздэг.

# 2.Аль урсгалыг шифрлэх ёстойг заах арга зам байх ёстой. Мэдээж та өөрийн бүх гарч байгаа урсгалаа шифрлэхийг хүсэхгүй байх -- та зөвхөн VPN-ий хэсэг болсон урсгалыг шифрлэхийг хүснэ. Аль урсгалыг шифрлэхийг тодорхойлохын тулд хийгдэх дүрмүүд нь “security policies” буюу “аюулгүй байдлын бодлогууд” гэгдэнэ.

Аюулгүй байдлын нэгдлүүд болон аюулгүй байдлын бодлогуудын ажиллагааг цөм хангаж байдаг бөгөөд хэрэглэгчдийн талбарын програмуудаар засварлагдаж болно. Гэхдээ үүнийг хийхийн өмнө IPsec болон Encapsulated Security Payload (ESP) буюу Хайрцаглагдсан Аюулгүй байдлын Ачаа протоколыг цөм дэмжихээр та тохируулах хэрэгтэй. Цөмийг:

 options IPSEC
 options IPSEC_ESP
      
тохируулгатай тохируулан дахин эмхэтгэж суулгаад ачаалан үүнийг хийнэ. Урьдын адил та хоёр гарц машин дээрх цөмийн хувьд үүнийг хийх ёстой.

Аюулгүй байдлын нэгдлүүдийг тохируулах үед танд хоёр сонголт байна. Шифрлэлтийн алгоритм, шифрлэлтийн түлхүүрүүд гэх зэргүүдийг сонгож тэдгээр нэгдлүүдийг хоёр хостын хооронд гараараа тохируулж болох бөгөөд эсвэл эдгээрийг хийх Internet Key Exchange protocol (IKE) буюу Интернэтийн Түлхүүр Солилцох протоколыг шийддэг дэмонуудыг та ашиглаж болно.

Би сүүлийнхийг зөвлөж байна. Өөр бусдыг тооцохгүй юм бол үүнийг тохируулах нь амархан.

Аюулгүй байдлын бодлогуудыг засварлах болон үзүүлэхдээ setkey(8)-г ашиглан хийдэг. Адилтгах юм бол setkey нь цөмийн аюулгүй байдлын бодлогын хүснэгтүүдэд route(8) цөмийн чиглүүлэлтийн хүснэгтүүдэд зориулагдсан шиг зориулагдсан байна. setkey нь бас одоогийн аюулгүй байдлын нэгдлүүдийг үзүүлж чадах бөгөөд адилтган цааш үргэлжлүүлбэл энэ нь бас netstat -r тушаалын нэгэн адил болох юм.

FreeBSD-ээр аюулгүй байдлын нэгдлүүдийг удирдах дэмонуудын хувьд хэд хэдэн сонголт байдаг. Энэ нийтлэл нь эдгээрийн нэг FreeBSD-ийн Портуудын цуглуулгын security/ipsec-tools-д байдаг racoon-ийг хэрхэн ашиглах талаар тайлбарлах болно.

racoon програм хангамж хоёр гарц машин дээр хоёулан дээр нь ажиллах ёстой. Энэ нь хост бүр дээр VPN-ий нөгөө төгсгөлийн IP хаяг болон нууц түлхүүртэйгээр (таны сонгох түлхүүр байх бөгөөд хоёр гарц машин дээр ижил байх ёстой) тохируулагддаг.

Дараа нь хоёр дэмон нэг нэгэндээ хандаж тэдгээр нь өөрсдөө хэн хэн гэж хэлснээ (таны тохируулсан нууц түлхүүрийг ашиглан) баталгаажуулдаг. Дэмонууд дараа нь шинэ нууц түлхүүрийг үүсгэж түүнийг ашиглан VPN-ээр урсгалыг шифрлэдэг. Тэд энэ нууцаа үе үе өөрчилдөг бөгөөд халдагч түлхүүрүүдийн аль нэгийг эвдсэн ч (цагаа тулахаар энэ нь онолын хувьд бараг боломжгүй зүйл) гэсэн энэ нь халдагчид муу юм хийх боломж олгодоггүй -- түлхүүрийг эвдэх тэр үед хоёр дэмон өөр түлхүүрийг сонгосон байна.

racoon-ий тохиргооны файл ${PREFIX}/etc/racoon-д байрлана. Та энд тохиргооны файлыг олох ёстой бөгөөд түүнд нэг их өөрчлөлт хийгдэх ёсгүй. Таны өөрчлөх шаардлагатай racoon-ий тохиргооны файлын өөр нэг бүрэлдэхүүн хэсэг нь “pre-shared key буюу урьдчилан хуваалцсан түлхүүр” юм.

racoon-ий анхдагч тохиргоо үүнийг ${PREFIX}/etc/racoon/psk.txt-д байгаа гэж боддог. Урьдчилан хуваалцсан түлхүүр нь таны урсгалыг VPN-ийн дагуу шифрлэх түлхүүр биш бөгөөд харин энэ нь ердөө л түлхүүр удирдах дэмонуудыг нэг нь нөгөөдөө итгэхийг зөвшөөрөх токен гэдгийг тэмдэглэж хэлэх нь зүйтэй юм.

psk.txt нь таны ажиллаж байгаа алсын сайт бүрийн мөрийг агуулсан байна. Хоёр сайт бүхий энэ жишээн дээр psk.txt файл бүр нэг мөрийг агуулсан байна (VPN-ий төгсгөлүүд бүр зөвхөн нөгөө төгсгөлтэйгээ ажилладаг).

Гарц хост #1 дээр энэ мөр иймэрхүү харагдах ёстой:

 W.X.Y.Z            secret
Энэ нь алсын төгсгөлийн нийтийн IP хаяг, хоосон зай, тэгээд нууц үгийг илэрхийлэх текст мэдээлэл байна. Мэдээж та өөрийн түлхүүртээ “secret” гэдгийг ашиглах ёсгүй -- нууц үгийг сонгох энгийн дүрэм энд үйлчилнэ.

Гарц хост #2 дээр энэ мөр иймэрхүү харагдах ёстой

 A.B.C.D            secret
Энэ нь алсын төгсгөлийн IP хаяг болон адилхан нууц түлхүүр байна. psk.txt нь racoon ажиллахаас өмнө 0600 (өөрөөр хэлбэл root-д зөвхөн унших/бичих) горимд байна.

Та racoon-ийг хоёр гарц машин дээр ажиллуулах ёстой. Та бас UDP-ээр ISAKMP (Internet Security Association Key Management Protocol буюу Интернэтийн Аюулгүй байдлын Нэгдлийн Түлхүүр Удирдах Протокол) порт уруу зөөгдөх IKE урсгалыг зөвшөөрөх галт ханын зарим дүрмүүдийг нэмэх хэрэгтэй. Дахин хэлэхэд энэ нь таны галт ханын дүрмийн олонлогт нэлээн эрт байх шаардлагатай.

 ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp
 ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp
      
racoon ажилласны дараа та нэг гарц хостоос нөгөө гарц хост уруу ping хийж үзэж болно. Холболт нь шифрлэгдээгүй байх боловч racoon дараа нь аюулгүй байдлын нэгдлүүдийг хоёр хостын хооронд тохируулна -- энэ нь хором болж өнгөрч болох бөгөөд ping тушаал хариу өгч эхлэх хүртэл богино саатал маягаар танд харагдаж болох юм.

Аюулгүй байдлын нэгдэл тохируулагдсаны дараа та үүнийг http://www.freebsd.org/cgi/man.cgi?query=setkey&sektion=8 ашиглан үзэж болно.

 setkey -D
тушаалыг аль нэг хост дээр ажиллуулж аюулгүй байдлын нэгдлийн мэдээллийг харна.

Энэ нь асуудлын нэг хагас нь юм. Нөгөө нэг хагас нь өөрийн аюулгүй байдлын бодлогуудыг тохируулах явдал юм.

Ухаалаг аюулгүй байдлын бодлогыг үүсгэхийн тулд энэ хүртэл юуг хийснээ эргэн харцгаая. Энэ хэлэлцээ нь холболтын төгсгөлийн хоёулангийнх нь хувьд авч үзнэ.

Таны гадагш илгээх IP пакет бүр пакетийн тухай өгөгдлийг агуулах толгойтой байдаг. Толгой нь эхлэл болон төгсгөлийн IP хаягуудыг агуулдаг. Бидний мэдэж байгаагаар 192.168.x.y зэрэг хувийн IP хаягууд нийтийн Интернэт дээр ил гарах ёсгүй. Харин тэд эхлээд өөр пакет дотор хайрцаглагдах ёстой. Энэ пакет нь хувийн хаягуудын оронд солигдсон нийтийн эхлэл болон төгсгөл IP хаягуудтай байх ёстой.

Тэгэхээр хэрэв таны гарч байгаа пакет иймэрхүү харагдаж эхэлбэл:

Дараа нь өөр нэг пакетийн дотор энэ нь хайрцаглагдан иймэрхүү харагдах болно:

Энэ хайрцаглалт нь gif төхөөрөмжөөр хийгдэнэ. Пакет нь гадна талдаа жинхэнэ IP хаягуудтай байх бөгөөд бидний эхний пакет Интернэт уруу гарах пакет дотор орсон байгааг харж болно.

Мэдээж бид VPN-үүдийн хоорондох бүх урсгалыг шифрлэхийг хүснэ. Та үүнийг иймэрхүүгээр үгчлэн хэлж болно:

“Хэрэв пакет A.B.C.D-с гарч W.X.Y.Z уруу чиглэсэн бол шаардлагатай аюулгүй байдлын нэгдлүүдийг ашиглан шифрлэнэ.”

“Хэрэв пакет нь W.X.Y.Z-с ирж A.B.C.D уруу чиглэсэн бол шаардлагатай аюулгүй байдлын нэгдлүүдийг ашиглан буцааж шифрлэнэ.”

Ингэж хэлэхэд ер нь бараг л зөв, ойрхон байна, гэхдээ бас тийм ч зөв биш юм. Хэрэв та үүнийг хийсэн бол W.X.Y.Z-с гарсан болон түүн уруу чиглэсэн, бүр VPN-ий хэсэг ч биш бүх урсгал шифрлэгдэх болно. Та яг үүнийг хүсээгүй байх. Зөв бодлого нь дараах маягаар байна

“Хэрэв пакет A.B.C.D-с гарч тэр пакет нь өөр пакет дотор орон хайрцаглагдан W.X.Y.Z уруу чиглэсэн бол шаардлагатай аюулгүй байдлын нэгдлүүдийг ашиглан шифрлэнэ.”

“Хэрэв пакет нь W.X.Y.Z-с ирж тэр пакет нь өөр пакет дотор орон хайрцаглагдан A.B.C.D уруу чиглэсэн бол шаардлагатай аюулгүй байдлын нэгдлүүдийг ашиглан буцааж шифрлэнэ.”

Нарийн өөрчлөлт, гэхдээ хэрэгтэй нэгэн.

Аюулгүй байдлын бодлогууд нь бас setkey(8) ашиглагдан заагдана. setkey(8) нь бодлого тодорхойлох тохиргооны хэлтэй байна. Та тохиргооны заавруудыг stdin-ээс оруулж болох бөгөөд эсвэл тохиргооны заавруудыг агуулах файлын нэрийг зааж өгөх -f тохируулгыг ашиглаж болно.

Гарц хост #1-ийн (A.B.C.D гэсэн нийтийн IP хаягтай) тохиргоо W.X.Y.Z уруу чиглэсэн бүх гарах урсгалыг хүчээр шифрлэхийн тулд:

 spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require;
      
Эдгээр тушаалуудыг файлд (өөрөөр хэлбэл /etc/ipsec.conf) хийгээд ажиллуулаарай

 #setkey -f /etc/ipsec.conf
spdadd нь бид аюулгүй бодлогын мэдээллийн санд дүрэм нэмэхийг хүсэж байгааг setkey(8)-д хэлж өгч байна. Энэ мөрийн бусад нь энэ бодлогод аль пакет таарахыг заана. A.B.C.D/32 ба W.X.Y.Z/32 нь энэ бодлого хамаарах сүлжээ болон хостуудыг таних IP хаягууд болон сүлжээний багууд юм. Энэ тохиолдолд эдгээр хоёр хостуудын хоорондох урсгалд үүнийг хамааруулахыг бид хүсэж байна. ipencap нь энэ бодлого зөвхөн бусад пакетуудыг хайрцаглах пакетуудад хамаатай гэдгийг цөмд хэлнэ. -P out тохируулга нь энэ бодлого гарах пакетуудад хамаатайг хэлэх бөгөөд ipsec тохируулга нь пакет нууцлагдахыг хэлж байна.

Хоёр дахь мөр нь энэ пакет хэрхэн шифрлэгдэхийг заана. esp нь ашиглагдах протокол байхад tunnel нь пакетийг цаашаагаа IPsec пакет дотор орж хайрцаглалт хийгдэхийг заана. A.B.C.D болон W.X.Y.Z-ийн давхардсан хэрэглээ нь ашиглах аюулгүй байдлын нэгдлийг сонгоход хэрэглэгдэх бөгөөд төгсгөлийн require тохируулга энэ дүрмэнд таарсан пакетуудыг шифрлэх ёстойг зааж байна.

Энэ дүрэм нь зөвхөн гарч байгаа пакетуудтай таарна. Ирж байгаа пакетийн хувьд танд үүнтэй адил дүрэм хэрэгтэй.

 spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require;
Энэ тохиолдолд out-ийн оронд in тохируулгыг ашиглаж шаардлагын дагуу IP хаягуудыг эсрэгээр болгосныг хараарай.

Нөгөө нэг гарц хостод (W.X.Y.Z нийтийн IP хаягтай) үүнтэй адил дүрмүүд хэрэгтэй.

 spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec esp/tunnel/W.X.Y.Z-A.B.C.D/require;
 spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec esp/tunnel/A.B.C.D-W.X.Y.Z/require;
Төгсгөлд нь та ESP болон IPENCAP пакетуудыг нааш цааш зөвшөөрөх галт ханын дүрмүүдийг нэмэх хэрэгтэй. Эдгээр дүрмүүдийг хост бүр дээр нэмэх шаардлагатай.

 ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z
 ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D
 ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z
 ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D
      
Дүрмүүд нь тэгш хэмт учир адилхан дүрмүүдийг та гарц хост бүр дээр ашиглаж болно.

Одоо гарч байгаа пакетууд үүнтэй адил харагдах болно:

Тэдгээрийг VPN-ий хамгийн төгсгөлд хүлээн авах үед тэдгээр нь эхлээд буцаан шифрлэгдэнэ (racoon-аар тохиролцсон аюулгүй байдлын нэгдлүүдийг ашиглан). Тэдгээр нь үүний дараа хоёр дахь давхаргыг гаргах gif интерфэйс уруу орж хамгийн дотор байрлах пакеттай үлдэх хүртэл боловсруулагдаад дотоод сүлжээ руу аялах болно.

Өмнө дурдсаны адил та http://www.freebsd.org/cgi/man.cgi?query=ping&sektion=8) тестийг ашиглан аюулгүй байдлыг шалгаж болно. Эхлээд A.B.C.D гарц машин уруу нэвтрэн орж дараах тушаалыг ажиллуулна:

 tcpdump dst host 192.168.2.1
Тэр хост дээрээ өөр сессээр дараах тушаалыг ажиллуулна

 ping 192.168.2.1
Энэ удаад та доор дурдсантай адил гаралтыг харах ёстой:

 XXX tcpdump output
Одоо эндээс харах юм бол http://www.freebsd.org/cgi/man.cgi?query=tcpdump&sektion=1 нь ESP пакетуудыг үзүүлж байна. Хэрэв та тэдгээрийг -s тохируулгатай шалгахыг оролдвол шифрлэлтээс болоод (мэдээж) нууцлаг харагдах болно.

Баяр хүргэе. Та дөнгөж сая алсын хоёр сайтын хооронд VPN тохирууллаа.

Дүгнэн хэлэхэд

# Хоёр цөмийг хоёуланг нь дараах тохируулгатай тохируулна:

#  options IPSEC
#  options IPSEC_ESP
         
# http://www.freebsd.org/cgi/url.cgi?ports/security/ipsec-tools/pkg-descr-г суулгана. Алсын хостын IP хаяг болон тэдгээрийн мэддэг нууц түлхүүрийн оруулгыг нэмж ${PREFIX}/etc/racoon/psk.txt файлыг хоёр гарц хост дээр хоёулан дээр засварлана. Энэ файлын горим 0600 байгааг шалгаарай.

# Хост бүр дээрх /etc/rc.conf файлд дараах мөрүүдийг нэмээрэй:

#  ipsec_enable="YES"
#  ipsec_file="/etc/ipsec.conf"
         
# Хост бүр дээр шаардлагатай spadd мөрүүдийг агуулсан /etc/ipsec.conf файл үүсгэна. 1-р гарц хост дээр энэ нь ийм байна:

 spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P out ipsec
   esp/tunnel/A.B.C.D-W.X.Y.Z/require;
 spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P in ipsec
   esp/tunnel/W.X.Y.Z-A.B.C.D/require;
# 2-р гарц хост дээр энэ нь ийм байна:

spdadd W.X.Y.Z/32 A.B.C.D/32 ipencap -P out ipsec
  esp/tunnel/W.X.Y.Z-A.B.C.D/require;
spdadd A.B.C.D/32 W.X.Y.Z/32 ipencap -P in ipsec
  esp/tunnel/A.B.C.D-W.X.Y.Z/require;
# Хост бүр дээр IKE, ESP, болон IPENCAP урсгалыг зөвшөөрөх галт ханын дүрмүүд нэмээрэй:

 ipfw add 1 allow udp from A.B.C.D to W.X.Y.Z isakmp
 ipfw add 1 allow udp from W.X.Y.Z to A.B.C.D isakmp
 ipfw add 1 allow esp from A.B.C.D to W.X.Y.Z
 ipfw add 1 allow esp from W.X.Y.Z to A.B.C.D
 ipfw add 1 allow ipencap from A.B.C.D to W.X.Y.Z
 ipfw add 1 allow ipencap from W.X.Y.Z to A.B.C.D
         
Өмнөх хоёр алхам VPN-ийг эхлүүлэн ажиллуулахад хангалттай байх ёстой. Сүлжээ бүрийн машинууд өөр хоорондоо IP хаягуудаараа хандах боломжтой болох бөгөөд холболтын дагуух бүх урсгал автоматаар аюулгүй шифрлэгдэх болно.
Ангилал:Virtual Private Network