
私は何年もの間、問題なく iptables ルールを実行してきましたが、次の方法ですべての信頼できる MAC のアクセスを許可した後、
/sbin/iptables -A INPUT -m mac --mac-source $MAC -j ACCEPT
/sbin/iptables -A FORWARD -m mac --mac-source $MAC -j ACCEPT
次のような他の MAC アドレスをマークしようとしています:
/sbin/iptables -A PREROUTING -t mangle -i $INT_DEV -p tcp --dport 80 -j MARK --set-mark 99
しかし、今そのアドレスを読み取ろうとすると、
conntrack -L | grep "src=10.1.1.234"
未知の10.1.1.234フリーローダーがどこにも見当たりません...
それでも、iptablesでフリーローダーをログインページに誘導し続けたいのですが、
/sbin/iptables -t filter -A FORWARD -m mark --mark 99 -j DROP```
And obviously it doesn't work because I can't even see it from my conntrack listing.
What am I doing wrong here..?
答え1
違いはパケットマーク、別名マーク、ファイアウォールマークまたはマーク、そしてconntrackエントリマーク、別名ctmark、接続マークまたはコネマーク: 前者はパケットのスクバフ後者はconntrack エントリ明確なiptables マット-チェスそしてタール-取得両方について、方法を含めパケットのマークを接続エントリに渡すまたは接続エントリからパケットまで。
ここではこのマークを使う必要はありません接続トラックこの場合、はconntrack -L
単にドロップされたパケットを表示する適切なツールではありません (最後の段落を参照)。iptables-nft
バリアントを使用する場合、デバッグの目的でマークされたパケットを確認する最も簡単な方法は ( を使用するだけでは-j LOG
パケットのマークがログに追加されます)、それらをトレースし、 を使用してxtables-monitor --trace
その運命を表示することです (iptables-legacy
はこれをカーネル ログに送信し、簡単にログがいっぱいになる可能性があります。また、ネットワーク名前空間ではうまく動作しません。これは、-legacy と -nft バリアント間のまれな非互換性の変更です)。
考えられる例を 1 つ挙げます。
iptables -A PREROUTING -t mangle -i $INT_DEV -p tcp --dport 80 -j MARK --set-mark 99
iptables -A PREROUTING -t mangle -m mark --mark 99 -j TRACE
[...]
iptables -A FORWARD -m mark --mark 99 -j DROP
-j TRACE
との間のすべてのマークされたパケットの詳細な運命-j DROP
(または、-j ACCEPT
これらの選択された少数のパケットに対するすべてのそれ以降の処理) は、次のように非常に冗長に追跡できます。
xtables-monitor --trace
冗長性を制限するには、次のようにルールを変更して、新しいフローを開始するパケットのみをトレースできますTRACE
。
iptables -A PREROUTING -t mangle -m mark --mark 99 -m conntrack --ctstate NEW -j TRACE
さらに、このようなフローの最初のパケットは、接続トラックエントリ(マークがなくても)は、通常、イベントモードで表示されますconntrack -E -p tcp --dport 80
。しかし、このパケットがドロップされると、暫定的なconntrackエントリは決して表示されません。確認済みそして、イベントは で利用できなくなりますconntrack
。 コマンドでは非表示になりますがconntrack
、ドロップされる前は を使用したルール内では表示されます-m conntrack --ctproto tcp --ctorigdstport 80
。それ以降の再試行は、パケットがドロップされたなどの理由で確認されない暫定エントリを作成する最初のパケットになります。
したがって、conntrack
最初のパケットがドロップされなかったフローを表示する場合にのみ使用できます。それ以外の場合は、利用可能なフローはありません。