Воскресенье, 20 Май 2012 19:02

Объединение двух офисов в единое адресное пространство.

Автор
Оцените материал
(8 голосов)

Всем привет!

Полагаю, что очень перед многими админами вставала задача настроить сетку между удалёнными офисами. И тут уже кто как мог, тот так и извращался. Но, в идеале, каждому бы хотелось настроить сетку с единым адресным сегментом. Я расскажу, как это сделать с помощью openvpn.

Итак, опишу, что имеем:
- удалённый офис1 с выходом в интернет.
- удалённый офис2 с выходом в интернет.
- Задача: в обоих офисах должна быть полностью прозрачная сетка с адресным пространством 10.0.0.0/24.
- в офисе1 интернет подключен к компу router1 с обязательно «белым» адресом.
- в офисе2 интернет подключен к компу router2. «Белый» адрес не обязателен.

Оба этих компа (router1 и router2) будут работать на Fedora 13. Поэтому, система на обоих этих компах будет идентична. Первым делом, установим эту ОС на обе машины. При установке, когда будет предложен выбор компонентов, мы выберем компоненты только в «базовой системе». Отмечаем там следующее:

- Основные
   - bridge-utils
   - man-pages
   - nano
   - unzip
   - wget
   - yum-utils
   - zip
- Поддержка оборудования
- Ситемные средства:
   - mc
   - openvpn

Ждём, пока система установится.

Примечание: Далее, первичная настройка будет одинакова для обоих компов (router1 и router2).

Заходим в систему под рутом. Первое, что нам надо сделать — это настроить сетевухи. Для этого, откроем консольный файловый менеджер midnight commander:

mc

Заходим в каталог /etc/sysconfig/network-scripts. Я предполагаю, что на вашей машине присутствует две сетевые карты. Одна вставлена в PCI слот, а другая интегрирована в материнскую плату. Если это так, то, обычно, файл ifcfg-eth0 будет для сетевой карты PCI-ного слота, а файл ifcfg-eth1 будет для интегрированной сетевой карты. Соответственно, интернетовский шнур будет воткнут в PCI-сетевуху (eth0), а шнур локальной сети — в интегрированную сетевуху (eth1).

Пропишем адреса для обеих сетевых карт на первом сервере. Поставим курсор на файл ifcfg-eth0 и нажмём F4. Откроется текстовый редактор, встроенный в mc. Приводим файл примерно к такому виду:

DEVICE=eth0
HWADDR=xx:xx:xx:xx:xx:xx #mac-адрес сетевого интерфейса
ONBOOT=yes
IPADDR=xxx.xxx.xxx.xxx #ваш ip-адрес
NETMASK=255.255.255.xxx #ваша маска сети
GATEWAY=xxx.xxx.xxx.xxx #ваш шлюз
DNS1=xxx.xxx.xxx.xxx #DNS-сервер вашего провайдера
DNS2=xxx.xxx.xxx.xxx #альтернативный DNS-сервер вашего провайдера

Правим файл ifcfg-eth1:

DEVICE=eth1
HWADDR=xx:xx:xx:xx:xx:xx #mac-адрес сетевого интерфейса
ONBOOT=yes
IPADDR=10.0.0.1 #ваш ip-адрес
NETMASK=255.255.255.0 #ваша маска сети
DNS1= xxx.xxx.xxx.xxx #ваш локальный DNS-сервер, если есть

Примечание: На втором же компьютере, адрес в локальной сети пусть будет 10.0.0.100.

После того, как прописали адреса и сохранили файлы ifcfg-eth0 и ifcfg-eth1, наберём в командной строке:

ntsysv

Откроется консольный редактор автоматического запуска сервисов. Нам нужно снять крыж с NetworkManager, ip6tables, cups и поставить крыж возле network. Сохраняем и перезагружаемся. После перезагрузки, нам надо отредактировать файл /etc/resolv.conf. Приведём его вот в такой вид:

