Основы работы с iptables
A. Теория. \\
https://ru.wikibooks.org/wiki/Iptables \\
http://www.opennet.ru/man.shtml?topic=iptables&category=8&russian=0 \\
P.S. По этим линкам найдёте ОЧЕНЬ МНОГА БУКАВмного подробной полезной информации, вам понадобится много сигарет и кофевремени на обдумывания и размышления, но это полезно :-) \\
Для ipv6 используются аналогичные тулзы, как и для ipv6 (**ip6tables**,**ip6tables-restore**,**ip6tables-apply**) \\
Если вам было лень читать многа букавговорить коротко, то основные таблицы, с которыми мы будем работать, это **filter** и **nat** (с таблицей **mangle**, которая используется для модификации полей __TTL__,__TOS__,__TCP MSS__ и __MARK__пакетов, мы практически не будем работать, так как в работе она вам редко когда понадобится ) и их основными цепочками: **INPUT**,**OUTPUT**,**FORWARD**, **POSTROUTING** и **PREROUTING** \\
Цепочки: \\
1. **INPUT** <- используется для фильтрации входящих пакетов \\
2. **OUTPUT** <- используется для фильтрации исходящих пакетов \\
3. **FORWARD** <- используется для фильтрации проходящих через наш хост пакетов \\
4. **PREROUTING** <- в эту цепочку пакеты сначала попадают, перед тем как отправиться на обработку в другие цепочки. Часто используется для перенаправления на другой порт, либо пробросов портов \\
5. **POSTROUTING** <- используется для натирования и обработки исходящего через нас пакетов \\
Таблицы: \\
1. **filter** <- основная таблица, которая отвечает за фильтрацию трафика по критериям: разрешить, отклонить, залогировать и т.п.\\
2. **nat** <- собственно отвечает за натирование и обработку проходящего и входящего трафика. Задействуется перед таблицей **filter**\\
3. **mangle** <- используется для модификации полей в пакете \\
Действия: \\
1. **ACCEPT** <- разрешить\\
2. **DROP** <- строгое запрещение\\
3. **REJECT** <- запретить дальнейшую обработку пакета и "отрыгнуть" icmp сообщение о том, что порт закрыт (может использоваться для отладки)\\
4. **LOG** <- логировать пакет стандартным средством syslog (крайне не рекомендуется, если вы конечно не хотите засрать все логи срабатываниями фаервола)\\
5. **ULOG** <- более кошерный,правильныйпродвинутый вариант **LOG** (не гадит в syslog а будет писать только в нужный вам текстовый файл, бинарный файл или даже БД. Требует установленного пакета ulogd )\\
6. **MASQUERADE** <- маскарадинг\\
7. **DNAT** <- подмена IP назначения, используется для проброса портов\\
8. **SNAT** <- подмена исходящего IP, используется для натирования \\
9. **REDIRECT** <- перенаправить на другой порт \\
Модули и параметры: \\
1. **-p** <- выбор протокола (tcp, udp, icmp, esp, sctp, ah, udplite и all) \\
2. **-i** <- входящий интерфейс \\
3. **-o** <- исходящий интерфейс \\
4. **-m** <- выбор модуля (tcp, udp, icmp, state, comment, limit, multiport, owner, string, conntrack, mac)\\
5. **-j** <- действие (см. сноску "Действия")\\
6. **-s** <- исходящий адрес/сеть\\
7. **-d** <- адрес/сеть назначения \\
8. **-A** <- указать цепочку\\
Мы рассмотрим правила iptables на примере пограничного фаервола, между офисом и внешним миром. \\
\\
Легенда: \\
1. eth0 <- это наш внешних интерфейс, который смотрит в "мир" у него будет IP 188.67.53.23\\
2. eth1 <- интерфейс смотрит в офисную сеть 172.16.5.0/24 \\
3. eth2 <- интерфейс смотрит в сеть где находятся тестовые веб-сервера, сеть 172.17.1.0/28\\
4. eth3 <- интерфейс за которым находятся наши боевые сервера, будут иметь сеть 188.67.13.0/24 \\
5. 172.17.1.10 <- IP нашего почтового сервера \\
6. 188.251.148.31 <- внешний IP нашего админа \\
7. 172.16.5.7 <- рабочий комп мудакадиректора\\
B. Пишем правила. \\
1. Для начала создадим наш файл с конфигом для загрузки правил в iptables \\
**cd /etc && mkdir firewall && chmod 0700 firewall && cd firewall && touch rc.firewall && chmod 0600 firewall** \\
2. Заранее запишем наш конфиг в **/etc/network/interfaces**, для того, что бы после ребута у нас не оказался сервер без фаерволла. \\
**echo** ''"up /sbin/iptables-restore < /etc/firewall/rc.firewall"'' **>> /etc/network/interfaces** \\
3. Открываем наш конфиг \\
**vim rc.firewall** \\
4. Теперь нам необходимо написать правила в основную таблицу **filter**\\
''*nat \\
:PREROUTING ACCEPT [0:0] \\
:INPUT ACCEPT [0:0] \\
:OUTPUT ACCEPT [0:0] \\
:POSTROUTING ACCEPT [0:0] \\
-A PREROUTING -p tcp -m state --state NEW -m tcp --dport 443 -j REDIRECT --to-ports 9001 \\
-A PREROUTING -p tcp -m state --state NEW -m tcp --dport 80 -j REDIRECT --to-ports 9030 \\
COMMIT'' \\
''*filter\\
:INPUT DROP [0:0] \\
:FORWARD DROP [0:0] \\
:OUTPUT DROP [0:0]'' <- В этих трёх правилах мы задаём политики по умолчанию для цепочек __INPUT__, __FORWARD__ и __OUTPUT__\\
''-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT \\
-INPUT -i lo -j ACCEPT \\
-A INPUT -m state --state INVALID -j DROP\\
-A INPUT -s 54.214.49.70/32 -j DROP -m comment --comment "rapid7 scan network" \\
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,ACK -j DROP \\
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP \\
-A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP \\
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP \\
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN -j DROP \\
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP \\
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP'' <- В этих правилах мы запрещаем проход новых пакетов с указанной последовательностью флагов \\
''-A INPUT -i eth0 -s 188.251.148.31/32 -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT \\
-OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT \\
-OUTPUT -o lo -j ACCEPT\\
-A OUTPUT -m state --state INVALID -j DROP \\
-A OUTPUT -o eth0 -p udp -m state --state NEW -m owner --uid-owner 0 -m udp --dport 33434:33524 -j ACCEPT -m comment --comment "traceroute"\\
-A OUTPUT -o eth1 -p icmp -m owner --gid-owner 4 -m icmp --icmp-type 8 -m state --state NEW -j ACCEPT \\
-A OUTPUT -p icmp -m owner --uid-owner 0 -m icmp --icmp-type 8 -m state --state NEW -j ACCEPT -m comment --comment "just ping"\\
COMMIT '' \\