Архив

Архив раздела ‘ubuntu’

Ubuntu OpenVPN Server (Настройка, соединение филиалов сеть)

27 августа 2010 admin Нет комментариев

logo

Изначально эту статью я писал для Хабра, но чуть позже решил продублировать в Блог.

Не так давно передо мною встала задача соединить в единую сеть филиалы одной крупкой компании, разбросанные по Сибири. Главная проблема была в том, что OpenVPN надо было заставить работать поверх нестабильного PPPoE попутно пустив весь трафик через OpenVPN

Первоначальная цель была в экономии денег на Интернет трафике в филиалах т.к. в удалённых районах цена безлимитного ADSL с шириной в 256кб/с стоила порядка 7-10т.р. в месяц, а интернет был жизненно необходим.
Вся радость была в том, что почти все филиалы имели подключения одного провайдера, в котором существовало понятие локального и пирингово трафика, а в Главном офисе был выделенный широкий Интернет (другой провайдер, но волей случая он был лоялен к провайдеру филиалов и у него был “пиринговый трафик” с ценой около 6 копеек за мегабайт).
image

1. proxy

Самое быстрое решение это было обычный каскад proxy серверов, так и было сделано т.к. раньше все филиалы раздавали интернет у себя прямо модемом, то нужно было всем выделить по 1 системнику, который бы выполнял роль шлюза, системники были не подарки, кто даст 800й пень, кто 233, в общем у кого что было.. Хотя сегодня за 4-7 т.р. можно собрать достойный шлюз, но хозяин-барин, хочу говорит без затрат!

На эти шлюзы была установлена ubuntu 8.04 LTS настроена в виде шлюза, чтоб воткнул в локальную сеть, в модем и в розетку, и сразу всё работало т.к. во многих филиалах, админы могли только нажать “Any key” на клавиатуре пользователя, но не беда, дело шло, постепенно 7 филиалов перенастроило свои модемы, и воткнули шлюзы :)

сразу же поднимали прокси каскадом, заруливали туда http трафик, но как мы все знаем, хттп трафик это всего некий % от общего трафика, перейдя на более простые тарифы, экономия была, но условная, ведь нерадивый админ или пользователь мог например через torrent стянуть что-то весомое, что сулило попаданием на деньги филиалу…

Попутно появлялись другие задачи в центральном офисе – перенос компаративного почтаря, шлюза, портала настроенного году в 2002 и не тронутого с тех пор, но это заслуживает отдельной статьи…
А нас пока интересует просто сеть…

2. OpenVPN

Эту штуку я видел в первый раз, был некий страх перед первым знакомством, далее чтение мануалов и интернетов, закатав рукава я полез ставить :)

2.1 Сервер
имеет 2 сетевых адаптера eth1 (192.168.5.x) – Локальная сеть и eth0 (real ip 111.111.111.111) Интернет с широким каналом.

apt-get install openvpn

Далее создаём файл конфигурации сервера

touch /etc/openvpn/server.conf

при загрузке системы автоматически поднимаются все VPN соединения, для которых в папке /etc/openvpn есть соответствующие файлы с расширением .conf

у меня он получился примерно таким.

port 1194 #Порт
proto udp #Протокол
dev tun   #Название виртуального устройства  
ca /etc/openvpn/ca.crt
cert /etc/openvpn/server.crt
key /etc/openvpn/server.key # This file should be kept secret
dh /etc/openvpn/dh1024.pem
server 10.10.10.0 255.255.255.0 # vpn subnet
ifconfig-pool-persist ipp.txt # Тут будут храниться ip адреса клиентов
push "route 192.168.5.0 255.255.255.0" # home
keepalive 10 120
comp-lzo
user nobody
group nogroup
persist-key
persist-tun
status openvpn-status.log
log-append  openvpn.log
verb 4
mute 20
client-to-client
client-config-dir /etc/openvpn/ccd # Тут будут настройки для каждого филиала
route 192.168.0.0 255.255.255.0 # Маршрут от сервера до филиала 1
route 192.168.1.0 255.255.255.0 # Маршрут от сервера до филиала 2

