Назад | Перейти на главную страницу

Как включить traceroute на Linux-машине

Я работаю над чем-то на транспортном уровне, и после того, как я запустил наши настраиваемые политики для защиты политик, я не могу сделать traceroute с машины linux.

root@keystone-evm:~# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     udp  --  anywhere             10.222.4.212         udp dpt:echo
ACCEPT     udp  --  anywhere             10.222.4.212         udp dpt:isakmp
ACCEPT     udp  --  anywhere             10.222.4.212         udp dpt:radius
ACCEPT     udp  --  anywhere             10.222.4.212         udp dpt:ntp
ACCEPT     icmp --  anywhere             10.222.4.212
ACCEPT     udp  --  anywhere             10.222.4.212         udp dpt:domain
ACCEPT     udp  --  anywhere             10.222.4.212         udp dpt:bootpc
ACCEPT     udp  --  anywhere             10.222.4.212         udp dpt:bootps
ACCEPT     123  --  anywhere             10.222.4.212
DROP       all  --  anywhere             anywhere
ACCEPT     udp  --  anywhere             anywhere             udp spts:33434:33524 state NEW,RELATED,ESTABLISHED

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     udp  --  10.222.4.212         anywhere             udp dpt:echo
ACCEPT     udp  --  10.222.4.212         anywhere             udp dpt:isakmp
ACCEPT     udp  --  10.222.4.212         anywhere             udp dpt:radius
ACCEPT     udp  --  10.222.4.212         anywhere             udp dpt:ntp
ACCEPT     icmp --  10.222.4.212         anywhere
ACCEPT     udp  --  10.222.4.212         anywhere             udp dpt:domain
ACCEPT     udp  --  10.222.4.212         anywhere             udp dpt:bootpc
ACCEPT     udp  --  10.222.4.212         anywhere             udp dpt:bootps
ACCEPT     123  --  10.222.4.212         anywhere
DROP       all  --  anywhere             anywhere
ACCEPT     udp  --  anywhere             anywhere             udp dpts:33434:33524 state NEW
root@keystone-evm:~# traceroute 10.222.4.100
traceroute to 10.222.4.100 (10.222.4.100), 30 hops max, 38 byte packets
 1traceroute: sendto: Operation not permitted

Ниже приведена команда, которую я выполнил для включения трассировки:

Мы можем видеть из man 8 traceroute который:

  • UDP - это механизм трассировки по умолчанию в Linux.
  • traceroute ожидает получить сообщение «ICMP недоступен» в ответ на свой запрос
  • трассировки начинаются с порта 33434 и увеличиваются на единицу для каждого перехода

Между тем, Microsoft подтверждает, что Windows использует «эхо-запросы ICMP» в его реализации.

Итак, вот ответ, позволяющий хосту правильно обрабатывать входящие и исходящие трассировки. Добавьте правило, чтобы отклонять (не отбрасывать) трафик на порты UDP 33434-33474 и отвечать на эхо-запросы, а также разрешать соответствующие исходящие пакеты, если вы ограничиваете исходящий трафик.

# reject (not drop) packets for inbound traceroutes from Linux boxes
iptables -I INPUT -p udp --dport 33434:33474 -j REJECT

# accept ping requests for Windows-style traceroutes
iptables -I INPUT -p ICMP --icmp-type echo-request -j ACCEPT

# allow ping responses for Windows-style traceroutes
iptables -I OUTPUT -p ICMP --icmp-type echo-reply -j ACCEPT

# allow the server to perform its own traceroutes
iptables -I OUTPUT -p udp --dport 33434:33474 -j ACCEPT

Для записи отрывок из справочной страницы:

LIST OF AVAILABLE METHODS
       In  general,  a  particular traceroute method may have to be chosen by -M name, but
       most of the methods have their simple cmdline switches (you can see them after  the
       method name, if present).

   default
       The traditional, ancient method of tracerouting. Used by default.

       Probe  packets  are udp datagrams with so-called "unlikely" destination ports.  The
       "unlikely" port of the first probe is 33434, then for each next probe it is  incre-
       mented by one. Since the ports are expected to be unused, the destination host nor-
       mally returns "icmp unreach port" as a final response.  (Nobody knows what  happens
       when some application listens for such ports, though).

       This method is allowed for unprivileged users.

   icmp       -I
       Most usual method for now, which uses icmp echo packets for probes.
       If you can ping(8) the destination host, icmp tracerouting is applicable as well.

   tcp        -T
       Well-known modern method, intended to bypass firewalls.
       Uses the constant destination port (default is 80, http).

Спасибо за все вклады.

Я придумал сценарий оболочки, который сделает эту работу за меня. Я считаю, что это было бы полезно для других пользователей также для выполнения этой задачи. Обратите внимание, что IP-адрес локальной машины. Пожалуйста, внесите необходимые изменения соответственно.

#!/bin/sh
echo "Enabling Traceroute..."

#Outbound UDP traffic Policy

iptables -I OUTPUT -o eth0 -p udp --dport 33434:33524 -m state --state NEW -j ACCEPT

iptables -I INPUT -p udp --sport 33434:33524 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#Inbound ICMP traffic Policy


iptables -I INPUT -p icmp --icmp-type 3/3 -d 10.222.4.212 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

iptables -I INPUT -p icmp --icmp-type 11  -d 10.222.4.212 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

Прежде всего: iptables -A команда добавить новое правило после конец ваших настоящих цепочек. Они обрабатывались только после последнего правила в ваших цепочках. Но этого не произойдет, потому что последнее правило уже все отфильтровывает! Вам нужно поставить эти команды перед ваше последнее правило, которое может быть выполнено с -I <n> флаг файла iptables.

Во-вторых: Traceroute отправляет пакеты ICMP, как и ping. По сути, это пинг, который пытается получить список удаленных сетевых узлов на пути к целевой машине, отправляя пакеты с низкими, но растущими полями TTL.

Понятия не имею, откуда у вас эта штука udp / 33434. Если вы хотите использовать traceroute, включите ICMP, в котором нет портов.

Третье: (реагируя на сообщения) Кажется, иногда traceroute использует не только простые пакеты icmp, но также пакеты udp или даже tcp. Есть даже инструмент под названием tcptraceroute, который может делать это последнее очень хорошо настраиваемым способом. Если вы не уверены, обратитесь к strace или с tcpdump, где ваш traceroute действительно хочет связываться, и включить хотя бы этот порт.