転送が無効になっても、Linuxが他のインターフェイスIPへの接続を許可するのはなぜですか?

転送が無効になっても、Linuxが他のインターフェイスIPへの接続を許可するのはなぜですか?

システムには2つのインターフェースが1.1.1.1あります1.1.2.1。 sysctl はnet.ipv4.ip_forward無効または有効になりますがiptables -P FORWARD DROP設定されます。

これで、1.1.1.1デフォルトパスに設定されている別のコンピュータでpingを実行してインターフェイスIP1.1.1.2に接続できるようになりました。1.1.2.1最もエレガントな方法でこれが起こるのをどのように簡単に防ぐことができますか?

解決策

私は今この素晴らしいライナーを使用しています。 @AB ありがとうございます。

nft add rule inet filter input fib daddr . iif type != { local, broadcast, multicast } drop

説明する:

nft推定される後続製品である nftables を表します。iptables

inputinet filterはデフォルトで作成されるテーブルのチェーンです(nft list table inet filterコマンドを使用してクエリできます)。ただし、カスタムnft設定がある場合はそれに応じて変更する必要があります。inetタイプ分類子は、ip4とip6プロトコルの両方で動作することを意味します。

fib daddr . iif typeデフォルトでは、入力インターフェイスの宛先アドレスtypeに何があるかを尋ねる転送情報ベースに対するクエリです。daddriif

localアドレスがインターフェイスでもなく、パケットが出てくるインターフェイスでもbroadcastない場合はインターフェイスです。multicastdrop

@ABはまた、DNAT規則に従ってパケットをブロックする方法(またはブロックしない方法)についていくつかのことを提案しました。詳細については、彼の答えを確認してください。

ベストアンサー1

1.1.2.1 は同じシステムに属する別の IP アドレスなので、転送は不要です。システムはパケットを受信し、第三者にルーティングされるのではなくローカルに転送される受信パケットとしてそれ自体を処理します。これは、IPがインターフェイスに属するのではなく、プールの一部と見なされるべきであるというLinuxの一般的な考えと一致しています。

以下を使用してパケットが受け入れられないようにするにはiptables、あなたは中になければなりません入力する代わりにチェーン今後チェーン。関連する2つのネットワークが/ 24の場合は、次のようになります。

iptables -I INPUT -s 1.1.1.0/24 -d 1.1.2.0/24 -j DROP

これは、場合によってはシステムがそれ自身に接続するのを防ぐため(この例ではルールでインターフェイス名を使用しないため)、少なくとも次のルールをシステムの前に追加する必要があります。

iptables -I INPUT -i lo -j ACCEPT

インターフェイス名を指定すると、いくつかの特別な場合にルールとセキュリティを設定するのに役立ちます。リバースパスフィルタリングほとんどのディストリビューションではデフォルトで有効になっています)。

更新:もちろん、OPで述べたように、-s 1.1.1.0/24 -d ! 1.1.1.0/24すべてのLANを同じように「分離」する必要がある場合は、LAN ^ 2ルールの代わりにLANごとに1つのルールのみを使用してこのサンプルルールをよりよく作成できます。


修正する:追加のリクエストがある場合は、以下を使用するよりエレガントなアプローチがあります。nftables嘘をつく(情報ベースの転送)式(マンページに例として文書化されています):これを受け取るインターフェイスに非ローカル(ブロードキャストでもマルチキャストでもない)宛先アドレスを削除します。この式は明示的なIP宣言(またはインタフェース)を必要としないため、次のようにIPv4とIPv6の両方で機能します。イントラネットホームアドレス代わりにテーブルアイピーアドレスファミリテーブル。

# nft add table inet filter
# nft add chain inet filter prerouting '{ type filter hook prerouting priority -150; policy accept; }
# nft add rule inet filter prerouting fib daddr . iif type != { local, broadcast, multicast } counter drop

これだけで多数のLAN/インターフェイスを処理できます(ゲームを行わずに同じインターフェイスに複数のLANを配置する限り、これは複数のLAN間の上記の規則に違反する可能性があります)。counterたとえば、視聴回数を表示する場合はオプションですnft list ruleset

しかし、この規則はDNATが異なります地元のDNATの前に発生する他のインターフェースで定義されたIP(使用iptables優先順位はNF_IP_PRI_NAT_DST(= -100))として登録されますが、ルーティング/転送(OPが有効になるように選択されている場合)またはDNAT転送の両方をブロックします。ローカルではないものとして破棄されるか(通常の転送の場合)、戻りパケットは破棄されます。このルールは次のとおりです。 「逆方向DNAT」が発生する前に出会い、除去される。追加された場合フック入力代わりに反対が発生します。他のIPへのローカルDNATは許可されていませんが、ルーティング/配信DNATは通過するため、機能できます。今後代わりにフック入力する。他のまれなケースに例外を追加すると便利です。したがって、上記の方法の代わりにこれを使用する必要があります。

# nft add table inet filter
# nft add chain inet filter input '{ type filter hook input priority 0; policy accept; }
# nft add rule inet filter input fib daddr . iif type != { local, broadcast, multicast } counter drop

返品iptablesそしてnftables平和に共存できます。ナットどちらも登録する必要があり、両方を登録することはできません。)nftables線は既存の線に従うことができます。iptablesルール。

nft list ruleset上記のルールは起動時に初期化されず、スクリプト形式(主に出力)で作成できます。たとえば、次のようになります。

#!/usr/sbin/nft -f

flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy accept;
        fib daddr . iif type != { local, broadcast, multicast } counter drop
    }
}

難しいので、確認する唯一のことは、最新の製品を使用するときです。nftables APIによるiptables、Debian Busterのデフォルト値と同じものもflush ruleset更新されます。iptablesルールは実際に使うのでnftablesこれは、エラーなしで存在しないチェーンを「初期」リフレッシュできないためです。したがって、このスクリプトは他のジョブの前に実行する必要があります。iptablesそのような場合は、スクリプトを作成してください。


さらに、1.1.1.0/24ネットワークのクライアントは1.1.2.1に接続できませんが、まだARPを使用してその存在を推論できます。それは次のとおりです。

arping -I eth0 1.1.2.1

1.1.2.1が他のネットワークの他のインターフェイスに「属している」場合でも(別のMACアドレスを使用)、1.1.1.0/24ネットワークのシステムインターフェイスを介して1.1.2.1から応答を受け取ります。

これは、Linuxがデフォルトで良いか悪いかを問わず、すべてのIPへのインターフェイスで受信されたARP要求に応答するためです。今回は詳細な説明があります。arp_filter

これを防ぐには、次のいずれかを混ぜてください。arp_filter+ip ruleまたはarp_お知らせ+arp_ignore、または使用arptables(またはnftablesそしてARPスイート)を使用してARP要求をフィルタリングします(とにかく前の設定のいずれかが必要になる場合があります)。

おすすめ記事