Архів рубрики: Мережа

Заміна IP адреси у файлах зон BIND

Є такі люди, що люблять подорожувати. Іноді сайти та сервіси теж зриваються з насидженого місця та вирушають у дорогу. Така міграція – справжній головний біль для системного адміністратора. Коли мова йде про 1-2 сервіси, це не проблема, а от коли переїжджає цілий хостінг.

Задача: є сервер імен BIND в якому треба поміняти всі записи зі старим IP на новий. Справу ускладнює те, що не всі зони треба міняти (оновлювати serial). Зміни мають зачепити лише ті файли зон, в яких дійсно змінюється IP. Як правило, я роблю такі зміни за допомогою Perl сценарію, але сьогодні спробував вичавити по максимуму командний рядок Лінукс.

У каталозі /etc/bing/db були зібрані файли зон, але були вкладені каталоги та символічні посилання. Тому на першому етапі відбираємо лише файли з каталогу та не чіпаємо підкаталоги:

find /etc/bind/db -maxdepth 1 -type f

Через xargs направляємо файл до grep

grep -H -m 1 '75.147.252.194'

Аргумент -H обов’язково додасть ім’я файлу до виводу, а -m 1 – покаже лише перше згадування старої IP-адреси.

Тепер залишаємо лише ім’я потрібного файлу зони (перший стовпець):

cut -d: -f1

Цю конструкцію я додав до Perl сценарію і на виході мав перелік файлів, в яких потрібно було зробити заміну IP та serial номер зони:

my $db_dir = "/etc/bind/db";
my $old_ip = '75.147.252.194';

my @files = `find $db_dir -maxdepth 1 -type f |
 xargs grep -H -m 1 '$old_ip' |
 cut -d: -f1`;

3mob інтернет через модем HUAWEI Mobile у Debian

Інколи, в мене падає кабельний інтернет і я змушений переключатися на резервний 3G від 3mob (колишній Утел та Укртелеком). Як я вже писав, з першого разу я зміг без проблем підключитися до 3G мережі, але потім всі мої спроби підключення завершувались аварійно.

Тоді в мене не було часу розбиратися в чому справа, бо як правило, кабельний інтернет швидко починав робити знову і я забував про свій 3G. Але сьогодні я вирішив з’ясувати в чому справа.

Перш за все, після відмови підключитися, я продивився вивід dmesg:

# dmesg | tail -n 1
[407908.851115] modem-manager[11161]: segfault at 0 ip
 00007f3172ea60a8 sp 00007fff6ce952c8 error 4 in
 libglib-2.0.so.0.3200.4[7f3172e32000+f5000]

Segmentation fault – це завжди погано. Погугливши на тему modem-manager я знайшов багато подібних проблем і рішення у стилі “ось тобі молоток та зубильце – доопрацьовуй”.

Справа в тому, що Лінукс не вірно визначає ідентифікатор пристрою. Але це можна полагодити.

1. Підключаємо USB модем і дивимось вивід dmesg:

$ dmesg | tail
[408349.676873] ehci_hcd 0000:00:1a.0: setting latency timer to 64
[408349.692769] xhci_hcd 0000:00:14.0: setting latency timer to 64
[408349.896576] usb 1-1.2: new high-speed USB device number 4 using
 ehci_hcd
[408349.999615] usb 1-1.2: New USB device found,
 idVendor=12d1, idProduct=1446
[408349.999626] usb 1-1.2: New USB device strings: Mfr=2, Product=1,
 SerialNumber=0
[408349.999632] usb 1-1.2: Product: HUAWEI Mobile
[408349.999637] usb 1-1.2: Manufacturer: HUAWEI Technology
[408350.004599] scsi33 : usb-storage 1-1.2:1.0
[408350.005229] scsi34 : usb-storage 1-1.2:1.1
[408350.595754] ehci_hcd 0000:00:1d.0: setting latency timer to 64

Нас цікавить лише ідентифікатор виробника (idVendor) та пристрою (idProduct).

2. Він рута завантажуємо модуль option:

# modprobe option

3. Через команду usb-devices перевіряємо які ідентифікатори виробника та продукту вказані для нашого модему (вивід скорочено):