Создаём каталог, в котором будут хранится индивидуальные настройки клиентов:

mkdir /etc/openvpn/ccd

Теперь необходимо создать ключи и сертификаты для шифрования и авторизации

cd  /usr/share/doc/openvpn/examples/easy-rsa/2.0
source ./vars
./clean-all
./build-ca

Теперь создадим сертификат и приватный ключ для сервера:

./build-key-server server

Создаём ключ для клиента (если клиентов несколько, процедуру придётся повторить):

./build-key client1

для каждого клиента должно быть указано своё уникальное имя (в данном случае client1).

если новый клиент создаётся спустя некоторое время, процедура будет выглядеть следующим образом:

cd  /usr/share/doc/openvpn/examples/easy-rsa/2.0
source ./vars
./build-key client2

Генерируем параметры Диффи-Хеллмана:

./build-dh

Помещаем следующие файлы в директорию /etc/openvpn/

    * ca.crt
    * server.crt
    * dh1024.pem
    * server.key

Создаём файл /etc/openvpn/ipp.txt

Конфигурационный файл клиентской машины /etc/openvpn/client.conf у меня получился примерно таким

remote 111.111.111.111 1194
client
dev tun
proto udp
resolv-retry infinite # this is necessary for DynDNS
nobind
user nobody
group nogroup
persist-key
persist-tun
ca /etc/openvpn/ca.crt
cert /etc/openvpn/client1.crt
key /etc/openvpn/client1.key
comp-lzo
verb 4
mute 20
redirect-gateway
#show-net-up
verb 4

Теперь необходимо скопировать с сервера в папку /etc/openvpn/ сгенерированные клиентские ключи и авторитарный сертификат сервера:

    * ca.crt
    * client1.crt
    * client1.key

Если за клиентом скрывается сеть 192.168.1.х то, чтоб сервер видел её нужно добавить на сервер маршрут до неё.

На сервере создаём файл /etc/openvpn/ccd/client1 такого содержания:

iroute 192.168.1.0 255.255.255.0
# роутинг на сеть филиала2, чтоб 2 филиала знали друг друга
#push "route 192.168.100.0 255.255.255.0"
#Заворачиваем весь трафик в OpenVPN
push "redirect-gateway def1"

Вот тут собственно и случилась самая злая проблема у меня.

OpenVPN получив директиву

push "redirect-gateway def1"

(при наличии ‘pull’ в своей конфигурации), клиент не удаляет старый маршрут, а добавляет в таблицу маршрутизации записи вида:

 0.0.0.0/1 via 192.168.231.5 dev tun0  
 128.0.0.0/1 via 192.168.231.5 dev tun0

и если openvpn идёт по ethernet то всё работает и радует админа и пользователей, но великий ppp любит поднимать вот такой маршрут.

0.0.0.0         0.0.0.0         0.0.0.0         U     0      0        0 ppp0

И вот OpenVPN ругается примерно вот так

Jul  2 19:28:53 ino ovpn-client[14465]: NOTE: unable to redirect default gateway -- Cannot read current default gateway from system

Решение этой проблемы искалось долго и нудно, хотя оно на поверхности. если в этом “кривом” маршруте ppp указывать шлюз вместо 0.0.0.0 реальный шлюз, то ОpenVPN видит этот маршрут и добавляет свой без проблем.

Поэтому я создал файл

/etc/ppp/ip-up.d/routing

В который прописал небольшой скрипт. (прошу ногами не пинать, я очень ленивый, и полноценный скрипт определения шлюза и правки маршрутов писать не стал, а сделал как простой костыль)
Буду очень рад, если кто-то предложит более логичный, надёжный, и универсальный метод правки маршрутов на лету.
Пока ещё нет уверенности, что всё будет на 100% работать при обрывах ppp, Но жизнь покажет, если что – поправлю топик.

