понедельник, 22 ноября 2010 г.

Терминальный сервер на Linux


LTSP (Linux Terminal Server Protocol) - гибкий и экономически эффективный способ для расширения возможностей школ, предприятий и бизнеса, который несложен в установке для использования.


Принцип работы заключается в том, что мощный сервер используется так
называемыми тонкими клиентами (thin clients) для исполнения всех вычислительных
и административных задач, начиная от запуска браузера до группового рендинга изображения.
Тонкий клиент - это компьютер, который напрямую зависит от других компьютеров или
разделяет вычислительные процессы с другими. По средствам ssh все тонкие клиенты
подключаются к единой сети с сервером, который, в свою очередь, раздает ip адреса и
полностью управляет сетью.

Ниже приведен пример LTSP сети:

LTSP сеть - пример

Плюсы LTSP: дешевизна, легкость администрирования, защищенность, работа со старыми
компьютерами, уменьшает количество железа на тонких клиентах (нужны только процессор,
видео, звуковая и сетевая карты, монитор, клавиатура, мышка), загрузка ОС с сервера, хранит
все данные на сервере. Имеется также вариант использовать один тонкий клиент для двух или
более человек, путем увеличения количества мониторов, клавиатур и мышек. Лимит в этом
заключается только в скорости сетевой карты, количестве видео выходов для мониторов и
портов для мышек с клавиатурами.

После того как вы осознали все плюсы LTSP, пришло время к установке (пример сделан для
Ubuntu с GNOME, но применим и к другим дистрибутивам - просто подставляйте команды
своего менеджера):
1) Установите ssh: sudo apt-get install ssh (необходим LTSP как главный способ коммуникации
между компьютерами)
2) Установите LTSP сервер: sudo apt-get install ltsp-server-standalone
(или скачайте с официального сайта)
3) Создайте конфигурационные файлы для тонких клиентов: sudo ltsp-build-client
4) Установите поддержку NFS : sudo apt-get install nfs-kernel-server
5) Установите FTP сервер: sudo apt-get install tftpd-hpa (либо любой другой)
6) Измените конфигурации tftpd: sudo gedit /etc/default/tftpd-hpa и
замените строчку RUN_DAEMON="yes" (заставляет ftp сервер работать как демон)
7) Измените конфигурационный файл экспорта NFS: sudo gedit /etc/exports
путем добавления строчки /opt/ltsp *(ro,no_root_squash,async,no_subtree_check)
8) Перезапустите NFS: sudo invoke-rc.d nfs-kernel-server restart
9) Отключите автоматическую загрузку tftpd: sudo gedit /etc/inetd.conf
и поставьте символ # (символ комментария) в строчке где упоминается tftp
10) Перезапустите сервисы ядра: sudo invoke-rc.d openbsd-inetd restart
11) Перезапустите tftpd: sudo invoke-rc.d tftpd-hpa restart
12) Конфигурируйте dhcp (: sudo gedit /etc/ltsp/dhcpd.conf
a) Включите конфигурации LTSP: sudo gedit /etc/dhcp3/dhcpd.conf и
добавьте в конец файла строчку include "/etc/ltsp/dhcpd.conf";
b) Включите XDMCP
в Ubuntu 9.10 это делается так: sudo cp /usr/share/doc/gdm/examples/custom.conf /etc/gdm/
копирует файл-пример gdm ("Gnome Desktop Manager"-оконного менеджер Гнома)
b1) Измените только что скопированный файл: sudo gedit /etc/gdm/custom.conf
и добавьте следующие конфигурации
[xdmcp]
Enable=true
DisplaysPerHost=2
 (зависит от количества мониторов на компьютер)
13) Перезапустите GDM: sudo restart gdm
14) Подключите необходимые сетевые кабели от сервера к свитчу или хабу и к клиентам
15) Измените ip адрес сервера (который указан в конфигурации dhcp):
sudo ifconfig eth0 192.168.0.1
16) Перезапустите dhcp: sudo invoke-rc.d dhcp3-server restart
17) Включите клиентов и, если необходимо, измените настройки в BIOS
для загрузки по средствам PXE  или Сетевой загрузки
18) Наслаждайтесь!!!)))

Возможные проблемы и способы их решения:
Для добавления новых пользователей: sudo adduser username
Для удаления пользователей: sudo deluser username

Если происходят весомые апгрейды сервера или изменений с пользователями
(добавление или удаление) необходимо обновить ключи для ssh и образ ltsp:
sudo ltsp-update-sshkeys
sudo ltsp-update-image