# usb-devices 
...
T:  Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 15 Spd=480 MxCh= 0
D:  Ver= 2.00 Cls=00(>ifc ) Sub=00 Prot=00 MxPS=64 #Cfgs=  1
P:  Vendor=12d1 ProdID=1001 Rev=00.00
S:  Manufacturer=HUAWEI Technology
S:  Product=HUAWEI Mobile
C:  #Ifs= 5 Cfg#= 1 Atr=e0 MxPwr=500mA
I:  If#= 0 Alt= 0 #EPs= 3 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
I:  If#= 1 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
I:  If#= 2 Alt= 0 #EPs= 2 Cls=ff(vend.) Sub=ff Prot=ff Driver=option
I:  If#= 3 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
I:  If#= 4 Alt= 0 #EPs= 2 Cls=08(stor.) Sub=06 Prot=50 Driver=usb-storage
...

4. Видно, що виробник вказаний вірно, а от код пристрою – ні. Встановлюємо вірні значення:

# echo 12D1 1446 > /sys/bus/usb-serial/drivers/option1/new_id

Після цього мій 3G модем HUAWEI успішно підключився до мережі 3mob.

Обмеження швидкості завантаження (upload) у Nginx для тестування

У веб-сервера Nginx є гарна вбудована опція для обмеження швидкості скачування – limit_rate. Але вона впливає лише на швидкість download і ніяк не може обмежити upload.

А в тестових цілях мені потрібно було зробити завантаження повільним, таким як на dial-up каналі. Пошук в інтернеті мене вивів на http://wiki.nginx.org/HttpUploadModule, я навіть зміг його додати до Nginx після встановлення пакунку libssl-dev:

# apt-get install libssl-dev

Цей модуль ніяк не хотів компілюватися без файлів md5.h та sha.h.

Та на жаль, я так і не зміг примусити директиву upload_limit_rate працювати.

Час спливав, і я змушений був шукати альтернативний спосіб зменшення швидкості завантаження файлів на тестовий сервер. Ним виявився пакунок trickle:

# apt-get install trickle

Це така консольна програма, що дозволяє обмежувати швидкість як завантаження так і скачування для програм, які запущені через неї.

Замість обмеження швидкості для Nginx – я обмежив її для браузера, в якому виконую тестування:

$ trickle -u 5 google-chrome

І хром завантажує лише 5 кілобайт на секунду.

 

Міграція гостьових Debian у VirtualBox та проблеми з мережею NAT

Нещодавно я скопіював усі свої гостьові операційні системи з одного комп’ютера на інший. Через OVL формат – це тривіальні задача. Хоча, якщо назви у віртуальних машин однакові (а саме назви файлів для дисків), то це не виходить зробити за один раз. Доводиться кожну таку машину окремо.

Так от, всі машини запустились без проблем, а старенька Debian 4.0 – ні. Точніше вона начебто працювала нормально, але без мережевого інтерфейсу eth0:

$ /sbin/ifconfig
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:8 errors:0 dropped:0 overruns:0 frame:0
 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:0 
 RX bytes:560 (560.0 b)  TX bytes:560 (560.0 b)

Спроба запустити його вручну закінчилась нічим:

# ifup eth0
Internet Systems Consortium DHCP Client V3.0.4
Copyright 2004-2006 Internet Systems Consortium.
All rights reserved.
For info, please visit http://www.isc.org/sw/dhcp/

SIOCSIFADDR: No such device
eth0: ERROR while getting interface flags: No such device
eth0: ERROR while getting interface flags: No such device
Bind socket to interface: No such device
Failed to bring up eth0.

Файл /etc/network/interfaces післе переносу не редагувався і містив стандартні рядки:

auto lo
iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

Трохи погугливши вияснив, що проблема в udev. А ще точніше – у файлі /etc/udev/rules.d/z25_persistent-net.rules. На різних версіях Debian-оподібних операційних систем він може мати інші префікси, але persistent-net.rules буде присутнє. Файл мав такий зміст:

# This file was automatically generated by the
# /lib/udev/write_net_rules
# program, probably run by the persistent-net-generator.rules rules
# file.
#
# You can modify it, as long as you keep each rule on a single line.
# MAC addresses must be written in lowercase.

# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="08:00:27:a5:c0:ff",
 NAME="eth0"

# PCI device 0x8086:0x100e (e1000)
SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="08:00:27:97:b2:6b",
 NAME="eth1"

Як я зрозумів, при міграції гостьової Debian, було змінено MAC адресу мережевого адаптеру. І система udev чомусь подумала, що це новий адаптер. Мені залишилось лише видалити інформацію про eth0 (перший рядок) та змінити в другому eth1 на eth0:

SUBSYSTEM=="net", DRIVERS=="?*", ATTRS{address}=="08:00:27:97:b2:6b",
 NAME="eth0"

Після перезапуску віртуальної машини – мережа піднялась автоматично.

Зміна hostname у Debian

Командний рядок терміналу (такого як Xterm), як правило, показує запрошення у вигляді:

user@hostname:dir$ _

Це доволі зручно, тому що працюючи одночасно з декількома консолями ви завжди розумієте по значенню @hostname з яким сервером маєте справу. Якщо ім’я серверу записане у форматі домену – www.example.com, то користувач побачить hostname не повністю, а лише його ліву частину до першої крапки:

user@www:dir$ _

У віртуальних серверів (VPS), особливо у орендованих, це ім’я не завжди містить корисну інформацію. Скоріше за все, там буде суміш літер та цифр, або якийсь номер для внутрішнього використання.

Отже як змінити hostname у Debian. Одразу попереджую, що використання команди hostname дає лише тимчасовий ефект, після перезапуску сервера повернеться попереднє ім’я.

Самий простий спосіб – змінити ім’я у файлі /etc/hostname (навіть якщо цей файл порожній) та перезавантажити комп’ютер.

Якщо можливості перезавантажити серер не має, можна спробувати зробити це “на ходу”. Більш детально читайте про це тут: https://wiki.debian.org/HowTo/ChangeHostname

Наведена тут інформація не підходить до контейнерів Debian всередині OpenVZ. Всередині контейнера, навіть якщо ви поміняєте вміст файлу /etc/hostname, після перезапуску hostname повернеться до первісного значення, яке вказане у конфігурації контейнера. Тому для OpenVZ використовуйте команду:

# vzctl set ID_КОНТЕЙНЕРА --hostname НОВИЙ_HOSTNAME --save

Порядок псевдонімів server_name у конфігу Nginx

Веб-сервер Nginx дозволяє доволі гнучко керувати псевдонімами вашого сайту. Можна використовувати декілька директив server_name:

server_name example.com www.example.com alias.com;
server_name www.alias.com;

Мені подобається схема у 2 імені, коли перше іде без www, а друге з www:

server_name example.com www.example.com;
server_name alias.com www.alias.com;

Але перше ім’я домену має найвищій пріоритет і саме воно буде використане за умовчанням при обробці правил rewrite з опціями redirect та permanent.

Простий приклад. Маємо правило:

rewrite ^/user/(.*) /newlook/$1 permanent;

За таким правилом користувача завжди буде перенаправлено до домену example.com:

example.com/user/index.php -> example.com/newlook/index.php
www.example.com/user/index.php -> example.com/newlook/index.php
alias.com/user/index.php -> example.com/newlook/index.php
www.alias.com/user/index.php -> example.com/newlook/index.php

Налаштування 3G інтернету від 3mob (Utel) в Gnome 3 (Linux)

Лінукс, як і всі Unix-оподібні операційні системи, традиційно сильна у налаштуванні мережі. Так було у епоху Ethernet, але з появою бездротових мереж та мобільного інтернету 2G (GPRS/EDGE) та 3G (UMTS/HSPA) підключення до мережі це лише сервіс. Тепер на перший план виходить зручність підключення.

У менеджері вікон Gnome 3 ці налаштування відбуваються майже автоматично, але є я зміг підключитися до 3G від 3mob (Utel) лише першого разу, коли спрацював “візард” налаштування. Потім коли я вставляв USB 3G-модем (HUAWEI) і клацав на перемикачі “Мобільна радіомережа” – з’являлось повідомлення, що “ви підключені до мережі Utel” і потім “з’єднання розірване”. Вам сюди – якщо у Вас проблеми на рівні драйверу USB 3G-модему.

Треба вручну прибрати за “візардом”. Для цього з командного рядка запускаємо:

$ nm-connection-editor

На вкладці “Мобільні широкосмугові” знаходимо підключення Utel та клацаємо кнопку “Змінити…”.

На наступному екрані також обираємо вкладку “Мобільні широкосмугові”. У себе я включив перемикач “Підключати автоматично” – це головне. А також змінив тип на “Віддавати перевагу 3G (UMTS/HSPA)”, та вимкнув “Вмикати роумінг, якщо недоступна домашня мережа”. Закриваємо діалог клацнувши на кнопку “Зберегти…”.

Все. Тепер щоб підключитися до інтернету я вставляю 3G модем, трохи чекаю поки його ідентифікує система та клацаю на кнопці включення “Мобільної радіомережі”.

