내 시스템에는 자체 포트가 있는 많은 도커 컨테이너가 있습니다. Docker는 IPTable을 사용하여 몇 가지 마법을 수행하므로 이에 대한 일부 사용자 지정 규칙을 정의하기가 어렵습니다.
http 연결의 경우에만 역방향 프록시는 문제가 되지 않습니다. 따라서 호스트에서 실행되는 nginx를 사용하여 자체 규칙(예: SYN 플러드 보호)을 정의할 수 있습니다.
하지만 이제는 네임서버를 도커 컨테이너로 실행하고 싶습니다. 보호를 위해공격 증폭규칙을 작성했지만 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
핵심 단어입니다. 이는 ferm에게 이러한 체인을 그대로 유지하라고 지시합니다. 여기에서 발견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는 함께 잘 작동합니다.