nameserver xxx.xxx.xxx.xxx # IP-адрес DNS-сервера вашего провайдера
nameserver xxx.xxx.xxx.xxx # IP-адрес вашего локального DNS-сервера

На самом деле, если router1 и router2 будут выполнять лишь только роль связи двух офисов, то настройка DNS в них нужна лишь для того, чтобы обновить саму федору из репозиториев. Как раз, это и сделаем щас.

Важно! Сначала надо обновить сам менеджер пакетов yum! На практике встречалось, что обновление может не пойти, пока не обновишь сам yum. Итак, делаем:

yum -y update yum

И вот только после этого запускаем обновление всей системы:

yum -y update

После успешного обновления не спешим перезагружать систему. Сразу переведём в разрешающий режим систему принудительного контроля доступа SELinux. Находим файл /etc/selinux/config , находим в нём строчку:

SELINUX=enforcing

и меняем её на:

SELINUX=permissive

Вот теперь надо перезагрузить систему.

Часть настроек openvpn будем делать с помощью программы webmin. Установим её так:

rpm -ivh http://prdownloads.sourceforge.net/webadmin/webmin-1.580-1.noarch.rpm

Напомню, что эти действия мы также делаем на обоих компах. После установки вебмина, чтобы им можно было воспользоваться, надо открыть порт 10000. Находим файл /etc/sysconfig/iptables и приводим его вот к такому виду:

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 10000 -j ACCEPT
-A INPUT -j DROP --reject-with icmp-host-prohibited
-A FORWARD -j DROP --reject-with icmp-host-prohibited
COMMIT

Т.е. добавили всего одну строчку к существующим правилам — я её выделил зелёным. Для того, чтоб прописанные нами правила фаервола применились, надо его перезапустить:

service iptables restart

И, чтобы попасть в webmin, в браузере наберём адрес: http://10.0.0.1:10000 ( http://10.0.0.100:10000 на втором компе).

Сначала настроим OpenVPN на первом компьютере (router1), у которого есть белый адрес и который будет VPN-сервером. Про это, кстати, я уже писал вот тут. Но здесь настройка будет отличаться кое в чём.

Открываем webmin, переходим в левом меню на webmin --> webmin configuration, жмём на значок «Webmin Modules». В поле «From ftp or http URL» вставляем ссылку http://www.openit.it/downloads/OpenVPNadmin/openvpn-2.5.wbm.gz и жмём на «install module». После установки модуля, вы увидите, что появился новый пункт «OpenVPN + CA» в левом меню «Servers». Переходим в него, нажимаем кнопку настройки модуля и приводим настройки вот к такому виду:

 

Далее, надо сгенерировать сертификат. Заполняем поля примерно вот так:

Жмём «save». После того, как сгенерировался сертификат, нам надо создать ключи для сервера и клиентов. Жмём на значок «Certification Authority List» и генерируем ключи для сервера и для одного клиента:

ключ для сервера:

и для клиента:

После этого, снова переходим в самое начало меню «OpenVPN + CA» и там жмём на значок «VPN List», ну а там уже на кнопку «new vpn server». В появившемся окне выставляем настройки примерно так:

В отличие от другой своей статьи, где я настраивал openvpn, тут будет несколько нюансов. Поясню:

Bridge device — указывается, как у нас будет называться мост в системе.

Network Device for Bridge — eth1 (интрефейс локальной сети).

IP config for bridge: IP-Address/Gateway — указываем локальный IP адрес и маску нашего сервера, которые установлены на eth1. Однако, эта настройка нам нужна лишь для того, чтобы вебмин смог создать конфиг. Потом, эту настройку поменяем вручную.

IP-Range for Bridge-Clients — диапазон адресов, которые будут выдаваться VPN-клиентам. Это тоже потом изменим вручную.