#! /bin/sh
#Определяем выданный шлюз по умолчанию у меня он всегда  разный но в сети 222.х.х.х
gw1=`ip route show | grep 222 | awk '{print $1}'`
# Удаляем 0.0.0.0 0.0.0.0
route del default
# Добавляем маршрут с верным шлюзом
route add -net default gw ${gw1} dev ppp0

Делаем его исполняемым

chmod ug+x /etc/ppp/ip-up.d/routing

После чего ребут, спустя некоторое время сервер перестал пинговаться по внешнему ипу, но стал отзываться по внутреннему – 10.10.10.26

ЗЫ Прошу принять во внимание, что файрволл шлюза и сервера и клиента надо поправить, для того, чтоб у пользователей был жизненно важный интернет.
Например я, сделал это так:

-A POSTROUTING -s 192.168.0.0/255.255.0.0 -j MASQUERADE

Тут не указана привязка ни к внешнему интерфейсу, ни ip :)
когда по разным причинам у нас не будет openvpn то у пользователей будет прямой инет, а когда он появится, то весь трафик полетит через него.

Заключение

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

push "redirect-gateway def1"

И снова добиваемся работы и жизни, всё было проделано не выходя из офиса, на шлюзах филиалов, были подписаны сетевые интерфейсы, чтоб админ просто воткнул сетевые кабеля и питание, позвонил мне, а дальше я уже по ssh настраивал на рабочий лад.

Ах да, чуть не забыл, о самом главном – profit

Помимо того, что теперь вся сеть обращается к серверам и сервисам филиалов и центра по внутренним ip адресам, так ещё и финансовая экономия.

Раньше каждый филиал тратил на интернет в среднем по 7 000р. в месяц, сейчас в месяц каждый из них платит по 550р. за доступ к пирингу, интернет не расходуется (кроме центрального), для начала было запущено 7 филиалов, дальше будет больше.
получается, что за год при старой схеме компания тратила бы на интернет 588 000р., а при текущей схеме в год будет потрачено 46 200р.

Что дальше?

А теперь, на этой всей хе…. мы попробуем взлететь! я попробую развернуть IP Телефонию, чтоб минимизировать расходы на Телефонные междугородние переговоры между филиалами, связать софтАТС с аппаратными в филиалах, о чём обязательно напишу. Удачи

update1 Много вопросов возникло к термину “Крупная компания” попробую прояснить.

Крупная она в Сибири, центр имеет штат 200 сотрудников, филиалы от 20 до 60, к каждому филиалу ещё крепятся 10-20 объектов. по 5-15 человек. филиалов менее 30ти.

Компания крайне не поворотлива, основной контроль идёт от государства, оборудование, компания делает некие шаги в сторону ИТ развития :)

Update2
И так, после тестирования выявилось, что если надолго опустить сервер управы, то клиенты не охотно поднимают openvpn и трафик может пойти прямо в дорогой инет.
Также если принудительно рвётся ADSL канал, то опенвпн вроде и пытается стартануть заново, но что-то у него это не получается, так и ходит по кругу.
пробовал всякие опции и keepalive и ping-restart и прочее… не помогало…

Поэтому пишем небольшой скрипт, который будет проверять состояние дел.

touch /usr/bin/vpn_keepalive.sh

C содержанием.

#! /bin/sh
# Нужна ли нам отладка, рас комментировать нужное
#debug_out=/dev/null
debug_out=/dev/stdout
#NEXTHOP Это хост внутри ВПН сети
# я взял внутренний ип OpenVPN сервера
NEXTHOP=192.168.5.1
# Комманда перезапуска Опенвпн
OPEN_VPN_CMD="sudo /etc/init.d/openvpn restart"
PING=/bin/ping

logger_opts="-t $0"
if [ "$debug_out" = "/dev/stdout" ]
then
        logger_opts="$logger_opts -s"
