Tomsk Sysadmins Forum

Unix => Разное => Topic started by: Comrad on February 28, 2006, 23:52:11

Title: traceroute
Post by: Comrad on February 28, 2006, 23:52:11
Есть Slackware 9.1 работает как маршрутизатор. Как правильно настроить iptables для прохождения запросов traceroute?

Вот текущие настройки
Code: [Select]
TRACEROUTE_SRC_PORT="32769:65535"
TRACEROUTE_DEST_PORT="33434:33523"

INPUT
# destination-unreachable
$IPTABLES -A INPUT -p icmp -i $ISPDEV -s $ANYADDR \
    --icmp-type 3 -j ACCEPT
# time-exceeded
$IPTABLES -A INPUT -p icmp -i $ISPDEV -s $ANYADDR \
    --icmp-type 11 -j ACCEPT

FORWARD
$IPTABLES -A FORWARD -i $HOMEDEV -p udp \
    -s $HOMENET --sport $TRACEROUTE_SRC_PORT \
    -d $ANYADDR --dport $TRACEROUTE_DEST_PORT -j ACCEPT
# destination-unreachable
$IPTABLES -A FORWARD -p icmp -i $ISPDEV -s $ANYADDR \
    --icmp-type 3 -j ACCEPT
# time-exceeded
$IPTABLES -A FORWARD -p icmp -i $ISPDEV -s $ANYADDR \
    --icmp-type 11 -j ACCEPT

OUTPUT
# traceroute service
$IPTABLES -A OUTPUT -o $ISPDEV -p udp \
    -s $HOMENET --sport $TRACEROUTE_SRC_PORT \
    -d $ANYADDR --dport $TRACEROUTE_DEST_PORT -j ACCEPT
При попытке запроса с маршрутизатора получаю ответ
Code: [Select]
# traceroute sysadmin.tomsk.ru
traceroute to sysadmin.tomsk.ru (213.183.104.233), 30 hops max, 38 byte packets
traceroute: sendto: Operation not permitted
 1 traceroute: wrote sysadmin.tomsk.ru 38 chars, ret=-1
 *traceroute: sendto: Operation not permitted
traceroute: wrote sysadmin.tomsk.ru 38 chars, ret=-1
Если запрос идет из локальной сети
Code: [Select]
C:\>tracert sysadmin.tomsk.ru

Трассировка маршрута к sysadmin.tomsk.ru [213.183.104.233]
с максимальным числом прыжков 30:

  1    <1 мс    <1 мс    <1 мс  home.net [192.168.10.10]
  2     *        *        *     Превышен интервал ожидания для запроса.
  3     *        *        *     Превышен интервал ожидания для запроса.
  4  ^C
На мой взгляд, Запрос даже не покидает маршрутизатор. Значит все дело в настройках iptables. Кто знает, подскажите, плиз.
Title: traceroute
Post by: demiurg on March 01, 2006, 01:35:44
Quote
Есть Slackware 9.1 работает как маршрутизатор. Как правильно настроить iptables для прохождения запросов traceroute?

На мой взгляд, Запрос даже не покидает маршрутизатор. Значит все дело в настройках iptables. Кто знает, подскажите, плиз.
[snapback]7761[/snapback]
Потому что все не правильно. Подумайте хорошенько. И срочно читать IPTables Tutorial, т.к. похоже что в голове нет ясности по тому как iptables работает.

Во-первых. traceroute в unix и в винде работает немного по разному. В unix по умолчанию используются udp пакеты (ключик -I меняет такое поведение), в Винде icmp.

При трассировке с хоста за маршрутизатором пакеты проходят только FORWARD (из указанных выше цепочек).
При трассировке с самого маршрутизатора исходящие пакеты проходят OUTPUT, а входящие INPUT.
Поэтому для трассировки с хостов за маршрутизатором нужно разрешить прохождение icmp пакетов через FORWARD и udp, если в сети есть UNIX машины.

Для трассировки с самого маршрутизатора нужно разрешить аналогичные пакеты в INPUT и в OUTPUT.

