22.11.2011

Трассировка iptables

Включаем модуль в ядре:
modprobe ipt_LOG

Включаем правила, которые будут перебрасывать все на трейс (обратите внимание на новую цепочку raw вместо nat/filter). В моем случае я трассировал ping'и и потому включил для ICMP, но Вам надо отконфигурировать под свою задачу:
iptables -t raw -A OUTPUT -p icmp -j TRACE
iptables -t raw -A PREROUTING -p icmp -j TRACE

И смотрим за трафиком:
tailf /var/log/kern.log


Когда попользуетесь, не забудьте удалить правила, а то раздел /var забьете (а многие и рутовый):
iptables -t raw -D OUTPUT -p icmp -j TRACE 
iptables -t raw -D PREROUTING -p icmp -j TRACE



Proxmox: гибридная сеть Bridge+NAT

Иногда нужно иметь часть виртуальных машин с внешним ("белым") IP и нормальным функционированием с Интернетом, а иногда виртуальным машинам нежелательно висеть наружу потрохами (как например LDAP-серверу). Если физическая хост-машина только одна, а виртуалки надо делать и так и так, то вот выход - создать еще одну сеть, только виртуальную, и к ней зацепиться бриджем.

Итак у нас есть интерфейс eth0 с сетью 222.111.123.231 (маска и шлюз тоже имеются) и ничего больше. Пусть внутренняя сеть имеет адресацию 192.168.0.0/24.

Сначала нам понадобится дополнительный интерфейс-пустышка, у которого будет собственный внутренний адрес, чтобы хост-машина могла общаться со своими виртуалками, а также работать им шлюзом:
lsmod | grep dummy

Если вывода не было, значит нужно подключить модуль, а если показалось что-то, то этот шаг пропустить.
Импорт модуля:
echo "dummy" >> /etc/modules
modprobe dummy

Теперь надо настроить два интерфейса (реальный eth0 и виртуальный dummy0) и два бриджа (в реальную сеть vmbr0 и в виртуальную vmbr1). Вот так изменится конфиг интерфейсов:
vi /etc/network/interfaces

# Loopback device:
auto lo
iface lo inet loopback

# Wide Area Network
auto vmbr0
iface vmbr0 inet static
  address  
222.111.123.231
  netmask   255.255.255.196
  gateway  
222.111.123.227
  bridge_ports eth0
  bridge_stp off
  bridge_fd 0

# Real phisical device: eth0
auto  eth0
iface eth0 inet manual

# default route to access subnet
up route add -net
222.111.123.226 netmask 255.255.255.196 gw 222.111.123.227 vmbr0

# Local Area Network
auto vmbr1
iface vmbr1 inet static
  address  192.168.0.1
  netmask  255.255.255.0
  bridge_ports dummy0
  bridge_stp off
  bridge_fd 0
  post-up echo 1 > /proc/sys/net/ipv4/ip_forward
  post-up    iptables -t nat -A POSTROUTING -s 192.168.0.0/16 -o vmbr0 -j SNAT --to-source
222.111.123.231
  post-up    iptables -t nat -A POSTROUTING -o vmbr1 -j SNAT --to-source 192.168.0.1
  post-down  iptables -t nat -D POSTROUTING -s 192.168.0.0/16 -o vmbr0 -j SNAT --to-source 222.111.123.231
  post-down  iptables -t nat -D POSTROUTING -o vmbr1 -j SNAT --to-source 192.168.0.1


# Dummy device for LAN
auto  dummy0
iface dummy0 inet manual

20.11.2011

Как запретить обычным пользователям биндиться на все порты, включая непривилегированные

Нужно ковыряться в ядре.


Вот здесь объявляется символическое имя:
grep -B 1 PROT_SOCK include/net/sock.h

/* Sockets 0-1023 can't be bound to unless you are superuser */
#define PROT_SOCK       1024 

А здесь PROT_SOCK используется:
Infiniband: drivers/infiniband/core/cma.c
SCTP: net/sctp/socket.c
IPv6: net/ipv6/af_inet6.c
IPv4: net/ipv4/af_inet.c
SunRPC: net/sunrpc/svc_xprt.c

15.11.2011

Как обычному пользователю забиндиться на привилегированный порт (1-1023)

