2022 年,一次"我为了能连上数据库、随手改了一个配置,几天后整个库被人勒索了"的事故,把我对"打通一条路"这件事的理解,从头到尾翻新了一遍。那天我在自己笔记本上,装了个图形化的数据库客户端,想连服务器上的 MySQL,方便看数据。我填好服务器 IP、端口 3306、账号密码,点"连接"——连不上,超时。我以为是密码错了、是防火墙没开。我搜了一圈,看到一句特别"对症"的话:"MySQL 默认只监听本机,把配置里的 bind-address 改成 0.0.0.0 就能远程连了。"我照做,重启 MySQL,再点"连接"——通了!数据整整齐齐地显示出来,我心满意足:搞定。可几天后,我登进数据库,发现里头多了一张我从没建过的表,表名叫 README_TO_RECOVER。打开一看,是一封勒索信:你的数据库已被下载并清空,想要回数据,往这个比特币地址打钱。我整个人僵在屏幕前:我只是想"能连上"我自己的数据库而已。我改的,是【我自己服务器上】的一个配置;我开的,是【我自己】要用的一个端口。这中间,我没碰过任何别人的东西。可为什么,我这么一个朝着"方便自己"使的小动作,会变成一扇门,让一个素不相识的人,长驱直入,把我的数据洗劫一空?这件事逼着我把"服务监听地址"、"能连上"和"该这样连"的区别、SSH 端口转发这一整套,彻底理清了。本文复盘这次实战。
问题背景
环境:CentOS 7 云服务器,MySQL 5.7,想从本地笔记本远程连
事故现象:
- 笔记本上数据库客户端连服务器 3306 —— 连不上
- ★ 我把 bind-address 改成 0.0.0.0,连上了
- 几天后数据库里多出一张表 README_TO_RECOVER,是勒索信
- 数据被下载、被清空
现场排查(事后复盘):
# 1. ★ 当初连不上时,服务监听在哪
$ ss -tlnp | grep 3306
LISTEN 0 128 127.0.0.1:3306 ... # ★ 只监听 127.0.0.1
# 2. ★ 我当初改了什么
$ grep bind-address /etc/my.cnf
bind-address = 0.0.0.0 # ★★ 我改成了这个
# 3. ★ 改完之后,监听地址变了
$ ss -tlnp | grep 3306
LISTEN 0 128 0.0.0.0:3306 ... # ★★ 变成监听所有网卡
# 4. ★ 防火墙,我也开了 3306
$ firewall-cmd --list-ports
3306/tcp # ★ 公网能直达 3306
# 5. ★ 看登录失败日志 —— 触目惊心
$ grep 'Access denied' /var/log/mysql/error.log | wc -l
50000+ # ★★ 几万次暴破尝试
# ★ 来自全世界各地 IP 的扫描和暴力破解,从未停过。
根因(后来想清楚的):
1. ★ MySQL 默认 bind 127.0.0.1 —— 这【不是 bug】,是
一道【默认的安全墙】:数据库默认只服务"本机"。
2. ★ 我连不上,是因为我从笔记本(公网)来的连接,
被这道墙挡在了外面 —— 墙起作用了。
3. ★ 我把 bind 改成 0.0.0.0 + 防火墙开 3306 —— 我做的,
不是"给自己开一扇门",是【把这道墙整个拆了】。
4. ★ 墙一拆,3306 端口就暴露在公网上。全世界的
扫描器,几分钟内就会发现这个开放的数据库端口。
5. ★ 接下来就是几万次自动化的弱口令暴破。只要密码
不够强、或有未打的漏洞 —— 被攻破只是时间问题。
6. 真相:我要的是"我自己能连",我做的却是"所有人
都能连"。这两件事,被我当成了同一件。
不是数据库不安全,是我为了让自己进得来,
把那道本来谁都进不来的墙,亲手拆掉了。
修复 1:连不上的真相——服务监听在哪个地址,决定谁能连它
# === ★ 先搞清楚:我当初为什么连不上 ===
# === ★ 一个服务,要"监听"在某个地址上 ===
# 任何网络服务(MySQL、Redis、后台)启动时,都要
# 【绑定(bind)】到一个 IP 地址 + 端口上,才能
# 接收连接。这个绑定的地址,决定了"谁连得到它"。
$ ss -tlnp | grep 3306
LISTEN 0 128 127.0.0.1:3306 ... # ★ 监听地址 = 127.0.0.1
# === ★ 127.0.0.1 和 0.0.0.0,是两种完全不同的"门" ===
# ★ 127.0.0.1(回环地址 / localhost):
# 只有【这台机器自己】发出的连接,能连到它。
# 从机器外面来的连接,根本【到不了】这个服务。
# ★ 0.0.0.0(所有网卡):
# 这台机器的【每一张网卡】上,都能连到它 ——
# 包括公网网卡。也就是说,★ 任何能在网络上
# 访问到这台机器的人,都能连。
# === ★ 所以"连不上",其实是墙在起作用 ===
# MySQL 默认 bind 127.0.0.1。我从笔记本连过去,
# 连接从公网网卡进来 —— 而服务【只认 127.0.0.1】,
# 公网网卡上根本没有它在听 -> 连接被拒 / 超时。
# ★ 这【不是故障】。这是数据库的默认安全设计:
# "我默认只服务本机,外面的一律不接待。"
# === ★ 为什么数据库要默认这样设计 ===
# 数据库里是最核心的资产。把它直接暴露在公网,
# 等于在闹市区摆一个保险箱,只靠一把密码锁。
# ★ 所以 MySQL、Redis、MongoDB 这些,新版本默认
# 都 bind 127.0.0.1 或 localhost —— 厂商在用
# 默认值,替你挡住一整类灾难。
$ ss -tlnp | grep 6379 # 看 Redis 监听在哪
$ ss -tlnp # 看本机所有监听端口
# === ★ 关键的认知分水岭 ===
# ★ "我连不上" 有两种截然不同的解读:
# - 错的解读:这是个障碍,要把它【消除】掉。
# - 对的解读:这是一道保护墙,我要的是【在不拆墙
# 的前提下,给自己开一条受控的通道】。
# ★ 本文事故,就源于我选了第一种解读。
# === 认知 ===
# ★ 服务启动要 bind 到一个地址:127.0.0.1 只有本机
# 能连,0.0.0.0 是所有网卡(含公网)谁都能连。
# MySQL 默认 bind 127.0.0.1,我从笔记本连不上正是
# 这道默认安全墙在起作用 —— 它不是故障。连不上
# 该想的是"怎么不拆墙开条通道",不是"怎么拆墙"。
修复 2:不该用的解法——把 bind 改 0.0.0.0 等于把数据库摆上公网货架
# === ★ 把我当初做的"解法",彻底否定掉 ===
# === ★ 我做的两步,每一步都在拆墙 ===
# 第一步:改 bind-address
$ vi /etc/my.cnf
bind-address = 0.0.0.0 # ★ 让 MySQL 监听所有网卡
# 第二步:防火墙放行 3306
$ firewall-cmd --permanent --add-port=3306/tcp
$ firewall-cmd --reload
# ★ 这两步合起来 = 把数据库的 3306,完整地、
# 直接地,暴露在了公网上。
# === ★ 这意味着什么:全世界都能"敲你的门" ===
# 公网上,无时无刻不有自动化扫描器,在遍历 IP、
# 探测开放端口。一个公网可达的 3306,通常:
# - 几分钟内,被扫描器发现"这有个 MySQL";
# - 接着,几千、几万次自动化的【弱口令暴破】;
# - 同时,针对该版本【已知漏洞】的攻击。
$ grep 'Access denied' /var/log/mysql/error.log | wc -l
# ★ 本文那几万条失败登录,就是这么来的。
# === ★ "能连上"不等于"该这样连" ===
# ★ 改完之后我确实"能连上"了 —— 但"能连上"这个
# 结果,同时对【我】和【全世界的攻击者】成立。
# ★ 我要的功能是"我能连";我实际部署的功能是
# "所有人都能连"。我把后者,误当成了前者。
# ★ 这是本文最该记住的一句:解决问题时,别只看
# "我的目的达到了没",要看"我顺手【还】打开了
# 什么"。
# === ★ 同样危险的几个"图省事"操作 ===
# ★ 下面这些,和本文是同一类错误,都是"拆墙换方便":
$ redis-server --bind 0.0.0.0 --protected-mode no # Redis 裸奔
$ # 管理后台 / 数据库,直接绑公网 IP 对外
$ # 安全组 / 防火墙,为了省事开 0.0.0.0/0 全放行
# ★ 它们的共同点:用"暴露范围"换"连接方便"。
# 而暴露范围一旦放开,就【收不回】那段已经暴露的
# 时间 —— 这期间被扒走的东西,追不回来。
# === ★ 正确的方向:墙不动,另开一条带锁的通道 ===
# ★ 正解不是"把数据库 bind 改成 0.0.0.0",而是:
# bind 保持 127.0.0.1(墙留着),然后用一条
# 【已经存在、且本来就安全】的通道,把我的连接
# "送进"这台机器内部 —— 这条通道,就是 SSH。
# ★ 下一节,讲这个正解。
# === 认知 ===
# ★ 把 bind 改成 0.0.0.0 加防火墙开 3306,等于把
# 数据库直接摆上公网货架,几分钟内就被扫描器发现、
# 遭几万次弱口令暴破。"能连上"这个结果对你和对
# 攻击者同时成立 —— 你要的是"我能连",做出来的
# 却是"所有人能连"。正解是墙不动,另开受控通道。
修复 3:正解——SSH 本地端口转发,不暴露任何端口也能连
# === ★ 把 bind 改回来,然后用 SSH 隧道连 ===
# === ★ 第一步:把墙重新砌好 ===
$ vi /etc/my.cnf
bind-address = 127.0.0.1 # ★ 改回只监听本机
$ systemctl restart mysqld
$ firewall-cmd --permanent --remove-port=3306/tcp # ★ 防火墙关掉 3306
$ firewall-cmd --reload
# ★ 现在,数据库重新"只服务本机",3306 对公网
# 彻底关闭。和出厂时一样安全。
# === ★ 那我笔记本还怎么连?—— 让连接"从本机发起" ===
# 数据库只接受"来自 127.0.0.1 的连接"。那我就想办法,
# 让我的连接,【在服务器内部、以 127.0.0.1 的身份】
# 发起。做这件事的工具,就是 SSH 端口转发。
# === ★ SSH 本地端口转发(-L) ===
# 在你的笔记本上,执行:
$ ssh -L 9306:127.0.0.1:3306 user@server
# ★ 这条命令,建立了一条隧道。它的意思是:
# ① 在【我笔记本】上,开一个本地端口 9306;
# ② 任何连到笔记本 9306 的流量,都塞进这条
# 【加密的 SSH 连接】,送到 server;
# ③ 流量到了 server,由 server 替我去连
# server 上的 127.0.0.1:3306。
# === ★ 第二步:客户端连"本地的 9306" ===
# 隧道建好后,你笔记本上的数据库客户端,★ 不再去连
# server 的 3306,而是连【你笔记本自己的 9306】:
$ mysql -h 127.0.0.1 -P 9306 -u root -p
# ★ 你连的是本地 9306,SSH 隧道把它接到了
# server 内部的 3306。数据库在 server 那头看到的,
# 是一个【来自 127.0.0.1 的连接】—— 它满意,放行。
# === ★ 妙在哪:3306 一刻也没对公网开放 ===
# ★ 全程,server 的 3306 端口,始终只 bind 127.0.0.1,
# 始终对公网关闭。攻击者扫描你的服务器,扫不到
# 任何开放的数据库端口。
# ★ 你能连,是因为你"借道 SSH 进了服务器内部";
# 攻击者连不了,是因为他没有 SSH 的钥匙。
# ★ 这就是"墙不拆,另开一道带锁的门"。那把锁,
# 就是你早已有的 SSH 认证(密码 / 密钥)。
# === ★ 为什么这条通道本来就安全 ===
# SSH(22 端口)这条路,你【本来就要用它登录服务器】。
# 它全程加密,有成熟的认证体系。端口转发,只是
# 让数据"搭一下这趟早已开通、且安全的车" ——
# ★ 没有新增任何对外暴露的攻击面。
# === 认知 ===
# ★ 正解是 SSH 本地端口转发:ssh -L 本地端口:目标:
# 目标端口 user@server,在笔记本开一个本地端口,
# 流量经加密 SSH 隧道送到服务器内部再连数据库。
# 客户端连本地端口即可,3306 全程不对公网开放。
# 你能连是因为有 SSH 钥匙,攻击者没有 —— 墙不拆,
# 只是借早已安全的 SSH 通道开了一道带锁的门。
修复 4:把 -L 的三个角色彻底讲清
# === ★ -L 参数最容易搞混,一个一个钉清楚 ===
# === ★ -L 的完整语法 ===
# ssh -L [本地监听地址:]本地端口:目标主机:目标端口 跳板机
$ ssh -L 9306:127.0.0.1:3306 user@server
# (1) (2) (3) (4) (5)
# (1) 本地端口 9306 —— 在【你运行 ssh 的机器】上开
# (2)(3) 目标 127.0.0.1:3306
# (5) 跳板机 user@server —— 隧道的另一头
# === ★ 最关键、最易错的一点:(3) 的视角 ===
# ★ "127.0.0.1:3306" 这个目标地址,是【从跳板机
# server 的视角】去解析、去连接的!
# ★ 它指的是"server 上的 127.0.0.1 的 3306",
# 【不是】你笔记本上的 127.0.0.1。
# ★ 想一下就通:流量经隧道到了 server,是 server
# 替你去连目标 —— 当然是用 server 的视角看目标。
# === ★ 由此,能转发的不只是"跳板机自己"的服务 ===
# 目标主机那一段,填的可以是【从跳板机能访问到的
# 任何主机】,不限于跳板机本身:
$ ssh -L 8000:192.168.1.50:80 user@server
# ★ 这条:在笔记本开 8000,经 server 中转,去连
# 【server 所在内网里】192.168.1.50 的 80 端口。
# ★ server 成了你进入那个内网的"跳板" —— 哪怕
# 192.168.1.50 你笔记本根本直连不到。
# === ★ (1) 本地监听地址:默认只有自己能用 ===
# 不写本地监听地址时,默认是 127.0.0.1 —— 意思是
# ★ 这条隧道的入口,【只有你笔记本自己】用得了。
$ ssh -L 9306:127.0.0.1:3306 user@server # 入口仅本机
# ★ 如果写成 0.0.0.0,则你局域网里【别人】也能
# 用你这条隧道 —— 这又是一次"扩大暴露",慎用:
$ ssh -L 0.0.0.0:9306:127.0.0.1:3306 user@server # ★ 慎用!
# === ★ 一句话记住三个角色 ===
# ★ 本地端口:在【我】这开,我连它。
# ★ 目标主机:目标端口:【跳板机】替我去连的那个东西。
# ★ 跳板机:隧道的另一头,我有它的 SSH 钥匙。
# === 认知 ===
# ★ ssh -L 本地端口:目标主机:目标端口 跳板机:本地
# 端口在你运行 ssh 的机器上开;最易错的是目标主机
# 是【从跳板机视角】去连的,127.0.0.1 指跳板机
# 自己。目标主机可填跳板机能访问的任何内网主机。
# 本地监听地址默认 127.0.0.1 只有自己能用,写
# 0.0.0.0 会让局域网别人也能用、慎用。
修复 5:隧道持久化与进阶——-f -N、保活、-R、-D
# === ★ 让隧道更好用、更稳,以及另外两种转发 ===
# === ★ 纯转发:-f -N,不开 shell、转后台 ===
# 直接 ssh -L ... 会同时给你一个登录 shell,且占着
# 终端。如果你【只要隧道、不要 shell】:
$ ssh -f -N -L 9306:127.0.0.1:3306 user@server
# ★ -N:不执行远程命令(不开 shell),纯转发。
# ★ -f:建立连接后转入后台。
# ★ 这条命令一跑,隧道在后台默默工作,终端还给你。
# === ★ 隧道会断:加保活参数 ===
# 网络抖动、长时间空闲,SSH 隧道会断。加保活:
$ ssh -f -N -o ServerAliveInterval=30 -o ServerAliveCountMax=3 \
-L 9306:127.0.0.1:3306 user@server
# ★ ServerAliveInterval=30:每 30 秒发个心跳包,
# 既能及时发现断线,也能防止被中间设备掐掉空闲连接。
# ★ 要"断了自动重连",用 autossh:
$ autossh -f -N -L 9306:127.0.0.1:3306 user@server
# === ★ 写进 ~/.ssh/config,一劳永逸 ===
$ vi ~/.ssh/config
Host db-tunnel
HostName server
User user
LocalForward 9306 127.0.0.1:3306 # ★ = -L 9306:127.0.0.1:3306
ServerAliveInterval 30
# ★ 之后只需:
$ ssh -f -N db-tunnel # 隧道就起来了
# === ★ 进阶 1:-R 反向端口转发(方向反过来)===
# 场景:一台【没有公网 IP】的内网机器,想让外面连到它。
# -L 是"我连进去",-R 是"我把自己推出去":
$ ssh -R 8022:127.0.0.1:22 user@public-server
# ★ 在有公网的 public-server 上开 8022,谁连
# public-server:8022,就被转回这台内网机的 22。
# ★ 注意:-R 转发默认只在跳板机的 127.0.0.1 上监听,
# 要让跳板机的【公网】也能用,需在跳板机
# sshd_config 里开 GatewayPorts yes。
# === ★ 进阶 2:-D 动态转发(SOCKS 代理)===
$ ssh -f -N -D 1080 user@server
# ★ -D 1080:在本地 1080 起一个 SOCKS5 代理。把
# 浏览器代理设成 127.0.0.1:1080,所有流量就经
# server 转发 —— 一条隧道顶多个 -L。
# === ★ 进阶 3:ProxyJump 串跳板机 ===
# 要连的机器,得先过一台跳板机才能到:
$ ssh -J user@jump-host user@target-host
# ★ -J 自动经 jump-host 中转连 target-host,
# 连内网深处的机器很常用。
# === 认知 ===
# ★ 纯转发用 ssh -f -N(后台、不开 shell);加
# ServerAliveInterval 保活、autossh 自动重连;
# 写进 ~/.ssh/config 的 LocalForward 一劳永逸。
# -L 是把外部连进内网,-R 反向把内网服务推给
# 公网跳板(需 GatewayPorts),-D 起 SOCKS 代理,
# -J 串跳板机。
修复 6:SSH 隧道与端口暴露排查纪律
# === 这次事故暴露的认知盲区,定几条纪律 ===
# === 1. ★ 服务 bind 127.0.0.1 只服务本机,0.0.0.0 是所有网卡谁都能连 ===
# === 2. ★ 数据库/Redis 默认 bind 127.0.0.1 是安全墙,连不上别想着拆墙 ===
# === 3. ★ 把 bind 改 0.0.0.0 + 防火墙开端口 = 把服务摆上公网,几分钟被扫到 ===
# === 4. ★ "能连上"不等于"该这样连",改动前先想"我顺手还打开了什么" ===
# === 5. 正解是 SSH 本地端口转发 ssh -L 本地端口:目标:目标端口 跳板机 ===
$ ssh -f -N -L 9306:127.0.0.1:3306 user@server
# === 6. ★ -L 里的目标主机是从跳板机视角连的,127.0.0.1 指跳板机自己 ===
# === 7. 客户端连本地端口,服务端口全程不对公网开放,墙一直在 ===
# === 8. ★ 隧道入口默认只本机能用,写 0.0.0.0 会让局域网别人也能用、慎用 ===
# === 9. 隧道加 ServerAliveInterval 保活、autossh 自动重连、写进 ssh config ===
# === 10. 自查"我有没有把内部服务暴露公网"的步骤链 ===
$ ss -tlnp # ① 看本机所有监听端口
# ★ 重点看有没有 0.0.0.0:3306 / 6379 / 27017 这类
$ firewall-cmd --list-ports # ② 防火墙放行了哪些端口
$ # ③ 云控制台安全组,有没有 0.0.0.0/0 放行数据库端口
# 凡是数据库/缓存/管理后台,都应 bind 127.0.0.1 +
# 端口不对公网,远程访问一律走 SSH 隧道。按此自查。
命令速查
需求 命令
=============================================================
看本机所有监听端口 ss -tlnp
看某服务监听在哪个地址 ss -tlnp | grep 3306
本地端口转发(连进去) ssh -L 9306:127.0.0.1:3306 user@server
纯转发 后台 不开 shell ssh -f -N -L 9306:127.0.0.1:3306 user@server
转发内网另一台主机 ssh -L 8000:192.168.1.50:80 user@server
反向转发(把自己推出去) ssh -R 8022:127.0.0.1:22 user@public-server
动态转发(SOCKS 代理) ssh -f -N -D 1080 user@server
经跳板机连目标 ssh -J user@jump user@target
隧道保活 ssh -o ServerAliveInterval=30 ...
断线自动重连 autossh -f -N -L ...
查防火墙放行端口 firewall-cmd --list-ports
口诀:bind 127.0.0.1 是安全墙连不上别拆墙,改 0.0.0.0 等于摆上公网货架
正解 ssh -L 借 SSH 通道连进去,目标主机从跳板机视角看 端口全程不暴露
避坑清单
- 服务监听地址决定谁能连它,127.0.0.1 只有本机能连,0.0.0.0 是所有网卡含公网谁都能连
- MySQL Redis 默认 bind 127.0.0.1 是默认的安全墙不是 bug,连不上正是这道墙在起作用
- 把 bind 改成 0.0.0.0 再加防火墙开端口,等于把数据库直接摆上公网货架几分钟就被扫描器发现
- 能连上不等于该这样连,改成 0.0.0.0 后能连上这个结果对你和对全世界攻击者同时成立
- 解决问题前先想我顺手还打开了什么,暴露范围一旦放开那段暴露时间里被扒走的东西追不回来
- 正解是 SSH 本地端口转发 ssh -L 本地端口 目标 目标端口 跳板机,墙不拆借安全的 SSH 通道连进去
- -L 里的目标主机是从跳板机视角去连的,127.0.0.1 指的是跳板机自己不是你笔记本
- 隧道入口默认只监听 127.0.0.1 只有自己能用,写成 0.0.0.0 会让局域网别人也能用要慎用
- 纯转发用 ssh -f -N 后台不开 shell,加 ServerAliveInterval 保活 autossh 自动重连写进 ssh config
- 定期 ss -tlnp 自查有没有数据库缓存端口监听在 0.0.0.0,云安全组别用 0.0.0.0/0 放行数据库端口
总结
这次"为了连自己的数据库、把数据库拱手送人"的事故,纠正了我一个关于"解决问题"的、根深蒂固的本能。在我过去的脑子里,遇到一个障碍——比如"我连不上"——我的第一反应,永远是【把这个障碍消除掉】。障碍就是麻烦,麻烦就该被清掉,这在我看来天经地义。我连不上,是因为有一道墙挡着;那解决方案,不就是【把墙拆了】吗?我改 bind-address 的那一刻,心里甚至有点畅快:挡我路的东西,我把它干掉了。我从没问过自己一个问题:这道墙,它【为什么】在这儿?是谁、出于什么目的,把它砌在这里的?现场用一封勒索信,逼着我把这个问题补上了。那道挡着我的墙,根本不是"碰巧挡了我路的障碍"——它是一道【有人精心设计的、保护我的屏障】。MySQL 的作者,默认让它 bind 127.0.0.1,不是疏忽,是替千千万万个像我这样的人,挡住一整类灾难。它挡住了我,是因为它在【尽职】——它分不清门外站的是主人还是窃贼,所以它对【所有】门外的人,一视同仁地说"不"。我把这道墙拆了,确实让我自己进来了;可墙这个东西,它从不只为某一个人挡。我拆掉它的同一瞬间,我也为全世界的窃贼,拆掉了同一道墙。我以为我在"清除一个障碍",其实我在"撤掉一个保护"。复盘到根上我才明白,我混淆了"障碍"和"边界"这两样长得很像、本质却相反的东西。障碍,是无意义的阻挡,该消除;边界,是有意义的限制,它挡住坏的,代价是同时挡住一部分好的——它不该被消除,而该被【正确地穿过】。一道边界拦住了我,正确的回应,从来不是"把边界推倒",而是"找到那扇为合法的人留的、带锁的门,用我的钥匙走进去"。SSH 隧道教会我的,正是这件事:墙,一寸不动;我,不去硬闯,而是借一条早已为我开通、且本身就上了锁的通道,堂堂正正地走进去。我要的"方便",和那道墙要的"安全",从来不是敌人——把它们摆成"二选一"的,是我那个"障碍就该清除"的、太急的本能。这次最大的收获,是我对自己"想抄近路"的那个冲动,生出了一道刹车。下一次,当某个限制挡住我、而我心里冒出"把它去掉不就行了"这个念头时,我会强迫自己先停下来,问三个问题:这个限制,当初是【谁】、为了【挡住什么】而设的?我若把它去掉,被我一并放进来的,【还有谁】?有没有一条路,能让我这个该进来的人进来,同时把不该进来的,继续挡在外面?因为绝大多数挡着我的东西,都不是路上的石头,而是别人为我砌的堤坝。拆掉一座堤坝,水固然流过来了——可流过来的,从来不只是我想要的那一瓢。
—— 别看了 · 2026