Linux中systemd服务禁外网的核心是PrivateNetwork=yes隔离网络命名空间,仅保留lo;辅以RestrictAddressFamilies限制协议族、IPAddressAllow/Deny控制内网白名单,并叠加PrivateUsers=yes和NoNewPrivileges=yes防逃逸。

Linux 中 systemd 服务限制访问外网 IP,核心不是“封某个外网地址”,而是让服务根本“看不见”外网——通过网络命名空间隔离 + 协议与地址白名单控制,从启动源头切断外网能力。
启用私有网络命名空间
这是最关键的一步。在服务单元文件(如 /etc/systemd/system/myapp.service)的 [Service] 段中添加:
-
PrivateNetwork=yes:服务启动时进入独立网络 namespace,仅保留
lo回环接口,完全无法看到eth0、wlan0等物理网卡,也无法访问主机上监听的任何端口(如 80、3306)。 - 该设置对纯本地处理类服务(如日志压缩、配置校验)已足够安全。
- 注意:
systemctl status查看日志可能变慢(journal 依赖网络 socket),可加 StandardOutput=journal+console 缓解。
限定可用协议族
即使在私有网络中,进程仍可能通过 AF_NETLINK 或 AF_UNIX 探测宿主机。用 RestrictAddressFamilies 显式收窄允许的地址族:
Agent 记忆系统 — 五路融合检索 + 双时间线 + 因果链 + Spirit管家 + 记忆回声 + 弹性配置 + Circuit Breaker + GDPR合规 + 192项安全审计修复
- 只允许 IPv4 连接:RestrictAddressFamilies=AF_INET
- 彻底禁用所有网络通信(仅保留本地 socket):RestrictAddressFamilies=AF_UNIX
- 严禁使用
AF_UNSPEC(等价于不限制,会绕过全部控制)。
按需放行目标内网 IP(禁止外网的关键)
在 PrivateNetwork=yes 基础上,用 IPAddressAllow 和 IPAddressDeny 做精细白名单:
- 只允许连内网数据库:IPAddressAllow=192.168.5.0/24 + IPAddressDeny=any
- 若需访问特定内网 API:IPAddressAllow=10.10.20.100,不写其他 IPAddressAllow 就默认拒绝一切。
- IPAddressDeny 仅作用于 outbound 连接;inbound 监听仍需配合防火墙(如 nftables)或服务自身绑定逻辑。
叠加用户命名空间防逃逸
单靠网络隔离不够——攻击者可能通过 /proc/net 或 netlink 获取宿主机信息。补上两道防线:
-
PrivateUsers=yes:服务以 UID 0 启动,但运行在映射的用户 namespace 中,对宿主机无真实 root 权限(需提前配置
/etc/subuid和/etc/subgid)。 -
NoNewPrivileges=yes:禁止通过
execve()获得新权限,阻断利用 AF_NETLINK 修改路由等提权路径。

