Как известно все ядра компилируют так, чтобы не-root не мог забиндится на порт 1-1023. Можно конечно пересобрать ядро и поменять эту настройку до компиляции, но поменять этот параметр на готовой работающей системе нельзя.
Есть еще вариант забиндить на непривилегированный порт, а привилегированный туда соединить либо через rinetd, либо через iptables такой командой:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

Но зачастую это не подходит, особенно когда TCP-демон возвращает свой URI для работы, а не тот, за которым маскируется.


Неподходят также и варианты запуска через sudo, так как нам не нужен демон, запущенный от рута по причинам безопасности.


Единственные три варианта, это

либо использовать возможность setcap/getcap в новых ядрах:
apt-get install libcap2-bin
setcap 'cap_net_bind_service=+ep' /path/to/daemon

запуск:
/path/to/daemon

либо запускать через authbind:
apt-get install authbind
install -o my_user -m 500 /dev/null /etc/authbind/byport/443

запуск:
authbind /path/to/daemon

либо воспользоваться посредником supervisor:
apt-get install supervisor
и отконфигурировать его так.


***************
вообще команда install не особо популярна, но я ее написал, чтобы сократить количество команд. Если не понимаете, что она делает, то просто сделайте так:
touch /etc/authbind/byport/443
chown my_user /etc/authbind/byport/443
chmod 500 /etc/authbind/byport/443
***************

10.11.2011

Как заставить OpenLDAP работать на основе posixGroup и groupOfNames одновременно

Обычно все при установке применяют схему nis.schema, чтобы была совместимость с Samba и тем самым переводят работу LDAP с groupOfNames на posixGroup.
К сожалению это имеет обратный негативный момент:

"Its use is strongly discouraged because it is very inefficient, but mostly because posixGroup membership is a badly designed grouping philosophy"

Получается, что мы не сможем подключить к нашему LDAP множество хороших сервисов, как например Atlassian Jira. Нужно подключать groupOfNames.

Переходим в директорию со схемами:
cd /etc/ldap/slapd.d/cn=config

Открываем для редактирования схему, посвященную загрузке модулей:
vi cn=module{0}.ldif

В ней будет уже подгружен один модуль - бэкэнд hdb (или bdb):
dn: cn=module{0}
objectClass: olcModuleList
cn: module{0}
olcModulePath: /usr/lib/ldap
olcModuleLoad: {0}back_hdb
structuralObjectClass: olcModuleList
entryUUID: 0a04d41e-3161-1030-9fef-abf604861a01
creatorsName: cn=admin,cn=config
createTimestamp: 20110622211920Z
entryCSN: 20110622211920.678877Z#000000#000#000000
modifiersName: cn=admin,cn=config
modifyTimestamp: 20110622211920Z

07.11.2011

SSH JailKit

Устанавливаем необходимые для сборки пакеты:
apt-get install debhelper devscripts

И желательные для конфигурации:
apt-get install libcap-dev

Переходим в директорию, где будем собирать пакет:
cd /usr/src

Скачиваем его:
wget http://olivier.sessink.nl/jailkit/jailkit-2.14.tar.gz

Распаковываем:
tar xzf jailkit-2.14.tar.gz

Переходим в директорию с пакетом и с удивлением находим, что самый обычный тарбол с сорцами уже готов к сборке на Debian (об этом говорит директория debian с внутренними файлами):
cd jailkit-2.14

В пакете есть неболшой косячок с LSB-тэгами, поэтому можно их до сборки руками поправить:
vi extra/jailkit
#!/bin/sh
#
### BEGIN INIT INFO
# Provides:          jailkit
# Required-Start:    $remote_fs $syslog
# Required-Stop:     $remote_fs $syslog
# Should-Start:      $network $time
# Should-Stop:       $network $time
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Start and stop the jailkit syslog daemon
### END INIT INFO
#
Осталось только запустить сборку. Во время прохождения инструкций, сборщик споткнется об отсутствие файла *orig*, но не беда. Жмем на Y и идем дальше:
debuild -uc -us
Устанавливаем свежесобранный пакет:
 dpkg -i ../jailkit_2.14-1_i386.deb
Конфигурирование находится под катом.