fi
pckts_rcvd=`$PING -c 8 -q -W 2 $NEXTHOP | grep transm | awk '{print $4}'`
echo "host: $NEXTHOP, pckts_rcvd: $pckts_rcvd" >$debug_out
if [ $pckts_rcvd -eq 0 ]
then
    echo "Connection with $NEXTHOP lost, resetting" | logger $logopts
    $OPEN_VPN_CMD > $debug_out
else
    echo "Connection with $NEXTHOP up, no action" | logger $logopts
fi

Делаем его исполняемым

chmod ug+x /usr/bin/vpn_keepalive.sh

Скрипт пингует хост, и если 0 пакетов вернулось, то выполнит команду рестарта.
после чего всё гарантированно поднимается, вливаются верные маршруты, и трафик идёт через ВПН трафик

Кидаем этот скрипт в крон

crontab -e

например каждые 2 минуты.

0-59/2 * * * * /usr/bin/vpn_keepalive.sh

И всё если дебаг включен, то в логах (syslog) будет отмечено вот так.

logger: Connection with 192.168.5.1 up, no action

Удачи!

Categories: man, ubuntu Tags: , , ,

Ubuntu mail server (Вариант 2)

30 марта 2010 admin 2 comments

Вот замечательная ссылочка на мануал http://sudouser.com/ustanovka-pochtovogo-servera-postfix-dovecot-mysql-i-virtualnyx-domenov.html

Почта поднялась и полетела, на многие вопросы есть ответы в комментариях.

Косяк обнаружил один, в файле master.cf когда добавляем 2 строки, смотрите по аналогии, в первой строке разделитель – ТАБ, во второй пробелы

Categories: ubuntu Tags:

boost 1.42 on ubuntu

mapnik  не назойливо требует boost 1.41 и выше.

Далее идёт на сайт буста качаем свежую версию распаковываем, заходим в

cd /tools/jam/src
$ chmod u+x build.sh
$ ./build.sh

переходим в верх каталога и приступаем к сборке

tools/jam/src/bin.linuxx86/bjam  --without-mpi stage --build-type=complete  --layout=versioned

Минут на 30-40 можно идти курить.

Как всё скомпилится, можно и установить :)

tools/jam/src/bin.linuxx86/bjam --without-mpi install
Categories: linux, ubuntu Tags:

vnstat на Ubuntu – Монитор сети

4 марта 2010 admin 1 комментарий

Хотим красивую статистику по использованию сети?

Ставим сборщик статистики

apt-get install vnstat

Демонизируем его.

на сайте http://humdi.net/vnstat/ находим init.d скрипты для Ubuntu

Выкачиваем его

wget http://humdi.net/vnstat/init.d/debian/vnstat

задаём права на запуск

chmod 755 vnstat

Копируем его в /etc/init.d/

и добавляем в автозагрузку

update-rc.d vnstat defaults

Запускаем демон.

/etc/init.d/vnstat start

Для нужных интерфесов создаём базы данных

vnstat -u -i eth1

vnstat -u -i ppp0

Если этого не сделать, то в файле дампа будет примерно это

Unable to read database "/var/lib/vnstat/ppp0"

Теперь качаем вэб морду

Вот с этого сайта

http://www.sqweek.com/sqweek/index.php?p=1

распаковываем в /var/www/vnstat

Идём в config.php и находим

$iface_list = array('eth0', 'eth1', 'sixxs');

тут оставляем те интерфейсы, что нам необходимы (например eth1 и ppp0)

$iface_title['eth0'] = 'Internal';
$iface_title['eth1'] = 'Internet';

тут указываем кто кем будет.

создаём каталог для дампов

mkdir /var/www/vnstat/dumps

теперь пробуем создать дампы.

vnstat --dumpdb -i eth1 /var/www/vnstat/dumps/vnstat_dump_eth1

vnstat --dumpdb -i ppp0  /var/www/vnstat/dumps/vnstat_dump_ppp0

