2.8.4 服务监听与绑定地址管理
4. 服务监听与绑定地址管理#
服务监听决定“哪个端口接受连接”,绑定地址决定“哪些网卡/来源可以访问”。合理管理可降低暴露面、提升多网卡隔离,并便于排错。
一、原理草图:监听与绑定的网络边界
二、安装与工具准备(ss/netstat/lsof)
- Debian/Ubuntu:
sudo apt update
sudo apt install -y iproute2 net-tools lsof
- RHEL/CentOS/Rocky:
sudo yum install -y iproute net-tools lsof
三、查看监听与绑定(含命令解释)
# 查看所有 TCP 监听与所属进程
ss -lntp
# -l: 仅监听 -n: 数字格式 -t: TCP -p: 进程信息
# 查看 UDP 监听
ss -lnup
# 列出所有监听端口与进程(旧系统常见)
netstat -lntup
# 查看端口与进程映射(包含 IPv4/IPv6)
lsof -i -P -n | grep LISTEN
预期效果:输出中包含 Local Address(绑定地址:端口)与进程名/PID。
四、典型服务绑定配置示例(可执行)
1) SSH 仅管理网监听
# 文件:/etc/ssh/sshd_config
ListenAddress 10.0.0.10
Port 22
# 验证配置并重载
sudo sshd -t
sudo systemctl reload sshd
预期效果:ss -lntp | grep sshd 只显示 10.0.0.10:22。
2) Nginx 内外网分离监听
# 文件:/etc/nginx/conf.d/site.conf
server {
listen 10.0.0.10:80;
server_name internal.example.com;
location / { return 200 "internal ok\n"; }
}
server {
listen 0.0.0.0:80;
server_name public.example.com;
location / { return 200 "public ok\n"; }
}
sudo nginx -t
sudo systemctl reload nginx
预期效果:内外网都能访问,但内部接口仅内网地址可达。
3) MySQL 仅内网访问
# 文件:/etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf
[mysqld]
bind-address = 10.0.0.11
port = 3306
sudo systemctl restart mysqld
ss -lntp | grep 3306
预期效果:只显示 10.0.0.11:3306。
4) Redis 绑定多地址 + 保护模式
# 文件:/etc/redis/redis.conf
bind 127.0.0.1 10.0.0.12
port 6379
protected-mode yes
sudo systemctl restart redis
ss -lntp | grep 6379
5) 双栈监听注意点(IPv4/IPv6)
# 查看是否有 :: 表示 IPv6 全监听(可能同时覆盖 IPv4)
ss -lntp | grep '::'
如需仅 IPv4:
# 示例:某些服务支持设置仅 IPv4
listen 0.0.0.0:8080;
五、端口绑定的排错流程(含命令)
1) 端口被占用
sudo ss -lntp | grep :8080
sudo lsof -i :8080
# 结束占用进程(谨慎)
sudo kill -9 <PID>
2) 绑定地址不存在
ip addr show
# 确认配置中的 IP 存在于本机网卡
3) 外部访问不到
# 1. 本机是否监听正确
ss -lntp | grep :3306
# 2. 防火墙是否放行
sudo firewall-cmd --list-ports
# 或
sudo iptables -L -n
# 3. 路由可达性
ip route
六、实战演练(带验证步骤)
练习1:将本地服务限制为仅本机访问
# 启动一个 Python HTTP 服务,仅绑定 127.0.0.1
python3 -m http.server 8000 --bind 127.0.0.1
# 验证监听地址
ss -lntp | grep 8000
# 验证访问
curl http://127.0.0.1:8000
# 从另一台机器访问应失败
练习2:多网卡隔离监听
# 假设有两块网卡:10.0.0.10(业务网),192.168.1.10(管理网)
# 用 socat 启动两个监听示例
socat TCP-LISTEN:9000,bind=10.0.0.10,reuseaddr,fork EXEC:'/bin/cat'
socat TCP-LISTEN:9001,bind=192.168.1.10,reuseaddr,fork EXEC:'/bin/cat'
# 验证
ss -lntp | egrep '9000|9001'
七、关键建议与安全基线
- 默认“最小暴露”:优先绑定 127.0.0.1 或内网地址。
- 多网卡场景分离管理网、业务网、存储网。
- 绑定不是安全终点,必须配合防火墙与访问控制。
- 变更绑定后,务必 ss/lsof 验证与联通性测试。