воскресенье, 18 марта 2012 г.

Как вести лог блокировок в iptables и ipfw


Linux:

- Перед правилом блокировки нужно вставить "log" правило:
   iptables -A FORWARD -p tcp -m tcp -s 192.168.0.0/16 --dport 25 \
      -j LOG --log-level debug --log-prefix "outgoing mail"
   iptables -A FORWARD -p tcp -m tcp -s 192.168.0.0/16 --dport 25 -j DROP

- Проверить запущены ли в системе klogd и syslogd.

- Настроить /etc/syslog.conf на прием kern.debug логов:
   kern.=debug   -/var/log/kernel/info

FreeBSD:
Добавить ключ log в ipfw, например:
   ipfw add 1000 deny log tcp from any to 192.168.10.10 22 via fxp0
   ipfw add 1000 deny log logamount 0 tcp from any to 192.168.10.10 80 via fxp0

Для ведения логов ядро должно быть собрано с IPFIREWALL_VERBOSE или нужно
выставить "sysctl -w net.inet.ip.fw.verbose=1".

Далее проверить чтобы в /etc/syslog.conf было упоминание LOG_SECURITY:
   security.*      /var/log/security

Через параметр logamount передается число записей которые будет записано в лог,
после превышения записи перестанут появляться в логе, до тех пор пока не будет вызвана команда
"ipfw resetlog". Максимальное число сообщений можно также установить
через sysctl net.inet.ip.fw.verbose_limit.
Для отмены лимитирования на число записей, нужно установить атрибут в 0.

Как увеличить размер таблицы контроля сессий ip_conntrack в Linux


Если ядро ругается "kernel: ip_conntrack: table full, dropping packet.", причину флуда
(скорее всего вирус или сканирование портов) можно найти по списку /proc/net/ip_conntrack
Если просто общая загрузка большая, увеличить размер таблицы можно через /proc/sys/net/ipv4/ip_conntrack_max

Также можно увеличить размерность хэша через параметр  hashsize модуля ip_conntrack:
/etc/modules.conf:
   options ip_conntrack hashsize=N

Более тонкий тюнинг можно произвести через переменные определенные в /proc/sys/net/ipv4/netfilter

Скрипт для блокировки в iptables целых стран


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

Список привязки IP к странам загружается с сайта http://www.ipdeny.com/ipblocks/data/countries

   #!/bin/bash
   ### Block all traffic from AFGHANISTAN (af) and CHINA (CN). Use ISO code ###
   ISO="af cn"

   ### Set PATH ###
   IPT=/sbin/iptables
   WGET=/usr/bin/wget
   EGREP=/bin/egrep

   ### No editing below ###
   SPAMLIST="countrydrop"
   ZONEROOT="/root/iptables"
   DLROOT="http://www.ipdeny.com/ipblocks/data/countries"

   cleanOldRules(){
   $IPT -F
   $IPT -X
   $IPT -t nat -F
   $IPT -t nat -X
   $IPT -t mangle -F
   $IPT -t mangle -X
   $IPT -P INPUT ACCEPT
   $IPT -P OUTPUT ACCEPT
   $IPT -P FORWARD ACCEPT
   }

   # create a dir
   [ ! -d $ZONEROOT ] && /bin/mkdir -p $ZONEROOT

   # clean old rules
   cleanOldRules

   # create a new iptables list
   $IPT -N $SPAMLIST

   for c  in $ISO
   do
# local zone file
tDB=$ZONEROOT/$c.zone

# get fresh zone file
$WGET -O $tDB $DLROOT/$c.zone

# country specific log message
SPAMDROPMSG="$c Country Drop"

# get
BADIPS=$(egrep -v "^#|^$" $tDB)
for ipblock in $BADIPS
do
  $IPT -A $SPAMLIST -s $ipblock -j LOG --log-prefix "$SPAMDROPMSG"
  $IPT -A $SPAMLIST -s $ipblock -j DROP
done
   done

   # Drop everything
   $IPT -I INPUT -j $SPAMLIST
   $IPT -I OUTPUT -j $SPAMLIST
   $IPT -I FORWARD -j $SPAMLIST

   # call your other iptable script
   # /path/to/other/iptables.sh

   exit 0


Вместо последовательного добавления правил, для увеличения производительности,
рекомендуется использовать систему ipset (http://ipset.netfilter.org/) или
nfqueue (http://nfqueue.sf.net/)


Использовать можно примерно так:

    #!/bin/sh
    iptables -F INPUT

    ipset -N spam ipmap

    cat block_country_net_list.txt | while read net; do
       ipset -A spam --network $net
    done

    iptables -A INPUT -m set --set spam src -j REJECT


Другой эффективный вариант - использовать iptables модуль geoip (http://people.netfilter.org/peejix/geoip/),
который не входит в базовую поставку iptables и требует установки patch-o-matic и
загрузки дополнительной базы привязки к странам, например с http://www.maxmind.com/

Например, блокировка ICMP запросов из Франции, Италии и Испании будет выглядеть так:

   iptables -A OUTPUT -p icmp -m geoip --dst-cc FR,IT,ES -j REJECT

Ограничение возможностей ssh туннеля при помощи iptables

Использование туннелей на основе ssh сейчас широко распространено. И многие используют его как 
универсальное решение для организации туннелей внутрь локальной сети для
доступа к различным сервисам.
И в связи с этим очень часто возникает вопрос "А как ограничить возможности такого туннеля".

Например: 
есть компания, которая обслуживает ваш web сервер. Для выполнения этой работы требуется доступ 
к серверу web-server.dmz по портам 80 и 443.

Решение: 
на сервере ssh, через который создаётся туннель, выполняем: 

1) добавляем пользователя aaa

2) устанавливаем ему шелл /bin/false (или другой, только так чтобы он не мог залогиниться)

3) Добавляем правила iptables:

   iptables -A OUTPUT -d web-server.dmz -p tcp -m tcp --dport 80 -m owner --uid-owner aaa -j ACCEPT
   iptables -A OUTPUT -d web-server.dmz -p tcp -m tcp --dport 443 -m owner --uid-owner aaa -j ACCEPT
   iptables -A OUTPUT -m owner --uid-owner aaa -j REJECT

