Видео ролики бесплатно онлайн

Смотреть подборки видео

Официальный сайт synclub 24/7/365

Смотреть видео бесплатно

ite 24.09.2010 19:45

НовичкуОсновы работы в iptables

Основы работы с iptables.

Думаю многие администраторы Linux сталкивались хотя бы раз с такой утилитой как iptables, не важно что это было: ограничение доступа извне, порт-форвардинг или маскарад. Но найдя руководство для конкретной задачи были разочарованы, примеры просто не работали. В этой статье я попробую рассказать суть работы этой утилиты и основы для ее успешного применения.

Введение.
Все пакеты приходящие на сетевую карту проходят все 5(7) уровней модели OSI, iptables начинает обработку пакетов с 3-го(сетевого) уровня, после того как пакет по кабелю попал на сетевую карту, он передается в ядро ОС, а именно в netfilter, далее пакет проходит ряд таблиц и только после этого попадает в приложение(или не попадает, если пакет шел транзитом), которому он был адресован. Именно таблицами и правилами netfilter`а управляет утилита iptables.

Таблицы и цепочки.
В iptables существуют 3 таблицы:

filter - Используется для фильтрации входящего, транзитного и исходящего трафика, имеет 3 цепочки
INPUT - сюда попадает все входящие пакеты
FORWARD - сюда попадают пакеты предназначенные другой машине в сети
OUTPUT - все исходящие пакеты
Над пакетамми проходящими в таблице filter можно делать следующие действия:
DROP - блокировать пакет
ACCEPT - разрешить(пропустить далее) пакет.
Это таблица используется по умолчанию.

nat - Используется для трансляции сетевых адресов(NAT)
PREROUTING - используется для DNAT(трансляция адреса назначения)
POSTROUTING - тут происходит SNAT(Изменение Сетевого Адреса Отправителя)
OUTPUT - Все исходящие из этой цепочки пакеты
Действия, используемые в этой цепочке:
DNAT - как уже упоминалось, используется для трансляции адреса назначения, использую это действие, мы можем пробросить порт, либо целую машину в другую сеть.
SNAT - изменяет исходные адреса пакетов, используется для того, чтобы машины в локальной сети имели доступ в интернет(в случае если наш компьютер - роутер)
MASQUERADE - по сути тоже самое, что и SNAT, только считается что больше нагружает систему. Если у вас выделенный ip - динамический, то нужно использовать именно его, если не хотите каждый раз переписывать правила SNAT.

mangle - Таблица для изменения заголовков пакетов. Имеет цепочки: PREROUTING, FORWARD, OUTPUT, POSTROUTING. У всех цепочек роль одна - вносить изменения в заголовок пакета на различных стадиях движения этого пакета через цепочки iptables. Над этими пакетами можно проводить действия TOS, TTL, MARK.

С точки зрения iptables трафик бывает 3х типов:
Входящий
Транзитный
Исходящий
Движение пакета происходит в следующей последовательности:
=iptables
После прохождения nat(PREROUTING), основываясь на записях в mangle(PREROUTING) и nat(PREROUTING), ядро принимает решение какой будет трафик, входящим или транзитным. Если трафик оказался транзитным, то идем в цепочку mangle(FORWARD),
если входящим, то в mangle(INPUT).
1. Входящий трафик - данные, которые принимает приложение запущенное на компьютере
2. Исходящий трафик - трафик, который передает приложение через сеть
3. Транзитный трафик - трафик, который проходит через наш компьютер другим(в случае если наш компьютер работает как маршрутизатор)

Работа с iptables.
Теперь после того, как мы имеем представление как течет через нас трафик, мы можем что-нибудь с ним сделать.

Основные ключи iptables:
-t (--table) <таблица> - правило указывает таблицу, в которую будут вноситься изменения, без указания этого ключа используется таблица filter
-A (--append) <цепочка> - добавление новой записи в конец цепочки
-D (--delete) <цепочка> - удаление правила
-I (--insert) <цепочка> <номер> - вставляет правило над цепочкой с указанным номером
-R (--replace) <цепочка> <номер> - заменяет определенные критерии цепочки с номером <номер>
-L (--list) <цепочка> - листинг правил цепочки
-F (--flush) <цепочка> - удаление всех правил из цепочки
-P (--policy) <цепочка> - задать действие по умолчанию, действие будет выполняться на все пакеты, которые не подошли по каким-либо параметрам в другие правила.

Ключи классификации и выделения пакетов
-p (--protocol) - используется для указания конкретного протокола для обработки, список всех протоколов можно посмотреть в /etc/protocols/
-s(--src, --source) - адрес исходящих пакетов для фильтрации.
-d (--dst, --destination) - адрес назначения пакетов для фильтрации.
-i (--in-interface) - интерфейс с которого приходит пакет
-o (--out-interface) - интерфейс на который уходит пакет
--sport (--source-port) (может использоваться с ключами -p tcp и -p udp) - порт с которого был отправлен пакет
--dport (--destination-port) (может использоваться с ключами -p tcp и -p udp) - порт на который отправляется пакет
Так же есть ключ, который указывается, когда мы работаем с протоколом icmp (-p icmp):
--icmp-type <тип icmp пакета> - указывается над каким конкретно типом ICMP пакета проводить операцию. Типы ICMP описаны в RFC 792.
На всех ключах классификации возможно применения специального символа !, который буквально означает “кроме”, например:
правило
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#EXTINF:0 tvg-name="Первый",Первый
#EXTVLCOPT:deinterlace=-1
#EXTVLCOPT:deinterlace-mode=yadif2x
#EXTVLCOPT:udp-caching=2000
rtp://@235.1.5.1:5678

#EXTINF:0 tvg-name="Первый HD",Первый HD
###EXTVLCOPT:deinterlace=-1
###EXTVLCOPT:deinterlace-mode=yadif2x
###EXTVLCOPT:udp-caching=2000
rtp://@235.1.5.73:5678

#EXTINF:0 tvg-name="Россия 1",Спорт 1
#EXTVLCOPT:deinterlace=-1
#EXTVLCOPT:deinterlace-mode=yadif2x
#EXTVLCOPT:udp-caching=2000
rtp://@235.1.5.2:5678


указывает, что все пакеты поступающие с IP-адреса 192.168.1.7 на 80 TCP порт(обычно веб-сервер) необходимо блокировать. А правило:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/bin/bash

PLAYLISTURL="http://DOMAIN/stb_channels.m3u"
PLAYLIST="ch.m3u"

TVGUIDEURL="http://DOMAIN/xmltv.xml"
TVGUIDE="TVGUIDE"

OUT_FILE="channels_processed"

PRE_FILTER="EXTINF|rtp:|udp:"
NAME_FILT="tvg-name"
MLTST_FILT="rtp:|udp:"

let name=0
let mltcst=0
let HD=0
let tvgid=0
cat /dev/null > $OUT_FILE
cat /dev/null > $TVGUIDE

let number=1

wget $PLAYLISTURL -O $PLAYLIST
wget $TVGUIDEURL -O- | egrep -v 'generator-info-url|DOCTYPE' | grep -n1 'channel id' | cut -d '=' -f2 | egrep -v 'channel|--' | sed 's/[ru>"]//g' | cut -d '<' -f1 | sed 's/\r//g' | sed '$!N;s/\n/ /' > $TVGUIDE

while read line
do
i=`echo $line | egrep $PRE_FILTER`
if [ ! -z "$i" ]; then
flag=`echo $line | egrep $NAME_FILT`
if [ ! -z "$flag" ]; then
NAME=`echo $line | awk -F, '{print $2}' | sed 's/"//g' | sed 's/,/_/g'`
flag=`echo $NAME | egrep HD`
if [ ! -z "$flag" ]; then
let HD=1
fi
failname="`echo $NAME|sed 's/r//g'`"
flag=`cat $TVGUIDE | egrep -i "$NAME|$failname"| awk '{print length, $0}' | sort -n | awk '{$1=""; print $0 }' | head -1`
if [ ! -z "$flag" ]; then
let tvgid=`echo $flag|cut -d ' ' -f1`
fi
let name=1
fi
if [ $name -ne 0 ]; then
flag=`echo $line | egrep "$MLTST_FILT"`
if [ ! -z "$flag" ]; then
MLTCST=`echo $i`
let mltcst=1
fi
fi
if [ $mltcst -ne 0 ]; then

NAME=`echo "$NAME" | sed 's/ /_/g'`
echo $number $NAME $MLTCST $HD $tvgid >> $OUT_FILE
let name=0
let mltcst=0
let HD=0
let tvgid=0
let number++
fi
fi

done < $PLAYLIST


указывает, что все пакеты поступающие с IP-адреса 192.168.1.7 кроме 80 TCP порта необходимо блокировать.

Строим свои правила iptables.

С теорией покончено, переходим к практике. Попробуем настроить фаерволл(цепочка filter) Первым делом, когда вы настраиваете фаервол с нуля, необходимо убедиться, что все правила пусты, сделать это можно командой:
iptables -L
Если картина примерно следующая, то можно приступать к написанию своих правил фильтрации:
1
2
3
4
5
6
7
1 Первый rtp://@235.1.5.1:5678 0 300125
2 Первый_HD rtp://@235.1.5.73:5678 1 300125
3 Спорт_1 rtp://@235.1.5.2:5678 0 940
4 Спорт_2 rtp://@235.1.5.4:5678 0 1354
5 Россия_К rtp://@235.1.5.5:5678 0 5
6 Россия_24 rtp://@235.1.5.6:5678 0 676
7 Россия_HD rtp://@235.1.5.72:5678 1 300124



Если в какой-то из цепочек присутствуют правило, удалим их по одной или воспользуемся ключом -F и очистим цепочку полностью
пример:
  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/bin/bash

CONFIG="/var/www/stalker_portal/server/config.ini"

MHOST_FILTER="mysql_host"
MPASS_FILTER="mysql_pass"
MUSER_FILETER="mysql_user"
MDB_FILTER="db_name"

PLAYLIST_TABLE="itv"
CHANNEL_TABLE="ch_links"
EPG_TABLE="epg"

TMP_FILE=/tmp/.playlist_update.tmp

CUTTED_PLAYLIST="channels_processed"

ENCODING="utf8"

UPDATE_EPG_STRING="sh /var/www/stalker_portal/server/tasks/update_epg.sh force"

echo '' > $TMP_FILE

mhost="`cat $CONFIG | grep -v ';' | grep $MHOST_FILTER | cut -d '=' -f2 | cut -d ' ' -f2 | sed 's/\r//g'`"
mpass="`cat $CONFIG | grep -v ';' | grep $MPASS_FILTER | cut -d '=' -f2 | cut -d ' ' -f2 | sed 's/\r//g'`"
muser="`cat $CONFIG | grep -v ';' | grep $MUSER_FILETER | cut -d '=' -f2 | cut -d ' ' -f2 | sed 's/\r//g'`"
mdb="`cat $CONFIG | grep -v ';' | grep $MDB_FILTER | cut -d '=' -f2 | cut -d ' ' -f2 | sed 's/\r//g'`"

#UPDATE MAIN CHANNEL_LIST

if [ "$1" == "force" ]; then
read -p 'It will reset playlist. Really? (YES, no) ' answer
if [ "$answer" == "YES" ]; then
echo "Okaaay... :( 10 seconds for press Ctrl+C"
sleep 10
echo "DELETE FROM $PLAYLIST_TABLE; ALTER TABLE $PLAYLIST_TABLE AUTO_INCREMENT=0;" | mysql -h "$mhost" -u $muser --password="$mpass" $mdb
else
exit 1
fi
fi

while read line
do

set -- $line

num=$1
name="`echo $2 | sed 's/_/ /g'`"
url_raw="`echo $3 | sed 's/@//g'`"
url="rtp $url_raw"
isHD="$4"
let tvgid="$5" 2>/dev/null

if [ $tvgid -eq 0 ]; then
tvgid=''
fi

db_request=`echo "SELECT id, cmd, xmltv_id FROM $PLAYLIST_TABLE WHERE number=$num" | mysql -h "$mhost" -u $muser --password="$mpass" $mdb --disable-column-names`

url_db="`echo $db_request | awk '{print $2 " " $3}'`"
id_db="`echo $db_request | awk '{print $1}'`"
tvgid_db="`echo $db_request | awk '{print $4}'`"
if [ -z "$db_request" ]; then
sql="`echo "SET NAMES '$ENCODING'; INSERT INTO $PLAYLIST_TABLE (name, number, censored, cmd, descr, cost, count, status, tv_genre_id, base_ch, hd, xmltv_id, service_id, bonus_ch, volume_correction, use_http_tmp_link, mc_cmd, enable_tv_archive, wowza_tmp_link, wowza_dvr, monitoring_status, monitoring_status_updated, enable_monitoring, monitoring_url, enable_wowza_load_balancing, cmd_1, cmd_2, cmd_3, logo, correct_time, allow_pvr, allow_local_pvr) VALUES ('$name', $num, 0, '$url', '', 0, 0, 1, 2, 1, $isHD, '$tvgid', '', 0, 0, 0, '$url_raw', 0, 0, 0, 1, NULL, 0, '', 0, '', '', '', '', 0, 0, 1);"`"
elif [ ! "$url_db" == "$url" ]; then
if [ ! "$tvgid_db" == "" ]; then
sql="`echo "SET NAMES '$ENCODING'; UPDATE $PLAYLIST_TABLE SET name='$name', number=$num, cmd='$url', mc_cmd='$url_raw' WHERE id=$id_db;"`"
else
sql="`echo "SET NAMES '$ENCODING'; UPDATE $PLAYLIST_TABLE SET name='$name', number=$num, cmd='$url', mc_cmd='$url_raw', xmltv_id='$tvgid' WHERE id=$id_db;"`"
fi
elif [ "$url_db" == "$url" ]; then
if [ ! "$tvgid_db" == "$tvgid" ]; then
sql="`echo "SET NAMES '$ENCODING'; UPDATE $PLAYLIST_TABLE SET name='$name', number=$num WHERE id=$id_db;"`"
else
sql="`echo "SET NAMES '$ENCODING'; UPDATE $PLAYLIST_TABLE SET name='$name', number=$num, xmltv_id='$tvgid' WHERE id=$id_db;"`"
fi
fi

echo $sql | mysql -h "$mhost" -u $muser --password="$mpass" $mdb --disable-column-names

done < $CUTTED_PLAYLIST

#UPDATE ch_links table:
echo "SELECT id, cmd, status, use_http_tmp_link, wowza_tmp_link, monitoring_url, enable_monitoring FROM $PLAYLIST_TABLE;" | mysql -h "$mhost" -u $muser --password="$mpass" $mdb --disable-column-names | sed 's/\t/ /g' > $TMP_FILE

echo "DELETE FROM $CHANNEL_TABLE; ALTER TABLE $CHANNEL_TABLE AUTO_INCREMENT=0;" | mysql -h "$mhost" -u $muser --password="$mpass" $mdb
echo "DELETE FROM $EPG_TABLE; ALTER TABLE $EPG_TABLE AUTO_INCREMENT=0;" | mysql -h "$mhost" -u $muser --password="$mpass" $mdb
while read line
do

set -- $line

itv_ud=$1
itv_url="$2 $3"
itv_sitatus=$4
itv_use_http_tmp_link=$5
itv_wowza_tmp_link=$6
itv_monitoring_url=$7
itv_enable_monitoring=$8

#echo "INSERT INTO $CHANNEL_TABLE (ch_id, priority, url, status, use_http_tmp_link, wowza_tmp_link, user_agent_filter, monitoring_url, use_load_balancing, changed, enable_monitoring) VALUES ($itv_ud, 0, $itv_url, $itv_sitatus, $itv_use_http_tmp_link, $itv_wowza_tmp_link, 0, '$itv_monitoring_url', 0, $itv_enable_monitoring)
echo "INSERT INTO $CHANNEL_TABLE (ch_id, priority, url, status, use_http_tmp_link, wowza_tmp_link, user_agent_filter, monitoring_url, use_load_balancing, enable_monitoring) VALUES ($itv_ud, 0, '$itv_url', $itv_sitatus, $itv_use_http_tmp_link, $itv_wowza_tmp_link, 0, '$itv_monitoring_url', 0, '$itv_enable_monitoring');" | mysql -h "$mhost" -u $muser --password="$mpass" $mdb

done < $TMP_FILE

$UPDATE_EPG_STRING > /dev/null



Теперь правила пусты, но прежде чем писать новые необходимо установить политики, как уже было написано, политики это правила, которые обрабатывают пакет неподходящие не под одно из описанных правил в таблицах.

Какой действие(ACCEPT или DROP) должно выполнятся над этими пакетами решать вам, однако хочу предостеречь, если вы настраиваете фаерволл удаленно по ssh, то прежде чем поставить политику DROP на цепочку INPUT, напишите правило, разрешающие соединения к 22 порту TCP:
  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/bin/bash

if [ -z "$1" ]; then
echo "Need STB IP adress, and tv system."
echo "TV system is NTSC (super SD), PAL (SD), or HD (yep, it's 1080p). HD is default."
exit 1
fi

LOGDIR="/tmp/stb_deploy_log"
LOGDATE=`date +%d-%m-%G`
STBLOGSTRING="fw_printenv kernel Image_Version Image_Desc serial# Boot_Version ethaddr"

if [ ! -e $LOGDIR -o ! -d $LOGDIR ]; then
echo "Cannot locate $LOGDIR"
echo "Create $LOGDIR or change LOGDIR env"
exit 2
fi

DEPLOYDIR="/home/nazarovd/Dropbox/Scripts/MAG245deploy"
IMGDIR="img"
SCRIPTDIR="bin"
KEYDIR="key"
CONFDIR="conf"

STBTMPDIR="/tmp/"
STBSPLACHSCREENDIR="/home/default/"
STBSPLACHSCREENPREFIX="splash-"

BOOTLOGO="IPH-bootlogo.bmp.gz"
BOOTLOGOSETSCRIPT="update_logo.sh"

SSHKEYFILE="authorized_keys"
SSHCONFIG="sshd_config"
STBSSHCONFPATH="/etc/openssh/"
STBAUTH_KEYSPATH="/root/.ssh/"

DEFAULTPORTAL="URL"
NTPSERVER="192.168.0.3"
DEFAULTTIMEZONE="/usr/share/zoneinfo/Europe/Moscow"
BGCOLOR="0x00ffffff"
FGCOLOR="0x00000000"

STBSETENVSTRING="fw_setenv net dhcp '|' portal1 $DEFAULTPORTAL '|' ntpurl $NTPSERVER '|' language ru '|' timezone_conf_int plus_02_00_13 '|' logo_x 0 '|' logo_y 0 '|' bg_color $BGCOLOR '|' fg_color $FGCOLOR '|' graphicres tvsystem_res '|' bootupgrade no"

if [ -z "$2" ]; then
TVSYSSTRING="fw_setenv tvsystem 1080p-60"
else
case $2 in
"pal")
TVSYSSTRING="fw_setenv tvsystem PAL"
;;
"NTSC")
TVSYSSTRING="fw_setenv tvsystem NTSC"
;;
"hd")
TVSYSSTRING="fw_setenv tvsystem 1080i-60"
;;
esac
fi

STBIP=$1
STBLOGIN=root

echo 'Standart password: 930920'
ssh-copy-id $STBLOGIN@$STBIP

#Copy stuff:
#Boot-logo
scp $DEPLOYDIR/$IMGDIR/$BOOTLOGO $STBLOGIN@$STBIP:$STBTMPDIR
scp $DEPLOYDIR/$SCRIPTDIR/$BOOTLOGOSETSCRIPT $STBLOGIN@$STBIP:$STBTMPDIR
ssh $STBLOGIN@$STBIP "chmod +x $STBTMPDIR$BOOTLOGOSETSCRIPT"
#Splash-screen
scp $DEPLOYDIR/$IMGDIR/$STBSPLACHSCREENPREFIX* $STBLOGIN@$STBIP:$STBSPLACHSCREENDIR
#END Stuff

#SETUP:
#bootlogo:
ssh $STBLOGIN@$STBIP "$STBTMPDIR$BOOTLOGOSETSCRIPT $STBTMPDIR$BOOTLOGO"

#Timezone:
ssh $STBLOGIN@$STBIP "rm -f /etc/localtime"
ssh $STBLOGIN@$STBIP "ln -sf $DEFAULTTIMEZONE /etc/localtime"


#Set env:
#Tvsystem:
ssh $STBLOGIN@$STBIP "$TVSYSSTRING"
#Different:
ssh $STBLOGIN@$STBIP "$STBSETENVSTRING"

#ssh
scp $CONFDIR/$SSHCONFIG $STBLOGIN@$STBIP:$STBSSHCONFPATH
scp $KEYDIR/$SSHKEYFILE $STBLOGIN@$STBIP:$STBAUTH_KEYSPATH

LOGFILE="`ssh $STBLOGIN@$STBIP "fw_printenv ethaddr" | cut -d '=' -f 2 | sed 's/:/_/g'`"

#Write log:
touch $LOGDIR/$LOGFILE
echo "" >> $LOGDIR/$LOGFILE
echo "------------------------------------------------" >> $LOGDIR/$LOGFILE
echo $LOGDATE >> $LOGDIR/$LOGFILE
echo "------------------------------------------------" >> $LOGDIR/$LOGFILE
ssh $STBLOGIN@$STBIP "$STBLOGSTRING" >> $LOGDIR/$LOGFILE
echo "------------------------------------------------" >> $LOGDIR/$LOGFILE
echo "" >> $LOGDIR/$LOGFILE

#reboot
ssh $STBLOGIN@$STBIP "reboot"
#END SETUP


После чего можно смело применять политику DROP на цепочку INPUT:
 1
2
3
4
5
6
7
8
9
10
1 Первый канал
2 Россия 1
3 ТВЦ
4 НТВ
5 Россия Культура
235 Россия 2 (Спорт)
101 ТНТ
102 Домашний
103 РЕН ТВ
104 СТС


После наших манипуляций, цепочка INPUT должна выглядеть следующим образом:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#EXTINF:0 tvg-name="Первый",Первый
#EXTVLCOPT:deinterlace=-1
#EXTVLCOPT:deinterlace-mode=yadif2x
#EXTVLCOPT:udp-caching=2000
rtp://@235.1.5.1:5678

#EXTINF:0 tvg-name="Первый HD",Первый HD
###EXTVLCOPT:deinterlace=-1
###EXTVLCOPT:deinterlace-mode=yadif2x
###EXTVLCOPT:udp-caching=2000
rtp://@235.1.5.73:5678

#EXTINF:0 tvg-name="Россия 1",Спорт 1
#EXTVLCOPT:deinterlace=-1
#EXTVLCOPT:deinterlace-mode=yadif2x
#EXTVLCOPT:udp-caching=2000
rtp://@235.1.5.2:5678



Допустим мы имеем сеть 192.168.1.0/24, внешний ip-адрес: 65.25.2.83. Причем локальная сеть подключена к интерфейсу eth0, а интернет к eth1.
Теперь поставим задачу нашему фаерволлу: Максимальная безопасность(политику DROP мы уже поставили), доступ к Веб-серверу могут иметь только IP-адрес 192.168.1.170, доступ к IMAP могут иметь все, однако доступ к smtp-серверу разрешить только локальным пользователям(сеть 192.168.1.0/24).
Незабываем, что цепочка INPUT равно обрабатывает все интерфейсы, если конкретный не указан в параметре -i.
Для доступа к веб-серверу напишем следующие правило:
 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#!/bin/bash

PLAYLISTURL="http://DOMAIN/stb_channels.m3u"
PLAYLIST="ch.m3u"

TVGUIDEURL="http://DOMAIN/xmltv.xml"
TVGUIDE="TVGUIDE"

OUT_FILE="channels_processed"

PRE_FILTER="EXTINF|rtp:|udp:"
NAME_FILT="tvg-name"
MLTST_FILT="rtp:|udp:"

let name=0
let mltcst=0
let HD=0
let tvgid=0
cat /dev/null > $OUT_FILE
cat /dev/null > $TVGUIDE

let number=1

wget $PLAYLISTURL -O $PLAYLIST
wget $TVGUIDEURL -O- | egrep -v 'generator-info-url|DOCTYPE' | grep -n1 'channel id' | cut -d '=' -f2 | egrep -v 'channel|--' | sed 's/[ru>"]//g' | cut -d '<' -f1 | sed 's/\r//g' | sed '$!N;s/\n/ /' > $TVGUIDE

while read line
do
i=`echo $line | egrep $PRE_FILTER`
if [ ! -z "$i" ]; then
flag=`echo $line | egrep $NAME_FILT`
if [ ! -z "$flag" ]; then
NAME=`echo $line | awk -F, '{print $2}' | sed 's/"//g' | sed 's/,/_/g'`
flag=`echo $NAME | egrep HD`
if [ ! -z "$flag" ]; then
let HD=1
fi
failname="`echo $NAME|sed 's/r//g'`"
flag=`cat $TVGUIDE | egrep -i "$NAME|$failname"| awk '{print length, $0}' | sort -n | awk '{$1=""; print $0 }' | head -1`
if [ ! -z "$flag" ]; then
let tvgid=`echo $flag|cut -d ' ' -f1`
fi
let name=1
fi
if [ $name -ne 0 ]; then
flag=`echo $line | egrep "$MLTST_FILT"`
if [ ! -z "$flag" ]; then
MLTCST=`echo $i`
let mltcst=1
fi
fi
if [ $mltcst -ne 0 ]; then

NAME=`echo "$NAME" | sed 's/ /_/g'`
echo $number $NAME $MLTCST $HD $tvgid >> $OUT_FILE
let name=0
let mltcst=0
let HD=0
let tvgid=0
let number++
fi
fi

done < $PLAYLIST


Сервер IMAP работает на 143 TCP-порту, следовательно правило будет выглядеть следующим образом:
1
2
3
4
5
6
7
1 Первый rtp://@235.1.5.1:5678 0 300125
2 Первый_HD rtp://@235.1.5.73:5678 1 300125
3 Спорт_1 rtp://@235.1.5.2:5678 0 940
4 Спорт_2 rtp://@235.1.5.4:5678 0 1354
5 Россия_К rtp://@235.1.5.5:5678 0 5
6 Россия_24 rtp://@235.1.5.6:5678 0 676
7 Россия_HD rtp://@235.1.5.72:5678 1 300124


Правило для обработки SMTP входящх пакетов выглядит так:
  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/bin/bash

CONFIG="/var/www/stalker_portal/server/config.ini"

MHOST_FILTER="mysql_host"
MPASS_FILTER="mysql_pass"
MUSER_FILETER="mysql_user"
MDB_FILTER="db_name"

PLAYLIST_TABLE="itv"
CHANNEL_TABLE="ch_links"
EPG_TABLE="epg"

TMP_FILE=/tmp/.playlist_update.tmp

CUTTED_PLAYLIST="channels_processed"

ENCODING="utf8"

UPDATE_EPG_STRING="sh /var/www/stalker_portal/server/tasks/update_epg.sh force"

echo '' > $TMP_FILE

mhost="`cat $CONFIG | grep -v ';' | grep $MHOST_FILTER | cut -d '=' -f2 | cut -d ' ' -f2 | sed 's/\r//g'`"
mpass="`cat $CONFIG | grep -v ';' | grep $MPASS_FILTER | cut -d '=' -f2 | cut -d ' ' -f2 | sed 's/\r//g'`"
muser="`cat $CONFIG | grep -v ';' | grep $MUSER_FILETER | cut -d '=' -f2 | cut -d ' ' -f2 | sed 's/\r//g'`"
mdb="`cat $CONFIG | grep -v ';' | grep $MDB_FILTER | cut -d '=' -f2 | cut -d ' ' -f2 | sed 's/\r//g'`"

#UPDATE MAIN CHANNEL_LIST

if [ "$1" == "force" ]; then
read -p 'It will reset playlist. Really? (YES, no) ' answer
if [ "$answer" == "YES" ]; then
echo "Okaaay... :( 10 seconds for press Ctrl+C"
sleep 10
echo "DELETE FROM $PLAYLIST_TABLE; ALTER TABLE $PLAYLIST_TABLE AUTO_INCREMENT=0;" | mysql -h "$mhost" -u $muser --password="$mpass" $mdb
else
exit 1
fi
fi

while read line
do

set -- $line

num=$1
name="`echo $2 | sed 's/_/ /g'`"
url_raw="`echo $3 | sed 's/@//g'`"
url="rtp $url_raw"
isHD="$4"
let tvgid="$5" 2>/dev/null

if [ $tvgid -eq 0 ]; then
tvgid=''
fi

db_request=`echo "SELECT id, cmd, xmltv_id FROM $PLAYLIST_TABLE WHERE number=$num" | mysql -h "$mhost" -u $muser --password="$mpass" $mdb --disable-column-names`

url_db="`echo $db_request | awk '{print $2 " " $3}'`"
id_db="`echo $db_request | awk '{print $1}'`"
tvgid_db="`echo $db_request | awk '{print $4}'`"
if [ -z "$db_request" ]; then
sql="`echo "SET NAMES '$ENCODING'; INSERT INTO $PLAYLIST_TABLE (name, number, censored, cmd, descr, cost, count, status, tv_genre_id, base_ch, hd, xmltv_id, service_id, bonus_ch, volume_correction, use_http_tmp_link, mc_cmd, enable_tv_archive, wowza_tmp_link, wowza_dvr, monitoring_status, monitoring_status_updated, enable_monitoring, monitoring_url, enable_wowza_load_balancing, cmd_1, cmd_2, cmd_3, logo, correct_time, allow_pvr, allow_local_pvr) VALUES ('$name', $num, 0, '$url', '', 0, 0, 1, 2, 1, $isHD, '$tvgid', '', 0, 0, 0, '$url_raw', 0, 0, 0, 1, NULL, 0, '', 0, '', '', '', '', 0, 0, 1);"`"
elif [ ! "$url_db" == "$url" ]; then
if [ ! "$tvgid_db" == "" ]; then
sql="`echo "SET NAMES '$ENCODING'; UPDATE $PLAYLIST_TABLE SET name='$name', number=$num, cmd='$url', mc_cmd='$url_raw' WHERE id=$id_db;"`"
else
sql="`echo "SET NAMES '$ENCODING'; UPDATE $PLAYLIST_TABLE SET name='$name', number=$num, cmd='$url', mc_cmd='$url_raw', xmltv_id='$tvgid' WHERE id=$id_db;"`"
fi
elif [ "$url_db" == "$url" ]; then
if [ ! "$tvgid_db" == "$tvgid" ]; then
sql="`echo "SET NAMES '$ENCODING'; UPDATE $PLAYLIST_TABLE SET name='$name', number=$num WHERE id=$id_db;"`"
else
sql="`echo "SET NAMES '$ENCODING'; UPDATE $PLAYLIST_TABLE SET name='$name', number=$num, xmltv_id='$tvgid' WHERE id=$id_db;"`"
fi
fi

echo $sql | mysql -h "$mhost" -u $muser --password="$mpass" $mdb --disable-column-names

done < $CUTTED_PLAYLIST

#UPDATE ch_links table:
echo "SELECT id, cmd, status, use_http_tmp_link, wowza_tmp_link, monitoring_url, enable_monitoring FROM $PLAYLIST_TABLE;" | mysql -h "$mhost" -u $muser --password="$mpass" $mdb --disable-column-names | sed 's/\t/ /g' > $TMP_FILE

echo "DELETE FROM $CHANNEL_TABLE; ALTER TABLE $CHANNEL_TABLE AUTO_INCREMENT=0;" | mysql -h "$mhost" -u $muser --password="$mpass" $mdb
echo "DELETE FROM $EPG_TABLE; ALTER TABLE $EPG_TABLE AUTO_INCREMENT=0;" | mysql -h "$mhost" -u $muser --password="$mpass" $mdb
while read line
do

set -- $line

itv_ud=$1
itv_url="$2 $3"
itv_sitatus=$4
itv_use_http_tmp_link=$5
itv_wowza_tmp_link=$6
itv_monitoring_url=$7
itv_enable_monitoring=$8

#echo "INSERT INTO $CHANNEL_TABLE (ch_id, priority, url, status, use_http_tmp_link, wowza_tmp_link, user_agent_filter, monitoring_url, use_load_balancing, changed, enable_monitoring) VALUES ($itv_ud, 0, $itv_url, $itv_sitatus, $itv_use_http_tmp_link, $itv_wowza_tmp_link, 0, '$itv_monitoring_url', 0, $itv_enable_monitoring)
echo "INSERT INTO $CHANNEL_TABLE (ch_id, priority, url, status, use_http_tmp_link, wowza_tmp_link, user_agent_filter, monitoring_url, use_load_balancing, enable_monitoring) VALUES ($itv_ud, 0, '$itv_url', $itv_sitatus, $itv_use_http_tmp_link, $itv_wowza_tmp_link, 0, '$itv_monitoring_url', 0, '$itv_enable_monitoring');" | mysql -h "$mhost" -u $muser --password="$mpass" $mdb

done < $TMP_FILE

$UPDATE_EPG_STRING > /dev/null


С поставленной задачей мы разобрались, теперь наш входящий трафик фильтруется и сервер вполне безопасен, единственное, чего бы я поменял, это входящие соединения по SSH. Если вы не планируете заходить на ваш сервер из любой точки планеты, то я бы поменял правило следующим образом:
  1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
#!/bin/bash

if [ -z "$1" ]; then
echo "Need STB IP adress, and tv system."
echo "TV system is NTSC (super SD), PAL (SD), or HD (yep, it's 1080p). HD is default."
exit 1
fi

LOGDIR="/tmp/stb_deploy_log"
LOGDATE=`date +%d-%m-%G`
STBLOGSTRING="fw_printenv kernel Image_Version Image_Desc serial# Boot_Version ethaddr"

if [ ! -e $LOGDIR -o ! -d $LOGDIR ]; then
echo "Cannot locate $LOGDIR"
echo "Create $LOGDIR or change LOGDIR env"
exit 2
fi

DEPLOYDIR="/home/nazarovd/Dropbox/Scripts/MAG245deploy"
IMGDIR="img"
SCRIPTDIR="bin"
KEYDIR="key"
CONFDIR="conf"

STBTMPDIR="/tmp/"
STBSPLACHSCREENDIR="/home/default/"
STBSPLACHSCREENPREFIX="splash-"

BOOTLOGO="IPH-bootlogo.bmp.gz"
BOOTLOGOSETSCRIPT="update_logo.sh"

SSHKEYFILE="authorized_keys"
SSHCONFIG="sshd_config"
STBSSHCONFPATH="/etc/openssh/"
STBAUTH_KEYSPATH="/root/.ssh/"

DEFAULTPORTAL="URL"
NTPSERVER="192.168.0.3"
DEFAULTTIMEZONE="/usr/share/zoneinfo/Europe/Moscow"
BGCOLOR="0x00ffffff"
FGCOLOR="0x00000000"

STBSETENVSTRING="fw_setenv net dhcp '|' portal1 $DEFAULTPORTAL '|' ntpurl $NTPSERVER '|' language ru '|' timezone_conf_int plus_02_00_13 '|' logo_x 0 '|' logo_y 0 '|' bg_color $BGCOLOR '|' fg_color $FGCOLOR '|' graphicres tvsystem_res '|' bootupgrade no"

if [ -z "$2" ]; then
TVSYSSTRING="fw_setenv tvsystem 1080p-60"
else
case $2 in
"pal")
TVSYSSTRING="fw_setenv tvsystem PAL"
;;
"NTSC")
TVSYSSTRING="fw_setenv tvsystem NTSC"
;;
"hd")
TVSYSSTRING="fw_setenv tvsystem 1080i-60"
;;
esac
fi

STBIP=$1
STBLOGIN=root

echo 'Standart password: 930920'
ssh-copy-id $STBLOGIN@$STBIP

#Copy stuff:
#Boot-logo
scp $DEPLOYDIR/$IMGDIR/$BOOTLOGO $STBLOGIN@$STBIP:$STBTMPDIR
scp $DEPLOYDIR/$SCRIPTDIR/$BOOTLOGOSETSCRIPT $STBLOGIN@$STBIP:$STBTMPDIR
ssh $STBLOGIN@$STBIP "chmod +x $STBTMPDIR$BOOTLOGOSETSCRIPT"
#Splash-screen
scp $DEPLOYDIR/$IMGDIR/$STBSPLACHSCREENPREFIX* $STBLOGIN@$STBIP:$STBSPLACHSCREENDIR
#END Stuff

#SETUP:
#bootlogo:
ssh $STBLOGIN@$STBIP "$STBTMPDIR$BOOTLOGOSETSCRIPT $STBTMPDIR$BOOTLOGO"

#Timezone:
ssh $STBLOGIN@$STBIP "rm -f /etc/localtime"
ssh $STBLOGIN@$STBIP "ln -sf $DEFAULTTIMEZONE /etc/localtime"


#Set env:
#Tvsystem:
ssh $STBLOGIN@$STBIP "$TVSYSSTRING"
#Different:
ssh $STBLOGIN@$STBIP "$STBSETENVSTRING"

#ssh
scp $CONFDIR/$SSHCONFIG $STBLOGIN@$STBIP:$STBSSHCONFPATH
scp $KEYDIR/$SSHKEYFILE $STBLOGIN@$STBIP:$STBAUTH_KEYSPATH

LOGFILE="`ssh $STBLOGIN@$STBIP "fw_printenv ethaddr" | cut -d '=' -f 2 | sed 's/:/_/g'`"

#Write log:
touch $LOGDIR/$LOGFILE
echo "" >> $LOGDIR/$LOGFILE
echo "------------------------------------------------" >> $LOGDIR/$LOGFILE
echo $LOGDATE >> $LOGDIR/$LOGFILE
echo "------------------------------------------------" >> $LOGDIR/$LOGFILE
ssh $STBLOGIN@$STBIP "$STBLOGSTRING" >> $LOGDIR/$LOGFILE
echo "------------------------------------------------" >> $LOGDIR/$LOGFILE
echo "" >> $LOGDIR/$LOGFILE

#reboot
ssh $STBLOGIN@$STBIP "reboot"
#END SETUP


где 34.1.63.169 - ip-адрес, с которого мы собираемся заходить на сервер по SSH

Таким образом наша цепочка INPUT таблицы filter выглядит следующим образом:
1

2
3
4
5
6
7
8
debian:~# iptables -t filter -L INPUT

Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 34.1.63.169 anywhere tcp dpt:ssh
ACCEPT tcp -- 192.168.1.170 anywhere tcp dpt:www
ACCEPT tcp -- anywhere anywhere tcp dpt:imap2
ACCEPT tcp -- 192.168.1.0 anywhere tcp dpt:smtp
debian:~#



Как видим простые правила фильтрации писать очень легко имея небольшую теоретическую основу.

Поставим следующую задачу: нам необходимо организовать доступ в интернет из локальной сети по портам 80 и 110 и компьютеру с ip-адресом 192.168.1.2 по всем портам.

Первым делом установим политику по умолчанию для цепочки FORWARD в DROP:
1
iptables -P FORWARD DROP




Затем нам необходимо, чтобы пакеты проходящие через цепочку FORWARD таблицы filter фильтровались таким образом, чтобы все пользователи сети 192.168.1.0/24 имели доступ к 80 и 110 портам tcp:
1
iptables -A FORWARD -s 192.168.1.0/24 -p tcp -m multiport -dports 80,110 -i eth0 -j ACCEPT




здесь -m multiport -dports указывает, что мы будем перечислять порты через запятую, а -i eth0 что трафик будет идти из интерфейса локальной сети.
Следующее правило разрешает хождение в обратную сторону, когда клиенты локальной сети будут получать данные из интернета:
1
iptables -A FORWARD -d 192.168.1.0/24 -p tcp -m multiport --sports 80,110 -i eth1 -j ACCEPT




Теперь правила для хоста 192.168.1.2:
1

2
iptables -A FORWARD -s 192.168.1.2 -i eth0 -j ACCEPT

iptables -A FORWARD -d 192.168.1.2 -o eth1 -j ACCEPT

T

И теперь добавляем самое волшебное правило, правило маскарада в цепочку POSTROUTING таблицы nat:
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

Под конец опубликую получившиеся таблицы filter и nat:
 1

2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
debian:~# iptables -t filter -L

Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 34.1.63.169 anywhere tcp dpt:ssh
ACCEPT tcp -- 192.168.1.170 anywhere tcp dpt:www
ACCEPT tcp -- anywhere anywhere tcp dpt:imap2
ACCEPT tcp -- 192.168.1.0 anywhere tcp dpt:smtp

Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT tcp -- 192.168.1.0/24 anywhere multiport dports www,pop3
ACCEPT tcp -- anywhere 192.168.1.0/24 multiport sports www,pop3
ACCEPT all -- 192.168.1.2 anywhere
ACCEPT all -- anywhere 192.168.1.2

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
debian:~# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- anywhere anywhere

Chain OUTPUT (policy ACCEPT)
target prot opt source destination
debian:~#


.end
Теперь пользователи довольствуются интернетом, а мы заслуженной банкой пива :)
В статье конечно описаны далеко не все возможности программы iptables, пожалуй только самые “популярные”, в статье не описано как работать с состояниями пакета(NEW, RELATED, ESTABLISHED), не описана работы с таблицей mangle да и еще много всего, я оставляю изучение этого на вас, в добавок кину пару ссылок:

1. http://www.opennet.ru/docs/RUS/iptables/ - очень полезный ресурс, описания полной работы iptables
2. http://iptables.ru/ - пошаговое руководство для ленивых
3. http://posix.ru/network/iptables/ - тоже неплохое руководство

http://unix-admin.su Уcтановка и администрирование Linux, так же хорошие статьи и руководства


PS. Возмоно просить об этом глупо, но господа, которые копируют статьи на другие сайты, если не хотите указывать источник, указывайте хотя бы автора статей.
ite, [email protected]


Тэги: iptables netfilter
+ 59 -
Похожие Поделиться

Username 24.09.2010 20:06 #
+ 6 -
Спасибо
le087 24.09.2010 20:18 #
+ 2 -
я присоединяюсь
m0nhawk 24.09.2010 20:55 #
+ 1 -
Я присоединяюсь к присоединению!
Denis 24.09.2010 22:38 #
+ 0 -
Присоединяюсь к присоединению к присоединению! :P

Замечательная статья, идет на панель закладок.
Zend 24.09.2010 22:48 #
+ 0 -
Получилась цепочка :-)
FalleN 25.09.2010 01:49 #
+ 1 -
C-C-C-C-C-COMBO B-B-BREAKER!!
le087 24.09.2010 20:06 #
+ 0 -
... на меня нашло просвещение! Хороший пост.
s2h 24.09.2010 20:16 #
+ 0 -
хмм прочитал первые несколько абзацев даже все понял... надо добавить в закладки
exelens 24.09.2010 20:21 #
+ 0 -
Побольше бы таких постов и авторов.
xT 24.09.2010 20:24 #
+ 1 -
А мне больше нравится такая картинка, хотя тоже самое абсолютно:
ite 24.09.2010 20:27 #
+ 1 -
Картинка немного не верна, после прохождения filter(OUTPUT) и filter(FORWARD) не происходит выбора решения о маршрутизации. А моим прототипом была эта :) : http://www.opennet.ru/docs/RUS/iptables/misc/iptables-tutorial/images/tables_traverse.jpg
Alex2ndr 27.09.2010 11:53 #
+ 0 -
Обратите внимание на то, что ваша картинка тоже не верна( в отличии от прототипа :) ). У Вас нету Решения о маршрутизации после Локальных процессов. Исправьте пожалуйста.
greynix 24.09.2010 21:11 #
+ 1 -
Хорошая статья, большое спасибо, добавлю некоторые моменты:
1.
iptables начинает обработку пакетов с 3-го(сетевого) уровня
, но кроме того iptables может работать и фильтровать данные по заголовкам на канальном уровне (т.е. банально по MAC адресу)
2. если мы делаем политику DROP по умолчанию на все цепочки, то необходимо учитывать что тот же ssh, кроме того что он принимает пакеты и они приходят в цепочку INPUT нашего iptables, отвечает же он через цепочку OUTPUT. И если у нас закрыто OUTPUT (DROP), то даже правило iptables -A INPUT -p tcp --dport 22 -j ACCEPT нас не спасет и ssh работать не будет. В этом случае (если вы как я - параноик) в цепочку OUTPUT необходимо добавить как минимум правило iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT (в этом случае сервер будет отвечать на уже установленные соединения , но не сможет сам создавать новые подключения)
P.S.Сам просто очень часто на это натыкался, может кому нибудь поможет.
ite 25.09.2010 02:00 #
+ 1 -
да, вы правы :)
Slip 24.09.2010 23:52 #
+ 0 -
Спасибо. Реквестую больше примеров, особенно для домашнего применения.
ite 25.09.2010 01:59 #
+ 3 -
На самом деле примеров я хотел добавлять наоборот по-меньше, чтобы народ понял как и научился сам соствлять правила, примеров можно найти сотни во все интернете
dr_magnus 25.09.2010 02:08 #
+ 0 -
то ли лыжи не едут, то ли я непонятный
xT 25.09.2010 02:14 #
+ 0 -
и? в конце поста есть эта ссылка
dr_magnus 25.09.2010 02:25 #
+ 0 -
сорри. не заметил :-(
main 25.09.2010 18:30 #
+ 1 -
Плюсую даже не прочитав!

P.S> потом прочитаю :)
n7y 25.09.2010 20:07 #
+ 0 -
Много спасибо за мануал!

На всякий случай, помещу тут пример простого файерволла: http://slackwiki.org/Simple_firewall- авось кому пригодиться (хотя бы в качестве примера)
stasikos 29.09.2010 08:56 #
+ 0 -
Имхо юзать echo 1 > /proc/net/something не тру
вместо этого лучше использовать sysctl
Hellion 26.09.2010 14:30 #
+ 0 -
Спасибо за статью, ползительно :)
Alex2ndr 27.09.2010 14:01 #
+ 0 -
Я надеюсь конструктивная критика принимается :)
Может показаться, что все что я напишу - придирки к словам. Но это не так. Определения должны быть четко указаны, иначе они могут ввести в заблуждение.


Все пакеты приходящие на сетевую карту проходят все 5(7) уровней модели OSI

Это не верно. Транзитные пакеты не поднимаются выше 3-го уровня по OSI. К тому же откуда эта 5-ка? У официальной модели OSI 7 уровней. У неофициальной модели TCP/IP - 4 уровня.

iptables начинает обработку пакетов с 3-го(сетевого) уровня,

Во-первых вы ниже пишите что пакет обрабатывает ядро(точнее его модуль - netfilter) а тут почему-то iptbales. Во-вторых, как уже сказали выше - обработка начинается с ethernet фрэйма ( т е со второго уровня).

filter - Используется для фильтрации входящего, транзитного и исходящего трафика, имеет 3 цепочки

Имеет 3 стандартные цепочки. Ведь можно же свои наделать в большом кол-ве.

Это цепочка используется по умолчанию.

Во-первых - не цепочка, а таблица. Во-вторых лучше сказать так: При операциях с правилами, если таблица не указана явно, будет происходить работа в таблице filter. Ну или в таком смысле. Прошу прощения - формулировать мысли умею плохо.

mangle - Таблица для изменения заголовков пакетов.

По большому счету nat это тоже изменение адреса назначения/отправления в заголовке пакета. Поэтому здесь лучше воспользоваться определением из man iptables - mangle: This table is used for specialized packet alteration.(Эта таблица используется для специализированных изменений пакетов).


Нигде не сказано что же такое за -j. Только в примерах оно сразу начинает использоваться. Возможно стоит указать какой-нить общий порядок создания правил:
iptables <-t <b>таблица</b>> {-A|-D} <b>цепочка</b> <b>спецификация_правил</b>
где
<b>спецификация_правил</b> = <<b>условие</b>...> <<b>цель</b>>
<b>условие</b> = -m <b>имя_условия</b> <<b>опции_условия</b>>
<b>цель</b> = -j <b>имя_цели</b> <<b>опции_цели</b>>

Взял опять же из man iptables

Кроме этого т к это статья для новичков, то возможно в конце стоит дать грамотный каркас скрипта, для добавления правил. Если вам это интересно - напишите здесь. У меня есть кое-какие наброски - готов поделится.
Alex2ndr 27.09.2010 14:04 #
+ 0 -
Прошу прощения. Не воспользовался предпросмотром, в результате получилось как-то плоховато оформлено. Я новичок в данном оформлении и не знаю как изменить комментарий.
kstep 28.09.2010 12:57 #
+ 0 -
Править комменты может только кровавая администрация.
ite 29.09.2010 01:24 #
+ 0 -
Контруктивная критикаконечо принимается, но первое: прежде чем критиковать прочитайте внимательно статью, это относится к вашему 2-у замечанию:
выше сказано:
Именно таблицами и правилами netfilter`а управляет утилита iptables.
Да, безусловно эти два понятия различаются, но к чему разводить эту разницу понятий, тем более что практически во всех руководствах указывается именно iptables. По поводу второго уровня: iptables начинает обработку именно с 3-го уровня, вся фильтрация по мак-адресам основывается на арп-таблицах, и к канальному имеет косвенное отношение, скажем, если бы нам необходимо было обрабатывать pppoe-соединение(который работает на канальном уровне), то iptables нам бы не помог, пришлось бы использовать что-то вроде ebtables
Далее:
Замечание номер 1:
На счет транзитных пакетов согласен. И модель стека протоколов TCP/IP уровневая: Физический, канальный, сетевой, транспортный, прикладной. Какой вы из них выкинете?