Because the OpenVPN server mode handles multiple clients through a single tun or tap interface, it is effectively a router (option client-to-client) — позволяет клиентам видеть друг друга.

Encrypt packets with cipher algorithm (option cipher) — метод шифрования трафика между сервером и клиентом.

Don't re-read key files (option persist-key) — не перезапрашивать данные ключа

Don't close and reopen TUN/TAP device or run up/down scripts (option persist-tun) — не закрывать и не рестартовать TAP device при перезапуске соединения.

keepalive (A helper directive designed to simplify the expression of **ping** and **ping-restart** in server mode configurations) — контроль за состоянием соединений. В случае если по туннелю не передаются данные, через некоторое время посылается ping, для того чтобы соединение не разрывалось.

Сохраням. И жмём на надпись «client list»:

Дальше, нажимаем кнопку «new vpn client» и видим окно настроек впн-клиента, в котором ничего менять не нужно. Сохраняем его, как есть. После того, как создали клиента, жмём на текст «Export»:

Webmin вам предложит сохранить zip-файл. В этом файле содержится конфиг, сертификат и ключ для вашего клиентского офиса2. Его нужно любым доступным способом скопировать на router2, который будет являться клиентом. И уже там этот файл надо распаковать и всё содержимое (ca.crt, dh2048.pem, for_router2.conf, for_router2.crt, for_router2.key, for_router2.ovpn) положить в каталог /etc/openvpn.

Возвращаемся к машине, которая будет сервером openvpn (router1). На ней надо внести правку в вебминовские скрипты bridge_end и bridge_start, которые находятся в каталоге /usr/libexec/webmin/openvpn/br_scripts. В каждом из этих скриптов найдём что-то вроде подобных строчек:

setbr=false
isbr=false
brexists=false
iseth=false
istap=false
isip=false
isnetmask=false
isgw=false
isnamesrv=false

И над ними добавим ещё одну, вот такую строчку:

PATH=$PATH:/usr/sbin/:/sbin/

Сохраним. Это мы сделали для того, чтобы запустился сервис openvpn. Теперь, как я уже и говорил выше, подправим кое-что вручную в самом конфиге /etc/openvpn/server1.conf. Открыв его, мы увидим вот такое содержимое:

port 1194
proto udp
dev tap0
ca keys/golova/ca.crt
cert keys/golova/server.crt
key keys/golova/server.key
dh keys/golova/dh2048.pem
server-bridge 10.0.0.1 255.255.255.0 10.0.0.150 10.0.0.160 #@@ br0 eth1
crl-verify keys/golova/crl.pem
cipher DES-EDE-CBC
user nobody
group nobody
status servers/server1/logs/openvpn-status.log
log-append servers/server1/logs/openvpn.log
verb 2
mute 20
max-clients 100
keepalive 10 120
client-config-dir /etc/openvpn/servers/server1/ccd
client-to-client
comp-lzo
persist-key
persist-tun
ccd-exclusive
up servers/server1/bin/server1.up
plugin /usr/lib/openvpn/plugin/lib/openvpn-down-root.so "/etc/openvpn/servers/server1/bin/server1.down-root"

И, чтобы проще было восприятие, я покажу, к какому виду этот конфиг надо привести. Изменённые и добавленные строчки выделю зелёным цветом:

port 1194
proto udp
dev tap0
ca keys/golova/ca.crt
cert keys/golova/server.crt
key keys/golova/server.key
dh keys/golova/dh2048.pem
tls-server
ifconfig 10.0.0.1 255.255.255.0
mode server
# server-bridge 10.0.0.1 255.255.255.0 10.0.0.150 10.0.0.160 #@@ br0 eth1
crl-verify keys/golova/crl.pem
cipher DES-EDE-CBC
user nobody
group nobody
status servers/server1/logs/openvpn-status.log
log-append servers/server1/logs/openvpn.log
verb 2
mute 20
max-clients 100
keepalive 10 120
client-config-dir /etc/openvpn/servers/server1/ccd
client-to-client
comp-lzo
persist-key
persist-tun
ccd-exclusive
up servers/server1/bin/server1.up
plugin /usr/lib/openvpn/plugin/lib/openvpn-down-root.so "/etc/openvpn/servers/server1/bin/server1.down-root"