Защищаем SSH при помощи технологии "Port Knocking"


Реализация идеи динамического открытия доступа к 22 порту, при предварительном
обращении telnet-ом на определенный сетевой порт (в примере 333 - открыть
доступ и 334 - закрыть). Идея реализована средствами iptables, без привлечения
дополнительных утилит и анализаторов логов.

   # Создаю цепочку с именем SSH
   iptables -N SSH
   # Правило по умолчанию в INPUT - DROP
   iptables -P INPUT DROP
   # Всё что пришло на 22 порт - в цепочку SSH
   iptables -A INPUT -p tcp --dport 22 -j SSH
   # Всё что пришло на 333 порт - в цепочку SSH
   iptables -A INPUT -p tcp --dport 333 -j SSH
   # Всё что пришло на 334 порт - в цепочку SSH
   iptables -A INPUT -p tcp --dport 334 -j SSH

Разделения на цепочки сделано для своего удобства, от этого можно и отказаться.

Теперь заполняем цепочку SSH.

   # Проверяем на наличие имени "SSH" у IP адреса устанавливающего соединение на 22 порт.
   # И если оно присутствует - то ACCEPT
   iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 22 -m recent --rcheck --name SSH --rsource -j ACCEPT

   # Устанавливает имя SSH любому IP адресу с которого пришло новое TCP соединение на указанный порт. (порт 333)
   iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 333 -m recent --set --name SSH --rsource -j DROP

   # Удаляет имя "SSH" с IP адреса установившего соединение на этот порт. (порт 334)
   iptables -A SSH -p tcp -m state --state NEW -m tcp --dport 334 -m recent --remove --name SSH --rsource -j DROP

Насладимся итоговым результатом:

Делаем:
   telnet ip_address_or_domain_name 333
После чего спокойно подключаемся по SSH.

Когда прекращаем работу закрываем за собой 22 порт:
   telnet ip_address_or_domain_name 334

Активное противодействие сканированию портов


Имеется сервер на нем ssh и web. Ниже приведён простой пример правил для
блокирования на определенное время IP, обратившегося по неактивному номеру порта.

   iptables -P INPUT DROP
   iptables -P OUTPUT DROP
   iptables -P FORWARD DROP

   iptables -A INPUT -p all -i lo -j ACCEPT
   iptables -A OUTPUT -p all -o lo -j ACCEPT

   # любой пакет идущий на не 22,80 порт блокируется с ip адресом отправившим его на 120 секунд,
   # на 120 секунд блокируется все пакеты с этого ip, тем самым предотвращается сканирование портов
   iptables -A INPUT -m recent --rcheck --seconds 120 --name FUCKOFF -j DROP
   iptables -A INPUT -p tcp -m multiport ! --dports 22,80 -m recent --set --name FUCKOFF -j DROP

   iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT
   iptables -A INPUT -p tcp --syn --dport 80 -j ACCEPT
   iptables -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
   iptables -A OUTPUT -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


Теперь nmap -sV ip не выдаст ничего и  если какой нибудь демон повесить на
нестандартный порт, его будет не так просто обнаружить.

Защита от трассировки маршрутов с помощью iptables


Для того, чтобы затруднить исследование сети (локальной, DMZ и т.д.) можно
заблокировать все пакеты с низким значением TTL. Пример блокирования пакетов с
TTL меньше 5:

   iptables -A INPUT -p all -m ttl --ttl-lt 5 -j DROP

или

   iptables -A FORWARD -p all -m ttl --ttl-lt 5 -j DROP

Защита от спамерских и bruteforce-атак с помощью iptables


Сохраняем в файл скрипт:

   #!/bin/sh
   # Защита от спамовских атак и от BRUTE-атак с помощью IPTABLES
   # REJECT_BRUTERS v.1.0 Lev Zabudkin. zabudkin@mail.ru. http://zabudkin.ru
   # 23.03.2010
   #
   #  Описание:
   #   Данный скрипт позволяет Вам, используя iptables заблокировать
   #   дальнейшие попытки соединения от надоедливых хостов,
   #   которые пытались приконнектиться в течении определенного Вами времени
   #   и определенное Вами количество раз.
   #
   #  Итак поехали:
   #
   #  Мы создаём ниже переменную IPTABLES, дабы не указывать  постоянно где он лежит
   #  Где у Вас лежит iptables?  (подсказка: # whereis iptables)
   IPTABLES="/sbin/iptables"

   #  На каком сетевом интерфейсе контролировать коннекты
   CHECK_INT="ppp0"

   #  Сколько именно коннектов Вы разрешаете с одного хоста?
   #  В данном случае указано 2, чего вполне достаточно для SMTP.
   MAXIMUM_CONNECTIONS_PER_PERIOD=2

   #  А в течение скольки секунд они разрешены?
   PERIOD_SECONDS=60

   #  Пояснение:  Если в течении Выше указанных секунд хост (в данном примере любой(!))
   #  попытается приконнектиться к Вам, то соединение будет отброшено (см. -j DROP)
   #  причем НАВСЕГДА, т.е ДО ТЕХ ПОР, пока Вы не обнулите цепочку BRUTE_CHECK
   #  ключём -F BRUTE_CHECK команды iptables

   #  Создаём цепочку  BRUTE_CHECK
   $IPTABLES -N BRUTE_CHECK
   #  Обнуляем правила цепочки BRUTE_CHECK
   $IPTABLES -F BRUTE_CHECK

   #  В данном случае мы удаляем ранее сделанное "перенаправление" (см. чуть ниже)
   #  чтобы этот скрипт можно было вызывать многократно
   $IPTABLES -D INPUT -j BRUTE_CHECK

   #  В данном случае мы "перенаправляем" для обработки входящие пакеты
   #  в нашу созданную цепочку
   $IPTABLES -A INPUT -j BRUTE_CHECK

   #  А тут уже пошли наши правила, которые гласят:
   #  все входящие пакеты на сетевой интерфейс (мы его указали выше),
   #  которые являются для нас новыми (см. state) и которые соответствуют нашим
   #  параметрам (см. выше), мы отбрасываем.
   $IPTABLES -A BRUTE_CHECK -i $CHECK_INT -p tcp -m state --state NEW -m recent --set --name BRUTE

   # См. Ниже Пояснение, если понадобится, то раскоментируете нижеприведенную строку
   # (просто уберите символ решетки - #)
   #$IPTABLES -A BRUTE_CHECK -i $CHECK_INT -p tcp -m state --state NEW -m recent --update --seconds $PERIOD_SECONDS \
   #  --hitcount $MAXIMUM_CONNECTIONS_PER_PERIOD --rttl --name BRUTE -j LOG --log-level 4 --log-prefix '** BRUTE **'

   $IPTABLES -A BRUTE_CHECK -i $CHECK_INT -p tcp -m state --state NEW -m recent --update --seconds $PERIOD_SECONDS \
     --hitcount $MAXIMUM_CONNECTIONS_PER_PERIOD --rttl --name BRUTE -j DROP


