четверг, 30 августа 2012 г.

Как узнать ip адрес интерфейса и вывести только его

Маленький пример о том как использовать ifconfig, cut и awk чтобы вывести только ip адрес. Вывод команды ifconfig будет таким

$ /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:69527 errors:0 dropped:0 overruns:0 frame:0
          TX packets:69527 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:41559546 (39.6 MiB)  TX bytes:41559546 (39.6 MiB)
eth0      Link encap:Ethernet  HWaddr 00:17:9A:0A:F6:44
          inet addr:192.168.2.1  Bcast:192.168.1.255  Mask:255.255.255.0
          inet6 addr: fe80::217:9aff:fe0a:f644/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:227614 errors:0 dropped:0 overruns:0 frame:0
          TX packets:60421 errors:0 dropped:0 overruns:0 carrier:0
          collisions:272 txqueuelen:1000
          RX bytes:69661583 (66.4 MiB)  TX bytes:10361043 (9.8 MiB)
          Interrupt:17
ra0       Link encap:Ethernet  HWaddr 00:50:56:C0:00:01
          inet addr:192.168.1.2  Bcast:192.168.2.255  Mask:255.255.255.0
          inet6 addr: fe80::250:56ff:fec0:1/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:1024 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1320 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)


Выведем нужный нам интерфейс и исключим все, кроме строки с IP-адресом:

$ /sbin/ifconfig eth0| grep 'inet addr:'
inet addr:192.168.2.1  Bcast:192.168.2.255  Mask:255.255.255.0

Теперь подключим утилиту cut для того чтобы отделить IP. Говоря просым языком, cut разделит строку в виртуальный массив через ":" и возьмет 2-й элемент этого массива. Вывод будет таким:

$ /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2
192.168.2.1  Bcast

Ну и в конце с помощью awk вытаскиваем IP. Финальная команда будет выглядеть так:

$ /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
192.168.2.1

Истрочник

понедельник, 27 августа 2012 г.

Установка драйвера для NetGear WNA1100 USB WiFi адаптера

Попросили меня на днях подключить драйвер для WiFi адаптера NetGear WNA1100 USB. Выглядит сей девайс следующим образом (см. картинку).


Интересен он тем, что может работать в режиме Access Point в связке с hostapd. Итак, втыкаем этот девайс в машину и смотрим что адаптер определился:


[root@host src]# lsusb 
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 001 Device 002: ID 0846:9030 NetGear, Inc. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub

Если у вас также - значит поехали далее. Устанавливаем linux-headers, build-essential и качаем драйвера:

[root@host ~]# apt-get install linux-headers-$(uname -r)
[root@host ~]# apt-­get install build-essential
[root@host src]# cd /usr/src
[root@host src]# wget http://wireless.kernel.org/download/compat-wireless-2.6/compat-wireless-2.6.tar.bz2

Далее распаковываем наше добро, переходим в каталог с распакованными драйверами и даем команду на выбор необходимого модуля. Нас интересует только ath9k_htc.

[root@host src]# tar xf compat-wireless-2.6.tar.bz2
[root@host src]# tar xf linux­-headers
[root@host src]# cd compat-wireless-2.6
[root@host src]# ./scripts/driver­select ath9k_htc

Компилируем модули:

[root@host src]# make
[root@host src]# make install

После того как вы успешно откомпилировалось качаем firmware и кладем его в каталог /lib/firmware. (Небольшое замечание: иногда, если исходники ядра уже были и из них собирались модули или ядро, то нужно перейти в каталог с исходниками ядра и дать команду "make modules_prepare").

[root@host src]# wget http://linuxwireless.org/download/htc_fw/1.3/htc_9271.fw
[root@host src]# mv ./htc_9271.fw /lib/firmware

Подгружаем модуль и убеждаемся что все корректно загрузилось:

[root@host src]# modprobe ath9k_htc

[root@host src]# lsmod | grep ath9
ath9k_htc              42366  0 
mac80211              286250  1 ath9k_htc
ath9k_common            1371  1 ath9k_htc
ath9k_hw              300480  2 ath9k_htc,ath9k_common
ath                    11078  3 ath9k_htc,ath9k_common,ath9k_hw
cfg80211              128110  3 ath9k_htc,mac80211,ath
compat                  8652  5 ath9k_htc,mac80211,ath9k_common,ath9k_hw,cfg80211


На этом все! Можно ставить hostapd и заставить wifi адаптер работать в режиме AP. Мой конфиг hostpad выглядит следующим образом:


