от Zerg(17-06-2005)
рейтинг (18)
[ добре ]
[ зле ]
Вариант за отпечатване
Виртуален тунел на базата на Linux
Това е втора статия по въпроса, по препоръката на коментарите от първата статия за друг по-добър продукт.
Отново е превод и оригинала можете да откриете тук.
Много ще се радвам, ако някой я допълни и обогати.
Защо OpenVPN?
---------------
Когато потърсих думата vpn в Google оговориха 17 000 000 препратки.
Това ме удиви приятно. След малко свиване на търсенето се натъкнах на сайта openvpn.sourceforge.net.
Въвеждащата статия обещаваше простота на инсталирането и конфигурирането, а най-вече,възможност за
създаване на тунел за повечето разпространени операционни системи,
включително Linux,SUN Solaris,*BSD, Mac OS X, w2k, w2k3.
Това ми бе и необходимо...
Външен интерфейс Външен интерфейс
100.100.100.1 101.101.101.1
+--------------+ +-------------+
| SuSE 8.2 | Internet | FreeBSD 5.3 |
| |-----------| |
| NAT,FireWall | | NAT, ipfw |
| | | |
+-----+--------+ +-------+-----+
^ ^ ^ ^
| | VPN | |
| +---------------------+ |
| 10.1.1.0 |
+-----+---+ +--+------+
|Локальная| |Локальная|
| сеть | | сеть |
+---------+ +---------+
10.0.0.0 192.168.1.0
Рис.1. Схема на моята виртуална частна мрежа.
Тъй като планирах да работя с VPN-а "завинаги", прекомпилирах ядрото на SuSE с поддръжка на tun/tap драйверите.
В съвременните дистрибуции на FreeBSD поддръжката на tun/tap е вградена в ядрото.
След това инсталирах пакета. За SuSE:
#cp openvpn-1.6.0.tar.gz /usr/src
#tar -xzvf openvpn-1.6.0.tar.gz.
#./configure
#./make
#./make install
По време на инсталацията SuSE поиска да се инсталира предварително и библиотеката lzo.
Под FreeBSD всичко премина гладко:
#cd /usr/ports/security/openvpn
#./make
#./make install
OpenVPN има два режима на защита. Първия се базира на SSL/TLS с използване на сертификати и ключове.
Втория,- на използването на статични ключове.
За създаването на сертификатите се наложи да редактирам във файла /etc/ssl/openssl.cnf няколко реда:
#
...
dir = /usr/local/etc/openvpn
certificate = $dir/my-ca.crt
private_key = $dir/private/my-ca.key
И за да не се занимавам с тази процедура (създаване на ключове и сертификати)всяка година (навярно ще забравя).
default_days = 3650 #(10 лет) ще стигне до пенсия...
...
След това генерирам ключове и сертификати:
openvpn reg -nodes -new -x509 -keyout my-ca.key -out my-ca.crt -day 3650
Дадената команда създава двойка сертификат/ключ действащи 10 години.
След това създавам двойка сертификат/частен ключ за всеки офис:
openvpn reg -nodes -new -x509 -keyout office1.key -out office1.csr
openvpn reg -nodes -new -x509 -keyout office2.key -out office2.csr
openvpn ca -out office1.crt -in office1.csr
openvpn ca -out office2.crt -in office2.csr
Аз не съм много силен в защитата, но след като искат да се създадат параметри Диффи Хельман за office2,създаваме:
openvpn dhparam -out dh1024.pem 1024
Не забравям да пренеса ключовете и сертификатите на машината office2.
Това е всичко с ключовете. Преминавам към конфигуриране на vpn.
Всъщност конфигурирането се свежда до създаване на конфигурационни файлове за офис1 и офис2.
При мен офис1 е сървър и съдържа:
#office1
dev tun
port 5000
ifconfig 10.1.1.1 10.1.1.2
#Тук вдигаме маршутизацията
up /etc/openvpn/office1.up
#Тук премахваме маршутизацията
down /etc/openvpn/office1.down
tls-server
dh dh1024.pem
ca my-ca.crt
cert office1.crt
key office1.key
verb3
#end office1
А това е при клиента:
#office2
dev tun
port 5000
remote 100.100.100.1
ifconfig 10.1.1.2 10.1.1.1
#Тук вдигаме маршутизацията
up /etc/openvpn/office2.up
#Тук премахваме маршутизацията
down /etc/openvpn/office2.down
tls-client
dh dh1024.pem
ca my-ca.crt
cert office2.crt
key office2.key
verb3
#end office2
За да могат да се виждат мрежите една друга файла office1.up съдържа:
#up routing
route add -net 192.168.10.0/24 10.1.1.2
Сценария down трябва да премахне маршрута
office1.down
#down
route del -net 192.168.10.0/24
office2.up съдържа:
#up routing FreeBSD
route add -net 10.0.0.0/24 10.1.1.1 netmask 255.255.255.0
office2.down:
#down FreeBSD
route delete -net 10.0.0.0/24
Стартираме:
openvpn --config office1 на сървъра;
openvpn --config office2 на клиента.
И проверяваме.
SuSE:
$ ifconfig
tun0 Link encap:Point-to-Point Protocol
inet addr:10.1.1.1 P-t-P:10.1.1.2 Mask:255.255.255.255
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1259 Metric:1
RX packets:79017 errors:0 dropped:0 overruns:0 frame:0
TX packets:85421 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:10
RX bytes:11237151 (10.7 Mb) TX bytes:34079868 (32.5 Mb)
$ ping 10.1.1.2
PING 10.1.1.2 (10.1.1.2) 56(84) bytes of data.
64 bytes from 10.1.1.2: icmp_seq=1 ttl=64 time=271 ms
64 bytes from 10.1.1.2: icmp_seq=2 ttl=64 time=419 ms
64 bytes from 10.1.1.2: icmp_seq=3 ttl=64 time=277 ms
64 bytes from 10.1.1.2: icmp_seq=4 ttl=64 time=184 ms
64 bytes from 10.1.1.2: icmp_seq=5 ttl=64 time=137 ms
--- 10.1.1.2 ping statistics ---
6 packets transmitted, 5 received, 16% packet loss, time 5039ms
rtt min/avg/max/mdev = 137.763/258.168/419.546/96.461 ms
FreeBSD:
$ ifconfig
tun0: flags=8051 mtu 1259
inet6 fe80::202:44ff:fe92:7ac6%tun0 prefixlen 64 scopeid 0x5
inet 10.1.1.2 --> 10.1.1.1 netmask 0xffffffff
Opened by PID 429
$ ping 10.1.1.1
PING 10.1.1.1 (10.1.1.1): 56 data bytes
64 bytes from 10.1.1.1: icmp_seq=0 ttl=64 time=159.315 ms
64 bytes from 10.1.1.1: icmp_seq=1 ttl=64 time=426.403 ms
64 bytes from 10.1.1.1: icmp_seq=2 ttl=64 time=352.940 ms
64 bytes from 10.1.1.1: icmp_seq=3 ttl=64 time=394.593 ms
64 bytes from 10.1.1.1: icmp_seq=4 ttl=64 time=249.855 ms
64 bytes from 10.1.1.1: icmp_seq=5 ttl=64 time=203.441 ms
^C
--- 10.1.1.1 ping statistics ---
6 packets transmitted, 6 packets received, 0% packet loss
round-trip min/avg/max/stddev = 159.315/297.758/426.403/99.439 ms
$
Разработчиците на OpenVPN любезно са предоставили настройка на firewall-а за Linux,която се включва
в сценария за автостартиране на OpenVPN.
#!/bin/sh
dir=/etc/openvpn
$dir/firewall.sh
openvpn --cd $dir --daemon --config office1
За FreeBSD,както винаги е доста по-просто:
/usr/local/etc/rc.d/openvpn.sh
#!/bin/sh
dir=/etc/openvpn
case $1 in
start) openvpn --cd $dir --daemon --config office1;;
stop) killall -TERM openvpn;;
*) echo "Use: {start|stop}"
esac
rc.firewall
#
vpn="tun0"
#vpn
${fwcmd} add allow ip from any to any via ${vpn}
#nat
${fwcmd} add divert natd all from any to any via ${oif}
#
Това е.
Огромно благодаря на разработчиците на OpenVPN!
<< Създаване на резервни копия с TAR | Малко висш пилотаж - изграждане на статистика с Cacti и RRDt >>
|