前面老板叫我看一下我们的一个app的登录有效期是多久,就不由得想到这个。这个app第一版是用的JWT来管理的登录token,所以就一直延续到现在,屎坑吧。
我对J字头的东西一直怀着深深的恶意,这个J和那个J虽然不是一个意思,但也很有渊源。改天我专门来讨论J的事。
网上已经有不少人批判过JWT了,不过大多有点故作高深,意思是对的,但看起来吃力,我用最简单的话来说。
JWT号称的最大最主要的优点就是,token由客户端管理,不需要占用服务器存储资源。 额。。这个系统架构谁设计的?多一个登录token都要拿出来说事,这系统的计算和储存容量是少得有多可怕?真是打算1C1G来做大气计算地震预测和原爆模拟么?事实上,从来没人担心系统压力大(别拿12306什么说事啦,咱们到不了那个层次),我们担心的是没生意没压力,压力来了,加机器提性能,老板这个钱掏得不要太开心。
上面一点先不议,再说它的不占用系统存储资源,是的,JWT本体确实不占用,然而,token就永远不过期?永远不能注销?允许无穷多点登录?不能修改权限等等? 所以啦,必须再建一个吊销表等,就是需要吊销的token放在表里面,这。。。这不就要存储了吗?JWT的无状态优点何在? 大聪明马上就会说,我会用redis啦,redis+jwt,头孢加酒,棒棒哒。 你都redis了,那session它不香吗?至于再复杂化一个JWT出来?
还有啥JWT支持SSO什么的我就不想说了,上面两点都已经涵括它了。
所以,在用户登录一块,它就是一个妥妥的垃圾。 至于帮它洗的一些应用场景,比如两台服务器间的临时对话的认证。。这个,用IP认证它不香吗?至于捧JWT这臭脚么?

省亲之旅结束,回家了,要继续好好工作了
父母在,人生尚有来处;父母去,人生只剩归途。爸爸已经走了,真希望妈妈能长命百岁。
不经历过的人会觉得是无病呻吟,只有到了那一天自己才能深刻的领会。然后一代一代传承直到永远。

等两天要回国探亲了,即将回到墙的怀抱。
出来这么多年了,已经习惯google了,没有还真不行。
以前是直接用漫游流量,一周折合人民币100多块钱,还是有点肉痛的,而且关键是不够用,看看油管一会就没了。
还是机场吧。。。随便在loc找的,双保险,一个月付10多块,一个年付10块,希望能坚挺住。

proxy.jpg

野卡证书很贵,去年是买的digital cert的,好几十刀,已经算便宜的了。
网上也流传alphassl的证书,只要30块钱,不过这个是利用了人家的漏洞,它的正常价格是100多刀。自己玩玩可以,掉证书就掉,不过生产环境的话三思。虽然没有掉的历史,但谁知道呢。。
免费+稳定,这就必然只能R3了。
一、安装certbot。(当然,用acme也可以,只是certbot简单点)
apt install certbot
二、运行:
certbot certonly --manual --agree-tos -d "*.你的域名" -d 你的域名 --email 你的email --preferred-challenges dns --manual-public-ip-logging-ok --server https://acme-v02.api.letsencrypt.org/directory
域名需要同时申请 *.domain.com 和 domain.com ,因为*不包含空。
三、运行时会提示你二次(因为上面输了两个域名):
Please deploy a DNS TXT record under the name:

_acme-challenge.你的域名.

with the following value:

s_vnp6r1TFPaCrO32hFUqCErUeGxEQ9KNbRwyQkNSW4

Press Enter to Continue

在你的dns管理器里面加入dns的txt记录即可。
在上面的例子中,就是加入 名称 _acme-challenge, 类型 TXT,值 s_vnp6r1TFPaCrO32hFUqCErUeGxEQ9KNbRwyQkNSW4
在没加好之前,一定不要敲回车,最好加好了再休息几分钟回车,如果不急的话。因为不排除有些dns不是立即刷新生效的。(dnspod和cloudflare都是立即生效)
一共重复两次。
四、不出意外,下面就是成功的提示:
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/你的域名/fullchain.pem
Key is saved at: /etc/letsencrypt/live/你的域名/privkey.pem
把对应的证书设置到nginx或者cdn就可以了。
五、更新需要重新运行上面的过程,certbot renew不能象单域名那样扔crontab使用,因为需要dns认证,不能自动完成。acme可能可以,不过三个月一次,多大件事呢。 这个是wildcard证书,单域名证书当然不需要这么复杂。

折腾了一个晚上,很失败。想象中很简单,就是对 DOCKER-USER 链加上白名单,然后禁止其余即可。然而,它就是不工作,或者全部允许,或者全部不允许,反正不按照预期中的来。
AI就不消说了,我把GPT老娘操了一万次它也改不对,BARD(老名字,现在叫啥忘了),更是差劲。
最后还是只能看GOOGLE,看上去洋人们很认真的讨论了这个问题,并号称找到了解决方案,还有好几种。。然而,在我这里还是失败。
放弃。也不想再深究了,我是实用主义者,不是科学家。
关闭掉DOCKER的iptables,人工维护规则算了: /etc/default/docker加上 DOCKER_OPTS="--iptables=false"。 还别说,就算这个也是坑,文档都说改 /etc/docker/daemon.json这个文件,然而这个文件并不存在。(文档不会和你说,新建一个即可)

完成后的规则,其实就是以前一直用的规则了,和docker无关。列在这里给有需要的人看看吧。

# Generated by iptables-save v1.8.9 (nf_tables) on Wed May  1 01:06:24 2024
*filter
:INPUT DROP [3816:196637]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2700:502529]
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT   #SSH,正常应该白名单,我这个玩具机就开着了。
-A INPUT -p tcp -m tcp --dport 81 -j ACCEPT   #这个是NPM的管理端口
-A INPUT -s 173.245.48.0/20 -p tcp -m tcp --dport 80 -j ACCEPT #CF白名单,IP段几十年不变,写死即可。
-A INPUT -s 103.21.244.0/22 -p tcp -m tcp --dport 80 -j ACCEPT #CF使用灵活模式,就是回源HTTP。回源HTTPS没有意义,除了消耗自己的CPU资源。
-A INPUT -s 103.22.200.0/22 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 103.31.4.0/22 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 141.101.64.0/18 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 108.162.192.0/18 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 190.93.240.0/20 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 188.114.96.0/20 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 197.234.240.0/22 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 198.41.128.0/17 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 162.158.0.0/15 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 104.16.0.0/13 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 104.24.0.0/14 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -s 172.64.0.0/13 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -j DROP
COMMIT