如何在AppArmor配置文件中允许程序访问特定的网络端口?
美国、香港服务器
如何在AppArmor配置文件中允许程序访问特定的网络端口?
12-30 来源:
在 AppArmor 配置文件中允许程序访问特定网络端口,核心是通过 network 规则 结合 端口 / 协议条件 实现精准控制,遵循「最小权限原则」—— 仅开放程序业务必需的端口和协议(TCP/UDP),拒绝所有未显式允许的网络访问。以下是适配 Ubuntu 24.04 的完整配置方法、示例和验证步骤:
一、核心语法:允许特定端口的 network 规则
AppArmor 控制网络端口的规则格式分为 基础格式 和 精准条件格式,后者可指定协议、IP 地址和端口:
apparmor
# 格式1:允许特定协议+端口(推荐,精准控制)
network [协议] port=[端口号],
# 格式2:允许特定IP+协议+端口(限制访问来源/目标)
network [协议] addr=[IP地址] port=[端口号],
# 格式3:允许端口范围(如 8000-9000)
network [协议] port=[起始端口]-[结束端口],
关键参数说明
参数 取值范围 示例 作用
[协议] tcp/udp/icmp tcp 指定网络协议,必填(否则允许所有协议)
[IP地址] 单个 IP / 网段(如 127.0.0.1/192.168.1.0/24) addr=127.0.0.1 限制程序仅能访问该 IP的端口,或仅能在该 IP上监听端口
[端口号] 1-65535 或端口范围 port=8080/port=8000-9000 允许访问的目标端口,或程序自身监听的端口
权限方向说明
主动访问目标端口:程序作为客户端,访问外部服务的端口(如 MySQL 客户端访问 3306 端口)。
监听本地端口:程序作为服务端,在本地端口提供服务(如 Nginx 监听 80 端口)。
AppArmor 的 network 规则同时支持这两种场景,无需额外区分。
二、分场景配置示例
以下以自定义程序 /usr/local/bin/myapp 为例,演示不同网络端口需求的配置方法。
场景 1:允许程序主动访问外部特定端口(客户端场景)
需求:让 myapp 作为客户端,通过 TCP 协议 访问外部的 MySQL 3306 端口和 Redis 6379 端口。配置文件 /etc/apparmor.d/usr.local.bin.myapp 内容:
apparmor
/usr/local/bin/myapp {
# 基础系统依赖(必选)
/lib/** r,
/usr/lib/** r,
/usr/local/bin/myapp mr,
# ========== 网络端口规则 ==========
# 允许TCP访问外部3306端口(MySQL)
network tcp port=3306,
# 允许TCP访问外部6379端口(Redis)
network tcp port=6379,
# 敏感目录拒绝+兜底规则
deny /etc/shadow r,
deny /** w,
}
场景 2:允许程序监听本地特定端口(服务端场景)
需求:让 myapp 作为服务端,仅在 本地 127.0.0.1 上监听 TCP 8080 端口(禁止外网访问该端口)。核心规则:
apparmor
/usr/local/bin/myapp {
# 基础系统依赖(省略)
# ========== 网络端口规则 ==========
# 仅允许在本地127.0.0.1监听TCP 8080端口
network tcp addr=127.0.0.1 port=8080,
# 兜底规则:禁止其他所有网络访问
deny network all,
}
场景 3:允许程序访问端口范围 + 指定协议
需求:让 myapp 通过 UDP 协议 访问 10000-10010 端口范围,用于音视频传输。核心规则:
apparmor
/usr/local/bin/myapp {
# 基础系统依赖(省略)
# ========== 网络端口规则 ==========
# 允许UDP访问10000-10010端口范围
network udp port=10000-10010,
# 兜底规则
deny /etc/shadow r,
deny /** w,
}
场景 4:允许程序访问特定 IP 的特定端口(精准限制)
需求:让 myapp 仅访问 192.168.1.100 这台服务器的 TCP 22 端口(SSH),禁止访问其他 IP 的 22 端口。核心规则:
apparmor
/usr/local/bin/myapp {
# 基础系统依赖(省略)
# ========== 网络端口规则 ==========
# 仅允许访问 192.168.1.100:22
network tcp addr=192.168.1.100 port=22,
# 兜底规则:禁止其他网络访问
deny network all,
}
三、关键注意事项(避免配置失效)
协议必须明确指定若只写 network port=8080 而不指定 tcp/udp,规则不生效,必须显式声明协议。
apparmor
# 错误写法(无协议,规则无效)
network port=8080,
# 正确写法
network tcp port=8080,
监听端口需配合程序自身权限若程序需监听 1-1024 特权端口(如 80、443、22),需额外添加 capability net_bind_service 规则,否则程序无法绑定特权端口:
apparmor
# 允许绑定特权端口(如 80/443)
capability net_bind_service,
兜底规则优先禁止所有网络推荐在配置文件末尾添加 deny network all,,仅开放业务必需的端口,避免规则遗漏导致的网络访问权限过大。
IP 地址限制的双向作用
addr=127.0.0.1:程序仅能在本地监听端口,或仅能访问本地的目标端口;
addr=192.168.1.0/24:程序仅能访问该网段内的端口,适合内网业务场景。
四、验证端口访问规则是否生效
步骤 1:加载配置文件
bash
运行
# 编译检查语法错误
sudo apparmor_parser -vW /etc/apparmor.d/usr.local.bin.myapp
# 重新加载AppArmor服务
sudo systemctl reload apparmor
# 切换为强制模式(生产环境)
sudo aa-enforce /etc/apparmor.d/usr.local.bin.myapp
步骤 2:测试授权端口访问
运行程序,尝试访问已授权的端口(如 127.0.0.1:8080),若能正常连接且无 DENIED 日志,说明规则生效。
步骤 3:测试未授权端口访问(验证拦截效果)
故意让程序访问未授权的端口(如 127.0.0.1:22),查看 AppArmor 拦截日志:
bash
运行
sudo grep -i apparmor /var/log/syslog | grep myapp
若输出以下日志,说明规则成功拦截未授权端口访问:
plaintext
apparmor="DENIED" operation="connect" profile="/usr/local/bin/myapp" name="tcp://127.0.0.1:22" pid=1234 comm="myapp" requested_mask="send receive" denied_mask="send receive"
五、调试:补充缺失的端口权限
若程序因端口访问被拦截导致功能异常,按以下步骤排查:
切换到 complain 模式(仅记录日志,不拦截):
bash
运行
sudo aa-complain /etc/apparmor.d/usr.local.bin.myapp
运行程序并触发所有网络相关业务操作;
查看日志,提取被拒绝的端口和协议:
bash
运行
sudo grep -i "network" /var/log/syslog | grep myapp
在配置文件中补充对应的 network 规则,重新加载即可。
总结
允许程序访问特定网络端口的核心逻辑:
明确程序的网络角色(客户端 / 服务端)和必需端口 / 协议;
在配置文件中写入 network [协议] port=[端口号] 规则,按需添加 IP 限制;
编译加载规则,通过日志验证拦截效果。
三二互联专业提供香港VPS,美国VPS主机,香港云服务器租用等业务香港美国到大陆CN2 GIA速度最快