
フィルタテーブルがパケットをドロップするのに最適な場所であることに同意しました。
ただし、デフォルトでは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チェーンの外観は次のとおりです。
これはうまくいくようです。しかし、別の事前ルーティングルールに到達する前にパケットを明示的に拒否する方法はありますか?
(Alpine Linux 3.6.2、Docker v17.05.0-ce)
答え1
誰かがアプリケーションを任意のアドレスにバインドするコンテナを展開しても、ネットワークトラフィックを「強化」する必要がある同様の問題に直面しました0.0.0.0:port
。
Dockerはフィルタチェーンを提供しますDOCKER-USER
が、すべての魔法DOCKER
がPREROUTING
。
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
。
答え2
DOCKER-BLOCKアプローチの問題は、ホストとコンテナのトラフィックをブロックしたい場合(たとえばtcpポート50ブロック)、それをDOCKER-BLOCKチェーンに追加し(ドッカールールをバイパスするため)、INPUTチェーン(実際のドロップを実行するため) )。