Файлы создаются, теперь добавляем эти команды в крон, например чтоб обновлялось каждые 30 минут

crontab -e
*/30 * * * * vnstat --dumpdb -i eth1 /var/www/vnstat/dumps/vnstat_dump_eth1

по аналогии для второго интефейса.

Собственно и всё заходим на http://ваш_ИП/vnstat/ и наслаждаемся собранной статистикой

(минут через 15-30 статистика начнёт появляться, а вэто время в файле дампа будет что-то вроде этого eth1 Not enough data available yet )

UPD 16.03.2010

Обновилась программа и интерфейс, данный мануал не актуален, теперь просто устанавливаем демон и запускаем PHP скрипт статы, без vnstat –dumpdb -i eth1

UPD 16.03.2010

Обновилась программа и интерфейс, данный мануал не актуален, теперь просто устанавливаем демон и запускаем скрипт статы.

Categories: net, ubuntu Tags:

Смена часового пояса в Ubuntu

Всё невероятно просто.

dpkg-reconfigure tzdata
Categories: man, net, ubuntu Tags:

Сменить MAC в Ubuntu

6 февраля 2010 admin Нет комментариев

в файле

/etc/network/interfaces

Добавить строчку перед инициализацией нужного интерфейса.

Например так:

auto eth0
iface eth0 inet static
pre-up ifconfig eth0 hw ether 00:0c:76:5d:af:ff
address 192.168.1.189
netmask 255.255.0.0
gateway 192.168.1.7
Categories: man, net, ubuntu Tags:

Установка новой сетевой карты в ubuntu

2 февраля 2010 admin Нет комментариев

Втыкаем сетевуху, грузимся, дальше смотрим

lspci

Вывод будет примерно такой

00:00.0 Host bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX Host bridge (
rev 03)
00:01.0 PCI bridge: Intel Corporation 440BX/ZX/DX - 82443BX/ZX/DX AGP bridge (re
v 03)
00:07.0 ISA bridge: Intel Corporation 82371AB/EB/MB PIIX4 ISA (rev 02)
00:07.1 IDE interface: Intel Corporation 82371AB/EB/MB PIIX4 IDE (rev 01)
00:07.2 USB Controller: Intel Corporation 82371AB/EB/MB PIIX4 USB (rev 01)
00:07.3 Bridge: Intel Corporation 82371AB/EB/MB PIIX4 ACPI (rev 02)
00:0a.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL-8139/8139C/8139 C+ (rev 10)
00:0b.0 Ethernet controller: MYSON Technology Inc SURECOM EP-320X-S 100/10M Ethernet PCI Adapter
01:00.0 VGA compatible controller: S3 Inc. 86c368 [Trio 3D/2X] (rev 02)

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

Дальше смотрим

ipconfig -a

Вывод будет примерно таким

eth0      Link encap:Ethernet  HWaddr 00:c0:26:2c:e6:ae
inet addr:192.168.5.36  Bcast:192.168.5.255  Mask:255.255.255.0
inet6 addr: fe80::2c0:26ff:fe2c:e6ae/64 Scope:Link
UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
RX packets:440 errors:0 dropped:0 overruns:0 frame:0
TX packets:145 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:39563 (38.6 KB)  TX bytes:14378 (14.0 KB)
Interrupt:10 Base address:0xe400

eth2      Link encap:Ethernet  HWaddr 00:02:44:4e:67:c0
BROADCAST MULTICAST  MTU:1500  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:1000
RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
Interrupt:5 Base address:0xe800

Вот тут то и видим, что сетевуха то нашлась но завётся не так как мы ожидали.

Как переименовать сетевые интерфейсы

Теперь идём в

/etc/udev/rules.d/ХХ_persistent-net.rules

где ХХ любые произвольные числа.

переименовываем и ребут либо перезапуск сетевых интерфейсов

Categories: man, net, ubuntu Tags:

Удаление правил iptables по их номерам

