Брандмауэр (firewall, фаерволл) неотъемлемая часть любой unix системы. И надо уметь работать с ним. В linux системах брандмауэр входит в стандартное ядро и называется netfilter. Iptables – название команды, с помощью которой задаются правила в системе netfilter.
В этой статье я хочу вам привести пример брандмауэра в котором по умолчанию все запрещено. Для домашних систем в которых работают разные torrent качалки и прочие p2p программы данный пример брандмауэра не подойдет, т.к. любое соединение на определенный порт надо прописывать в конфигурации.
Итак начинаем.. Сначала приведу два вспомогательных скрипта.
Первый, разрешает все и вся к нам и от нас. Запускается с целью протестировать соединения, если думаете, что вам мешает ваш рабочий брандмауэр. Этот скрипт я назвал fwaccept.
#очистка существующих правил
iptables -F
iptables -X
#политика по умолчанию - ACCEPT
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
Следующий скрипт fwdrop. Как видно из названия все соединения запрещает. Запускать только за консолью компьютера или сервера, а иначе удаленное управление точно потеряете. Может пригодиться, если вдруг заметите постороннюю активность и надо срочно перекрыть доступ. Ну мало ли, что в жизни бывает 🙂
#очистка существующих правил
iptables -F
iptables -X
#политика по умолчанию - DENY
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
А теперь сам скрипт моего firewall в котором по умолчанию все запрещено. Скрипт для одной сетевой карты, т.е для машин роутеров он не совсем подходит, или надо все прописывать на вторую сетевую.
Я надеюсь вам что-то пригодится из этого скрипта, т.к. описано много протоколов и примеров взаимодействия с другими машинами и сетями. Специально не использованы так называемые цепочки правил, чтобы не запутать новичков. Изменяете переменные на свои, убирайте лишнее и можно начинать работать 🙂
В каждой строке всегда 2 правила на вход и выход. Скрипт большой – показать
#Сначала задаем переменные, чтобы потом обращаться к хостам через них.
# Впоследствии может сэкономить много времени и нервов, если будете
# переносить данный скрипт на другие компьютеры и сети.
EXTERNAL_INTERFACE="eth1"
LOOPBACK_INTERFACE="lo"
IPADDR="192.168.21.21"
ANYWHERE="any/0"
LOOPBACK="127.0.0.0/8"
CLASS_A="10.0.0.0/8"
CLASS_B="172.16.0.0/12";
CLASS_D_MULTICAST="224.0.0.0/4"
CLASS_E_RESERVED="240.0.0.0/5"
M_LAN="192.168.15.0/24"
BROADCAST_SRC="0.0.0.0"
BROADCAST_DEST="255.255.255.255"
BROADCAST_17="192.168.17.255"
PRIVPORTS="0:1023"
ALL="1:65535"
UNPRIVPORTS="1024:65535"
PASSIVPORTS="15000:20000"
XWINDOW_PORTS="6000:6063"
SOCKS_PORTS="1080"
NETBIOSUDP_PORTS="137:139"
NS_SERVER="192.168.15.1"
DNS_SERVER="192.168.15.4"
MAIL_EXT_SERVER="192.168.0.2"
MAIL_SERVER_EXCH3="192.168.15.235"
PROXY_SERVER="192.168.15.4"
PROXY_SERVER_ISA="192.168.15.190"
PROXY_SERVER_ISA2="192.168.15.193"
TIME_SERVER="192.168.15.4"
NS_SERVER="192.168.15.1"
#очистка существующих правил
iptables -F
iptables -X
#политика по умолчанию - DENY
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
#разрешение неограниченного через LOOPBACK
iptables -A INPUT -i $LOOPBACK_INTERFACE -j ACCEPT
iptables -A OUTPUT -o $LOOPBACK_INTERFACE -j ACCEPT
#запрещаем фрагменты пакетов
iptables -A INPUT -f -i $EXTERNAL_INTERFACE -j DROP
#запрет пакетов, которые содержат адрес источника,
#принадлежащий диапазону классу A,
#предназначенный для внутреннего использования.
iptables -A INPUT -i $EXTERNAL_INTERFACE -s $CLASS_A -j DROP
iptables -A INPUT -i $EXTERNAL_INTERFACE -d $CLASS_A -j DROP
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -s $CLASS_A -j DROP
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -d $CLASS_A -j DROP
#запрет пакетов, которые содержат адрес источника,
#принадлежащий диапазону классу B,
#предназначенный для внутреннего использования.
iptables -A INPUT -i $EXTERNAL_INTERFACE -s $CLASS_B -j DROP
iptables -A INPUT -i $EXTERNAL_INTERFACE -d $CLASS_B -j DROP
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -s $CLASS_B -j DROP
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -d $CLASS_B -j DROP
#запретить пакеты, якобы отправленные через lo0
iptables -A INPUT -i $EXTERNAL_INTERFACE -s $LOOPBACK -j DROP
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -s $LOOPBACK -j DROP
#запретить некорректные широковещательные пакеты
iptables -A INPUT -i $EXTERNAL_INTERFACE -s $BROADCAST_DEST -j DROP
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -d $BROADCAST_SRC -j DROP
#запретить пакеты, содержащие в качестве источника класс D
iptables -A INPUT -i $EXTERNAL_INTERFACE -s $CLASS_D_MULTICAST -j DROP
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -s $CLASS_D_MULTICAST -j DROP
#запретить передачу и прием пакетов мультикаста с нашего узла
iptables -A INPUT -i $EXTERNAL_INTERFACE -d $CLASS_D_MULTICAST -j DROP
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -d $CLASS_D_MULTICAST -j DROP
#запретим пакеты с исходными адресами класса E
iptables -A INPUT -s $CLASS_E_RESERVED -j DROP
#разрешим необходимые для нормальной работы ICMP
iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type 4 -s $ANYWHERE \
-d $IPADDR -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp --icmp-type 4 -s $IPADDR \
-d $ANYWHERE -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type 12 -s $ANYWHERE \
-d $IPADDR -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp --icmp-type 12 -s $IPADDR \
-d $ANYWHERE -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type 3 -s $ANYWHERE \
-d $IPADDR -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp --icmp-type 3 -s $IPADDR \
-d $ANYWHERE -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type 11 -s $ANYWHERE \
-d $IPADDR -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp --icmp-type 11 -s $IPADDR \
-d $ANYWHERE -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type 0 -s $ANYWHERE \
-d $IPADDR -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp --icmp-type 0 -s $IPADDR \
-d $ANYWHERE -j ACCEPT
#Нормальный ping
iptables -A INPUT -i $EXTERNAL_INTERFACE -p icmp --icmp-type 8 -s $ANYWHERE \
-d $IPADDR -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p icmp --icmp-type 8 -s $IPADDR \
-d $ANYWHERE -j ACCEPT
#запретим использование X-Window с удаленными машинами и попытки соединения
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -d $IPADDR --destination-port \
$XWINDOW_PORTS -j DROP
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR -d $ANYWHERE \
--destination-port $XWINDOW_PORTS -j DROP
#запретим установление соединения с SOCKS
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp --syn -s $IPADDR \
-d $ANYWHERE $SOCKS_PORT -j DROP
#разрешение работы SNMP с устройствами
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p udp -s $IPADDR --source-port \
$UNPRIVPORTS -d $M_LAN --destination-port 161 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p udp -s $M_LAN --source-port 161 \
-d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение взаимодействия c DNS
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p udp -s $IPADDR --source-port \
$UNPRIVPORTS -d $ANYWHERE --destination-port 53 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p udp -s $ANYWHERE --source-port 53 \
-d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение получения почты через POP3 exchenge & SSL с exchange2010
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d $MAIL_SERVER_EXCH3 --destination-port 110 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $MAIL_SERVER_EXCH3 \
--source-port 110 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d $MAIL_SERVER_EXCH3 --destination-port 995 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $MAIL_SERVER_EXCH3 \
--source-port 995 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение отправки почты через SMTP exchenge2010
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d $MAIL_SERVER_EXCH3 --destination-port 25 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $MAIL_SERVER_EXCH3 \
--source-port 25 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение отправки и получения почты через SMTP m2
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d 192.168.15.4 --destination-port 25 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s 192.168.15.4 --source-port 25 \
-d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d 192.168.15.4 --destination-port 110 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s 192.168.15.4 --source-port 110 \
-d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение работы tftp только с 21.254 и 15сети udp
iptables -A INPUT -i $EXTERNAL_INTERFACE -p udp -s $M_LAN --source-port \
$UNPRIVPORTS -d $IPADDR --destination-port $ALL -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p udp -s $IPADDR --source-port \
$ALL -d $M_LAN --destination-port $UNPRIVPORTS -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p udp -s 192.168.21.254 --source-port \
$UNPRIVPORTS -d $IPADDR --destination-port $ALL -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p udp -s $IPADDR --source-port $ALL \
-d 192.168.21.254 --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение обращение по TELNET к внешним серверам
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d $ANYWHERE --destination-port 23 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE --source-port 23 \
-d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение обращение по SSH к внешним серверам
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d $ANYWHERE --destination-port 22 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE --source-port 22 \
-d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение обращения по TELNET к нашей машине
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE --source-port \
$UNPRIVPORTS -d $IPADDR --destination-port 23 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port 23 \
-d $ANYWHERE --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение обращения по SSH к нашей машине
iptables -A INPUT -p tcp -s $ANYWHERE --source-port $UNPRIVPORTS \
-d $IPADDR --destination-port 22 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port 22 \
-d $ANYWHERE --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение обращение по SSH к NS
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d $NS_SERVER --destination-port 5623 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $NS_SERVER --source-port \
5623 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение обращение по SSH к mail server
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d $MAIL_EXT_SERVER --destination-port 5623 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $MAIL_EXT_SERVER \
--source-port 5623 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение обращение на 8080 к mail server
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d $MAIL_EXT_SERVER --destination-port 8080 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $MAIL_EXT_SERVER \
--source-port 8080 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
# Как пример, запретить принимать все с узла 15.30
#iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s 192.168.15.30 -d $IPADDR -j DROP
#Для примера, разрешаем все на 21.55
#iptables -A INPUT -m state --state RELATED,ESTABLISHED -i $EXTERNAL_INTERFACE \
-s 192.168.21.55 -d $IPADDR -j ACCEPT
#iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -o $EXTERNAL_INTERFACE \
-s $IPADDR -d 192.168.21.55 -j ACCEPT
#разрешение обращаться к удаленным FTP серверам
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d $ANYWHERE --destination-port 21 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE --source-port 21 \
-d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#режим нормального канала данных
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE --source-port 20 \
-d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d $ANYWHERE --destination-port 20 -j ACCEPT
#режим пассивного канала данных
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port \
$PASSIVPORTS -d $ANYWHERE --destination-port $UNPRIVPORTS -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE --source-port \
$UNPRIVPORTS -d $IPADDR --destination-port $PASSIVPORTS -j ACCEPT
#разрешение доступа к локальному FTP-серверу
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE --source-port \
$UNPRIVPORTS -d $IPADDR --destination-port 21 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port 21 \
-d $ANYWHERE --destination-port $UNPRIVPORTS -j ACCEPT
#режим нормального канала данных
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port 20 \
-d $ANYWHERE --destination-port $UNPRIVPORTS -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp ! --syn -s $ANYWHERE --source-port \
$UNPRIVPORTS -d $IPADDR --destination-port 20 -j ACCEPT
#режим пассивного канала данных
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp ! --syn -s $IPADDR --source-port \
$PASSIVPORTS -d $ANYWHERE --destination-port $UNPRIVPORTS -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE --source-port \
$UNPRIVPORTS -d $IPADDR --destination-port $PASSIVPORTS -j ACCEPT
#разрешение обращения к удаленным WWW-серверам
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d $ANYWHERE --destination-port 80 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE --source-port 80 \
-d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#доступ к локальному WWW-серверу
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE --source-port \
$UNPRIVPORTS -d $IPADDR --destination-port 80 -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port 80 \
-d $ANYWHERE --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение обращения к PROXY 5623
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d $PROXY_SERVER --destination-port 5623 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $PROXY_SERVER \
--source-port 5623 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение обращения к PROXY ISA 8080
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d $PROXY_SERVER_ISA --destination-port 8080 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $PROXY_SERVER_ISA \
--source-port 8080 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d $PROXY_SERVER_ISA2 --destination-port 8080 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $PROXY_SERVER_ISA2 \
--source-port 8080 -d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение обращения к нашему PROXY port 3128 с машины 21.212.21.213
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -m iprange -p tcp -s $IPADDR \
--source-port 3128 --dst-range 192.168.21.212-192.168.21.213 --destination-port \
$UNPRIVPORTS -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -m iprange -p tcp --src-range \
192.168.21.212-192.168.21.213 --source-port $UNPRIVPORTS -d $IPADDR \
--destination-port 3128 -j ACCEPT
#разрешение получения времени с TIME_SERVER
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p udp -s $IPADDR -d $TIME_SERVER \
--destination-port 123 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p udp -s $TIME_SERVER --source-port 123 \
-d $IPADDR -j ACCEPT
#разрешение взаимодействия с принтером bxer440
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS \
-d 192.168.17.94 --destination-port 515 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s 192.168.17.94 --source-port 515 \
-d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение взаимодействия с принтером axer4525
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS \
-d 192.168.17.206 --destination-port 515 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s 192.168.17.206 --source-port 515 \
-d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение netbios
#разрешаем 139 порт по tcp
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port $UNPRIVPORTS \
-d $ANYWHERE --destination-port 139 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE --source-port 139 -d $IPADDR \
--destination-port $UNPRIVPORTS -j ACCEPT
#разрешаем 137,138,139 порты по udp от нас
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p udp -s $IPADDR --source-port $UNPRIVPORTS \
-d $ANYWHERE --destination-port $NETBIOSUDP_PORTS -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p udp -s $ANYWHERE --source-port $UNPRIVPORTS \
-d $IPADDR --destination-port $NETBIOSUDP_PORTS -j ACCEPT
#разрешаем connect на 445 порт по tcp от нас
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d $ANYWHERE --destination-port 445 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE --source-port 445 \
-d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение работы rdp
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d $ANYWHERE --destination-port 3389 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE --source-port 3389 \
-d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
#разрешение работы ldap
iptables -A OUTPUT -o $EXTERNAL_INTERFACE -p tcp -s $IPADDR --source-port \
$UNPRIVPORTS -d $ANYWHERE --destination-port 389 -j ACCEPT
iptables -A INPUT -i $EXTERNAL_INTERFACE -p tcp -s $ANYWHERE --source-port 389 \
-d $IPADDR --destination-port $UNPRIVPORTS -j ACCEPT
В данном скрипте, пришлось переносить строки через синтаксис “\“, чтобы нормально влезло на экран. Скрипт доступен для скачки в разных кодировках – fw-windows1251.txt, fw-koi8.txt, fw-utf8.txt.
Единственное, что может скомпрометировать безопасность в данном скрипте, это режим пассивного канала данных. Очень уж много доступа со множества портов разрешается на нашу машину. При открытии FTP сервера на машине, где запущен этот скрипт будет заметное увеличение соединения, это из-за пассивных портов FTP.
После того как скрипт отлажен и не выдает никаких ошибок при запуске, можно выполнить
# iptables-save > /etc/rc.d/fwrules
Команда iptables-save позволяет записать текущий набор правил iptables в файл, а файл можно восстанавливать обратно в память компьютера командой iptables-restore. Для чего все это? Команда iptables-restore при загрузке скрипта отработает почти в 20 раз быстрее чем наш скрипт. Там конечно разница в мс, но я хочу показать, как надо правильно делать.
Замерим скорость загрузки нашего скрипта и через iptables-restore
# time fw
real 0m0.717s
user 0m0.132s
sys 0m0.244s
# time iptables-restore /etc/rc.d/fwrules
real 0m0.039s
user 0m0.004s
sys 0m0.008s
Почувствуйте разницу!
Еще один совет при отлаживании правил firewall. Смотрите вывод команды
# iptables -vL
Ответ команды будет большой, но вывод можно ограничивать командой grep только нужных строчек. Смотрите на счетчик пакетов или байтов в начале строки. Это скажет по какому пути пошло соединение, а если не пошло, значит уперлось в DROP политику.
А теперь занесем загрузку скрипта при старте ОС. В каждом дистрибутиве это по разному, так что почитайте сами. Если лень читать, то вставьте в скрипт rc.local строку c iptables-restore и путем до файла сохраненных настроек.
Защищенной вам работы!
Здравствуйте
Скажите, зачем в скрипте присутствуют правила с целью DROP в начале, если политика DENY ? То есть запрещено всё, что явно не разрешено.
да вы правы. Если политика DENY то эти правила избыточны. Но я их держу на всякий случай в скрипте 🙂 Может кому и пригодятся, т.к. блокировать данные с этих адресов нужно обязательно.
К слову про iptables-save…
На машинах Like RedHat (Centos, Fedora etc.) этот скрипт только выводит текущие загруженные правила, при этом ни как не воздействуя на /etc/sysconfig/iptables
Возможность записи загруженных правил в конфиг только так
service iptables save
или
/etc/init.d/iptables save
ни в коем случае… там порты по фаллигатовской системе нарсипируются
P.S.: Хотя да, автор указывает перенаправление вывода в файл, но в разных машинах он разный. И тут либо направлять в родной файлик, либо через rc.local подгружать создаваемый.
Спасибо за статью, только пытаюсь освоить iptables и разжеванные комментарии в скрипте очень кстати .
Такой вопрос – у меня интерфейс ppp0, оператор присваивает динамический IP из диапазона “10.x.x.x” – как адаптировать скрипт? Просто убрать переменную А и все с ней связанное? Или еще какая-то специфика должна быть?
Не совсем понял что за переменная A в скрипте.. Но все равно я думаю скрипт описанный в статье не подходит для динамического адреса. Этот скрипт больше ориентирован для серверов со статическим адресом.
Для инета с ppp0 модно использовать что-то попроще. У меня был когда-то этот скрипт.
http://ruunix.ru/wp-content/uploads/iptables/fw_drop_in_pass_out.txt
Он тоже с комментариями на KOI8-R. Думаю разберетесь. Тут фактически ничего допиливать не надо, просто лишнее выкинуть или добавить свои ip для соседних машин в сети.
Под переменной А я подразумевал CLASS_A=”10.0.0.0/8″
За второй скрипт спасибо, буду изучать. Но первый сделан “от противного”, “запрещено все, что явно не разрешено”, этот путь мне представляется более правильным.
P.S.: Не люблю и не хочу быть модным, не моё )
Первый скрипт конечно более суровый 🙂 Если первый адаптировать, то да CLASS_A надо убирать, плюс разобраться с переменной IPADDR, т.к у вас по сути будет 2 интерфейса, 1 eth0, второй ppp0 с динамическим адресом.
Переменная EXTERNAL_INTERFACE у вас будет в таком случае ppp0, но в правилах не надо задавать “-s $IPADDR”, т.к. этот адрес будет динамическим.
В общем на первый взгляд так.
Попробовал все же сделать на основе второго скрипта, вроде почти все понял ) Логика там не хуже первого, ибо “всё, что явно не разрешено, то DROP”. Внес в него несколько изменений из Google, что-то поменял местами. Все же не определился с набором –icmp-type Есть возможность посмотреть краем глаза на предмет явных ошибок? Я понимаю, что “нафик_оно_мне_ надо”, но вдруг… ) В любом случае – спасибо, на конкретных примерах проще понимать.
про icmp типы в инете посмотреть можно. для чего какой тип отвечает. Лучше что у меня прописано то и оставить. Я это в книжке “Брандмауэры в linux” взял.
нуа посмотреть почему бы и нет 🙂 выложите куда-нибудь или по почте скиньте. в контактах сайта есть мыло.
Здравствуйте
Установил программу Gufw Firewall и на компе пропал интернет
Устанавливал из центра программ Мюон что как-бы подразумевает правильность проги
Было написано что этот Гуф Фаервол это охренительно простой способ защитить комп
Причём интернет пропал и в системе Виндовс
Винда показывает наличие подключения а браузер пишет что нет интерета
Как такое возможно? Как пингвин может залезать в БИОС?
Пришлось достать с антресолей древний лаптоп Азер всунуть в него лайв-диск с пингвином и с помощью такого бубна искать подмоги
Пингвин от КДЕ 14 04
Теперь вот собственно вопрос Как с этим злом бороться?
Дело в том что этот гуф фаервол будто бы выключен потому что всякий раз при старте системы приходится его искать и включать а интернет отсутствует постоянно даже в винде
Фаервол пишет в журнале какие-то порты но я хз правильно ли
Люди добрые помогите пожалуйста мы сами не местные мы с винды и в этом пингвине хуже чем в лесу
Сергей, я понятия не имею что это за программа такая. Разбираться ради вас в этой проблеме не вижу смысла.
А вот проблема отсутствия в windows интернета интересна. В браузере то что нет интернет еще ничего не значит, там могут быть настройки разные. Запустите в windows команду cmd и далее выполните команду ping 8.8.8.8. Если ответы пошли, значит интернет есть. Остальное дело настроек компьютера. Если ответы не пошли, тогда предположу, что программа в linux отключает полностью сетевую карту проводную или беспроводную. Вы не указали через какое подключение выходите в интернет.
На будущее не используйте программы не читая к ним документации. В linux такой подход не сработает. Надо четко понимать что вы делаете и заче вам firewall этот нужен. Если ваш компьютер стоит за роутером вам этот firewall вообще не сдался.
Здравствуйте.
Программа вот эта:
http://gufw.org/
Ради меня разбираться не нужно. Хотя и приятно было-бы … :о)
Я просто подумал: чувак ведёт блог, значит крут невероятно и он мою проблему одной левой…
С интернетом уже разобрались – нашёлся в нашем городке шибко шарящий товарищ. Каким-то макаром фаервол отключил в биосе сетевую карту. Включили в биосе и в настройках фаервола в одном месте поставили галку.
Осталось только понять, как он (фаервол) это делает…
Сейчас бодаюсь с системным временем. Эта зараза тупо переставляет системное время на -3 часа от московского. А при загрузке пингвина в трее пишет +3 часа от московского. При загрузке виндовс время устанавливается как положено.
Можно плюнуть, но ведь интересно… :о)
Спасибо за участие.
Если фаерволл работает отключил карту на уровне биос, то это вообще странно. Я бы сказал, что возможно в программе ошибка. Такого поведения быть не должно просто так. Разве что в той программе это не заложена в специальную команду, которую вы по незнанию запустили.
А насчет времени запускайте команду
date -R
должен быть примерно такой ответ
Sat, 21 Apr 2018 16:44:32 +0300
вот +0300 это показывает часовой пояс. В данном случае +3 часа к нулевому поясу Гринвича. Я думаю у вас какая-то проблема с часовым поясом.
Привет. Относительно трабла со временем выяснил, что если не грузить виндовс, то показывает правильное время – московское. Вот несколько дней не загружал винду и время не сбивается. Часовой пояс установлен на Москву и тож стоит ровно.
Спасибо за участие.