15.9. IPsec дээгүүр VPN хийх
Өмнөх | Бүлэг 15. Аюулгүй байдал | Дараах

## 15.9. IPsec дээгүүр VPN хийх

Бичсэн Ник Клэйтон.

FreeBSD гарц машинуудыг ашиглан Интернэтээр тусгаарлагдсан хоёр сүлжээний хооронд VPN үүсгэх.

### 15.9.1. IPsec-ийг ойлгох нь

Бичсэн Хитэн М. Пандиа.

Энэ хэсэг нь IPsec-ийг тохируулах процессийг тайлбарлах болно. IPsec-ийг тохируулахын тулд та өөрчлөн тохируулсан цөм бүтээх ухагдахууныг мэдсэн байх шаардлагатай (Бүлэг 9, FreeBSD цөмийг тохируулах нь-г үзнэ үү).

IPsec нь Интернэт Протокол (IP) давхаргын дээр суудаг протокол юм. Энэ нь хоёр буюу хэд хэдэн хостуудыг аюулгүй байдлаар (нэрээс нь харах юм бол) холбох боломжийг олгодог. FreeBSD IPsec «сүлжээний стек» нь IPv4 болон IPv6 протоколуудыг хоёуланг дэмждэг KAME шийдэл дээр үндэслэсэн.

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 device crypto

Хэрэв IPsec дибаг хийх дэмжлэг заавал хэрэгтэй бол дараах цөмийн тохируулга бас нэмэгдсэн байх шаардлагатай:

options IPSEC_DEBUG #debug for IP security

### 15.9.2. Асуудал

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

### 15.9.3. Тохиолдол: Хоёр сүлжээ, нэг нь гэрийн нэг нь ажлын. Хоёулаа Интернэтэд холбогдсон бөгөөд энэ VPN-ээр нэг юм шиг ажиллах сүлжээ.

Угтвар нөхцөл дараах маягийн байна:

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

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

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

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

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

### 15.9.4. IPsec-ийг FreeBSD дээр тохируулах нь

Бичсэн Том Рөүдс.

Эхлээд `security/ipsec-tools` портын цуглуулгаас суусан байх шаардлагатай. Энэ гуравдагч талын програм хангамжийн багц нь тохиргоог дэмжихэд туслах хэд хэдэн програмуудыг агуулдаг.

Дараагийн шаардлага нь пакетуудыг тунель хийх болон хоёр сүлжээг зөв холбогдоход ашиглагдах хоёр gif(4) псевдо төхөөрөмжийг үүсгэх явдал юм. `root` хэрэглэгчээр `internal` болон `external` гэсэн утгуудыг жинхэнэ дотоод болон гадаад гарцуудаар өөрчлөн дараах тушаалыг ажиллуулна:

`#` `ifconfig gif0 create`
`#` `ifconfig gif0 `internal1 internal2``
`#` `ifconfig gif0 tunnel `external1 external2``

Жишээ нь ажлын LAN-ий нийтийн IP нь `172.16.5.4` бөгөөд хувийн IP нь `10.246.38.1` байна. Гэрийн LAN-ий нийтийн IP нь `192.168.1.12` бөгөөд дотоод хувийн IP нь `10.0.0.5` байна.

Энэ нь толгой эргэмээр санагдаж болох бөгөөд ifconfig(8) тушаалын дараах жишээ үр дүнгээс харна уу:

Gateway 1: gif0: flags=8051 mtu 1280 tunnel inet 172.16.5.4 --> 192.168.1.12 inet6 fe80::2e0:81ff:fe02:5881%gif0 prefixlen 64 scopeid 0x6 inet 10.246.38.1 --> 10.0.0.5 netmask 0xffffff00 Gateway 2: gif0: flags=8051 mtu 1280 tunnel inet 192.168.1.12 --> 172.16.5.4 inet 10.0.0.5 --> 10.246.38.1 netmask 0xffffff00 inet6 fe80::250:bfff:fe3a:c1f%gif0 prefixlen 64 scopeid 0x4