[root@host ~]# cat /etc/hostapd/hostapd.conf 
interface=wlan0
driver=nl80211
logger_stdout=-1
logger_stdout_level=2
ssid=Test
hw_mode=g
ieee80211n=1
ht_capab=[HT40+][SHORT-GI-40][DSSS_CCK-40]
channel=5
auth_algs=3
max_num_sta=5
wpa=2
wpa_passphrase=1234567890
wpa_key_mgmt=WPA-PSK
wpa_pairwise=TKIP
rsn_pairwise=CCMP
logger_syslog=-1
logger_syslog_level=2
logger_stdout=-1
logger_stdout_level=2

четверг, 23 августа 2012 г.

Закрываем доступ к сайту с помощью .htpasswd и .htaccess

Эта заметка скорее не для общего обозрения, а чисто для себя. Бывает что нужно быстро закрыть доступ к некоему http-ресурсу. И я каждый раз ищу документацию по опциям htaccess и htpasswd. Чтобы этого не делать - лучше выложу у себя в блоге. Может кому-то пригодится.

Итак, в настройках apache разрешаем Override. Это для того, чтобы можно было .htaccess задействовать. Пример virtualhost:


< VirtualHost *:80 >
    ServerAdmin worldisfreedom@gmail.com
    DocumentRoot /home/www/www.alertme.ru/html
    ServerName alertme.ru
    < Directory / >
      Options FollowSymLinks
        AllowOverride All
            < /Directory >
    ErrorLog /home/www/www.alertme.ru/logs/error.log
    CustomLog /home/www/www.alertme.ru/logs/access.log common
< /VirtualHost >


Даем команду на reload apache:

# /sbin/service/httpd reload

Далее переходим в ту директорию, которую хотим закрыть и создаем там файл .htaccess со следующим содержимым:

AuthUserFile /home/www/www.voip-lab.ru/html/admin/.htpasswd
AuthName EnterPassword
AuthType Basic
Require user admin

Далее, в той же директории(или любой какой угодно-главное путь не забыть в .htaccess поменять) создаем файл .htpasswd командой

# htpasswd -c .htpasswd admin

И задаем пароль.

Ура! Я больше не буду искать эту инфу =))

среда, 22 августа 2012 г.

Редирект в nginx или использование rewrite и proxy_pass

Возникла тут задачка сделать редирект с помощью nginx при определенном запросе к сайту. Для осуществления нашей задачи я приведу пример конфига:


 server {
         listen       80;
         server_name  www.site.ru site.ru;
         reset_timedout_connection  on;
         location ~* /Service {
            proxy_pass http://avia.go2see.ru;
         }
         location ~* /Service2 {
            rewrite ^ http://demo.site.ru/Service2 permanent;
         }
         location / {
             proxy_pass http://www/;
             proxy_next_upstream error timeout invalid_header http_500 http_503;
             proxy_set_header   Host             $host;
             proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
             proxy_redirect off;
             proxy_connect_timeout 120;                                                                                                                                                                                                                                      
         }
 }

Отличие rewrite от proxy_pass состоит в том, что редирект будет выглядеть "открыто". Т.е. страничка автоматичеси переадресуется по новому адресу. 

В случае в proxy_pass запрос уйдет "прозрачно", т.е. пользователь даже не поймет что был запрос по новому url адресу.



понедельник, 20 августа 2012 г.

Как привязать ssl к nginx

В данной заметке я расскажу как быстро привязать ssl сертификат к nginx. Испытания мы  проведем тестовом сервере с тестовым сертификатом, который запросим у Comodo.

Итак, для начала определимся что у нас есть. А есть у нас один nginx сервер который смотрит в Интернет. И, для простоты, один внутренний (с ip 10.10.10.10) для которого и будет создаваться стандартное и ssl подключение. Конечно, серверов может быть сколько угодно. Но мы с вами сейчас не будем усложнять.

Для начала нам необходимо создать CSR-запрос на сертификат. Бесплатно можно его сделать либо напрямую у Comodo, либо через сайт http://www.freessl.su/. Мы будет делать через http://www.freessl.su/.

Конфигурационные файлы от nginx у меня лежат в каталоге /etc/nginx. Создаем там подкаталог ssl и переходим в него.

# mkdir /etc/nginx/ssl
# cd /etc/nginx/ssl

Далее необходимо создать CSR запрос. Для этого сначала создадим файл приватного ключа следующей командой:

# openssl genrsa -des3 -out secure.website.ru.key 2048

Если вы хотите создать файл ключа без пароля, то введите следующую команду

# openssl genrsa -out secure.website.ru.key 2048

Далее создадим файл запроса на генерацию сертификата. Для этого пишем команду:

# openssl req -new -key  secure.website.ru.key -out  secure.website.ru.csr

