Dockerトラフィックのフィルタリング

Dockerトラフィックのフィルタリング

私のシステムには独自のポートを持つ多くのドッカーコンテナがあります。 DockerはIPTableを使用していくつかの魔法を実行するため、これにはいくつかのカスタムルールを定義することは困難です。
http接続の場合にのみリバースプロキシは問題になりません。したがって、ホストで実行されるnginxを使用して独自のルール(SYN Flood Protectionなど)を定義できます。

しかし、今はネームサーバーをDockerコンテナとして実行したいと思います。保護のため攻撃増幅ルールを作成しましたが、docker-iptables-magicがこれをバイパスしました。

だからだまそうとしました。ネームサーバーの公開ポートを別のポート(5353)に変更しました。私の計画はこのようなルールを作ることです

# rules defined via ferm

table filter {
   chain INPUT {
      POLICY DROP;

      # drop any-query for nameserver
      proto udp dport (53) {
         mod string from 40 algo bm hex-string "|0000ff0001|" DROP;

         # my old rule would jump to ACCEPT now
         ACCEPT;

         # but I think would be nice, when can route the packet now
         # routing isn't allowed here
         REDIRECT to-ports 5353;
      }
   }
}


table nat {
   chain PREROUTING {
      # I also tried to preroute the packet
      # but then will match the docker-rule again 
      # and I cant protect the port
      proto udp dport 53 REDIRECT to-ports 5353;
   }
}


誰でもどんなアイデアがありますか?私は他のソリューションにも完全に開いています。 UDPリレーはオプションですか?

ベストアンサー1

私がやった!@preserveキーワードです。これは、ファームにこれらのチェーンをそのまま残すように指示します。ここで発見https://www.lullabot.com/articles/convincing-docker-and-iptables-play-nicely

これが私の新しい構成です

#vars
@def $WG_PORT = XXX;
@def $TCP_PORTS = (80 443 22);


table filter {

    # keep docker-chains
    chain (DOCKER DOCKER-INGRESS DOCKER-ISOLATION-STAGE-1 DOCKER-ISOLATION-STAGE-2 FORWARD KUBE-FIREWALL DOCKER-USER) @preserve;    

    chain mainRules {
        #allow local and wireguard
        interface (lo wg0 docker0 br+) ACCEPT;
        source 127.0.0.1 ACCEPT;

        #keep connected
        mod conntrack ctstate (ESTABLISHED RELATED) jump ACCEPT;

        #icmp
        proto icmp {
            mod limit limit  10/minute limit-burst 10 ACCEPT;
            DROP;
        }

        # allow wireguard-traffic instant
        proto udp dport ($WG_PORT) ACCEPT;


        # drop any-query for nameserver when udp
        proto udp dport (53) {
            mod string from 40 algo bm hex-string "|0000ff0001|" DROP;
            ACCEPT;
        }

        #tcp
        proto tcp dport ($TCP_PORTS) {

            #prevent syn-flood, but accept other
            syn {
                mod limit limit 10/sec limit-burst 10 jump PREACCEPT;
                DROP;
            }

            jump ACCEPT;
        }
    }


    chain INPUT {
        policy DROP;
        jump mainRules;
    }

    chain OUTPUT {
        policy ACCEPT;
    }

    chain FORWARD {
        policy ACCEPT;
    }
}

table nat {

    chain (DOCKER DOCKER-INGRESS PREROUTING POSTROUTING OUTPUT DOCKER-USER KUBE-POSTROUTING) @preserve;
}

今、fermとdockerは一緒にうまくいきます。

おすすめ記事