Differences between revisions 1 and 31 (spanning 30 versions)
Revision 1 as of 2008-07-08 18:33:44
Size: 5594
Editor: eSyr
Comment:
Revision 31 as of 2008-10-09 18:33:04
Size: 9062
Comment: No more illustration needed.
Deletions are marked like this. Additions are marked like this.
Line 3: Line 3:
Вот мы понастраивали фаервол ручным образом. Рчевидно, что если есть много правил, в разное время появившихся, то достаточно неудобно писать их все вручную. Первый способ это полуавтоматизировать: /etc/sysconfig/iptables (осталось от Mandrake). Выше был приведён пример полностью ручной настройки фаерволла, но писать большое количество правил неудобно, и желание полуавтоматизировать процесс вполне естественно. Существует два способа сделать это. Первый достался по наследству от дистрибутива Mandrake и позволяет записать все правила кучей в {{{/etc/sysconfig/iptables}}}. Теперь они будут добавляться при запуске iptables. Второй способ -- вписать нужные настройки в соответствующий подкаталог {{{/etc/net/}}}. Полную информацию о том, как это делать можно прочитать в {{{/usr/share/doc/etcnet-<version>/examples/firewall-hiddenman/ifaces/default/fw/iptables/nat}}}. Один из примеров фрагмента довольно сложной конфигурации:
{{{
# cat POSTROUTING
snat-to 5.6.7.8 if marked as 1
}}}
Line 5: Line 9:
Второй способ --- отредактировать в /etc/net/ ## Это было лирическое отступление, вроде как непротокольное
##В ксах есть два места для копирования информации --- есть cutbuffer, причём их несколько. Второй из них --- copy area. cutbuffer заполняется автоматически поо выделению текста. copyarea заполняется, если вы явно вызываете команду копирования. То же с операцией вставки. П средней кнопке мыши --- из cutbuffer, по команде --- из copyarea. Идея с cutbuffer хороша, но на не принимается виндузовыми пользователями.
Line 7: Line 12:
Посмотрим в /usr/share/doc/etcnet-.../examples/firewall-hissenman/ifaces/default/fw/iptables/nat и сделаем cat POSTROUTING Для примера настроим NAT (Network Address Translation, преобразование сетевых адресов) для второй машины, подключенной к интерфейсу eth1 и заблокируем для неё соединения с некоторым адресом. Настройки интерфейса eth0 на второй машине и соединённого с ним eth1 на первой не приводятся по причине рассмотренности ранее ([[http://uneex.lorien.cs.msu.su/PspoClasses/080703/04EtcNetAndDHCP|Автоматическая настройка сетевых подключений]]). Для того, чтобы серверная машина смогла маршрутизировать пакеты необходимо включить в {{{/etc/net/sysctl.conf}}} опцию {{{net.ipv4.ip_forward}}}:
{{{
# grep forward sysctl.conf
# IPv4 packet forwarding.
net.ipv4.ip_forward = 0
# sed -i '/net.ipv4.ip_forward = 0/s/0/1/' sysctl.conf
# grep forward sysctl.conf
# IPv4 packet forwarding.
net.ipv4.ip_forward = 1
}}}
Line 9: Line 23:
В ксах есть два места для копирования информации --- есть cutbuffer, причём их несколько. Второй из них --- copy area. cutbuffer заполняется автоматически поо выделению текста. copyarea заполняется, если вы явно вызываете команду копирования. То же с операцией вставки. П средней кнопке мыши --- из cutbuffer, по команде --- из copyarea. Идея с cutbuffer хороша, но на не принимается виндузовыми пользователями.

Создаём каталоги fw/iptables/nat в /etc/net/ifaces/eth0:
Создадим каталог {{{fw/iptables/nat}}} в {{{/etc/net/ifaces/eth0}}}:
Line 15: Line 27:
# cp fw/iptables/nat # cd fw/iptables/nat
Line 19: Line 31:
Проблема вот какая: существует два синтаксиса управления etc-net'ом iptables'ом. Один приближенный к iptables, другой human-readable. Есть в документации файл, который описывает взаимооднозначное соответствие этих форматов: /etc/net/ifaces/default/fw/iptables/syntax

Чтобы было совсем правильно, заменить ip-адрес на ${IPV4ADDRESS}:
Существует проблема управления iptables в etc-net, связанная с различными форматами синтаксиса. В файле документации {{{/etc/net/ifaces/default/fw/iptables/syntax}}} описано их взаимооднозначное соответствие. В связи с этим правильно заменить ip-адрес на ${IPV4ADDRESS}:
Line 23: Line 33:
... # echo '-o ${NAME} -j SNAT --to-source ${IPV4ADDRESS}' > POSTROUTING
Line 26: Line 36:
В задачу этой лекции не входило рассказать про весь iptables и etcnet, лектр только хотел показать примеры работы с ними. ##Замечание: при удалении правил iptables не делается substitution у ${IPV4ADDRESS} (бага!)
##Ответ на замечание: в использованной 23 июля при установке в терминальный класс версии Легкого Линукса этой проблемы нет. -- DmitryChistikov <<DateTime(2008-07-23T22:48:41+0400)>>
Line 28: Line 39:
##Замечание: при удалении правил iptables не делается substitution у ${IPV4ADDRESS} Таким образом мы совершили настройку iptables через /etc/net. То есть, при выполнении `service network restart` соответствующие правила будут применены. При этом iptables может быть выключен по умолчанию (например, в версии дистрибутива Lite), в таком случае редактирование /etc/net не приведёт к его работе -- фаерволл следует сначала включить.
Line 30: Line 41:
Чего мы дбидись? Включение и выключение iptables через etcnet. При этом iptables вообще мжет быть выключен по умолчанию (например, в Lite), и как вы не редактируете etcnet, пка вы не включите, оно бы не заработало. Тем не менее, iptables неявн включился.

##У нас настрйка уестуе вручную в правильном порядке уже была, такие ручные поделки делат не рекомендуется, и делать это надо либо центром управления, либо правкой /etc/net

Теперь забаним lor. Сначала добавим его ip:
{{{
$ host linux.org.ru
}}}

Теперь добавим правило (по умолчанию исп. таблоица filter)
Для примера запретим для второй машины соединения с адресом linux.org.ru. Добавим правило (таблица filter уже используется по умолчанию, но мы это традиционно укажем явно)
Line 45: Line 47:
Понятно, что этот способ общения с iptables --- традиция. Ведь это всё ключи, и правила можно добавлять не в свои таблицы, но так мы плоучим такой же сервер, в ктором каша. Первой строчкой мы добавили в syslog предупреждение о попытке посещения неким пользователем указанного сайта, а второй оборвали связь. Для сохранения этих настроек будет достаточно добавить аргументы команды iptables в файл FORWARD в рассмотренном выше каталоге `/etc/net/ifaces/eth0/fw/iptables/nat`.
Line 47: Line 49:
Этими командами мы добавим в syslog варнинг о том, что кто-то лмится на лор и выбрасываем этот пакет. Обратите внимание, что мы написали правила для перенаправляемых (проходящих "сквозь" маршрутизатор) пакетов, следовательно к пакетам, отправленным с маршрутизатора, эти правила не будут применяться. Проверим, что получилось.
Line 49: Line 51:
Обратите внимание, что мы написали правила для форвардящихся пакетов, следовательно, к пакетам, которые идут с маршрутизатора, эти правила не применяются. Проверка: На demo (серверной машине) попробуем соединиться с 80 портом (послав туда некие данные, в нашем примере --- текст календаря за этот месяц, выводимый командой cal):
{{{
# cal | netcat linux.org.ru 80
HTTP/1.1 400 Bad Request
Date: Tue, 08 Jul 2008 15:19:53 GMT
Server: Apache/2.2.8 (Fedora)
Content-Length: 352
Connection: close
Content-Type: text/html; charset=iso-8859-1
Line 51: Line 61:
на demo <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Request header field is missing ':' separator.<br />
<pre>
Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12</pre>
</p>
</body></html>
}}}
Соединение проходит, пакеты идут в обе стороны.

Попробуем соединиться с linux.org.ru с клиентской машины localhost, использующей demo в качестве маршрутизатора:
Line 55: Line 79:
всё работает.

на localhost
{{(
# cal | netcat linux.org.ru 80
}}}
не работает.

на demo
Соединение не проходит, и в syslog на demo появляется запись:
Line 65: Line 81:
# tail /var/log/syslog/messages # tail -2 /var/log/syslog/messages
Jul 8 19:19:13 demo kernel: IN=eth1 OUT=eth0 SRC=172.16.0.2 DST=217.76.32.61 LEN=52 TOS=0x00 PREC=0x00 TTL=63 ID=16897 DF PROTO=TCP SPT=1395 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Jul 8 19:19:16 demo kernel: IN=eth1 OUT=eth0 SRC=172.16.0.2 DST=217.76.32.61 LEN=52 TOS=0x00 PREC=0x00 TTL=63 ID=16898 DF PROTO=TCP SPT=1395 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Line 75: Line 93:
|| 0 || 1 || 1 || 1 || || 1 || MaximByshevskiKonopko, BorisTsema || || || || 90 || 1 || 1 || 1 || || 1 || MaximByshevskiKonopko, BorisTsema, MaximByshevskiKonopko || || ||

Практика использования iptables: продолжение

Выше был приведён пример полностью ручной настройки фаерволла, но писать большое количество правил неудобно, и желание полуавтоматизировать процесс вполне естественно. Существует два способа сделать это. Первый достался по наследству от дистрибутива Mandrake и позволяет записать все правила кучей в /etc/sysconfig/iptables. Теперь они будут добавляться при запуске iptables. Второй способ -- вписать нужные настройки в соответствующий подкаталог /etc/net/. Полную информацию о том, как это делать можно прочитать в /usr/share/doc/etcnet-<version>/examples/firewall-hiddenman/ifaces/default/fw/iptables/nat. Один из примеров фрагмента довольно сложной конфигурации:

# cat POSTROUTING 
snat-to 5.6.7.8 if marked as 1

Для примера настроим NAT (Network Address Translation, преобразование сетевых адресов) для второй машины, подключенной к интерфейсу eth1 и заблокируем для неё соединения с некоторым адресом. Настройки интерфейса eth0 на второй машине и соединённого с ним eth1 на первой не приводятся по причине рассмотренности ранее (Автоматическая настройка сетевых подключений). Для того, чтобы серверная машина смогла маршрутизировать пакеты необходимо включить в /etc/net/sysctl.conf опцию net.ipv4.ip_forward:

# grep forward sysctl.conf 
# IPv4 packet forwarding.
net.ipv4.ip_forward = 0
# sed -i '/net.ipv4.ip_forward = 0/s/0/1/' sysctl.conf 
# grep forward sysctl.conf 
# IPv4 packet forwarding.
net.ipv4.ip_forward = 1

Создадим каталог fw/iptables/nat в /etc/net/ifaces/eth0:

# cd /etc/net/ifaces/eth0
# mkdir -p fw/iptables/nat
# cd fw/iptables/nat
# echo 'snat-to 10.0.2.15' > POSTROUTING

Существует проблема управления iptables в etc-net, связанная с различными форматами синтаксиса. В файле документации /etc/net/ifaces/default/fw/iptables/syntax описано их взаимооднозначное соответствие. В связи с этим правильно заменить ip-адрес на ${IPV4ADDRESS}:

# echo '-o ${NAME} -j SNAT --to-source ${IPV4ADDRESS}' > POSTROUTING

Таким образом мы совершили настройку iptables через /etc/net. То есть, при выполнении service network restart соответствующие правила будут применены. При этом iptables может быть выключен по умолчанию (например, в версии дистрибутива Lite), в таком случае редактирование /etc/net не приведёт к его работе -- фаерволл следует сначала включить.

Для примера запретим для второй машины соединения с адресом linux.org.ru. Добавим правило (таблица filter уже используется по умолчанию, но мы это традиционно укажем явно)

iptables -t filter -A FORWARD -d linux.org.ru -j LOG --log-level warning
iptables -t filter -A FORWARD -d linux.org.ru -j DROP

Первой строчкой мы добавили в syslog предупреждение о попытке посещения неким пользователем указанного сайта, а второй оборвали связь. Для сохранения этих настроек будет достаточно добавить аргументы команды iptables в файл FORWARD в рассмотренном выше каталоге /etc/net/ifaces/eth0/fw/iptables/nat.

Обратите внимание, что мы написали правила для перенаправляемых (проходящих "сквозь" маршрутизатор) пакетов, следовательно к пакетам, отправленным с маршрутизатора, эти правила не будут применяться. Проверим, что получилось.

На demo (серверной машине) попробуем соединиться с 80 портом (послав туда некие данные, в нашем примере --- текст календаря за этот месяц, выводимый командой cal):

# cal | netcat linux.org.ru 80
HTTP/1.1 400 Bad Request
Date: Tue, 08 Jul 2008 15:19:53 GMT
Server: Apache/2.2.8 (Fedora)
Content-Length: 352
Connection: close
Content-Type: text/html; charset=iso-8859-1

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>400 Bad Request</title>
</head><body>
<h1>Bad Request</h1>
<p>Your browser sent a request that this server could not understand.<br />
Request header field is missing ':' separator.<br />
<pre>
Su Mo Tu We Th Fr Sa       1  2  3  4  5 6  7  8  9 10 11 12</pre>
</p>
</body></html>

Соединение проходит, пакеты идут в обе стороны.

Попробуем соединиться с linux.org.ru с клиентской машины localhost, использующей demo в качестве маршрутизатора:

# cal | netcat linux.org.ru 80

Соединение не проходит, и в syslog на demo появляется запись:

# tail -2 /var/log/syslog/messages
Jul  8 19:19:13 demo kernel: IN=eth1 OUT=eth0 SRC=172.16.0.2 DST=217.76.32.61 LEN=52 TOS=0x00 PREC=0x00 TTL=63 ID=16897 DF PROTO=TCP SPT=1395 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0 
Jul  8 19:19:16 demo kernel: IN=eth1 OUT=eth0 SRC=172.16.0.2 DST=217.76.32.61 LEN=52 TOS=0x00 PREC=0x00 TTL=63 ID=16898 DF PROTO=TCP SPT=1395 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0


Сведения о ресурсах

Готовность (%)

Продолжительность (ак. ч.)

Подготовка (календ. ч.)

Полный текст (раб. д.)

Предварительные знания

Level

Maintainer

Start date

End date

90

1

1

1

1

MaximByshevskiKonopko, BorisTsema, MaximByshevskiKonopko


CategoryLectures CategoryPspo CategoryMpgu CategoryUneex

PspoClasses/080708/03IptablesPractice (last edited 2008-10-09 18:33:04 by MaximByshevskiKonopko)