пятница, 5 марта 2010 г.

Создание LiveCD Slackware based. Часть 2: сетевая станция

Возникновение домашнего сервера как бытового прибора, восходит к тем далеким, голодным временам когда интернет-каналы были маленькие и что бы хоть что-то выкачать приходилось держать сутками включенный компьютер. Как сейчас помню, образ slackware-12.1 качался 8 суток на скорости 64Кбит/с. Одним словом нужна была тихая маломощная машинка без клавиатуры и монитора с управлением по ssh-каналу. Такие машинки называются NAS (Network Attached Storage) сетевые диски, говоря по-русски. Продаются они в виде готовых гиговских девайсов, есть и специализированные сборки LiveCD FreeNAS готовые превратить Ваш компьютер в такую машинку, но своя рубашка, как известно, ближе к телу, о ней сегодня и поговорим.
Обзор источников, программного обеспечения и концепция системы.
Торрент-клиентом у нас будет выступать rtorrent
Обычно когда говорят об удаленном управлении rtorrent, речь идет о связке:
на_удаленной_машине:{rtorrent+web-сервер+PHP}<-->на_локальной_машине:{веб-браузер}
Мы откажемся от использования web-сервера и PHP, а на клиентской машине вместо веб-браузера поставим специализированную программу nTorrent.
Также будут установлены программы:
- сетевые утилиты: ping, whois, traceroute, ifconfig, iptables, etc
- демоны: inetd, telnetd, sshd, vsftpd
- программы: консольный веб-браузер lynx, торрент-клиент rTorrent, wget
Компьютер будет оснащен двумя сетевыми интерфейсами, один из которых будет подключен к интернет, а другой к локальной сети и будет выполнять роль шлюза и файрвола для локальной сети.
В качестве тестового компьютера мне служит:
Celeron 850 (Pentium III based)
M/B: CT-6BJM (i440BX chipset based)
RAM: 192Mb
Ethernet: rt8139 2шт.

Основным материалом для построения системы послужила статья:
Установка rTorrent в Slackware.
Для настройки ftp-сервера неоценимую помощь оказал материал:
Установка и настройка vsftpd
При составлении ~/.rtorrent.rc помог перевод официального HOWTO в википедии:
http://ru.wikibooks.org/wiki/RTorrent

Установка необходимого программного обеспечения.
Предполагаем что мы успешно собрали базовую систему, имеем рутовые права, находимся в директории /tmp/livecd и наш rootfs.cgz распакован.
Формируем список пакетов для закачки:
cat > /tmp/livecd/pklist << EOF
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/n/inetd-1.79s-i486-8.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/n/iptables-1.4.3.2-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/n/iputils-s20070202-i486-2.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/n/lynx-2.8.6rel.5-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/n/net-tools-1.60-i486-2.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/n/network-scripts-13.0-noarch-2.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/n/openssh-5.2p1-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/n/tcp_wrappers-7.6-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/n/telnet-0.17-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/n/traceroute-1.4a12-i386-2.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/n/vsftpd-2.1.2-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/n/wget-1.11.4-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/n/whois-4.7.26-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/n/cyrus-sasl-2.1.23-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/ap/screen-4.0.3-i486-1.txz
ftp://ftp.chg.ru/pub/Linux/Slackware/slackware-13.0/slackware/a/utempter-1.1.4-i486-1.txz
Для выхода из режима редактирования нажмите Ctrl+D или напечатайте EOF и нажмите Enter

выкачиваем их:
wget -i /tmp/livecd/pklist