Самый лучший способ -- разрешить все пакеты, запустить tcpdump и понаблюдать за тем какие пакеты в каком направлении проходят. Это поможет разобраться и написать правила.
Title: traceroute
Post by: demiurg on March 01, 2006, 01:59:34
Для проходящих нужно еще добавить
Code: [Select]
FORWARD
$IPTABLES -A FORWARD -i $HOMEDEV -p icmp \
   -s $HOMENET --icmp-type echo-request -j ACCEPT

ну и по хорошему

$IPTABLES -A FORWARD -p icmp -i $ISPDEV -s $ANYADDR \
   --icmp-type echo-reply -j ACCEPT
Вообще, лучше распихать правила по пользовательским цепочкам, тогда не надо писать такие сложные условия и отлаживать легче.

В исходящих тоже ошибка
Code: [Select]
OUTPUT
# traceroute service
$IPTABLES -A OUTPUT -o $ISPDEV -p udp \
   -s $HOMENET --sport $TRACEROUTE_SRC_PORT \
   -d $ANYADDR --dport $TRACEROUTE_DEST_PORT -j ACCEPT
если указан -o $ISPDEV то -s $HOMENET ну никак не может быть.
(Я полагаю что $HOMENET это что-то вроде 192.168.0.0/24)
Соответственно под указанное правило пакеты не попадают и грохаются.
Title: traceroute
Post by: Comrad on March 01, 2006, 20:42:41
Quote
Потому что все не правильно. Подумайте хорошенько. И срочно читать IPTables Tutorial, т.к. похоже что в голове нет ясности по тому как iptables работает.

Во-первых. traceroute в unix и в винде работает немного по разному. В unix по умолчанию используются udp пакеты (ключик -I меняет такое поведение), в Винде icmp.
[snapback]7762[/snapback]
Роберт Л. Зиглер, "Брандмауэры в Linux"
"Система traceroute использует протокол UDP и работает следующим образом. При прохождении данных от исходного компьютера к месту назначения все промежуточные узлы генерируют ICMP-сообщения Time Exceeded, а целевой узел передает сообщение Destination Unreachable."

Использовал этот источник, правда там все настройки для ipchains.

Quote
Самый лучший способ -- разрешить все пакеты, запустить tcpdump и понаблюдать за тем какие пакеты в каком направлении проходят. Это поможет разобраться и написать правила.
[snapback]7762[/snapback]
При всех целях ACCEPT все работает.
Title: traceroute
Post by: Comrad on March 01, 2006, 20:47:23
Quote
В исходящих тоже ошибка
Code: [Select]
OUTPUT
# traceroute service
$IPTABLES -A OUTPUT -o $ISPDEV -p udp \
   -s $HOMENET --sport $TRACEROUTE_SRC_PORT \
   -d $ANYADDR --dport $TRACEROUTE_DEST_PORT -j ACCEPT
если указан -o $ISPDEV то -s $HOMENET ну никак не может быть.
(Я полагаю что $HOMENET это что-то вроде 192.168.0.0/24)
Соответственно под указанное правило пакеты не попадают и грохаются.
[snapback]7763[/snapback]
Ваша правда. Грохнул -s $HOMENET и с маршрутизатора пошло.
Буду рыть FORWARD.

Спасибо за потраченное на меня время.
Title: traceroute
Post by: demiurg on March 01, 2006, 23:41:38
Quote
Ваша правда. Грохнул -s $HOMENET и с маршрутизатора пошло.
Буду рыть FORWARD.

Спасибо за потраченное на меня время.
[snapback]7784[/snapback]
Еще раз акцентирую внимание на том, что Винда отправляет не udp пакеты, а icmp echo request. См. также ключ -I для traceroute.

А с ACCEPT естественно все будет проходить, но наблюдение в tcpdump за проходящими пакетами позволит сделать вывод о том как происходит процесс обмена пакетами и устранить ошибки в правилах. По крайней мере мне очень помогало. В некоторых случаях различные авторы допускают разночтения стандартов и реализуют протоколы на свой странный манер.