суббота, 20 ноября 2010 г.

Посчитаем трафик - Часть 1

Доброго времени суток всем. Вот решил описать один из способов учета трафика, который использую. Это всем известный демон ipcad. На мой взгляд один из самых достоверных пакетных счетчиков. Единственный недостаток, что не можем определить на что конкретно трафик был потрачен, но здесь я провел небольшие исследования, и выявил,что из бесплатных и более легких реализаций является связка Squid+SAMS+IPcad.
В первой части я расскажу как установить и настроить IPcad.
Ну что же начнем. Для начала нам естественно необходимо скачать IPcad. Далее следует стандартная процедура инсталяции.
Следуем просьбам создателей.
Program should compile and run on probably all POSIX-compliant system
with at least BPF device or PCAP library (libpcap/tcpdump).
# tar -xvzf ipcad-3.x.x.tar.gz
# cd ipcad-3.x.x
# ./configure && make install
Таким не хитрым способом мы установили пакет, но для его работы нам понадобится настроить его, благо - это единственный conf файл, для примера я приведу развернутый вид файла.
##################
# GLOBAL OPTIONS #
##################
#
# Enable or disable capturing UDP and TCP port numbers, IP protocol and
# ICMP types for RSH output.
#
# capture-ports {enable|disable} ;
#
# Enabling this will BREAK Cisco RSH output format compatibility,
# increase memory requirements and may slow down traffic processing.
# This option takes effect IMMEDIATELY, that is, it can be specified
# multiple times, even between interfaces configuration.
# This option has NO effect on NetFlow operation (NetFlow always captures
# port information).
#
capture-ports enable;
#
# Buffers to be used for transferring the data from the kernel,
# if applicable (BPF, ULOG).
# Using larger buffers may increase the performance but will
# affect responsiveness.
#
# buffers = <number>[{k|m}] ;
#
# Reasonable defaults are used if this parameter is not set.
#
buffers = 64k;
#####################
# INTERFACE OPTIONS #
#####################
#
# interface <iface> [ promisc ] [ input-only ]
# [ netflow-disable ] [ filter "<pcap_filter>" ] ;
# OR
# interface ulog group <group> [, group <group> ...]
# [ netflow-disabled ];
# OR
# interface ipq [ netflow-disabled ]; # man libipq(3)
# OR
# interface {divert|tee} port <divert-port> # man divert(4)
# [ input-only ] [ netflow-disabled ];
# OR
# interface file <tcpdump-output.pcap> [ netflow-disabled ];
#
# Options meaning:
#
# promisc:
# Put interface into promiscuous mode.
# This enables listening for the packets which are not destined for
# this host and thus ipcad will count and display all the traffic within
# the local network. Note that the interface might be in promiscuous mode
# for some other reason.
#
# input-only: 
# Use kernel feature of counting only incoming packets.
#
# netflow-sampled: (DO NOT ENABLE THIS OPTION, unless you have to!)
# If the NetFlow export mechanism is used, this option instructs
# the interface to supply only one out of N packets to the NetFlow
# accounting code, thus lowering the CPU requirements. The value of N
# is configured explicitly in a NetFlow configuration section.
# NOTE: This option is NOT used to enable NetFlow on the interface,
# it just modifies the NetFlow behavior on this interface.
# DO NOT ENABLE THIS OPTION, UNLESS YOU HAVE TO!
#
# netflow-disable: 
# By default, all interfaces are included into NetFlow accounting.
# This option is used to disable NetFlow on a particular interface.
#
# filter: 
# Install a custom filter on packets instead of basic
# IP protocol filter. Requires libpcap (even if BPF is being used).
# May be employed to eliminate CPU overhead on passing unnecessary
# data between the kernel and user space (by installing the filter
# directly into the kernel).
#
# NOTES:
#  * "input-only" directive must be supported by kernel.
#    Probably, you were noticed about it during the compilation process
#    if it was not supported.
#    FreeBSD 3.x and elder kernels do not support this feature.
#  * ULOG packet source (interface ulog) is supported under
#    Linux >= 2.4.18-pre8.
#    You should configure iptables to dump the packet stream
#    into the appropriate group, i.e.:
#        iptables -A OUTPUT -j ULOG --ulog-nlgroup <group>
#    Given ULOG groups will be OR'ed together.
#  * A wildcard (*) may be specified as part of an interface name.
#
interface eth3;   здесь я указываю интерфейсы на которых будет установлена "слежка"
interface eth2;
#interface eth2 filter "ip and dst net 192.168.0.0/24 and not src net 192.168.0.0/24";
#interface ed1 promisc filter "ip and not dst net 192.168.0.0/16";
#interface sbni0 input-only netflow-disable; # Disable NetFlow.
#interface ppp*; # Dynamically pick up PPP interfaces.
#interface ulog group 3, group 15; # Use ULOG, do not disable NetFlow.
#interface ipq; # Use Linux IPQ (libipq(3))
#interface tee port 123; # Use BSD ipfw(8)'s tee.
#interface divert port 321 netflow-disable; # Use ipfw(8)'s divert(4).
#
# aggregate <ip>/<masklen> strip <maskbits> ;
#
# Aggregate addresses from the specified network (<ip>/<masklen>),
# by AND'ing with specified mask (<maskbits>).
#
#
aggregate 192.168.0.0/24 strip 32; /* Don't aggregate internal range */ Выборка по IP
#aggregate 0.0.0.0/0 strip 24; /* Aggregate external networks */
#
# aggregate <port_range_start>[-<port_range_end>] into <port> ;
#
# Aggregate port numbers. Meaningful only if capture-ports is enabled.
#
aggregate 20-21 into 21; Здесь у нас идет выборка по портам.
aggrefate 25 into 25;
aggregate 80-81 into 0;
aggregate 3128 into 0;
aggregate 110 into 110;
aggregate 443 into 443;
aggregate 1024-65535 into 65535; /* Aggregate wildly */
#aggregate 3128-3128 into 3128; /* Protect these ports */
aggregate 150-1023 into 1023; /* General low range */
##########################
# NetFlow EXPORT OPTIONS #
##########################
#
# Enable Cisco NetFlow export method.
# NetFlow uses UDP to feed flow information to the receiver.
# If the destination is not specified, NetFlow is disabled.
#
# netflow export destination 127.0.0.1 9996;
netflow export version 5; # NetFlow export format version {1|5}
netflow timeout active 30; # Timeout when flow is active, in minutes
netflow timeout inactive 15; # Flow inactivity timeout, in seconds
netflow engine-type 73; # v5 engine_type; 73='I' for "IPCAD"
netflow engine-id 1; # Useful to differentiate multiple ipcads.
# The following option is enabled by the "netflow-sampled" interface flag.
#netflow sampling-mode packet-interval 10;   # 1 out of 10 packets accounted
# DO NOT ENABLE THIS UNLESS YOU KNOW WHAT ARE YOU DOING.
#
# NetFlow protocol exports an SNMP id instead of the interface name
# (i.e., "eth0", "ppp32"). The following statements options define
# mapping between the interface names and a set of "SNMP identifiers".
#
netflow ifclass eth mapto 0-99; # i.e., "eth1"->1, "eth3"->3
netflow ifclass fxp mapto 0-99; # i.e., "fxp4"->4, "fxp0"->0
netflow ifclass ppp mapto 100-199; # i.e., "ppp32"->532, "ppp7"->507
netflow ifclass gre mapto 200-299;
netflow ifclass tun mapto 300-399; # i.e., "tun0"->300
######################
# RSH SERVER OPTIONS #
######################
#
# Enable RSH Server:
#
#   rsh {enable|yes|on|disable|no|off} [at <listen_ip>];
#
# If "at <listen_ip>" omitted, rsh server listens on IP address 0.0.0.0,
# which may be undesirable.
#
rsh enable at 127.0.0.1; Включаем RSH
#rsh root@127.0.0.1 admin;
#rsh root@127.0.0.1 backup;
#rsh root@127.0.0.1;
#rsh 127.0.0.1 view-only;
#rsh ttl = 3;
#rsh timeout = 30;
chroot = /var/log/ipcad;
dumpfile = ipcad.dump;
#pidfile = ipcad.pid;
#
# RSH access rules:
#
# rsh [<user>@]<host_addr> {admin|backup|[default]|view-only|deny} ;
#
rsh root@127.0.0.1 admin; /* Can shutdown ipcad */
rsh staff@127.0.0.1 backup; /* Can dump/restore/import accounting table */
rsh root@127.0.0.1; /* Can view and modify accounting tables */
/* Note the order! */
#rsh luser@127.0.0.1 deny; /* Deny this user from even viewing tables */
#rsh 127.0.0.1 view-only; /* Other users can view current tables */
# Keep IP packet time to live reasonably low to avoid remote attacks.
# (The rsh client must reside no more than three hops away from the
# router running ipcad.)
rsh ttl = 3;
# Set rsh timeout for the same purpose.
rsh timeout = 30;
#
# Dump active IP accounting table to this file on exit and read on startup.
# (read about -s and -r options in ipcad(8) manual page)
# NOTE: This setting has no effect on NetFlow operation. The flow cache
#       contents are flushed to the collector upon ipcad termination.
#
#dumpfile = ipcad.dump; # The file is inside chroot(), see below...
#################
# OTHER OPTIONS #
################
#
# Chroot to this directory before processing.
#
# Of course, you could disable chroot()'ing by commenting it out,
# but it is not recommended, so I left this confusing default
# to encourage you to change it.
#
#chroot = /adm/tmp;
#
# File to keep getpid() in it. ipcad will also hold a lock.
#
# WARNING: Pidfile is created AFTER chroot()'ing, so if you're using
# chroot statement above, make sure the path to the pidfile exists
# inside chrooted environment.
#
pidfile = ipcad.pid;
#
# UID/GID privileges dropping
# Please note: RSH service will be UNAVAILABLE when uid is not zero.
# Use it only when you know what are you doing (i.e., NetFlow without RSH).
#
# uid = 65534;
# gid = 65534;
#
# Few useful settings.
#


