понедельник, 9 февраля 2015 г.

Самопальный файрвол на базе Ubuntu

Допустим, имеется ПК с предустановленной ubuntu server 14.04 и надо настроить связку dns+dhcp.
Дано:
Имя хоста: dc1
Домен: dc1.torg.com
Сеть: 192.167.13.0/24
Сетевки: eth0 - подключен тырнет, eth1 - смотрит в локалку

Первым делом надо привести к такому виду /etc/hosts
127.0.0.1   localhost
127.0.0.1   dc1.torg.com   dc1

В /etc/hostname должно быть:
dc1
Сколько не лазил в тырнетах, раз 20 находил команду SUDO SU
Сказать, что у меня пошла кровь из глаз, наверное ничего не сказать. ПАЦАНЫ, ИСПОЛЬЗУЙТЕ SUDO -S И НЕ БУДЬТЕ МУДАКАМИ
Есстно команду маленькими буквами, один хрен все операции от рута делать.

Можно не заморачиваться сильно по поводу iptables, и использовать надстройку типа ufw (тот же iptables, только для самых маленьких)

Для начала надо его включить:
ufw enable 
Если нужен ssh на нестандартном порту, например 1200, достаточно его разрешить:
ufw allow 1200
Ну и соответственно указать нужный порт в /etc/ssh/sshd.conf
Теперь надо разрешить хождения трафика по локалке через шлюз:
ufw allow from 192.168.13.0/24
А еще надо разрешить форфардинг пакетов в Интернеты. Все просто, нужно добавить следующее в /etc/ufw/before.rules
# NAT table rules
*nat :POSTROUTING ACCEPT [0:0] 
# Forward traffic through eth0 - Change to match you out-interface 
-A POSTROUTING -s 192.168.13.0/24 -o eth0 -j MASQUERADE 
# don't delete the 'COMMIT' line or these nat table rules won't
# be processed 
COMMIT
Вот именно от закоменченой строчки, до самого Коммита. Скопировать и вставить.

И на десерт надо разрешить в ядре форфардинг. Да, это очень удобно, когда интернеты выключаются в трех местах, а включить нужно в 4-х. Так вот, надо добавить или раскоментировать строчку в /etc/sysctl.conf
net.ipv4.ip_forward=1
И желательно ребутнутся. Или же выполнить:
sysctl -p
В выхлопе должно отобразиться добавленное правило.
А еще надо разрешить форвардинг на уровне самого ufw. Для этого необходимо изменить строчку в /etc/default/ufw
Там одна одна. Изменить с DROP на ACCEPT. Короч вот как надо
DEFAULT_FORWARD_POLICY="ACCEPT
Если выдача ip адреса у провайдера автоматическая, то надо отредактировать /etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
auto eth0
iface eth0 inet dhcp

auto eth1
iface eth1 inet static
address 192.168.13.1
netmask 255.255.255.0
network 192.168.13.0
broadcast 192.168.13.255
Еще надо временно отредактировать /etc/resolv.conf в такой вид
domain torg.com
search torg.com
nameserver 192.168.13.1

Ну, это были лишь цветочки. Я убил почти неделю, чтобы настроить это сраное говно, так как все маны протухли, поэтому пишу свой. Может кому-то или же мне когда-то пригодится.

Теперь самое важное. DHPC и DNS-сервера. В качестве DHCP-сервера я выбрал isc-dhcp-server, а в качестве DNS - bind9
Сервера легковесны и доступны из официальных репозиториев.
Короч, ставим их.
apt-get install isc-dhcp-server bind9
После установки, надо добавить isc-dhcp-server в автозагрузку
update-rc.d isc-dhcp-server defaults
Иначе после каждой перезагрузки надо его запускать вручную. Что можно сказать поэтому поводу? УДОБНО! Благо bind9 после установки сам в автозапуск прописывается.

Начнем со сложного, а именно с DNS-сервера. Вообще эта замудреная штука не такая и сложная, особенно если перерыл первые 5 страниц гугла вдоль и поперек.  Суть в чем, надо сделать форвардинг на dns гугла или провайдера, и создать кэширующую локальную зону. Ну, чтобы имена компьютеров преобразовывались в ip и наоборот. И тут у нас DNS становится DDNS-мать его сервер! 

Конфигурирование DNS-сервера начинается с файла 
/etc/bind/named.conf.options  и туда надо запихнуть эти строки:

        forwarders {
                8.8.8.8;
                8.8.4.4;
        };
        listen-on {
                127.0.0.1;
                192.168.13.1;
        };

Вообще, я читал ман по настройке на help.бубунту.лажа и есстно dns не взлетел. Максимум что он смог, так это перенаправлять трафик на DNS-гугла, но локальная зона не взлетела. Ладно, теперь о ней более детально. Рекомендуется файлы настроек локальной зоны хранить в /var/lib/bind и лучше не пренебрегать рекомендацией. Поэтому создаем файл /var/lib/bind/forward.bind
и запихиваем в него следующее
;
; BIND data file for torg.com
;
$TTL    604800
@       IN      SOA     torg.com. root.torg.com. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
        IN      A       192.168.13.1