И заполняем поля. После этого будет сгенерирован файл /etc/nginx/ssl/secure.website.ru.csr. Скопируем его содержимое и идем на сайт http://www.freessl.su/. Там заполняем поля ФИО, Телефон, email и вставляем содержимое файла secure.website.ru.csr в поле CSR. Нажимаем далее, выбираем подходящий контактный email.

После этого на почтовый ящик от Comodo придет письмо с просьбой подтвердить создание ssl сертификата. В письме будет указан код подтверждения. Перейдите по ссылке в письме и подтвердите.

Через некоторое время вам придет файл с сертификатом и файл с промежуточными сертификатами. Скопируйте их содержимое в /etc/nginx/ssl/secure.website.ru.crt.

#cat secure_website_ru.crt >> /etc/nginx/ssl/secure.website.ru.crt
#cat secure_website_ru.ca_bundle >> /etc/nginx/ssl/secure.website.ru.crt

На этом формирование сертификата закончено. Переходим к настройке nginx. Для нашего случая конфигурация /etc/nginx/nginx.conf будет выглядеть следующим образом:

user  nginx;

worker_processes  1;

error_log  /var/log/nginx/error.log;
pid        /var/run/nginx.pid;


events {
    worker_connections  2048;
}


http {
    upstream www {
        server 10.10.10.10 weight=1 max_fails=3 fail_timeout=120;
    }

    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                        '$status $body_bytes_sent "$http_referer" '
                        '"$http_user_agent" "$http_x_forwarded_for"';

    access_log  /var/log/nginx/access.log  main;

    sendfile        on;

#Секция для стандартного подключение по 80 порту
     server {
         listen       80;
         server_name  secure.website.ru;
         reset_timedout_connection  on;
         location / {
             proxy_pass http://www/;
             proxy_next_upstream error timeout invalid_header http_500 http_503;
             proxy_set_header   Host             $host;
             proxy_set_header  X-Forwarded-For  $proxy_add_x_forwarded_for;
             proxy_redirect off;
             proxy_connect_timeout 100;
         }
    }

 # Секция для подключения по ssl
    server {
        listen          443 ssl;
        server_name     secure.website.ru;

        access_log      logs/ssl-access.log;
        error_log       logs/ssl-error.log;

        ssl_certificate      ssl/secure.website.ru.crt;
        ssl_certificate_key  ssl/secure.website.ru.key;
        ssl_verify_depth 3;
      
        keepalive_timeout    60;
        location / {
                proxy_pass  http://www/;
                proxy_next_upstream error timeout invalid_header http_500 http_5
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
                proxy_set_header X-Forwarded-Proto https;
                proxy_redirect     off;
      }
 }
}

Сохраняем и перезапускаем nginx.

# service nginx reload

Вдаваться в детали настроек я не хочу. Про них очень хорошо написано в официальной документации nginx.

Единственное что хотелось бы подчеркнуть, что если вы хотите на 1 сервер повесить несколько разных ssl сертификатов на порт 443, то просто добавить такую конфигурацию не получится:

server {
    listen           443;
    server_name      www.example.com;
    ssl              on;
    ssl_certificate  www.example.com.crt;
    ...
}

server {
    listen           443;
    server_name      www.example.org;
    ssl              on;
    ssl_certificate  www.example.org.crt;
    ...
}

В такой конфигурации браузер получит сертификат первого сервера, т.е. www.example.com, независимо от запрашиваемого имени сервера. Это связано с поведением протокола SSL. SSL-соединение устанавливается до того, как браузер посылает HTTP-запрос, и nginx не знает имени запрашиваемого сервера. Следовательно, он лишь может предложить сертификат сервера по умолчанию.

Решение данного вопроса вы можете найти по ссылке.

На этом базовая настройка nginx законена.

четверг, 16 августа 2012 г.

Моя прелесть или uptime сервера

Хочу похвастать uptime-ом одним из серверов, который выполняет функцию Voip-сервера и шлюза на базе NEOPbx.


Учитывая что сервер активно используется - думаю есть повод гордиться. Выкладывайте в комментах свои "My Precious" =)

Настраиваем домашний файловый сервер на основе Xen и Freenas / Часть 1 - Установка Xen на Debian

Данной небольшой заметкой я начну серию статей о хитрой связке Xen и Freenas. Почему хитрой, ответит на вопрос серия требований. Далее, под системой я буду понимать всю связку Xen c Freenas со всеми дополнениями и фунционалом.