3: К чему это в статье "ОСНОВЫ работы с iptables"? Кому надо будет - дойдет до этого сам, кому нет, хватит и стандартных.

4: Да, простите, описался, уже исправил(на счет цепочек-таблиц). Остальное, простите, переиначивание моих слов на ваши, я считаю, гораздо понятней и короче выражение "по умолчанию".

5: По большому счету, возможно вы и правы, но следуя вашей традиции оно должно называться "Эта таблица используется для специализированных изменений заголовков пакетов".

Спасибо за критику.
Alex2ndr 29.09.2010 10:54 #
+ 0 -
По поводу второго уровня: iptables начинает обработку именно с 3-го уровня, вся фильтрация по мак-адресам основывается на арп-таблицах, и к канальному имеет косвенное отношение, скажем, если бы нам необходимо было обрабатывать pppoe-соединение(который работает на канальном уровне), то iptables нам бы не помог, пришлось бы использовать что-то вроде ebtables

Да - вы правы. Я забыл что за 2-й уровень отвечают иные утилиты. Помню что в ядро и та и другая информация попадает, а то что она обрабатывается другой утилитой - забыл :(


И модель стека протоколов TCP/IP уровневая: Физический, канальный, сетевой, транспортный, прикладной. Какой вы из них выкинете?

Снова я ошибся. Я исходил из книги У. Ричард Стивенс "TCP/IP крупным планом". там рассматривается TCP/IP модель, состоящая из 4-х уровней(те же, но без физического - http://www.soslan.ru/tcp/tcp01.html). В то время как в Википедии эта же модель имеет 5 уровней(те что вы описали). Предполагаю, что с момента написания книги были некоторые изменения.


5: По большому счету, возможно вы и правы, но следуя вашей традиции оно должно называться "Эта таблица используется для специализированных изменений заголовков пакетов".

Это не мое определение а авторов man страницы для iptables в debian lenny. Я тоже с ним не согласен по тому же поводу.

Спасибо за ваши ответы!
Всегда интересно изучить что-то новое или уточнить изменившиеся моменты.

PS Посмотрите на мой коммент относительно рисунка чуть выше.

Смотреть видео онлайн

Онлайн видео бесплатно


Смотреть русское с разговорами видео

Online video HD

Видео скачать на телефон

Русские фильмы бесплатно

Full HD video online

Смотреть видео онлайн

Смотреть HD видео бесплатно

School смотреть онлайн