Устанавливаем:
installpkg -root /tmp/livecd/1 /tmp/livecd/*.txz
rm /tmp/livecd/*txz
Кроме этого, понадобятся дополнительные пакеты:

libsigc++
wget http://slackbuilds.org/slackbuilds/13.0/libraries/libsigc++.tar.gz
tar xvfz libsigc++.tar.gz
cd /tmp/livecd/libsigc++
wget http://ftp.gnome.org/pub/GNOME/sources/libsigc++/2.2/libsigc++-2.2.3.tar.bz2
sh ./libsigc++.SlackBuild && installpkg -root /tmp/livecd/1 /tmp/libsigc++-2.2.3-i486-1_SBo.tgz
cd -
rm -r /tmp/livecd/libsigc++
rm /tmp/livecd/libsigc++.tar.gz
rm /tmp/libsigc++-2.2.3-i486-1_SBo.tgz


libtorrent
wget http://slackbuilds.org/slackbuilds/13.0/libraries/libtorrent.tar.gz
tar xvfz /tmp/livecd/libtorrent.tar.gz
cd /tmp/livecd/libtorrent
wget http://libtorrent.rakshasa.no/downloads/libtorrent-0.12.5.tar.gz
sh ./libtorrent.SlackBuild && installpkg -root /tmp/livecd/1 /tmp/libtorrent-0.12.5-i486-2_SBo.tgz
cd -
rm -r /tmp/livecd/libtorrent
rm /tmp/livecd/libtorrent.tar.gz
rm /tmp/libtorrent-0.12.5-i486-2_SBo.tgz

xmlrpc-c
mkdir /tmp/livecd/xmlrpc-c
cd /tmp/livecd/xmlrpc-c
svn checkout https://xmlrpc-c.svn.sourceforge.net/svnroot/xmlrpc-c/advanced xmlrpc-c
cd ./xmlrpc-c
sh ./configure --prefix=/usr
make
mkdir /tmp/xmlrpc-c
make install DESTDIR=/tmp/xmlrpc-c
cd /tmp/xmlrpc-c
find . | xargs file | grep -e "executable" -e "shared object" | grep ELF | cut -f 1 -d : | xargs strip --strip-unneeded 2> /dev/null || true
/sbin/makepkg -l y -c n /tmp/xmlrpc-c_svn_my.tgz
cd /tmp/livecd
installpkg -root /tmp/livecd/1 /tmp/xmlrpc-c_svn_my.tgz
rm -r /tmp/xmlrpc-c
rm /tmp/xmlrpc-c_svn_my.tgz
rm -r /tmp/livecd/xmlrpc-c

rtorrent
wget http://slackbuilds.org/slackbuilds/13.0/network/rtorrent.tar.gz
tar xvfz ./rtorrent.tar.gz
cd /tmp/livecd/rtorrent
wget http://libtorrent.rakshasa.no/downloads/rtorrent-0.8.5.tar.gz
sed -i "/--mandir=/ a --with-xmlrpc-c" ./rtorrent.SlackBuild
sed -i 's/--with-xmlrpc-c/ --with-xmlrpc-c \\/' ./rtorrent.SlackBuild
sh ./rtorrent.SlackBuild && installpkg -root /tmp/livecd/1 /tmp/rtorrent-0.8.5-i486-2_SBo.tgz
cd -
rm /tmp/rtorrent-0.8.5-i486-2_SBo.tgz
rm /tmp/livecd/rtorrent.tar.gz
rm -r /tmp/livecd/rtorrent
rm /tmp/livecd/pklist

С инсталяцией закончили.

Настройка.
Конфигурация сети.
На машине два ethernet интерфейса. Первый подключен к одно-портовому ADSL-роутеру с ip=192.168.1.1. С него идет интернет. Второй интерфейс смотрит в локальную сеть. Локальной сети необходим форвардинг до модема, файрвол тоже не будет лишним.

Поднимаем наши интерфейсы и назначаем шлюз:
rm -f /tmp/livecd/1/etc/rc.d/rc.inet1
rm -f /tmp/livecd/1/etc/rc.d/rc.inet1.conf
cat > /tmp/livecd/1/etc/rc.d/rc.inet1 << EOF
#!/usr/bin/bash
/sbin/ifconfig lo 127.0.0.1
/sbin/ifconfig eth0 192.168.1.2
/sbin/ifconfig eth1 10.0.35.1
/sbin/route add -net 127.0.0.0/8 lo
/sbin/route add default gw 192.168.1.1

Ставим резолв:
echo "nameserver 192.168.1.1" > /tmp/livecd/1/etc/resolv.conf

Разрешаем форвардинг
chmod +x /tmp/livecd/1/etc/rc.d/rc.ip_forward

Пишем правила для файрвола:
cat > /tmp/livecd/1/etc/rc.d/rc.firewall << EOF
#!/usr/bin/bash
/usr/sbin/iptables -A POSTROUTING -o eth0 -t nat -j MASQUERADE
/usr/sbin/iptables -A INPUT -i eth0 -p icmp -j DROP
/usr/sbin/iptables -A INPUT -i eth0 -p tcp --dport 6900 -j ACCEPT
/usr/sbin/iptables -A INPUT -i eth0 -p tcp -m tcp --tcp-flags FIN,SYN,ACK SYN -j REJECT --reject-with icmp-port-unreachable
У нас маленькая частная локальна сеть. Поэтому при любом запросе притворяемся кирпичом не имеющим подключения к интернет.

Права на выполнение:
chmod +x /tmp/livecd/1/etc/rc.d/rc.firewall

Устанавливаем имя хоста:
echo "dark.warrior.net" > /tmp/livecd/1/etc/HOSTNAME


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

Нам нужен ftp-сервер. По правде говоря, у нас он уже есть - это sftp входящий в состав sshd. Но. ftp нам нужен в защищенном участке сети, а sftp шифрует весь трафик сводя и так невысокую скорость 100Mbit на нет. Также из-за возможных траблов с ключами мы поставили telnetd в систему, хотя пользоваться им не собираемся. Пусть будет.
Существует два основных ftp-демона: vsftpd и proftpd. Мы будем пользоваться первым.
Раскомментируем нужную строку в inetd.conf
sed -i 's/#ftp stream tcp nowait root \/usr\/sbin\/tcpd vsftpd/ftp stream tcp nowait root \/usr\/sbin\/tcpd vsftpd/' /tmp/livecd/1/etc/inetd.conf

Правим конфиг.
Запрещаем доступ анонимусам на наш сервер:
sed -i "s/anonymous_enable=YES/anonymous_enable=NO/" /tmp/livecd/1/etc/vsftpd.conf

Разрешаем локальным пользователям заходить на сервер:
sed -i "s/^#local_enable=YES/local_enable=YES/" /tmp/livecd/1/etc/vsftpd.conf

Даем им право на запись:
sed -i "s/^#write_enable=YES/write_enable=YES/" /tmp/livecd/1/etc/vsftpd.conf

Теперь внешний носитель. Давайте договоримся, что наш диск будет с etx3 файловой системой и носить метку раздела "rtorrent". При старте система будет узнавать его и монтировать в /mnt/hd:
echo "LABEL=rtorrent /mnt/hd auto defaults 0 0" >> /tmp/livecd/1/etc/fstab
На случай если мы все же в будущем добавим поддержку других файловых систем, тип ФС выставляем auto вместо ext3

У меня есть манера использовать флешку в качестве диска, а подключать мне ее приходится в usb1.1 порт, который не отличается быстродействием. Поэтому мне необходимо установить дополнительную задержку 10 секунд, что бы ядро успело ее распознать:
sed -i "/Check all the non-root filesystems/ a sleep 10" /tmp/livecd/1/etc/rc.d/rc.S

У меня динамический внешний IP. Возможно, мне захочется удаленно зайти на сервер, что при постоянно меняющимся ip не очень удобно. Для решения этой проблемы существуют сервисы типа www.dyndns.com, которые предоставляют постоянный адрес в сети таким машинам. Необходимо зарегистрироваться и выбрать себе подходящее доменное имя. Итак у меня имеется: login, password, domain name. Осталось поставить программу-клиент. Делаем:
wget http://cdn.dyndns.com/inadyn.zip
unzip /tmp/livecd/inadyn.zip
cd /tmp/livecd/inadyn
make CFLAGS="-O2 -march=i486 -mtune=i686"
cp -v ./bin/linux/inadyn /tmp/livecd/1/sbin/
cd -
rm -r /tmp/livecd/inadyn
echo '#/sbin/inadyn --username логин --password пароль --update_period 60000 --alias ваш_домен &' >> /tmp/livecd/1/etc/rc.d/rc.local
Если я решу воспользоваться сервисом, то просто раскомментирую строку в rc.local

Закончив с настройкой системы, приступаем к настройке пользовательских программ.

Конфиг rtorrent
touch /tmp/livecd/1/home/flanker/.rtorrent.rc
chown --reference=/tmp/livecd/1/home/flanker /tmp/livecd/1/home/flanker/.rtorrent.rc
cat >> /tmp/livecd/1/home/flanker/.rtorrent.rc << EOF
min_peers = 1
max_peers = 20
download_rate = 0
upload_rate = 0
directory = /mnt/hd
session = /mnt/hd/session
schedule = watch_directory,5,5,load_start=/home/flanker/*.torrent
schedule = low_diskspace,5,300,close_low_diskspace=0M
port_range = 6900-6900
port_random = no
check_hash = yes
use_udp_trackers = yes
session_save = yes
dht = auto
scgi_port = 127.0.0.1:5000
encoding_list = UTF-8
Здесь нужно пояснить. Конфиг не отличается от приведенного в викиучебнике кроме одной маленькой строчки:
schedule = low_diskspace,5,300,close_low_diskspace=0M
в rtorrent нет способа выбрать файл из раздачи, вместо этого открывается вся раздача и уже после этого отключают закачку ненужных файлов. Что же делать если размер полной раздачи превышает размер носителя? Ничего страшного. Создавая файлы входящие в раздачу, rtorrent создает "разряженные" (анг. sparse) файлы, т.е. их логический размер превышает физический. если выполнить ls -l имя_файла то покажет одно, а если du имя_файла, то покажет другое. Все дело в том, что rtorrent при определении свободного пространства берет именно логический размер, кроме того он отключает закачку при оставшимся размере, если не ошибаюсь, 500Мб. Если мы используем флешку как носитель размер которой ограничен, то нам проще отключить подобное поведение.

Теперь Lynx, который при первом старте по-русски конечно не бум-бум
touch /tmp/livecd/1/home/flanker/.lynxrc
chown --reference=/tmp/livecd/1/home/flanker /tmp/livecd/1/home/flanker/.lynxrc
cat >> /tmp/livecd/1/home/flanker/.lynxrc << EOF
accept_all_cookies=off
anonftp_password=
bookmark_file=lynx_bookmarks.html
case_sensitive_searching=off
character_set=UNICODE (UTF-8)
cookie_accept_domains=
cookie_file=
cookie_loose_invalid_domains=
cookie_query_invalid_domains=
cookie_reject_domains=
cookie_strict_invalid_domains=
dir_list_order=ORDER_BY_NAME
dir_list_style=MIXED_STYLE
emacs_keys=off
file_editor=
file_sorting_method=BY_FILENAME
keypad_mode=LINKS_ARE_NOT_NUMBERED
lineedit_mode=Default Binding
multi_bookmarkB=
multi_bookmarkC=
multi_bookmarkD=
multi_bookmarkE=
multi_bookmarkF=
multi_bookmarkG=
multi_bookmarkH=
multi_bookmarkI=
multi_bookmarkJ=
multi_bookmarkK=
multi_bookmarkL=
multi_bookmarkM=
multi_bookmarkN=
multi_bookmarkO=
multi_bookmarkP=
multi_bookmarkQ=
multi_bookmarkR=
multi_bookmarkS=
multi_bookmarkT=
multi_bookmarkU=
multi_bookmarkV=
multi_bookmarkW=
multi_bookmarkX=
multi_bookmarkY=
multi_bookmarkZ=
personal_mail_address=
preferred_charset=
preferred_language=ru
run_all_execution_links=off
run_execution_links_on_local_files=off
select_popups=on
show_color=default
show_cursor=off
show_dotfiles=off
sub_bookmarks=OFF
user_mode=NOVICE
verbose_images=on
vi_keys=off
visited_links=LAST_REVERSED

Автостарт. При старте, система нас выкидывает на первую консоль под пользователем. Нам нужно обеспечить автостарт пользовательских программ, в частности торрент-клиента:
echo '#!/usr/bin/bash' > /tmp/livecd/1/home/flanker/.bash_profile
echo 'PATH=/sbin:/usr/sbin:$PATH' >> /tmp/livecd/1/home/flanker/.bash_profile
echo 'if [ -z "$DISPLAY" ] && [ $(tty) == /dev/tty1 ]; then' >> /tmp/livecd/1/home/flanker/.bash_profile
echo ' [ ! -d /mnt/hd/session ] && mkdir /mnt/hd/session' >> /tmp/livecd/1/home/flanker/.bash_profile
echo ' [ -e /mnt/hd/session/rtorrent.lock ] && rm -f /mnt/hd/session/rtorrent.lock' >> /tmp/livecd/1/home/flanker/.bash_profile
echo ' screen -d -m rtorrent' >> /tmp/livecd/1/home/flanker/.bash_profile
echo 'fi' >> /tmp/livecd/1/home/flanker/.bash_profile
chown --reference=/tmp/livecd/1/home/flanker /tmp/livecd/1/home/flanker/.bash_profile

Итак сервер мы настроили, осталось вставить болванку в /dev/cdrom и набрать:
sh ./cl
sh ./mk


Настраиваем Desktop
машине в локальной сети задаем: статический IP 10.0.35.2
шлюз 10.0.35.1
далее идем на домашнюю страницу nTorrent, выкачиваем nTorrent-bin-0.5.1.tar.bz2, распаковываем, даем права на выполнение скрипту nTorrent.sh, запускаем в окошке Connect указываем:
SSH
host 10.0.35.1
port 22
Socket port 5000
username flanker
password ваш_пароль
Remember password да
Connect on startup да
Proxy DIRECT

далее, cохраняем профиль как nas
выбираем его, жмем Connect, подключаемся и пользуемся.

UPD 11.04.10 добавлен комментарий к конфигу rtorrent.rc, добавлен strip к сборке xmlrpc-c, добавлен конфиг lynxrc, конфиг vsftpd по прежнему нерабочий, увы.

Комментариев нет:

Отправить комментарий