Поглядев на многие руководства по настройке iptables решил написать правила сам. конечно, использовал материал и теорию из интернета, основываясь на правильных руководствах и выбирая необходимое. надеюсь, кому-нибудь это пригодится)
Итак, начнем.
Сначала определимся с нашими задачами. Нам необходимо:
1. Запретить доступ к нашему компьютеру извне для любых пользователей/сервисов, кроме оговоренных
2. Разрешить доступ к нашей рабочей станции тем пользователям/сервисам, с которыми мы сами устанавливаем соединение (проверенные пользователи)
3. Разрешить доступ к нашей рабочей станции для оговоренных пользователей/сервисов
Оформим всю настройку iptables в виде скрипта.
I. Создаем любой файл в любой директории (к примеру - /etc/init.d/iptables.local):
Код:
# vim /etc/init.d/iptables.local
II. Начинаем писать наш скрипт. Будем писать скрипт BASH:
Создадим несколько переменных для упрощения нашей задачи:
Код:
## Переменные
IFACE="eth0" # Сетевой интерфейс, для которого необходимо создавать правила
IPT="/sbin/iptables" # iptables
Все операции по непосредственной настройке iptables вынесем в отдельную функцию:
Код:
## Скрипт применения правил iptables
start_iptables()
{
## Настройка цепочек
# Очистка всех цепочек от правил
$IPT -F
$IPT -X
# Установка политик цепочек
$IPT -P INPUT DROP
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD DROP
## Настройка правил приёма пакетов
# Принимать ESTABLISHED пакеты
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Разрешить loopback
$IPT -A INPUT -i lo -j ACCEPT
## Открытие портов
# SMB
$IPT -A INPUT -p tcp -m multiport --source 192.168.1.0/24 --dports 137,138,139,445 -j ACCEPT
$IPT -A INPUT -p udp -m multiport --source 192.168.1.0/24 --dports 137,138,139,445 -j ACCEPT
$IPT -A INPUT -p udp -m multiport --source 192.168.1.0/24 --sports 137,138,139,445 -j ACCEPT
# FTP
$IPT -A INPUT -p tcp --dport 21 -j ACCEPT
# HTTP
$IPT -A INPUT -p tcp --dport 80 -j ACCEPT
# SSH
$IPT -A INPUT -p tcp --source 192.168.1.0/24 --dport 22 -j ACCEPT
}
Теперь внесем в наш скрипт больше функциональности. Добавим возможности остановки действия правил iptables, их перезапуска, старта, сохранения настроек и их восстановления и вывода списка текущих правил:
Код:
case "$1" in
start) echo -n "Starting iptables: iptables" # старт правил iptables
start_iptables
echo "."
;;
stop) echo -n "Stopping iptables: iptables" # остановка действия правил iptables
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
echo "."
;;
save) echo -n "Saving iptables configuration: iptables" # сохранение настроек iptables
iptables-save > /etc/iptables.save
echo "."
;;
restart) echo -n "Restarting iptables: iptables" # перезапуск правил iptables
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
start_iptables
echo "."
;;
reload) echo -n "Reloading iptables configuration: iptables" # перезагрузка сохраненной конфигурации iptables
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
cat /etc/iptables.save | iptables-restore
echo "."
;;
list) echo "List of iptables rules" # вывод списка текущих правил
iptables -L
;;
*) echo "Usage: /etc/init.d/iptables.local start|stop|save|restart|reload" # подсказка к использованию нашего скрипта
exit 1
;;
esac
Ну и как положено, в случае удачной работы скрипт должен возвращать 0:
В итоге мы получаем такой скрипт:
Код:
#!/bin/bash
## Переменные
IFACE="eth0" # Сетевой интерфейс
IPT="/sbin/iptables" # iptables
## Скрипт применения правил iptables
start_iptables()
{
## Настройка цепочек
# Очистка всех цепочек от правил
$IPT -F
$IPT -X
# Установка политик цепочек
$IPT -P INPUT DROP
$IPT -P OUTPUT ACCEPT
$IPT -P FORWARD DROP
## Настройка правил приёма пакетов
# Принимать ESTABLISHED пакеты
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Разрешить loopback
$IPT -A INPUT -i lo -j ACCEPT
## Открытие портов
# SMB
$IPT -A INPUT -p tcp -m multiport --source 192.168.1.0/24 --dports 137,138,139,445 -j ACCEPT
$IPT -A INPUT -p udp -m multiport --source 192.168.1.0/24 --dports 137,138,139,445 -j ACCEPT
$IPT -A INPUT -p udp -m multiport --source 192.168.1.0/24 --sports 137,138,139,445 -j ACCEPT
# FTP
$IPT -A INPUT -p tcp --dport 21 -j ACCEPT
# HTTP
$IPT -A INPUT -p tcp --dport 80 -j ACCEPT
# SSH
$IPT -A INPUT -p tcp --source 192.168.1.0/24 --dport 22 -j ACCEPT
}
case "$1" in
start) echo -n "Starting iptables: iptables"
start_iptables
echo "."
;;
stop) echo -n "Stopping iptables: iptables"
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
echo "."
;;
save) echo -n "Saving iptables configuration: iptables"
iptables-save > /etc/iptables.save
echo "."
;;
restart) echo -n "Restarting iptables: iptables"
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
start_iptables
echo "."
;;
reload) echo -n "Reloading iptables configuration: iptables"
iptables -F
iptables -X
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
cat /etc/iptables.save | iptables-restore
echo "."
;;
list) echo "List of iptables rules"
iptables -L
;;
*) echo "Usage: /etc/init.d/iptables.local start|stop|save|restart|reload"
exit 1
;;
esac
exit 0
III. Сохраняем наш скрипт и даем ему права на исполнение:
Код:
chmod +x /etc/init.d/iptables.local
Теперь вы можете применять правила iptables просто исполняя наш скрипт с ключом start. Но правила iptables действуют только до следующего запуска системы, поэтому имеет смысл автоматизировать запуск правил iptables. Сделать это можно несколькими способами, кому какой нравится. Мы же сделаем это путем добавления в файл /etc/rc.local необходимых записей. Открываем файл /etc/rc.local и приводим его к следующему виду:
Код:
#!/bin/sh -e
/etc/init.d/iptables.local start
exit 0
Все, теперь мы решили поставленные нами задачи. Если кто-то заметит неточности или предложит другие варианты - буду очень признателен!