私のシステムには独自のポートを持つ多くのドッカーコンテナがあります。 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は一緒にうまくいきます。