Создание скрипта настройки firewall/routing
Создаем собственно файл — назовем его например netfilter
Помещаем скрипт в /etc/init.d/
Делаем файл исполнимым: chmod +x /etc/init.d/netfilter
Прописываем в файл стандартный заголовок для shell-скриптов: #!/bin/bash
Добавляем скрипт в автозагрузку: update-rc.d netfilter defaults
TODO: описать процесс для более других дистрибутивов, в частности не использующих SYSV Init
Теперь у нас есть скрипт, который будет выполнятся каждый раз при перезагрузке системы. Надобно наполнить его содержимым. При настройке firewall следует пользоваться правилом «доброго админа» — запретить все и разрешать при наличии необходимости только тому кому действительно нужен доступ.
Ex.1
#!/bin/bash
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
#iptables -A INPUT -p tcp —dport 22 -j ACCEPT
#iptables -A OUTPUT -p tcp —sport 22 -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
Вот собственно простейший firewall, который никого никуда не пускает. Если вы работает на удаленной машине по ssh — раскомментируйте строки 5 и 6 чтобы не потерять к ней доступ — пока что это правило без объяснений. Строки 2-3 — это очистка цепочек правил iptables. Строки 7-9 — установка для всех цепочек политики по умолчанию DROP (т.е запрет прохождения пакетов без уведомления отправителя). Подробнее о структуре и правилах iptables можно прочитать тут: http://gazette.lrn.ru/rus/articles/ipta
Все пакеты обрабатываемы ядром проходят через несколько таблиц и цепочек. Определенные операции возможно и принято выполнять в определенных таблицах и цепочках. Подробнее о порядке прохождения пакетов см. тут: http://gazette.lrn.ru/rus/articles/ipta
INPUT — пакеты пришедшие из сети и предназначеные данному хосту.
OUTPUT — пакеты созданные на данном хосте и передаваемые другим хостам в сеть.
FORWARD — пакеты пришедшие из сети и предназначенные для передачи другим хостам в сети.
Ex.2
#!/bin/bash
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
#iptables -A INPUT -p tcp —dport 22 -m state —state NEW -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp -m state —state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -m state —state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp -m state —state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p udp -m state —state NEW,RELATED,ESTABLISHED -j ACCEPT
Строки 9,10 — разрешаем входящие и исходящие ICMP-пакеты (в частности ping )
Строка 11 — разрешаем прохождение tcp-пакетов принадлежащих к уже установленым соединениям
Строка 12 — разрешаем прохождение пакетов принадлежащих к уже установленым tcp-соединениям, а так же пакетов создающих новые tcp-соедиения.
Строки 13,14 — аналогично для протокола UDP
В данном примере используеся отслеживание состояния соединения для принятия решения о прохождении пакета. Подробнее о механизме отслеживания состояний соединения см. тут: http://gazette.lrn.ru/rus/articles/ipta
В подсистеме фильтрации пакетов Linux существует 4 возможных состояния соденияния — взято из IPTables Tutorial 1.1.19
Разрешение входящих соединений
Для того, чтобы разрешить входящее TCP-соединение необходимо в скрипт добавить строчку: iptables -A INPUT -p tcp —dport 80 -m state —state NEW -j ACCEPT В данном случае разрешается доступ к 80 порту (как правило там находится http-сервер)
Маршрутизация — основы
При настройке маршрутизации следует учесть следующие моменты (собрано по мотивам популярных заблуждений):
Маршрутизацию надо настраивать на: маршрутизаторе, хосте принимающем соединение, хосте иницирующем соединение — т.е. в трех местах.
Если нет возможности настроить маршрутизацию на хосте принимающем соедиение — следует использовать NAT
Маршрутизация осуществляется между подсетями ip. Любой ip-адрес стандарта IP версии 4 (IPv4) состоит 4-х байт и условно делится на номер сети и номер хоста. Маршрутизация возможна только между сетями с разными номерами.
Маска подсети (netmask) не передается в заголовке ip-пакета. Маска подсети имеет смысл только в пределах хоста.
Для вычисления разнообразных параметров удобно использовать ipcalc:
В данном случае хосты расположены в одной подсети 192.168.0.0 размером в 2049 хостов. «нормальная» маршрутизация между ними невозможна.
Возьмем для примера более привычне диапазоны адресов: 192.168.1.0/24 (255.255.255.0) и 192.168.2.0/24 (255.255.255.0) — по 254 узла в каждой.
Например в маршрутизаторе есть две сетевые карты — с адресами 192.168.1.1 или 192.168.2.1.
Для того, чтобы маршрутизация между подсетями работала, необходимо произвести настройки:
На хосте в сети 192.168.1.0/24 — прописать маршрут к сети 192.168.2.0/24 через 192.168.1.1 — например в linux : ip route add 192.168.2.0/24 via 192.168.1.1
На хосте в сети 192.168.2.0/24 — прописать маршрут к сети 192.168.1.0/24 через 192.168.2.1 — например в linux : ip route add 192.168.1.0/24 via 192.168.2.1
На маршрутизаторе разрешить маршрутизацию пакетов: echo 1 > /proc/sys/net/ipv4/ip_forward — строчку стоит добавить в скрипт 😉
На маршрутизаторе разрешить прохождение пакетов через firewall (см. цепочку FORWARD)
Пакеты проходящие через маршрутизатор попадают в цепочку FORWARD. Например, чтобы разрешить пользователям из сети 192.168.1.0/24 обращаться к веб-серверам в сети в сети 192.168.2.0/24:
Ex.3
#!/bin/bash
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
#iptables -A INPUT -p tcp —dport 22 -m state —state NEW -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp -m state —state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -m state —state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp -m state —state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p udp -m state —state NEW,RELATED,ESTABLISHED -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.0/24 -p tcp —dport 80 -m state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.2.0/24 -d 192.168.1.0/24 -p tcp -m state ESTABLISHED -j ACCEPT
Строка 15 — разрешаем маршрутизацию.
Строка 16 — разрешаем прохождение пакетов открывающих новое соединение на порт 80 протокола tcp, либо принадлжащих к уже установленмову соединению на этот же порт от хостов в сети 192.168.1.0/24 к хостам в сети 192.168.2.0/24.
Строка 17 — разрешаем прохождение пакетов принадлежащих к уже установленым соединениям
В случае, если в одной из сетей настройка маршрутизаии невозможна, следует использовать NAT.
NAT — сокращение от Network address translation — т.е. преобразование адерсов в IP-пакетах. Подробнее о том что есть NAT и как его использовать — читайте в соответсвующем разделе IPtables tutorial.
Ex. 4
#!/bin/bash
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
#iptables -A INPUT -p tcp —dport 22 -m state —state NEW -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -A INPUT -p icmp -j ACCEPT
iptables -A OUTPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp -m state —state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -m state —state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp -m state —state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p udp -m state —state NEW,RELATED,ESTABLISHED -j ACCEPT
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 192.168.2.0/24 -p tcp —dport 80 -m state NEW,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.2.0/24 -d 192.168.1.0/24 -p tcp -m state ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -d 192.168.2.0/24 -j MASQUERADE
Строка 18 — модифицирует адрес источника пакетов идущих из сети 192.168.1.0/24 в сеть 192.168.2.0/24. В денном конкретном случае в качестве адреса источника будет установлен 192.168.2.1 — т.е. адрес соответсвующего интерфейса маршрутизатора подключенного к сети назначения. Соответсвующее обратное преобразование производится прозрачно. Firewall и локальные приложения. Некоторые программы работая на локальном компюьтере тем не менее не используют unix-sockets, а обращаются к адресам 127.0.0.0/8 (точнее, 127.0.0.1) Для нормально работы рекомендуется использовать конструкцию вида:
- iptables -A INPUT -i lo -j ACCEPT
- iptables -A OUTPUT -o lo -j ACCEPT
В первой строчке все пакеты пришедшие ( -i ) с интерфейса lo aka loopback принимаются безоговорочно. Во второй — уходящие через интерфейс lo так же отправляются.
—————————————-
RUSUA:Данная статья скопипизжена из http://www.linux.by/wiki/index.php/Debi
Спасибо автору,более понятного разьяснения команд iptables еще не встречал.Понятно даже школьнику.
Сделал все по первому правилу. SSH все равно закрыт. Что делать?Посоветуйте!
Напишите что именно вы вводили из первого правила. И закрыт ССШ извне,внутри сети можно подключиться,если она есть? Демон ССШ точно установлен и работает?
Прошу прощения. Моя ошибка. Демон SSH просто напросто не был запущен. Скажите пожалуйста, как открыть доступ для веб-серфинга но при этом разрешить только определенные сайты!
Подробнее пожалуйста) Открыть доступ что б этот ваш компьютер мог попадать на определенные сайты?или что б через него могли?или на нем хостятся сайты,и надо разрешить к ним доступ извне? и т.д.
помогите, хочу изменить дефолтный порт SSH с 22 на какой нибудь другой к примеру 4444, добавил в iptables правило
iptables -A FORWARD -i $intif -o $extif -p tcp —dport 4444 -d $everywhere
стучусь телнетом myserver.com 4444, но пишет connectiuon refused,
у меня debian
На самом деле порт в SSH меняется не так.Для этого достаточно в файле конфигурации демона /etc/ssh/sshd_config найти строчку Port 22 и изменить цифру порта на любую какую хочешь(но лишь бы не занятую другим сервисом на вашем сервере) и перезапустить демон ССШ.