;
@       IN      NS      dc1.torg.com.
@       IN      A       192.168.13.1
@       IN      AAAA    ::1
dc1      IN      A       192.168.13.1

Теперь надо создать файл обратной зоны, из ip в имена преобразует /var/lib/bind/reverse.bind 
;
; BIND reverse data file for local 192.168.13.XXX net
;
$TTL    604800
@       IN      SOA     dc1.torg.com. root.torg.com. (
                              2         ; Serial
                         604800         ; Refresh
                          86400         ; Retry
                        2419200         ; Expire
                         604800 )       ; Negative Cache TTL
;
@       IN      NS      dc1.
1      IN      PTR     dc1.torg.com.
Финальная стадия настройки вот-вот начнется. Но нам нужен секретный ключ, который будет делать перезапись супер-секретных имен компьютеров в сети и ip.
И где его взять? А негде, в Linux все как в совке, открываешь книгу "Сделай сам", и делаешь. В совке было сурово, но нам проще, и делается это одной командой:
dnssec-keygen -a HMAC-MD5 -b 128 -r /dev/urandom -n USER DHCP_UPDATER
Генерируется он в текущий каталог, там где ты был. Обычно в  ~/
Так вот, теперь надо забрать его из полученного файла
cat Kdhcp_updater.*.private|grep Key
И он должен быть в выхлопе в виде что-то такого 
YboDJAiXA8lhFMOaxG49rw==
Вот теперь все готово для создания локальной зоны. Настройки хранятся в файле /etc/bind/name.conf.local и обычно там почти ничего нет, поэтому надо внести следующее:


key DHCP_UPDATER {
        algorithm HMAC-MD5.SIG-ALG.REG.INT;
        secret "YboDJAiXA8lhFM0axG49rw==" ;
};

zone "torg.com" IN {
        type master;
        file "/var/lib/bind/forward.bind";
        allow-update { key DHCP_UPDATER; };
};

zone "13.168.192.in-addr.arpa" IN {
        type master;
        file "/var/lib/bind/reverse.bind";
        allow-update { key DHCP_UPDATER; };
};

И теперь пришло время перезапустиь bind9
sudo service bind9 restart
Если удачно перезапустился, это не факт, что все нормально. Пришло время тестировать локальную зону!! Она себя не затестирует. Так вот, чтобы ее тестировать, надо просто проверить три команды. 
dig dc1
В выхлопе должно быть что-то вроде 
; <<>> DiG 9.9.5-3ubuntu0.1-Ubuntu <<>> dc1
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 52459
;; flags: qr rd ra ad; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;dc1.    IN A

;; AUTHORITY SECTION:
.   1598 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2015020901 1800 900 604800 86400

;; Query time: 5 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Tue Feb 10 17:58:58 SAKT 2015
;; MSG SIZE  rcvd: 107
Но это мелочь, по-моему просто проверка тырнета, не вникал. Теперь же делаем преобразование имени в ip-адресс
host dc1
Выхлоп должен содержать что-то вроде: 
dc1.torg.com has address 192.168.13.1
Если ошибка, то надо смотреть /var/lib/bind/forward.bind
Если все ок, идем дальше:
host 192.168.13.1
И опять-таки, если все нормально (а по-идее нормально), то выхлоп должен быть таким
1.13.168.192.in-addr.arpa domain name pointer dc1.torg.com.
Самое страшное позади. Настроить dhcp - как два перста оросить. 
Просто сохраняем на всякий случай старый конфиг
mv /etc/dhcp/dhcp.con /etc/dhcp/dhcp.conf.orig
И создаем новый с таким содержанием


ddns-update-style interim;
authoritative;
log-facility local7;

key DHCP_UPDATER {
algorithm hmac-md5;
secret "YboDJAiXA8lhFMOaxG49rw==";
}

zone torg.com. {
primary 127.0.0.1;
key DHCP_UPDATER;
}

zone 13.168.192.in-addr.arpa. {
primary 127.0.0.1;
key DHCP_UPDATER;
}

subnet 192.168.13.0 netmask 255.255.255.0 {
range 192.168.13.2 192.168.13.254;
option domain-name "torg.com";
option domain-name-servers 192.168.13.1;
option routers 192.168.13.1;
option broadcast-address 192.168.13.255;
default-lease-time 43200;
max-lease-time 86400;
}

Можно еще запихнуть в dhcp.conf такие строки, чтобы резервировать ip-адреса машин в сети, и вести ip-лист
 host buhgaltery {
                hardware ethernet 08:00:27:e9:fd:82;
                fixed-address 192.162.13.10;
        }
Вроде все. Но не все! Логи же надо смотреть кто-чего просит, да и вообще это полезно. Так вот, в /etc/rsyslog.d/50-default.conf
Надо добавить в самый конец строчку
local7.* /var/log/dhcpd.log
И перезапускаем службы по порядку
service rsyslog restart
service isc-dhcp-server restart
И теперь логи видны при помощи команды
tail -f /var/log/dhcpd.log
Теперь можно отслеживать, кто когда запрашивает адреса. Вообще у dhcp-server куча много настроек, но это необходимый минимум для работы.