Skype у Debian 7 (wheezy)

Версія Skype 4.2.0.11 з офіційного сайту хоча і була для архітектури i386, але встановилась майже без проблем (звичайно натягнула трохи зайвих пакетів). А от у роботі була дуже нестабільною:

  • час від часу пропадав звук
  • без видимої причини програма припиняла свою роботу (так звані crashes)
  • одного разу взагалі підвісила Х-и

Після чергового крешу, я спробував знайти щось на зразок логу, але це виявилось не так просто. Тому наступний раз я запустив скайп з командного рядка, щоб бачити, які повідомлення він пише до консолі. На жаль, вивід того терміналу я не зберіг, але там були повідомлення про невірні параметри налаштування звуку. Трохи погугливши, я знайшов рішення для 64-х розрядної Debian та 32-х розрядного Skype:

# apt-get install libasound2-plugins:i386

Після встановлення пакунку libasound2-plugins для архітектури i386 – попередження з консолі зникли.

Wifi для Debian Wheezy (iwlwifi)

Ноутбук з Windows 8 для мене наче пристрій з майбутнього. Без сенсорного екрану та миші я не зміг оцінити переваг нового інтерфейсу. Навіть перезавантажити його, щоб зайти у BIOS, виявилось не так просто.

Встановити Лінукс (Debian Wheezy) я зміг майже без проблем, але під час виявлення мережевого обладнання побачив на екрані повідомлення, що для роботи драйвера wifi мені потрібні якісь firmware:

iwlwifi-2030-6.ucode та iwlwifi-2030-5.ucode

Звичайно, ні на якому змінному носії в мене їх не було, хоча в комплекті до ноутбука йшла низка компакт-дисків (DVD чи CD не знаю), але вставити їх все рівно не було куди. Тому під час встановлення я пропустив пункт налагодження wifi і підключився через звичайне дротове з’єднання з мережею (добре, що у комплекті був перехідник usb-ethernet).

Але без wifi працювати не прикольно. Тому я поліз у гугл та знайшов wiki по налаштуванню Intel WiFi пристроїв у Debian: http://wiki.debian.org/iwlwifi

Треба віддати належне документації Debian – вона може трохи заплутана, але дуже достовірна. Все зробив як там було написано:

  1. Додав non-free пакунки у файлі /etc/apt/sources.list
    deb http://mirror.mirohost.net/debian/ wheezy main non-free
  2. Оновив перелік пакунків та встановив firmware-iwlwifi
    # apt-get update
    # apt-get install firmware-iwlwifi
  3. Перезапустив модуль ядра для роботи з wifi:
    # modprobe -r iwlwif
    # modprobe iwlwif

Все, wifi мережі одразу з’явились на панелі:

 

Створення власного SSL сертифікату та застосування його у Nginx

Стисло опишу, як згенерувати SSL сертифікат у Debian.

Встановлюємо пакет ssl-cert:

apt-get install ssl-cert

Створюємо сертифікат для потрібного домену:

make-ssl-cert /usr/share/ssl-cert/ssleay.cnf /etc/ssl/ДОМЕН

Ця консольна утиліта запитає назву домену. Ви повинні ввести домен, для якого створюється сертифікат.

Сертифікат матиме вміст:

-----BEGIN RSA PRIVATE KEY-----
 це приватний ключ
-----END RSA PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
 це публічний сертифікат
-----END CERTIFICATE-----

Приватний ключ зберігаємо у каталозі /etc/ssl/private. Краще дати йому розширення *.key:

$ cat /etc/ssl/private/ДОМЕН.key
-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----

Публічну частину – у каталозі /etc/ssl/certs, з розширенням *.pem:

$ cat /etc/ssl/certs/ДОМЕН.pem
-----BEGIN CERTIFICATE-----
...
-----END CERTIFICATE-----

Оригінальній файл можна видалити. Чомусь в мене файл сертифікату був створений зі символічним посиланням на нього. Це посилання – теж видаляємо.

Підключаємо сертифікат до Nginx:

server {

 listen   443;
 server_name ДОМЕН;

 ssl  on;
 ssl_certificate        /etc/ssl/certs/ДОМЕН.pem;
 ssl_certificate_key    /etc/ssl/private/ДОМЕН.key;

 ssl_session_timeout  5m;

 ssl_protocols  SSLv3 TLSv1;
 ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv3:+EXP;
 ssl_prefer_server_ciphers   on;

 ...
}