在k8s上装了一个gitlab接口,用ingress-nginx暴露了2222端口作为ssh服务端口,供远
程提交代码。这是前言
后来就在gitlab日志里发现n多尝试登录的信息,基本上每分钟都有好几次,这不行啊,
有洁癖的我受不了。
在k8s 容器内部没法设置防火墙,只能在系统设置,我的思路是 获取ingress-nginx的日
志(python k8s api或者直接kubectl log获取日志),然后分析日志,通过ingress登录的
日志长这样:
[154.83.14.89] [13/Dec/2022:12:21:52 +0000] TCP 200 1637 1250 0.316
ip 时间 tcp send recv duration
所以不成功的登录一一般都是send/recv<3000字节的,碰到这个,我就记录下来,然后出
现三次同一ip的,就在防火墙封掉ip。
代码写好了,测试的时候发现问题了,k8s完全掌控了iptables,本来我是
iptables -N fail2ban
iptables -I INPUT 1 -j fail2ban
先让fail2ban规则处理的,但是后来想iptables应该是先经过PREROUTING,直接到docker
镜像内部了,从iptables -nL -t nat也能看到,所以规则变成
iptables -t nat -N fail2ban
iptables -t nat -I PREROUTING -j fail2ban
而nat里,是不能drop和reject的,只能把包导到一个不存在的ip -j DNAT --to 0.0.0.1
代码测试成功了,iptables fail2ban的规则也创建了,结果发现某些ip被ban了之后,仍
然能继续访问2222端口,再用iptables一看,
cali-PREROUTING这个PREROUTING的target又排在第一了,看来k8s后台对iptables做了监
控,cali-PREROUTING 始终会排第一,把对ingress暴露的端口的包先转到docker里处理了
。
这个规则太复杂,我不想在DOCKER或者cali-PREROUTING里直接添加规则。
这时候我想到了k8s的networkpolicy的ingress规则,可以限制对pod端口的访问,直接用
python kubernetes api,写了读日志以及patch networkpolicy ingress yaml的接口,
结果发现问题又来了,networkpolicy的ingress规则,只支持默认全部deny,然后加白名
单,而我需要的是默认全部allow,然后设置黑名单。又去看了istio相关设置,同样只支
持白名单,不支持黑名单,郁闷。
明天继续研究。
--
FROM 120.229.14.*