Пояснение:

Для того, чтобы видеть, каких же успехов Вы добились, применив выше написанное,
проделайте следующее:

откройте файл /etc/syslog.conf и добавьте в конец строку:

   kern.warning /var/log/iptables.log

затем перезапустите syslog:

   /etc/init.d/syslog restart

(если у Вас Ubuntu, то наверное это sysklogd)

События (про попытки) будут записываться в файл /var/log/iptables.log,
его и смотрите.

Да, и будет не лишним добавить данный скрипт в CRON (/etc/crontab),
скажем каждые 5 минут:

   */5 * * * * root Путь/ВашСкрипт

Защита от bruteforce средствами iptables


В заметке приведены различные варианты защиты от bruteforce-атак,   на примере
блокирования последовательного подбора паролей через ssh.

Общий шаблон правил

   iptables -P INPUT DROP
   iptables -P OUTPUT DROP
   iptables -P FORWARD DROP

   iptables -A INPUT -p all -i lo -j ACCEPT
   iptables -A OUTPUT -p all -o lo -j ACCEPT

Здесь будут наши правила (вариант)

   iptables -A INPUT -p all -m state --state ESTABLISHED,RELATED -j ACCEPT
   iptables -A OUTPUT -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


Вариант 1, используя модуль recent:

Добавляем ip в таблицу
   iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name BLOCK -set

С одного ip разрешаем 2 (--hitcount 3-1) запроса на соединение (NEW) в минуту (60 секунд),
третье блокируется и все последующие в течение минуты
   iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name BLOCK --update --seconds 60 --rttl --hitcount 3 -j DROP

Разрешаем входящие соединения на 22 порт
   iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT


Вариант 2, используя модуль hashlimit:

С одного ip разрешаем 2 запроса на соединение (NEW) в минуту (2/m) все
остальные пакеты (NEW) c этого ip блокируется

   iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m hashlimit \
      --hashlimit-name BLOCK --hashlimit-mode srcip --hashlimit-above 2/m --hashlimit-burst 2 -j DROP

Разрешаем входящие соединения на 22 порт
   iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT


Вариант 3, используя модули connlimit, limit:

С одного ip разрешаем не больше одно соединения (! --connlimit-above 1) на 22
порт, пропускаем 2 пакета в минуту с запросом на соединение (NEW), все
остальные пакеты (NEW) c этого ip блокируется
   iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m connlimit ! \
      --connlimit-above 1 -m limit --limit 2/m --limit-burst 2 -j ACCEPT

Вариант 4, параноидальный:

Два раза в течение минуты разрешено подключаться к 22 порту, при превышении
порога ip блокируется на 10 минут.

блокируем ip с запросом на соединение (NEW) попавшие в динамически обновляемую
таблицу на 600 секунд
   iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --name BLOCK --rcheck --seconds 600 -j DROP

С одного ip разрешаем 2 запроса на соединение (NEW) в минуту (2/m), если
превышен порог,то добавляем ip в таблицу BLOCK для блокировки на 600 секунд (10 минут)
   iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m hashlimit \
      --hashlimit-name BLOCK --hashlimit-mode srcip --hashlimit-above 2/m --hashlimit-burst 2 -m recent --name BLOCK --set -j DROP

Разрешаем входящие соединения на 22 порт
   iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT

Установка ipfw и dummynet в Linux и Windows


Не многие знают о том, что классический пакетный фильтр FreeBSD ipfw  и система
ограничения пропускной способности dummynet были успешно портированы в Linux и Windows.

В Ubuntu для сборки могут потребоваться пакеты:

   $ sudo apt-get install build-essential linux-source linux-headers-$(uname -r)

Собираем ipfw и dummynet в Linux:

   $ wget http://info.iet.unipi.it/~luigi/dummynet/20100319-ipfw3.tgz
   $ tar xzf 20100319-ipfw3.tgz -C ~/src
   $ cd ~/src/ipfw3
   $ make



Загружаем модуль Linux-ядра:

   $ sudo insmod ./dummynet2/ipfw_mod.ko
   $ lsmod| grep ipfw
   ipfw_mod               86695  0

Проверяем работу утилиты:

   $ sudo ipfw/ipfw show

   65535 54 6340 allow ip from any to any

   $ sudo ipfw/ipfw 10 add deny ip from 192.168.100.100 to any

   00010 deny ip from 192.168.100.100 to any

   $ sudo ipfw/ipfw show

   00010   1    84 deny ip from 192.168.100.100 to any
   65535 121 22335 allow ip from any to any


Для Windows достаточно загрузить со страницы
http://info.iet.unipi.it/~luigi/dummynet/ готовые исполняемые файлы.
Для установки драйвера в панели конфигурации сетевой карты ( Control Panel ->
Network -> карта) перейти в Properties->Install->Service->Add, выбрать 'Driver
Disk' и указать на файл 'netipfw.inf', после чего выбрать 'ipfw+dummynet'.

Простой интерактивный firewall в Linux


Недавно на форуме спрашивали есть ли интерактивный firewall в Linux и многие
отвечали, что нет. Ниже  простая заготовка скрипта, следящего за событиями в
логе, в случае подозрительной активности выводящего пользователю окно с
предложением блокирования трафика или игнорирования предупреждения.