На этом, конфигурирование OpenVPN на первом компе (router1) закончено. Не забудем на фаерволе открыть порт для подключения к openvpn. К ранее добавленной строчке для вебмина добавим ещё одну для openvpn:

-A INPUT -p udp -m state -m udp --dport 1194 --state NEW -j ACCEPT

Переходим ко второму компу (router2). На него мы уже перенесли архив с конфигом, ключом и сертификатом. Теперь, откроем конфиг /etc/openvpn/for_router2.conf и добавим там строчки (их я также выделил зелёным):

client
tls-client
proto udp
dev tap
ca ca.crt
dh dh2048.pem
cert for_router2.crt
key for_router2.key
remote 192.168.0.10 1194
ifconfig 10.0.0.100 255.255.255.0
cipher DES-EDE-CBC
user nobody
group nobody
verb 2
mute 20
keepalive 10 120
comp-lzo
persist-key
persist-tun
float
resolv-retry infinite
nobind
log /var/log/openvpn

Сохраняем. После этого, надо создать сетевой мост, который нам и обеспечит прозрачность сети. В конец файла /etc/sysconfig/network-scripts/ifcfg-eth1 добавим вот такую строчку:

BRIDGE=br0

Сохраним. И тут же, в этой же папке /etc/sysconfig/network-scripts, создадим файл с названием ifcfg-br0 и наполним его вот таким содержимым:

DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
IPADDR=10.0.0.100
NETMASK=255.255.255.0
ONBOOT=yes

Сохраним и перезагрузим компьютер. Только что, на втором компе, мы уже вручную создали сетевой мост и включили в него сетевуху локальной сети.

Вот после всего этого, на обоих компах запускаем openvpn:

service openvpn start

Затем, на обоих компах смотрим вывод команды ifconfig. На первом должно быть так:

br0 Link encap:Ethernet HWaddr 08:00:27:89:2D:74 
inet addr:10.0.0.1 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe89:2d74/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:2638 errors:0 dropped:0 overruns:0 frame:0
TX packets:89 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:198792 (194.1 KiB) TX bytes:7039 (6.8 KiB)

eth0 Link encap:Ethernet HWaddr 08:00:27:A8:63:C3
inet addr:xxxxxxxxxx Bcast:xxxxxxxxx Mask:xxxxxxxxx
inet6 addr: fe80::a00:27ff:fea8:63c3/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:12010 errors:0 dropped:0 overruns:0 frame:0
TX packets:12500 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1468787 (1.4 MiB) TX bytes:2049320 (1.9 MiB)