Хийгдэж дууссаны дараа хоёр хувийн IP-д ping(8) тушаал ашиглан дараах үр дүнд харуулсан шиг хүрэх боломжтой байх ёстой:

priv-net# ping 10.0.0.5 PING 10.0.0.5 (10.0.0.5): 56 data bytes 64 bytes from 10.0.0.5: icmp_seq=0 ttl=64 time=42.786 ms 64 bytes from 10.0.0.5: icmp_seq=1 ttl=64 time=19.255 ms 64 bytes from 10.0.0.5: icmp_seq=2 ttl=64 time=20.440 ms 64 bytes from 10.0.0.5: icmp_seq=3 ttl=64 time=21.036 ms --- 10.0.0.5 ping statistics --- 4 packets transmitted, 4 packets received, 0% packet loss round-trip min/avg/max/stddev = 19.255/25.879/42.786/9.782 ms corp-net# ping 10.246.38.1 PING 10.246.38.1 (10.246.38.1): 56 data bytes 64 bytes from 10.246.38.1: icmp_seq=0 ttl=64 time=28.106 ms 64 bytes from 10.246.38.1: icmp_seq=1 ttl=64 time=42.917 ms 64 bytes from 10.246.38.1: icmp_seq=2 ttl=64 time=127.525 ms 64 bytes from 10.246.38.1: icmp_seq=3 ttl=64 time=119.896 ms 64 bytes from 10.246.38.1: icmp_seq=4 ttl=64 time=154.524 ms --- 10.246.38.1 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max/stddev = 28.106/94.594/154.524/49.814 ms

Хүсэн хүлээж байсны дагуу хоёр тал хоёулаа хувийн тохируулсан хаягаасаа ICMP пакетуудыг илгээх болон хүлээн авах боломжтой байна. Дараа нь аль аль сүлжээнээс урсгалыг зөв илгээдэг байхын тулд хоёр гарцад хоёуланд нь пакетуудыг хэрхэн яаж чиглүүлэхийг зааж өгөх ёстой. Энэ зорилгод дараах тушаал хүрнэ:

`#` `corp-net# route add `10.0.0.0 10.0.0.5 255.255.255.0``
`#` `corp-net# route add net `10.0.0.0: gateway 10.0.0.5``
`#` `priv-net# route add `10.246.38.0 10.246.38.1 255.255.255.0``
`#` `priv-net# route add host `10.246.38.0: gateway 10.246.38.1``

Энэ үе хүрэхэд дотоод машинууд нь аль аль гарц болон гарцын цаана байгаа машинуудаас хүрэх боломжтой байх ёстой. Үүнийг хялбараар дараах жишээнээс тодорхойлж болно:

corp-net# ping 10.0.0.8 PING 10.0.0.8 (10.0.0.8): 56 data bytes 64 bytes from 10.0.0.8: icmp_seq=0 ttl=63 time=92.391 ms 64 bytes from 10.0.0.8: icmp_seq=1 ttl=63 time=21.870 ms 64 bytes from 10.0.0.8: icmp_seq=2 ttl=63 time=198.022 ms 64 bytes from 10.0.0.8: icmp_seq=3 ttl=63 time=22.241 ms 64 bytes from 10.0.0.8: icmp_seq=4 ttl=63 time=174.705 ms --- 10.0.0.8 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max/stddev = 21.870/101.846/198.022/74.001 ms priv-net# ping 10.246.38.107 PING 10.246.38.1 (10.246.38.107): 56 data bytes 64 bytes from 10.246.38.107: icmp_seq=0 ttl=64 time=53.491 ms 64 bytes from 10.246.38.107: icmp_seq=1 ttl=64 time=23.395 ms 64 bytes from 10.246.38.107: icmp_seq=2 ttl=64 time=23.865 ms 64 bytes from 10.246.38.107: icmp_seq=3 ttl=64 time=21.145 ms 64 bytes from 10.246.38.107: icmp_seq=4 ttl=64 time=36.708 ms --- 10.246.38.107 ping statistics --- 5 packets transmitted, 5 packets received, 0% packet loss round-trip min/avg/max/stddev = 21.145/31.721/53.491/12.179 ms

