Основы работы с 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 '' \\