笔记
0工具
0此页用于记录用户反馈问题后的每一次改进
关于
“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。
md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。
要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。
在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。
要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。
工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。
写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。
适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。
不想公开、只想临时给人看:点“分享”生成一条带密码和有效期的链接,到期自动失效,你也能随时撤销。
你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。
全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。
这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。
不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。
产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。
如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。
趋势
fail2ban 的 recidive 把我连 ban 七天:多个 jail 累计误伤的坑
记录一个让我折腾了大半天的 fail2ban 坑。背景:我有台阿里云机器,上面装了 fail2ban,自己把 sshd 的 jail 调得比较激进,bantime 设成 3600 秒,findtime 600 秒,maxretry 3,想着早点把扫端口的封掉。结果某天白天我自己的固定 IP(办公室出口,连着 CI 和一台监控探针)怎么都连不上 SSH,连接直接超时,ping 却能通——一看就是被防火墙 drop 了。
上云厂商的网页 VNC 进去,先 fail2ban-client status 看 jail 列表,除了 sshd 还有个 recidive,里面赫然躺着我办公室那个 IP。当时就愣了:我 sshd 的 bantime 只设了 1 小时,怎么会被封这么久?查了下 ban 时间,剩余还有六天多。这才想起来 fail2ban 默认配置里有个 recidive jail,它的作用是把“反复进别的 jail”的 IP 拉出来长期封。默认参数大概是 bantime 604800 秒(整整七天)、findtime 86400 秒、maxretry 3 到 5 次,不同发行版略不一样。逻辑是:一个 IP 在一段时间内多次被任意 jail 封过,就说明它是惯犯,升级成周级别的封禁。
问题就出在这儿。我办公室那台探针,每天夜里会跑一个 rsync 备份脚本,脚本用的 SSH 密钥某次轮换后没更新到服务器的 authorized_keys 里,于是每天凌晨都会来几次 Failed,触发 sshd jail 短封一小时。单看每天没啥,但 recidive 按的是“累计次数”,几天下来凑够了阈值,直接给我甩了个七天套餐。我在公司连不上服务器,还以为是网络问题,绕了一大圈。
解封很简单:fail2ban-client set recidive unbanip 我的IP,再把 sshd 里残留的也清一遍 fail2ban-client set sshd unbanip 我的IP。但根子得改配置,不然过几天又来。我把 rsync 的密钥换掉,让探针别再产生失败尝试;同时把办公室出口 IP 加进 ignoreip。这里有个容易漏的点:ignoreip 要是只写在 [sshd] 这个 jail 下面,recidive 照样会封你,因为 recidive 看的是别的 jail 的封禁记录,不看你的 ignoreip。正确做法是把 ignoreip 写到 [DEFAULT] 段,所有 jail 一起生效:
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1 我的办公室出口IP/32
ignoreip 支持 IP、CIDR,也支持 DNS 名字,但 DNS 名字每次重载会重新解析,动态 IP 的家庭宽带就别指望它了,老老实实配固定出口或者用 ignorecommand 挂个脚本去查你当前的 IP。我懒得搞脚本,办公室是固定 IP,直接写死。
顺手把 recidive 的参数也改温和了点,写在 /etc/fail2ban/jail.local 里覆盖默认:
[recidive]
enabled = true
logpath = /var/log/fail2ban.log
bantime = 604800
findtime = 86400
maxretry = 6
maxretry 提到 6,意思是得累计被不同 jail 封六次才升级,误伤概率小很多。改完 systemctl reload fail2ban,让配置生效。注意 reload 和 restart 的区别:reload 会重新读配置但保留当前封禁状态,restart 会把内存里的封禁清掉重新从数据库加载。fail2ban 0.11 之后封禁记录会落进 /var/lib/fail2ban/fail2ban.sqlite3,restart 后自动恢复,所以想彻底清某个 IP 的封禁,unbanip 才是正道,别指望重启服务。
后来我养成了习惯:凡是 fail2ban 出现“封禁时间长得不合理”的情况,先 status 看命中的是哪个 jail,别只看 sshd。recidive 这种靠累计触发的 jail,最容易把自己人误伤进去,尤其是家里有定时任务、监控、CI 这类“每天都来戳一下”的机器。白名单要写在 [DEFAULT],长封要想着去 recidive 里解。这次要不是有网页 VNC 兜底,光靠 SSH 我根本进不去,算是长了记性。
补充一点:fail2ban-client status recidive 显示的是当前生效的封禁,想确认某个 IP 是不是被 recidive 盯上,也可以直接 fail2ban-client get recidive banned 把封禁列表打出来,比翻日志快。还有 recidive 依赖 fail2ban 自己的运行日志,/var/log/fail2ban.log 要是被 logrotate 切得太勤、或者日志级别被调低到不记录 Ban 事件,recidive 就相当于瞎了,这是它和普通 jail 不一样的地方——普通 jail 看的是被保护服务的日志,recidive 看的是 fail2ban 自己记的封禁历史。改参数的时候别光调数字,确认 fail2ban.log 里每天都有 Ban 记录在写,这套机制才靠得住。