web-dev-qa-db-ja.com

Linuxマシンでtracerouteを有効にする方法

トランスポート層で何かに取り組んでおり、ポリシーを保護するためのカスタムポリシーを実行した後、Linuxマシンからtracerouteを実行できません。

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

以下は、tracerouteを有効にするために発行したコマンドです。

  • iptables -A OUTPUT -o eth0 -p udp --dport 33434:33524 -m state --state NEW -j ACCEPT
  • iptables -A INPUT -p udp --sport 33434:33524 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
5
Renold Singh

すべての入力をありがとう。

私は私のために仕事をするためにシェルスクリプトを思いつきました。これは、他のユーザーもタスクを実行するのに役立つと思います。ローカルマシンの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
5
Renold Singh

man 8 traceroute それ:

  • UDPはLinuxのデフォルトのtracerouteメカニズムです
  • tracerouteは、クエリへの応答として「ICMP到達不能」メッセージを受け取ることを期待しています
  • トレースはポート33434から始まり、ホップごとに1ずつ増加します

一方、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

参考までに、manページからの抜粋:

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).
7
miken32

まず最初に:iptables -Aコマンドは、実際のチェーンの最後の後に新しいルールを追加します。それらは、チェーン内の最後のルールの後でのみ処理されました。しかし、それは起こりません、最後のルールはすでにすべてを除外しているためです!これらのコマンドを最後のルールの前に置く必要があります。これは、iptablesの-I <n>フラグを使用して実行できます。

2番目:pingと同じように、TracerouteはICMPパケットを送信することで機能します。これは基本的にはpingであり、ターゲットマシンに向かう途中のリモートネットワークノードのリストを取得しようとしますが、パケットの[TTL]フィールドが大きくなります。

このudp/33434をどこから入手したのか、私にはわかりません。 tracerouteが必要な場合は、ポートのないICMPを有効にします。

3番目:(反応する)どうやら、tracerouteは単純なicmpパケットだけでなく、udpまたはtcpパケットも使用するようです。 tcptraceroute という名前のツールもあり、非常に優れた構成可能な方法でこの最後のことを実行できます。不明な場合は、straceまたはtcpdumpを使用して確認します。ここで、tracerouteが実際に通信する必要があり、少なくともこのポートを有効にします。