web-dev-qa-db-ja.com

ネットワークスタックがデフォルト以外のインターフェイスからのicmp応答を無視するのはなぜですか?

私は次の状況にあります:

  • eth0-デフォルトゲートウェイ(ip:172.28.183.100、gw:172.28.183.1)
  • eth0-セカンダリネットワーク接続(ip:172.28.171.2、gw:172.28.171.2)。

ルーティングは次のようになります。

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
172.28.183.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
172.28.171.0    0.0.0.0         255.255.255.0   U     0      0        0 eth2
172.28.173.0    0.0.0.0         255.255.255.0   U     0      0        0 eth1
78.46.78.0      172.28.171.1    255.255.255.0   UG    0      0        0 eth2
169.254.0.0     0.0.0.0         255.255.0.0     U     1000   0        0 eth0
0.0.0.0         172.28.183.1    0.0.0.0         UG    100    0        0 eth0

ご覧のとおり、78.46.78.0/24の特別なルートがあります。このトラフィックは、セカンダリネットeth2を経由する必要があります。

どちらが機能しますか。 78.46.78.0/24では、マシンへのあらゆる種類のtcp接続を実行できます。

しかし、それらをmtrしようとすると、奇妙な結果が得られました。

root@blob:~# mtr --report --report-cycles=5 78.46.78.198
Host: blob                        Loss%   Snt   Last   Avg  Best  Wrst StDev
  1. 172.28.171.1                  0.0%     5    0.6   0.6   0.5   0.6   0.0
  2. ???                          100.0     5    0.0   0.0   0.0   0.0   0.0

Tcpdumpの出力で、返される存続時間の応答が超過していることがわかります。

10:16:28.158888 IP 172.28.171.2 > 78.46.78.198: ICMP echo request, id 2092, seq 59520, length 44
10:16:28.159363 IP 172.28.171.1 > 172.28.171.2: ICMP time exceeded in-transit, length 72
10:16:28.259153 IP 172.28.171.2 > 78.46.78.198: ICMP echo request, id 2092, seq 59776, length 44
10:16:28.359546 IP 172.28.171.2 > 78.46.78.198: ICMP echo request, id 2092, seq 60032, length 44
10:16:28.408129 IP 10.9.208.1 > 172.28.171.2: ICMP time exceeded in-transit, length 36
10:16:28.428193 IP 10.9.208.2 > 172.28.171.2: ICMP time exceeded in-transit, length 36
10:16:28.459953 IP 172.28.171.2 > 78.46.78.198: ICMP echo request, id 2092, seq 60288, length 44
10:16:28.560260 IP 172.28.171.2 > 78.46.78.198: ICMP echo request, id 2092, seq 60544, length 44
10:16:28.618138 IP 10.9.213.6 > 172.28.171.2: ICMP time exceeded in-transit, length 36
10:16:28.660678 IP 172.28.171.2 > 78.46.78.198: ICMP echo request, id 2092, seq 60800, length 44
10:16:28.708130 IP 10.9.212.253 > 172.28.171.2: ICMP time exceeded in-transit, length 36
10:16:28.730193 IP 213.158.195.13 > 172.28.171.2: ICMP time exceeded in-transit, length 36
10:16:28.761086 IP 172.28.171.2 > 78.46.78.198: ICMP echo request, id 2092, seq 61056, length 44
10:16:28.861380 IP 172.28.171.2 > 78.46.78.198: ICMP echo request, id 2092, seq 61312, length 44
10:16:28.938167 IP 213.248.89.153 > 172.28.171.2: ICMP time exceeded in-transit, length 36

しかし、mtrのstraceを使用すると、これらのICMP応答がmtrに配信されないことがわかります。

理由は、icmp応答のソースIPが「間違った」インターフェイスから来ているためだと思います。つまり、ICMP応答は(たとえば)10.9.212.253(一部の中間ルーター)から来ていますが、このIPはeth0経由でルーティングする必要があります。それはeth2になります。

それは理にかなった理由ですか? 「特別な」ネットワークでもmtrを機能させるにはどうすればよいですか?

iptablesは以下を使用して設定されます。

iptables -P INPUT   DROP
iptables -P FORWARD DROP
iptables -P OUTPUT  ACCEPT

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i lo                                  -j ACCEPT
iptables -A INPUT -i eth1                                -j ACCEPT
iptables -A INPUT -p icmp                                -j ACCEPT

iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -i eth1                              -j ACCEPT

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE

iptables -A INPUT   -j LOG --log-prefix 'IPTABLES: '
iptables -A FORWARD -j LOG --log-prefix 'IPTABLES: '

しかし、kern.logでicmp関連のパッケージは見当たりません。

1
user13185

RafałRamockiのおかげで-解決策は簡単です-eth2インターフェースでrp_filter-ingをオフにする必要があります:

echo 0 > /proc/sys/net/ipv4/conf/eth2/rp_filter

カーネルドキュメントから:

rp_filter
---------

Integer value determines if a source validation should be made. 1 means yes, 0
means no.  Disabled by default, but local/broadcast address spoofing is always
on.

If you  set this to 1 on a router that is the only connection for a network to
the net,  it  will  prevent  spoofing  attacks  against your internal networks
(external addresses  can  still  be  spoofed), without the need for additional
firewall rules.

なりすまし攻撃(少なくとも一部)を防ぐのに適していますが、インターネット接続が多い場合は、確実に一部の機能が停止します。

4
user13185