Роберт Л. Зиглер, "Брандмауэры в Linux" очень хорошая книжка, жаль не хотят переводить последнее издание, там все на iptables уже переписано.
Title: traceroute
Post by: demiurg on March 02, 2006, 13:08:05
Вот кстати пример, я специально выбрал адрес по ближе, что бы не загромождать вывод.
Code: [Select]
/usr/sbin/traceroute -n 217.18.129.182
traceroute to vl313-core521.bbn.tomsknet.ru (217.18.129.182), 30 hops max, 38 byte packets
 1  192.168.2.1  7.237 ms  7.318 ms  7.105 ms
 2  217.18.128.7  6.963 ms  7.399 ms  7.396 ms
 3  217.18.129.182  7.392 ms *  6.441 ms
Всю процедуру обмена приводить не буду только интересный последний фрагмент

Code: [Select]
sudo /usr/sbin/tcpdump '!port ssh and !port domain and !port ircd' -n
<...>
12:58:19.041865 IP 192.168.2.2.32818 > 217.18.129.182.33439: UDP, length 10
12:58:19.049494 IP 217.18.128.7 > 192.168.2.2: ICMP time exceeded in-transit, length 36
12:58:19.050317 IP 192.168.2.2.32818 > 217.18.129.182.33440: UDP, length 10
12:58:19.057625 IP 217.18.128.7 > 192.168.2.2: ICMP time exceeded in-transit, length 36
12:58:19.058934 IP 192.168.2.2.32818 > 217.18.129.182.33441: UDP, length 10
12:58:19.066975 IP 217.18.129.182 > 192.168.2.2: ICMP 217.18.129.182 udp port 33441 unreachable, length 36
12:58:19.077124 IP 192.168.2.2.32818 > 217.18.129.182.33442: UDP, length 10
12:58:24.075770 IP 192.168.2.2.32818 > 217.18.129.182.33443: UDP, length 10
12:58:24.082796 IP 217.18.129.182 > 192.168.2.2: ICMP 217.18.129.182 udp port 33443 unreachable, length 36
Code: [Select]
/usr/sbin/traceroute -I -n 217.18.129.182
traceroute to vl313-core521.bbn.tomsknet.ru (217.18.129.182), 30 hops max, 38 byte packets
 1  192.168.2.1  7.390 ms  6.814 ms  7.253 ms
 2  217.18.128.7  7.613 ms  7.723 ms  7.305 ms
 3  217.18.129.182  7.544 ms  7.504 ms  7.558 ms
Code: [Select]
12:59:22.331021 IP 192.168.2.2 > 217.18.129.182: ICMP echo request, id 35778, seq 5, length 18
12:59:22.337740 IP 217.18.128.7 > 192.168.2.2: ICMP time exceeded in-transit, length 36
12:59:22.338583 IP 192.168.2.2 > 217.18.129.182: ICMP echo request, id 35778, seq 6, length 18
12:59:22.345632 IP 217.18.128.7 > 192.168.2.2: ICMP time exceeded in-transit, length 36
12:59:22.346921 IP 192.168.2.2 > 217.18.129.182: ICMP echo request, id 35778, seq 7, length 18
12:59:22.354102 IP 217.18.129.182 > 192.168.2.2: ICMP echo reply, id 35778, seq 7, length 18
12:59:22.364080 IP 192.168.2.2 > 217.18.129.182: ICMP echo request, id 35778, seq 8, length 18
12:59:22.371471 IP 217.18.129.182 > 192.168.2.2: ICMP echo reply, id 35778, seq 8, length 18
12:59:22.372277 IP 192.168.2.2 > 217.18.129.182: ICMP echo request, id 35778, seq 9, length 18
12:59:22.380087 IP 217.18.129.182 > 192.168.2.2: ICMP echo reply, id 35778, seq 9, length 18
Title: traceroute
Post by: Comrad on March 02, 2006, 20:26:55
Спасибо за примеры. Нашел для себя новое и по tcpdump/

Книгу я читаю совместно со статьей о Kernel packet traveling diagram (http://www.docum.org/docum.org/kptd/)