#
# Memory usage limit for storing per-stream entries.

# memory_limit = <number>[{k|m|e}] ;
# Where k, m and g are for kilobytes, megabytes or table "entries".
#
memory_limit = 10m;


Директория логирования  /var/log/ipcad/ не создаётся при установке ipcad, поэтому её необходимо создать самостоятельно. Права на чтение, запись и просмотр содержимого директории с логами ipcad рекомендую дать лишь пользователю root. 
После этой не хитрой настройки, можно запускать ipcad.
Запускать ipcad имеет смысл таким образом, чтобы при загрузке он восстанавливал данные о статистике из dumpfile, уходил в фон, а при выключении сбрасывал все данные в тот же dumpfile. Команда для запуска выглядит следующим образом:
/usr/local/bin/ipcad –rds
где:
  1. ключ r – импортирует данные из dumpfile;
  2. ключ d – «демонизирует» ipcad;
  3. ключ s – сбрасывает статистику в dumpfile при выключении ipcad.
И небольшое использование:
rsh localhost help
rsh localhost show ip accounting
В следующей части установим SQUID+SAMS. Так как основной поток трафика все-таки лезет по 80 порту.

пятница, 12 ноября 2010 г.

четверг, 11 ноября 2010 г.

IP tables for beginners

Каждый человек встречающийся, первый раз с серверов с установленном на нем Linux, сталкивается с определенными проблемами по настройке IP tables. Я решил не углублятся в тяготы пониманию прохождения пакета по цепочкам IP tables, а просто дам конкретные советы.