eth1 Link encap:Ethernet HWaddr 08:00:27:89:2D:74
inet addr:10.0.0.1 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fe89:2d74/64 Scope:Link
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:7679 errors:0 dropped:0 overruns:0 frame:0
TX packets:6031 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:636014 (621.1 KiB) TX bytes:496126 (484.4 KiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

tap0 Link encap:Ethernet HWaddr 46:73:9D:B1:28:F0
inet6 addr: fe80::4473:9dff:feb1:28f0/64 Scope:Link
UP BROADCAST RUNNING PROMISC MULTICAST MTU:1500 Metric:1
RX packets:5636 errors:0 dropped:0 overruns:0 frame:0
TX packets:5571 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:448580 (438.0 KiB) TX bytes:440705 (430.3 KiB)

А на втором должно быть вот так:

br0 Link encap:Ethernet HWaddr 08:00:27:FB:62:E9 
inet addr:10.0.0.100 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fefb:62e9/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1798 errors:0 dropped:0 overruns:0 frame:0
TX packets:253 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:133448 (130.3 KiB) TX bytes:23570 (23.0 KiB)

eth0 Link encap:Ethernet HWaddr 08:00:27:09:DD:F7
inet addr:xxxxxxxxxx Bcast:xxxxxxxxx Mask:xxxxxxxxx
inet6 addr: fe80::a00:27ff:fe09:ddf7/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:11639 errors:0 dropped:0 overruns:0 frame:0
TX packets:10819 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1465397 (1.3 MiB) TX bytes:1695884 (1.6 MiB)

eth1 Link encap:Ethernet HWaddr 08:00:27:FB:62:E9
inet6 addr: fe80::a00:27ff:fefb:62e9/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6414 errors:0 dropped:0 overruns:0 frame:0
TX packets:5888 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:518834 (506.6 KiB) TX bytes:470588 (459.5 KiB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:63 errors:0 dropped:0 overruns:0 frame:0
TX packets:63 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:6695 (6.5 KiB) TX bytes:6695 (6.5 KiB)

tap0 Link encap:Ethernet HWaddr 32:8A:69:C0:3A:8B
inet addr:10.0.0.100 Bcast:10.0.0.255 Mask:255.255.255.0
inet6 addr: fe80::308a:69ff:fec0:3a8b/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:5563 errors:0 dropped:0 overruns:0 frame:0
TX packets:5638 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100

На обоих машинах видим, что появился сетевой мост (на первой его создаёт сам openvpn, на второй — создан нами вручную). Чтобы трафик спокойно проходил через эти мосты, надо на обоих машинах в фаерволе добавить вот такую строчку:

-A FORWARD -i br0 -j ACCEPT

На первом компе вставляем её под строчкой:

-A INPUT -p udp -m state -m udp --dport 1194 --state NEW -j ACCEPT

А навтором компе — под строчкой:

-A INPUT -p tcp -m state -m tcp --dport 10000 --state NEW -j ACCEPT

Либо, можно это через вэбмин сделать. В нём, это правило будет выглядеть так:

не забываем после этого перезапустить iptables:

service iptables restart

И вот теперь, на втором компе, настало время ввести команду, после которой сеть в удалённых офисах станет единой:

brctl addif br0 tap0

Этой командой мы добавили виртуальную сетевуху tap0 к сетевому мосту. После этого действия, все компьютеры, находящиеся в двух удалённых офисах, начнут друг друга видеть. Причём, вовсе не обязательно, чтобы на них шлюзом был прописан комп 10.0.0.1 или 10.0.0.100.

Осталось всё это наше хозяйство настроить, чтобы оно само загружалось при включении компьютеров. На обоих компах набираем команду ntsysv и ставим крыж рядом с openvpn демоном. Сохраняем. А чтобы на второй машине, после старта openvpn, интерфейс tap0 автоматически добавлялся в сетевой мост, создадим вот такой скрипт:

#!/bin/sh
#
# chkconfig: - 98 83
#
# processname: routing
#

/bin/echo "starting bridge"
sleep 15s
brctl addif br0 tap0

Назовём его, допустим, start_bridge и положим в каталог /etc/init.d Затем, сделаем его исполняемым:

chmod +x start_bridge

И включим его в автозагрузку:

chkconfig start_bridge on

С параметром sleep поэксперементируйте. Дело в том, что, в зависимости от скорости интернета, соединение openvpn может подниматься с некоторой задержкой. В моём случае, 15-ти секунд хватало, чтобы openvpn успевал подняться, и уже после этого, срабатывал скрипт, и интерфейс tap0 присоединялся к мосту.

На этом всё! Можно пользоваться Улыбаюсь

Прочитано 19940 раз Последнее изменение Воскресенье, 21 Октябрь 2012 12:45

You have no rights to post comments

Вы здесь: Home Мои статьи Linux Fedora/CentOS/RedHat Объединение двух офисов в единое адресное пространство.