1. Первоначальные настройки iptables:

   #iptables-save
   # Generated by iptables-save v1.4.7 on Fri Mar 11 15:15:29 2011
   *filter
   :INPUT DROP [137:16764]
   :FORWARD DROP [0:0]
   :OUTPUT DROP [10:708]
   -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
   -A INPUT -j LOG --log-prefix "firewall-INPUT "
   -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
   -A FORWARD -j LOG --log-prefix "firewall-FORWARD "
   -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
   -A OUTPUT -j LOG --log-prefix "firewall-OUTPUT "
   COMMIT
   # Completed on Fri Mar 11 15:15:29 2011
   # Generated by iptables-save v1.4.7 on Fri Mar 11 15:15:29 2011
   *nat
   :PREROUTING ACCEPT [48:6290]
   :POSTROUTING ACCEPT [0:0]
   :OUTPUT ACCEPT [6:396]
   COMMIT
   # Completed on Fri Mar 11 15:15:29 2011

Правила по умолчанию в цепочках можно изменить на ваш вкус.
Основной сценарий будем запускать от рядового пользователя, поэтому
ему требуется право на чтение /var/log/syslog (или куда у Вас попадает журнал netfilter).

Также пользователю требуется право заполнять правила netfilter командой
iptables. У меня это сделано через /etc/sudoers

2. Основной сценарий обработки журнала netfilter:

interactive-firewall.sh

   while read line
   do
      echo $line | grep firewall > /dev/null 2>&1
      [ $? != 0 ] && continue
      for item in $line
      do
        case $item in
          firewall-*) CHAIN=$item;;
          PROTO=*) PROTO=$item;;
          SRC=*) SRC=$item;;
          SPT=*) SPT=$item;;
          DST=*) DST=$item;;
          DPT=*) DPT=$item;;
        esac
      done
      CHAIN=${CHAIN#firewall-}
      PROTO=${PROTO#PROTO=}
      PROTO=${PROTO,,}
      SRC=${SRC#SRC=}
      SPT=${SPT#SPT=}
      DST=${DST#DST=}
      DPT=${DPT#DPT=}
      ACTION=`LANG=C xmessage -buttons ACCEPT,DROP,SKIP -default SKIP    -timeout 15 -print "$SRC => $DST:$DPT"`
      ACTION=${ACTION:-"SKIP"}
      case $ACTION in
        SKIP) continue;;
        ACCEPT) sudo iptables -I $CHAIN 2 -s $SRC -d $DST -p $PROTO   --dport $DPT -j ACCEPT;;
        DROP) sudo iptables -I $CHAIN 2 -s $SRC -d $DST -p $PROTO --dport $DPT -j DROP;;
      esac
      sleep 1

3. Запускаем firewall

   tail -f /var/log/syslog | ./interactive-firewall.sh

4. Что можно улучшить.

В этом варианте правила имеют вид SRC => DST:PORT -j ACTION. Исходный порт
соединения понятно пропускается. Хорошо бы предоставлять выбор пользователю из
нескольких вариантов, но xmessage для этого маловато. Может у кого есть
предложения чем рисовать вопрос пользователю и обрабатывать его выбор?

По желанию сценарий можно доработать и отображать в xmessage не голые цифры, а
расшифровать их в имена компьютеров командой host, а протоколы по
/etc/services. Кроме модификации сценария потребуется так же разрешить
первоначально DNS трафик resolver'а в первоначальной конфигурации netfilter.

5. Эта заметка ни на что не претендует, просто идея и простой набросок.

Интерактивный firewall в Linux

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

Рассмотрим следующую заготовку firewall, которую в дальнейшем можно обучать интерактивно:

cat slackwall.initstate
   # Generated by iptables-save v1.4.10 on Sat Dec  3 21:42:46 2011
   *filter
   :INPUT ACCEPT [0:0]
   :FORWARD ACCEPT [0:0]
   :OUTPUT ACCEPT [0:0]
   :FIREWALL-INPUT - [0:0]
   :FIREWALL-FORWARD - [0:0]
   :FIREWALL-OUTPUT - [0:0]
   -A INPUT -m state --state INVALID -j REJECT --reject-with icmp-port-unreachable
   -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
   -A INPUT -p icmp -j ACCEPT
   -A INPUT -j FIREWALL-INPUTFIREWALL-INPUT
   -A INPUT -j LOG --log-prefix "FIREWALL-INPUT "
   -A INPUT -j REJECT --reject-with icmp-port-unreachable
   -A FORWARD -m state --state INVALID -j REJECT --reject-with icmp-port-unreachable
   -A FORWARD -p icmp -j ACCEPT
   -A FORWARD -p udp -m udp --dport 53 -j ACCEPT
   -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
   -A FORWARD -j FIREWALL-FORWARD
   -A FORWARD -j LOG --log-prefix "FIREWALL-FORWARD "
   -A FORWARD -j REJECT --reject-with icmp-port-unreachable
   -A OUTPUT -m state --state INVALID -j REJECT --reject-with icmp-port-unreachable
   -A OUTPUT -p icmp -j ACCEPT
   -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT
   -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
   -A OUTPUT -j FIREWALL-OUTPUT
   -A OUTPUT -j LOG --log-prefix "FIREWALL-OUTPUT "
   -A OUTPUT -j REJECT --reject-with icmp-port-unreachable
   COMMIT
   # Completed on Sat Dec  3 21:42:46 2011

В трёх основных цепочках мы сначала запрещаем обрывки соединений, потом
разрешаем уже установленные соединения, DNS и ICMP трафик.
Далее пакеты перенаправляются в одну из трёх обучаемых цепочек:

   FIREWALL-INPUT
   FIREWALL-OUTPUT
   FIREWALL-FORWARD

откуда пакеты, для которых не нашлось правила возвращаются в одну из основных
цепочек и ЛОГИРУЮТСЯ а затем отклоняются ПО УМОЛЧАНИЮ.
В цепочке FIREWALL-OUTPUT для персонального firewall лучше держать только одно
разрешающее правило для всего трафика, иначе обучение становится трудоёмким.

Таким образом пакет в обучаемой цепочке шлибо обрабатывается с соответствующим
решением, либо попадает в LOG firewall`а и отклоняется.

То есть строки о "необученных пакетах" можно регулярно считывать, парсить,
предлагать решение пользователю и вносить новые правила в обучаемые цепочки.

Например если есть некий shell сценарий обработки SYSLOG, можно выполнить от рута:

   tail -n 1 -f /var/log/syslog | ./slackwall
  
В данном примере обработчик - скрипт slackwall. Вот его текст:

   #!/bin/sh
   while read string
   do
      echo $string | grep FIREWALL > /dev/null || continue
      for token in $string
      do
          echo $token | grep "=" > /dev/null  && export $token
          echo $token | grep "FIREWALL" > /dev/null && export CHAIN=$token
      done

      [ -z "$IN" ] && unset SRC

      [ -z "$OUT" ] && unset DST

      HSRC=`host $SRC 2>/dev/null | grep "domain name pointer" | awk '{ print $5 }'`
      HDST=`host $DST 2>/dev/null | grep "domain name pointer" | awk '{ print $5 }'`
      echo $PROTO | grep "^[[:digit:]]*$" > /dev/null && unset DPT
      PROTO=`cat /etc/protocols | grep "[[:space:]]$PROTO[[:space:]]" | awk '{ print $1 }'`
      HPROTO=`cat /etc/services | grep -i "[[:space:]]$DPT/$PROTO"`
      HSRC=${HSRC:-$SRC}
      HDST=${HDST:-$DST}
      HPROTO=${HPROTO:-"$DPT/$PROTO"}

      unset IHSRC IHDST ISRC IDST IDPT IPROTO

      [ -z "$HSRC" ] || IHSRC="-s $HSRC"
      [ -z "$HDST" ] || IHDST="-d $HDST"
      [ -z "$SRC" ] || ISRC="-s $SRC"
      [ -z "$DST" ] || IDST="-d $DST"
      [ -z "$DPT" ] || IDPT="--dport $DPT"
      IPROTO="-p $PROTO"

      cat slackwall.userules | grep "iptables -A $CHAIN $IPROTO $IHSRC $IHDST $IDPT -j" \
          && echo Alredy && continue

      cat slackwall.userules | grep "iptables -A $CHAIN $IPROTO $ISRC $IHDST $IDPT -j" \
          && echo Alredy && continue

      cat slackwall.userules | grep "iptables -A $CHAIN $IPROTO $IDPT -j" \
          && echo Alredy && continue

      unset COMMAND
      ACTION=6
      LANG=C xmessage -buttons BlockFQDN:1,BlockIP:2,AcceptFQDN:3,AcceptIP:4,BlockPortOnAllIP:5,Skip:6 \
       -default Skip -timeout 15 "$HSRC => $HDST ($HPROTO)"
      ACTION=$?

      [ $ACTION == 0 ] && continue
      [ $ACTION == 1 ] && COMMAND="iptables -A $CHAIN $IPROTO $IHSRC $IHDST $IDPT -j REJECT"
      [ $ACTION == 2 ] && COMMAND="iptables -A $CHAIN $IPROTO $ISRC $IDST $IDPT -j REJECT"
      [ $ACTION == 3 ] && COMMAND="iptables -A $CHAIN $IPROTO $IHSRC $IHDST $IDPT -j ACCEPT"
      [ $ACTION == 4 ] && COMMAND="iptables -A $CHAIN $IPROTO $ISRC $IDST $IDPT -j ACCEPT"
      [ $ACTION == 5 ] && COMMAND="iptables -A $CHAIN $IPROTO $IDPT -j REJECT"
      [ $ACTION == 6 ] && continue

      $COMMAND
      [ "$?" == 0  ] && echo "$COMMAND" >> slackwall.userules
   done

Он парсит строки SYSLOG и рисует на экране пользователя вопрос с помощью
xmessage и затем добавляет правило в ядро и дублирует его в сценарий
slackwall.userules, предназначенный для начальной инициализации firewall.

Вот его начальное состояние:

   #!/bin/bash
   modprobe nf_conntrack
   modprobe nf_conntrack_amanda
   modprobe nf_conntrack_ftp
   modprobe nf_conntrack_h323
   modprobe nf_conntrack_irc
   modprobe nf_conntrack_netbios_ns
   modprobe nf_conntrack_netlink
   modprobe nf_conntrack_pptp
   modprobe nf_conntrack_proto_dccp
   modprobe nf_conntrack_proto_gre
   modprobe nf_conntrack_proto_sctp
   modprobe nf_conntrack_proto_udplite
   modprobe nf_conntrack_sane
   modprobe nf_conntrack_sip
   modprobe nf_conntrack_tftp
   modprobe xt_conntrack
   iptables -F FIREWALL-INPUT
   iptables -F FIREWALL-FORWARD
   iptables -F FIREWALL-OUTPUT

   iptables -A FIREWALL-OUTPUT -j ACCEPT

Для начального запуска firewall нужно выполнить:

1. Разрешаем руту рисовать на X сервере (выполняется от пользователя, остальное всё от рута)

   $xhost +localhost

2. Загружаем неизменяемую часть firewall

   #cat slackwall.initstate | iptables-restore

3. Загружаем пользовательские правила, в дальнейшем их можно отредактировать и
перезапустить эту комманду

   #./slackwall.userules

4. Запускаем скрипт обучения:

   #tail -n 1 -f /var/log/syslog | ./slackwall

Ссылка на готовый пакет: https://sourceforge.net/projects/slackwall/

Ограничение трафика через iptables

Доп инфо


ipt_limit - общее ограничение по срабатываний правила
     -m limit --limit {avg}/[second|minute|hour|day] --limit-burst {burst}

iplimit - ограничение соединений для одного IP.
    Ограничение коннектов к 80 порту от одного IP:
         iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-above 4 -j REJECT
    Тоже, но для запросов с одной /24 подсети:
         iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-mask 8 --iplimit-above 4 -j REJECT

hashlimit - для каждого IP в хэше хранятся параметры соединений;
    -m hashlimit --hashlimit {avg} --hashlimit-burst {burst} --hashlimit-mode {режим: dstip, dstport, srcip, srcport} \
       --hashlimit-name {name} --hashlimit-htable-max {num} --hashlimit-htable-expire {num} --hashlimit-htable-gcinterval {num}

    iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m hashlimit --hashlimit 1/hour \
       --hashlimit-burst 2 --hashlimit-mode srcip --hashlimit-name SSH --hashlimit-htable-expire 360000 -j ACCEPT

tbf (http://www.nmalykh.org/work/tbf.tar.gz) - продолжение развития limit и hashlimit c поддержкой
возможности инверсии правил в целом.

    iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW -m tbf ! -- tbf 1/s --tbf-burst
       --tbf-mode srcip --tbf-name SMTP  -j DROP

Как в Linux перебросить соединение через NAT во внутреннюю сеть


Первый путь - пробрасывание только порта:

  1) iptables -t nat -A PREROUTING -p tcp -d EXT_R_IP --dport 10000 -j DNAT --to-destination LOCAL_IP:80
  2) iptables -A FORWARD -i eth0 -d LOCAL_IP -p tcp --dport 22 -j ACCEPT

Второй вариант - выброс всей машины наружу (если есть свободные адреса):

  1) ifconfig eth0:0 NEW_IP netmask NETMASK broadcast BROADCAST
  2) route add NEW_IP gw GW netmask 0.0.0.0 metric 1 dev eth0:0
  3) iptables -t nat -A PREROUTING -p tcp -d NEW_IP -j DNAT --to-destination LOCAL_IP
  4) iptables -A FORWARD -i eth0 -d LOCAL_IP -j ACCEPT

Обозначения: EXT_R_IP - внешний IP роутера, LOCAL_IP - внутренний IP машины,
которую хочешь выбросить NEW_IP - новый IP на который хочешь посадить машину, которая имеет локальный LOCAL_IP NETMASK, BROADCAST, GW - внешние netmask, broadcast и gateway

Port mapping и открытие портов наружу во FreeBSD 7.1 (ipfw + kernel nat)


Для начала надо пересобрать ядро со следующими опциями

   options         IPFIREWALL              #firewall
   options         IPFIREWALL_VERBOSE      #enable logging to syslogd(8)
   options         IPFIREWALL_DEFAULT_TO_ACCEPT    #allow everything by default
   options         IPDIVERT
   options         IPFIREWALL_FORWARD
   options         DUMMYNET
   options         IPFIREWALL_NAT          #ipfw kernel nat support
   options         LIBALIAS

Далее пересобираем ядро:

   # cd /usr/src/
   make buildkernel KERNCONF=Yourkernel && make installkernel KERNCONF=Yourkernel

  # shutdown -r now

Далее кусок файла конфигурации с примером.
192.168.1.132 - ip адрес сетевой карты смотрящей наружу
останое внутренние адреса

   #!/bin/sh
   # здесь просто удаляю старые правила
   ipfw -f flush
   ipfw nat 122 delete

   # разрещаю все через loopback
   ipfw add allow all from any to any via lo0

   # делаю нат на ip смотрящем наружу, same_ports - для попытки сохранить номера портов при нате
   ipfw nat 123 config ip 192.168.1.132 log same_ports \

   # пробрасываю все что приходит на порт 9999 на тот же порт внутренней машины
   # как вариант можно указать -redirect_port tcp 192.168.4.86:9999 192.168.1.132:9999
    redirect_port tcp 192.168.4.86:9999 9999

   # этот кусок нужен что бы у машины был не полный нат а только порт который я разрешил,
   # потому что вообще в интернет буду пускать через проксю.
   ipfw add 100 nat 123 tcp from 192.168.4.86 9999 to any
   ipfw add 100 nat 123 tcp from any to 192.168.4.86 9999

   # здесь я разрешаю клиенту с ip 192.168.4.86 коннектится к любым серверам по 25 порту,
   # но только по нему.
   ipfw add 100 nat 123 tcp from 192.168.4.86 to any 25

   # это что бы был нат, иначе ничего не будет работать, правило для выпуска клиентов наружу
   ipfw add 100 nat 123 ip from any to 192.168.1.132

Организация доступа к IPTV через NAT


Инструкция для желающих настроить Multicast Routing на Linux шлюзе,
обеспечивающем работу клиентов через NAT. Доп ссылка
Для переброса IGMP-трафика между подсетями будем использовать демон igmpproxy  (http://sourceforge.net/projects/igmpproxy)

Ставим IGMP Proxy из пакетов используемого дистрибутива или устанавливаем из исходных текстов:

   # tar -zxf igmpproxy-src-0.1.tar.gz
   # cd igmpproxy/
   # less README
   # cd src/
   # make && make install

Правим файл конфигурации /etc/igmpproxy.conf. В представленном примере,
интерфейс eth0 смотрит в публичную сеть провайдера Mig Telecom, а eth1 в
домашнюю сеть.

   # Enable Quickleave mode (Sends Leave instantly)
   # Эту строчку раскомментируют только в том случае,
   # если внути всего лишь один клиент IP TV

   #quickleave

   # Configuration for eth0 (Upstream Interface)
   # Здесь указаны параметры для публичного интерфейса,
   # на который придет поток от провайдера

   phyint eth0 upstream ratelimit 0  threshold 1
           altnet 10.20.0.0/16
           altnet 88.210.40.0/24
           altnet 80.240.211.0/22

   # Configuration for eth1 (Downstream Interface)
   # Типовая конфигурация для внутреннего интерфейса

   phyint eth1 downstream ratelimit 0  threshold 1

   # Configuration for eth2 (Disabled Interface)
   # eth2 в системе есть, но не используется никем, отключаем

   phyint eth2 disabled

Запускаем igmpproxy и переходим к небольшой конфигурации IPTables.
Вот этот набор правил понадобился для корректной работы пакетного фильтра,
разрешается весь входящий мультикст, разрешается его форвардинг и плюс ко всему
добавляем в TTL 1, без этого добавления не работает если пакеты от провайдера
приходят с минимально выставленным TTL.

   modprobe ipt_TTL
   iptables -t filter -A INPUT -d 224.0.0.0/240.0.0.0 -i eth0 -j   ACCEPT
   iptables -t filter -A INPUT -s 224.0.0.0/240.0.0.0 -i eth0 -j ACCEPT
   iptables -t filter -A FORWARD -d 224.0.0.0/240.0.0.0 -j ACCEPT
   iptables -t filter -A FORWARD -s 224.0.0.0/240.0.0.0 -j ACCEPT
   iptables -t mangle -A PREROUTING -d 224.0.0.0/240.0.0.0 -p udp -j TTL --ttl-inc 1

Дублирование сервера с использованием VRRP


Имеется два сервера - первичный и запасной. При помощи протокола VRRP (Virtual
Router Redundancy Protocol)
при крахе первичного сервера, автоматически поднимаем его MAC и IP на запасном.

Устанавливаем vrrpd (http://sourceforge.net/projects/vrrpd/).

На первичном сервере выполняем:

   vrrpd -i eth0 -p 25 -v 1 192.168.1.1

На запасном:

  vrrpd -i eth0 -p 24 -v 1 192.168.1.1

,где
    -i eth0  - имя интерфейса на котором будет установлен IP 192.168.1.1
    -v 1 - (virtual router) номер VRRP связки
            (в локальной сети может быть несколько резервирующих друг-друга систем)
   -p N - приоритет, машина с меньшим весом будет активирована, только при недоступности системы с большим весом.

При тестировании можно использовать tcpdump -vv proto 112

Объединение сетевых интерфейсов в Gentoo Linux

Довольно часто бывает, что пропускной способности не хватает.
Если у вас нет гигабитной сетевой карты (или порта на свиче), не расстраивайтесь. 
Можно вставить в компьютер еще 1-2 сетевухи и объединить интерфейсы в один. 
Данная операция называется bonding. Так как под рукой у меня только Gentoo, 
то могу привести алгоритм объединения интерфейсов только для него.

Итак.

1. emerge ifenslave

2. Редактируем /etc/conf.d/net:
2.1 Комментируем текущий конфиг
2.2 Пишем следующее:

   slaves_bond0="eth0 eth1"
   config_bond0=( "192.168.1.101 netmask 255.255.255.0 brd 192.168.1.255" )
   routes_bond0=( "default gw 192.168.1.11" )

config_bond0 и routes_bond0 берем из закомментированного конфига
(скорее всего это будет config_eth0 и routes_eth0). 
То есть настраиваем bond0 как обычный интерфейс

3. Делаем симлинк из /etc/init.d/net.lo в /etc/init.d/net.bond0

4. Проверяем:
   ~# /etc/init.d/net.eth0 stop
   ~# /etc/init.d/net.bond0 start

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

   ~# rc-update -d net.eth0
   ~# rc-update -a net.bond0 boot

Все, скорость линка должна возрасти.

Объединение сетевых интерфейсов под FreeBSD 5.x

Превращение двух 100 мбит/c сетевых карт в одну виртуальную, с пропускной способностью 200 мбит/c . Доп ссылка



kldload /boot/kernel/ng_ether.ko
  kldload /boot/kernel/ng_one2many.ko
  ifconfig rl0 up
  ifconfig rl1 up
  ngctl mkpeer rl0: one2many upper one
  ngctl connect rl0: rl0:upper lower many0
  ngctl connect rl1: rl0:upper lower many1
  ngctl msg rl1: setpromisc 1
  ngctl msg rl1: setautosrc 0
  ngctl msg rl0:upper \
        setconfig "{ xmitAlg=1 failAlg=1 enabledLinks=[ 1 1 ] }"
  ifconfig rl0 inet 192.168.0.78

Объединение сетевых интерфейсов под Linux


Превращение двух 100 мбит/c сетевых карт в одну виртуальную, с пропускной способностью 200 мбит/c. (Ссылка)


Документация: Documentation/networking/bonding.txt в дереве исходных текстов
ядра и "modinfo bonding".

Кратко:


Подгружаем модуль ядра "bonding", в /etc/modules.conf указываем alias bond0 bonding

При желании устанавливаем опции для доп. настройки модуля, например: options bond0 mode=2, где mode=
        0 - balance-rr (Round-robin выбор интерфейса)
        1 - active-backup (работает только один интерфейс, остальные в режиме горячей замены)
        2 - balance-xor - для всех пересылок на MAC закрепляется один из интерфейсов
        3 - broadcast - трафик идет через оба интерфейса одновременно
        4 - 802.3ad - для коммутаторов с поддержкой IEEE 802.3ad Dynamic link aggregation
        5 - balance-tlb, 6 - balance-alb

# /sbin/ifconfig bond0 192.168.1.1 netmask 255.255.255.0 broadcast 192.168.1.255 up

# /sbin/ifenslave bond0 eth0
# /sbin/ifenslave bond0 eth1

Или для дистрибутивов в которых используется пакет initscripts (http://rhlinux.redhat.com/initscripts/)


/etc/sysconfig/network-scripts/ifcfg-bond0

     DEVICE=bond0
     BOOTPROTO=static
     BROADCAST=192.168.63.255
     IPADDR=192.168.1.1
     NETMASK=255.255.255.0
     NETWORK=192.168.0.0
     ONBOOT=yes

   /etc/sysconfig/network-scripts/ifcfg-eth0

     DEVICE=eth0
     BOOTPROTO=static
     ONBOOT=yes
     MASTER=bond0
     SLAVE=yes
     USERCTL=no

   /etc/sysconfig/network-scripts/ifcfg-eth1

     DEVICE=eth1
     BOOTPROTO=static
     ONBOOT=yes
     MASTER=bond0
     SLAVE=yes
     USERCTL=no




Установка phpMyAdmin

Установка


Подключим репозиторий RPMforge repository

Импортируем RPMforge GPG ключ:
# rpm --import http://dag.wieers.com/rpm/packages/RPM-GPG-KEY.dag.txt
Посмотрим на rpmforge-релизы и выберем последний.


x86_64 systems:
# yum -y install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

i386 systems:
# yum -y install http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.i686.rpm



# yum -y install phpmyadmin

Теперь мы конфигурируем phpMyAdmin. Мы изменяем конфигурацию Apache так, чтобы phpMyAdmin позволил соединения не только от localhost

# vi /etc/httpd/conf.d/phpmyadmin.conf

------------------------------------------------------

#
#  Web application to manage MySQL
#

#<Directory "/usr/share/phpmyadmin">
#  Order Deny,Allow
#  Deny from all
#  Allow from 127.0.0.1
#</Directory>

Alias /phpmyadmin /usr/share/phpmyadmin
Alias /phpMyAdmin /usr/share/phpmyadmin
Alias /mysqladmin /usr/share/phpmyadmin
------------------------------------------------------


Затем мы изменяем аутентификацию в phpMyAdmin от cookie до http:

# vi /usr/share/phpmyadmin/config.inc.php

------------------------------------------------------

[...]
/* Authentication type */
$cfg['Servers'][$i]['auth_type'] = 'http';
[...]
------------------------------------------------------

Перезапустим Apache

# service httpd restart

Впоследствии, получаем доступ к phpMyAdmin через браузер http://192.168.0.100/phpmyadmin/




Установка PHP5

Установка


# yum -y install php
# service httpd restart

Установим поддержку MySQL и другую приблуду:

# yum search php

Например:

# yum -y install php-mysql php-gd php-imap php-ldap php-mbstring php-odbc php-pear php-xml php-xmlrpc
# service httpd restart



Тест


# echo "<!--?php phpinfo(); ?-->" >> /var/www/html/phpinfo.php
или
# vi /var/www/html/info.php


<?php
phpinfo();
?>

Откроем в браузере (e.g. http://192.168.0.100/info.php)


Установка Apache 2

Установка


# yum -y install httpd
# chkconfig --levels 235 httpd on


Настройка и запуск

Рихтуем /etc/httpd/conf/httpd.conf (сервер нэйм, закомментируем cgi-bin, shtml, отключим ненужные модули, удалим ненужные языки, etc ...  ) дополнительные конфиги лежат в /etc/httpd/conf.d/, тут настроим php, PhpMyAdmin и VirtualHost'ы.

# service httpd start

По умолчанию document root в /var/www/html

Посмотреть список включенных модулей:
# apachectl -M | grep shared

Mob health - Plugin Minecraft Server

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

Страница плагина
Скачать плагин

Русифицировать можно через файл /plugins/MobHealth/lang.yml

Настройка: в /plugins/MobHealth/config.yml ставим usePermissions: true, в пермишенсах группе дефаултс добавим MobHealth.show и hideNoDammage: true


Конфигурация:


usePermissions: false
Если true, то в пермишенсах для пользователей нужно добавить MobHealth.show

disableSpout: false
Force messages to display in chat even if spout is detected.

disableChat: false
Force messages to display in chat even if spout is detected. 
Устанавливая оба вышеупомянутых параметра в true отключит уведомления.

disablePlayers: false
Отключить уведомления об ударах игрока.

disableMonsters: false
Отключить уведомления об ударах монстров.

disableAnimals: false 
Отключить уведомления об ударах животных. 

damageDisplayType: 1
  1. Вывести на экран причиненный ущерб.
  2. Вывести на экран полученное повреждение.
  3. Вывести на экран причиненный ущерб (- количество сопротивления)
  4. Вывести на экран повреждают взятый (+ количество сопротивления)
hideNoDammage: false
Скрыть уведомления, которые наносят ущерб 0. 
Custom Egg and Snowball notifications are exempt.

Команды

/MobHealth reload
Перезагрузка текущей конфигурации.

/MobHealth toggle [player]
Переключить уведомления.  [player] is ignored via chat and mandatory via the console.
Как я понял, игнорировать в чате, показывать в консоле.

Permissions

MobHealth.* 
Все полномочия ModHealth.

MobHealth.show
Если  usePermissions как true только игроки из пермишенс увидят сообщения об уроне.

MobHealth.command.*
Дайте игроку все MobHealth команды (и всех последующих команд). MobHealth.commands также работает для этого, чтобы позволить совместимость с прежними системами.

MobHealth.command.toggle
Дать игроку  команду /MobHealth toggle [player]

MobHealth.command.reload
Дать игроку команду /MobHealth reload

MyHome - Plugin Minecraft Server

Тут кое че Разбираться

В настройке MySQL вроде бы ничего сложного нету, ковыряем файл, вот тут подводный камень:

Делаем:

libraries:
   sqliteLib: false

Конфигурация
позже разберемся

Для R6

Комманды и пермишен


MyHome – плагин для bukkit, позволяющий оставлять игроку точку телепорта — дом.
Любой игрок сможет зарегистрировать себе «дом» командой /home set в любом месте на карте, и легко телепортироваться на эту точку, набрав команду /home

С помощью этого плагина игроки так же смогут посещать чужие дома, если владелец разрешит им.

/home invite [ник игрока] — позволяет пригласить другоко игрока, то есть телепортироваться к вам домой, командой /home [ник игрока]

Особенности:
Возможность приглашать друзей домой
Ограничение времени использования команды /home 
Просмотр списка приглашенных друзей и приглашений.

Установка:
* Убедитесь что у вас установлен любой плагин Permissions и исправно функционирует, хотя без него тоже работает.
* Скачайте плагин MyHome для своей версии букита
* Положите его в папку сервер/plugins/
* Запустите Bukkit, сначала могут быть ошибки, просто перезапустите проект

Permissions
* Добавьте игрокам поле myhome.home.* для стандартных /home и /home set 
* Добавьте игрокам поле myhome.home.soc.* для остальных команд

Полный список команд:
/home help – показать все команды.
Основные команды:
/home set – создать точку дома.
/home – перейти домой
/home delete – удалить точку дома
/home [ник игрока] – перейти на точку дома, указанного игрока
/home list –показать дома, куда вы приглашены
/home ilist – показать игроков, которые приглашены в ваш дом
/home invite [ник игрока] – пригласить игрока к вам домой
/home uninvited [ник игрока] – убрать игрока из списка приглашенных
/home public – сделать дом доступным для всех
/home private – сделать дом доступным только вам


Admin Commands:
/home clear [playername] - (myhome.admin.home.delete) - Позвольте администратору удалять дом playername.