Требования:
  • Система должна представлять собой файловое хранилище.
  • Система должна уметь закачивать .torrent файлы через web интерфейс и dropbox
  • Система должна иметь DLNA сервер для последующего воспроизведения
  • Нужно модифицировать web-интефейс transmission для нативного перезапуска DLNA службы на основном сервере.
  • Орагнизовать запуск на скачку .torrent с мобольных девайсов
  • Пробросить жесткий диск из Dom0 во FreeNAS
По службам получается приблизительно такая картина:



За неимением Android девайса не могу сказать что нам понадобится для запуска закачки на сервере. Но обещаю ближе к финалу найти телефончик. Протестить и дополнить схему.

В итоге мы подключим жесткий диск и прокинем его в гостевую машину. Далее, поскольку если   одновременно смонтировать ЖД и прокинуть в гостевую машину, появляются глюки(по понятным причинам), а адекватно работающий DLNA-сервер мне удалось найти только под Linux,- мы смотнируем по nfs содержимое FreeNAS сервера в Debian. По производительности вы ничего не потеряете, а вот возможных глюков можно избежать.

Далее мы установим dropbox на сервер Debian и натравим его на смонтированный по nfs (под)каталог.

И в заключение в transmission мы добавим волшебную кнопочку, которая будет на Debian сервере перезапускать minidlna службу. А сделаем это с помощью javascript+php+ssh с авторизацией по ключу.

Итак, инсталляцию гипервизора я буду производить на дистрибутив squeeze. Нам нужно всего 4 команды и сделать ребут сервера.

# apt-get install xen-linux-system
# apt-get install xen-qemu-dm-4.0
# dpkg-divert --divert /etc/grub.d/08_linux_xen --rename /etc/grub.d/20_linux_xen
# update-grub

По умолчанию у вас должна загрузиться система с новым ядром с поддержкой XEN. В следующей части мы установим на Debian - sshd, dlna, nfsd, dropbox и настроим iptables.



среда, 15 августа 2012 г.

Новый опрос

В блог я, конечно, стал писать гораздо реже, в связи с сильной загруженностью. Но прошу Вас ответить на опрос который я разместил в панели справа. Я хочу показать и рассказать каким образом можно организовать связку между xen, freenas, dlna, dropbox, ipad и/или iphone. Основная задача такой связки в том, что я могу с любого устройства (и даже все локальной сети) на сервере запустить закачку torrent-файла с последующим просмотром его на телевизоре с поддержкой DLNA. Если вам (не)интересно прошу ответить в опросе.

вторник, 14 августа 2012 г.

Выполнение скрипта при обращении к хосту

Однажды у меня возникла задача - как сделать так, чтобы при обращении к определенному ip на шлюзе запускался некий скрипт или программа. В этом посте я хочу привести пример на perl с использованием tcpdump. В этом скрипте если было обращение с хоста 192.168.0.104 к 93.158.134.61 произойдет перезапуск DLNA сервера. Я использую его в связке со своим телевизором подключенном к локальной сети. Таким образом мне удалось перезапускать DLNA службу, если я открыл на телевизоре сайт yandex.ru. Ну и собственно сам скрипт:


#!/usr/bin/perl
$LIMIT = shift || 5000;
$|=1;
open (STDIN,"/usr/sbin/tcpdump -lnx -s 1024 dst port 80 |");
while (<>) {
    if (/^\S/) {
  last unless $LIMIT--;
while ($packet=~/(GET|POST|WWW-Authenticate|Authorization).+/g)  {
       #print "$client -> $host\t$&\n";
       if(($host=="93.158.134.61") and ($client="192.168.0.104")){
              system('/sbin/service minidlna restart&');}
}
undef $client; undef $host; undef $packet;
($client,$host) = /(\d+\.\d+\.\d+\.\d+).+ > (\d+\.\d+\.\d+\.\d+)/
       if /P \d+:\d+\((\d+)\)/ && $1 > 0;
    }
    next unless $client && $host;
    s/\s+//;
    s/([0-9a-f]{2})\s?/chr(hex($1))/eg;
    tr/\x1F-\x7E\r\n//cd;
    $packet .= $_;
}

понедельник, 13 августа 2012 г.

PS1 или меняем строку приглашения

Работая  одновременно с большым количеством линуксовых серваков я подумал что было бы удобно, если в строке риглашения выводилось не только сообщение о хосте, пользователе но и ip адресе текущей машины. Сказано - сделано. Открываем файл .bashrc в домашнем каталоге и дописываем в него строку

export "PS1=[`/sbin/ifconfig eth0 | /usr/bin/perl -ne 'if ( m/^\s*inet (?:addr:)?([\d.]+).*?cast/ ) { print qq($1\n); exit 0; }'`][\u@\h \W] # "


Сохраняем и переподключаемся. И в результате видим нашу красоту. Теперь я буду путаться гораздо меньше =)