Тунелиуд үүсгэж тохируулах нь хялбар хэсэг юм. Аюулгүй холбоосыг тохируулах нь илүү гүнзгий процесс юм. Дараах тохиргоо нь урьдчилан хуваалцсан (PSK) RSA түлхүүрүүдийг ашиглаж байна. IP хаягаас гадна хоёр `/usr/local/etc/racoon/racoon.conf` файл хоёулаа адил бөгөөд доорхтой төстэй байна.

path pre_shared_key "/usr/local/etc/racoon/psk.txt"; #location of pre-shared key file log debug; #log verbosity setting: set to 'notify' when testing and debugging is complete padding # options are not to be changed { maximum_length 20; randomize off; strict_check off; exclusive_tail off; } timer # timing options. change as needed { counter 5; interval 20 sec; persend 1; # natt_keepalive 15 sec; phase1 30 sec; phase2 15 sec; } listen # address [port] that racoon will listening on { isakmp 172.16.5.4 [500]; isakmp_natt 172.16.5.4 [4500]; } remote 192.168.1.12 [500] { exchange_mode main,aggressive; doi ipsec_doi; situation identity_only; my_identifier address 172.16.5.4; peers_identifier address 192.168.1.12; lifetime time 8 hour; passive off; proposal_check obey; # nat_traversal off; generate_policy off; proposal { encryption_algorithm blowfish; hash_algorithm md5; authentication_method pre_shared_key; lifetime time 30 sec; dh_group 1; } } sainfo (address 10.246.38.0/24 any address 10.0.0.0/24 any) # address $network/$netmask $type address $network/$netmask $type ( $type being any or esp) { # $network must be the two internal networks you are joining. pfs_group 1; lifetime time 36000 sec; encryption_algorithm blowfish,3des,des; authentication_algorithm hmac_md5,hmac_sha1; compression_algorithm deflate; }

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

FreeBSD болон racoon нь хостуудын хооронд сүлжээний урсгалыг нууцлах болон буцааж задалж чаддаг байхын тулд SPD бодлогуудыг тохируулсан байх ёстой.

Энэ үйлдлийг дараах ажлын гарц дээрх шиг энгийн бүрхүүлийн скриптээр шийдэж болно. Энэ файлыг системийг эхлүүлэх үед ашиглах бөгөөд `/usr/local/etc/racoon/setkey.conf` гэж хадгалах ёстой.

flush; spdflush; # To the home network spdadd 10.246.38.0/24 10.0.0.0/24 any -P out ipsec esp/tunnel/172.16.5.4-192.168.1.12/use; spdadd 10.0.0.0/24 10.246.38.0/24 any -P in ipsec esp/tunnel/192.168.1.12-172.16.5.4/use;

Ингэсний дараа racoon-г хоёр гарц дээр дараах тушаал ашиглан эхлүүлнэ:

`#` `/usr/local/sbin/racoon -F -f /usr/local/etc/racoon/racoon.conf -l /var/log/racoon.log`

Гарах үр дүнд нь доорхтой төстэй байна:

corp-net# /usr/local/sbin/racoon -F -f /usr/local/etc/racoon/racoon.conf Foreground mode. 2006-01-30 01:35:47: INFO: begin Identity Protection mode. 2006-01-30 01:35:48: INFO: received Vendor ID: KAME/racoon 2006-01-30 01:35:55: INFO: received Vendor ID: KAME/racoon 2006-01-30 01:36:04: INFO: ISAKMP-SA established 172.16.5.4[500]-192.168.1.12[500] spi:623b9b3bd2492452:7deab82d54ff704a 2006-01-30 01:36:05: INFO: initiate new phase 2 negotiation: 172.16.5.4[0]192.168.1.12[0] 2006-01-30 01:36:09: INFO: IPsec-SA established: ESP/Tunnel 192.168.1.12[0]->172.16.5.4[0] spi=28496098(0x1b2d0e2) 2006-01-30 01:36:09: INFO: IPsec-SA established: ESP/Tunnel 172.16.5.4[0]->192.168.1.12[0] spi=47784998(0x2d92426) 2006-01-30 01:36:13: INFO: respond new phase 2 negotiation: 172.16.5.4[0]192.168.1.12[0] 2006-01-30 01:36:18: INFO: IPsec-SA established: ESP/Tunnel 192.168.1.12[0]->172.16.5.4[0] spi=124397467(0x76a279b) 2006-01-30 01:36:18: INFO: IPsec-SA established: ESP/Tunnel 172.16.5.4[0]->192.168.1.12[0] spi=175852902(0xa7b4d66)

Тунель зөв ажиллаж байгааг шалгахын тулд нөгөө консол руу шилжиж сүлжээний урсгалыг харахын тулд tcpdump(1) ашиглан дараах тушаалыг хэрэглэнэ. `em0`-ийг сүлжээний интерфэйс картаараа шаардлагатай бол солиорой.

`#` `tcpdump -i em0 host `172.16.5.4 and dst 192.168.1.12``

Доорхтой төстэй өгөгдөл консол дээр гарах ёстой. Хэрэв үгүй бол асуудалтай гэсэн үг бөгөөд буцаасан өгөгдлийг дибаг хийх шаардлагатай.

01:47:32.021683 IP corporatenetwork.com > 192.168.1.12.privatenetwork.com: ESP(spi=0x02acbf9f,seq=0xa) 01:47:33.022442 IP corporatenetwork.com > 192.168.1.12.privatenetwork.com: ESP(spi=0x02acbf9f,seq=0xb) 01:47:34.024218 IP corporatenetwork.com > 192.168.1.12.privatenetwork.com: ESP(spi=0x02acbf9f,seq=0xc)

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

ipfw add 00201 allow log esp from any to any ipfw add 00202 allow log ah from any to any ipfw add 00203 allow log ipencap from any to any ipfw add 00204 allow log udp from any 500 to any

### Тэмдэглэл:

Дүрмийн дугааруудыг тухайн хостын тохиргооноос хамаарч өөрчлөх шаардлагатай байж болох юм.

pf(4) эсвэл ipf(8),-ийн хэрэглэгчдийн хувьд дараах дүрмүүд үүнийг хийх болно:

pass in quick proto esp from any to any pass in quick proto ah from any to any pass in quick proto ipencap from any to any pass in quick proto udp from any port = 500 to any port = 500 pass in quick on gif0 from any to any pass out quick proto esp from any to any pass out quick proto ah from any to any pass out quick proto ipencap from any to any pass out quick proto udp from any port = 500 to any port = 500 pass out quick on gif0 from any to any

Төгсгөлд нь системийг эхлүүлэх явцад VPN-ийг машин дэмжин ажиллаж эхэлдэг байлгахын тулд дараах мөрүүдийг `/etc/rc.conf` файлд нэмэх хэрэгтэй:

ipsec_enable="YES" ipsec_program="/usr/local/sbin/setkey" ipsec_file="/usr/local/etc/racoon/setkey.conf" # allows setting up spd policies on boot racoon_enable="yes"

Өмнөх | Дээш | Дараах
15.8. OpenSSL | Эхлэл | 15.10. OpenSSH

Энэ болон бусад баримтуудыг ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/ хаягаас татаж авч болно.

FreeBSD-ийн талаар <questions@FreeBSD.org> хаягтай холбоо барихаасаа өмнө баримтыг уншина уу.
Энэ бичиг баримттай холбоотой асуулт байвал <doc@FreeBSD.org> хаягаар цахим захидал явуулна уу.
Энэ бичиг баримтын орчуулгатай холбоотой асуулт байвал <admin@mnbsd.org> хаягаар цахим захидал явуулна уу.