29 сентября 2009 admin Нет комментариев

Смотрим список правил с номерами.

 iptables -L -t nat --line-numbers

Видим примерно следущее

 Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination
1  DNAT       udp  --  anywhere             proxy               udp dpt:475 to:192.168.100.6:475
2 DNAT       tcp  --  anywhere             proxy               tcp dpt:3389 to:192.168.100.202:3389
3 DNAT       tcp  --  anywhere             anywhere            tcp dpt:www to:192.168.100.192:3128

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination
1 MASQUERADE  all  --  192.168.0.0/16       anywhere
2 SNAT       tcp  --  anywhere             192.168.100.202     tcp dpt:3389 to:91.196.161.26

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination

Чтобы удалить нужное правило нужной цепочки -  Указываем цепочку и номер правила.

iptables -t nat -D PREROUTING 3

Вроде всё :)

Categories: iptables, net, ubuntu Tags:

nginx на ubuntu – это просто ( Компиляция )

20 сентября 2009 admin Нет комментариев

1. ставим зависимости nginx

sudo aptitude install libpcre3 libpcre3-dev libpcrecpp0 libssl-dev zlib1g-dev

2. Создаём каталог. заходим в него, качаем свежий nginx

wget http://sysoev.ru/nginx/nginx-0.7.62.tar.gz

3. Извлекаем

tar -zxvf nginx-0.7.62.tar.gz

4. Заходим в каталог.

cd nginx-0.7.62

5. Компиляция. вполне стандартные опции, что первые выдал гугл.

./configure --sbin-path=/usr/local/sbin --with-http_ssl_module

в результате выполнения команды скрипт configure нам подсказывает, что и как будет

Configuration summary
+ using system PCRE library
+ using system OpenSSL library
+ md5: using OpenSSL library
+ sha1 library is not used
+ using system zlib library
nginx path prefix: "/usr/local/nginx"
nginx binary file: "/usr/local/sbin"
nginx configuration prefix: "/usr/local/nginx/conf"
nginx configuration file: "/usr/local/nginx/conf/nginx.conf"
nginx pid file: "/usr/local/nginx/logs/nginx.pid"
nginx error log file: "/usr/local/nginx/logs/error.log"
nginx http access log file: "/usr/local/nginx/logs/access.log"
nginx http client request body temporary files: "client_body_temp"
nginx http proxy temporary files: "proxy_temp"
nginx http fastcgi temporary files: "fastcgi_temp"

Где будут находится конфиги, где логи т. п.

далее

make && make install

Вот и всё nginx готов к работе.
Можно его запустить командой

sudo /usr/local/sbin/nginx

Если мы хотим чтобы он запустился с вашими уже рабочими конфигурационными файлами. то создаём символическую ссылку предварительно удалив /usr/local/nginx/conf

ln -s /etc/nginx /usr/local/nginx/conf

6. Правка скрипта запуска.
т.к. до этого у меня стоял пакет из репозитория, остались и рабочие файлы конфигурации и скрипт управления nginx (/etc/init.d/nginx)
скорректируем его с учётом нового места установки nginx

DAEMON=/usr/local/sbin/nginx

7. если до этого был установлен Nginx из пакета. то можно его удалить.

apt-get remove nginx

8. запускаем

/etc/init.d/nginx start

9. Проверяем работу сайта.

Оказалось вот на столько просто :)

PS Данный топик был отправлен мною в песочницу Хабра.

Categories: linux, man, ubuntu Tags:

iptables Автозагрузка

27 апреля 2009 admin 3 comments

И так есть у нас вбитые правила и мы хотим чтоб они при рестарте сами вгружались.

1 сохраняем правила в файл

sudo iptables-save > /etc/iptables.up.rules

Дальше в конец файла /etc/network/interfaces дописываем

pre-up iptables-restore < /etc/iptables.up.rules

Ребутемся и проверяем iptables -L

Categories: iptables, linux, net, ubuntu Tags: