iptablesでPREROUTINGを使用してパケットを破棄する

iptablesでPREROUTINGを使用してパケットを破棄する

フィルタテーブルがパケットをドロップするのに最適な場所であることに同意しました。

ただし、デフォルトではDockerはPREROUTINGを介して独自のFORWARDルールでINPUTフィルタリングルールをバイパスし、Dockerコンテナにグローバルにアクセスできるようにします。入れるドッカー名前付きフィルタINPUT / FORWARDルールは、Dockerが再起動されると削除され、挿入(追加されていない)になるため失敗します。

私の最善の試みは、Dockerの前に別のPREROUTINGチェーンを挿入し、eth0(WAN)からブラックホールに不要なパケットを送信することでした。0.0.0.1- これ以上natテーブルでDROP / REJECTを実行できないからです。

# Route anything but TCP 80,443 and ICMP to an IPv4 black hole
iptables -t nat -N BLACKHOLE
iptables -t nat -A BLACKHOLE ! -i eth0 -j RETURN
iptables -t nat -A BLACKHOLE -m conntrack --ctstate ESTABLISHED,RELATED -j RETURN
iptables -t nat -A BLACKHOLE -p tcp --dport 80 -j RETURN
iptables -t nat -A BLACKHOLE -p tcp --dport 443 -j RETURN
iptables -t nat -A BLACKHOLE -p icmp -j RETURN
iptables -t nat -A BLACKHOLE -p all -j DNAT --to 0.0.0.1
iptables -t nat -I PREROUTING -m addrtype --dst-type LOCAL -j BLACKHOLE

Dockerと実行中のコンテナを含むNATチェーンの外観は次のとおりです。

Natテーブルルール

これはうまくいくようです。しかし、別の事前ルーティングルールに到達する前にパケットを明示的に拒否する方法はありますか?

(Alpine Linux 3.6.2、Docker v17.05.0-ce)

ベストアンサー1

誰かがアプリケーションを任意のアドレスにバインドするコンテナを展開しても、ネットワークトラフィックを「強化」する必要がある同様の問題に直面しました0.0.0.0:port

Dockerはフィルタチェーンを提供しますDOCKER-USERが、すべての魔法DOCKERPREROUTING

natしたがって、この問題を解決する方法はありません今後フィルタリング、ドッカールールについてあまり扱いたくありません。

パケットを変更するアイデアが気に入らなかったので、基本的にすべてを返し、別のチェーンにジャンプする方法を考えました。PREROUTING 今後 DOCKER呼んだ。

DOCKERその後、交通状況が良いと思われる場合は、選択的にジャンプします。

コードは次のとおりです。

iptables -t nat -N DOCKER-BLOCK
iptables -t nat -I PREROUTING -m addrtype --dst-type LOCAL -j RETURN
iptables -t nat -I PREROUTING -m addrtype --dst-type LOCAL -j DOCKER-BLOCK

それだけです!

パケットはDOCKER-BLOCKチェーンにジャンプし、チェーンが空の場合はチェーンからジャンプしてジャンプし続け、ブロックされPREROUTINGますRETURN

ポートを有効にする場合:

iptables -t nat -I DOCKER-BLOCK -p tcp -m tcp --dport 1234 -j DOCKER

その後、パケットはDOCKER管理されたチェーンにジャンプしますdocker。 Dockerはパケットを処理する必要があり、ソースRETURNに到達してはいけません。PREROUTING

何よりも、PREROUTING再びテーブルに触れる必要はなく、水を下げるには水を下げるだけですDOCKER-BLOCK

おすすめ記事