1.Принудительное перенаправление http трафика на прокси сервер (прозрачный режим).
iptables -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3128
К данному правилу можно добавить конкретное указание интерфейса, подсети с которой будет вестись обращение и др. необходимые вещи с помощью ключей. Сразу предупрежу, что данное правило работает только для HTTP трафика, т.к. squid не умеет проксировать никакой другой трафик в прозрачном режиме.
2.Проброс порта в локальную сеть
iptables -t nat  -A PREROUTING -p tcp -m tcp --dport 19876 -j DNAT --to-destination 192.168.0.1:19876
3.NAT для всей подсетки и конкретного порта назначения
iptables -A POSTROUTING -p tcp -m tcp -s 172.16.0.0/255.255.0.0 --dport 443 -j MASQUERADE
Данное правило можно использовать для отдельного ip адреса и для группы портов или диапозона
4. Разрешение пингов для локальной сети, дабы умные пользователи умеющие дать пинг не паниковали :)
iptables-A POSTROUTING -p icmp -s 172.16.0.0/255.255.0.0 -j MASQUERADE
5. Разрешаем доступ к заданному порту из инета
iptables -A INPUT -p tcp -m tcp -d внешний_ип --dport 80 -j ACCEPT
6.Разрешаем "установленные" и "дочерние" соединения
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state RELATED -j ACCEPT

7. Ну и открываем необходимый для нас протокол.
iptables -A INPUT -p gre -j ACCEPT

Естественно эти команды не являются всем тем необходимым и порой очень важным при формировании правил iptables. Но я думаю помогут понять некоторые азы в этом поистине необъятном фаерволе ))

среда, 10 ноября 2010 г.

Доброго времени суток

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