多网卡服务器需通过策略路由隔离:为每网卡建独立路由表并绑定源IP,禁用IP转发与严格rp_filter,用iptables限制跨网卡通信,服务须绑定指定IP且防火墙精细化放行。

在多网卡服务器环境中,不同网卡通常接入不同网络(如内网、外网、管理网、存储网),若不加隔离,容易出现路由混乱、跨网段误访问、安全策略失效等问题。核心思路是:**按网卡划分路由表,用策略路由(Policy-Based Routing)绑定源地址与出口路径,并配合防火墙限制跨网卡通信**。
为每张网卡配置独立路由表
Linux 默认只使用 main 路由表,多网卡时需为每张网卡(如 eth0、eth1)创建专用路由表,避免默认网关冲突。
- 编辑 /etc/iproute2/rt_tables,追加自定义表名与ID(如:200 table_eth0、201 table_eth1)
- 为 eth0 添加默认路由到其对应表:ip route add default via 192.168.1.1 dev eth0 table table_eth0
- 为 eth1 添加默认路由到其对应表:ip route add default via 10.10.2.1 dev eth1 table table_eth1
- 确保各表中包含对应网段的直连路由(通常自动添加,可执行 ip route show table table_eth0 验证)
用策略路由指定流量出口
仅配路由表还不够,系统仍可能按 main 表转发。需通过规则(rule)告诉内核:来自某网卡 IP 的包,查哪个表。
- 添加源地址匹配规则:ip rule add from 192.168.1.100 table table_eth0
- 添加另一网卡 IP 规则:ip rule add from 10.10.2.50 table table_eth1
- 若需按目的网段分流(如所有访问 172.16.0.0/16 的流量走 eth1),可用:ip rule add to 172.16.0.0/16 table table_eth1
- 规则优先级由数字决定,越小越先匹配;可用 ip rule show 查看顺序
禁止跨网卡互访(路由隔离)
即使路由分离,内核仍可能响应其他网卡发来的 ARP 或转发跨网段请求。必须关闭非必要转发并限制响应行为。
- 关闭全局 IP 转发:echo 0 > /proc/sys/net/ipv4/ip_forward(除非明确需要做网关)
- 对每个网卡单独禁用反向路径过滤(避免因回程路径不一致丢包):echo 2 > /proc/sys/net/ipv4/conf/eth0/rp_filter(推荐设为2,宽松模式)
- 用 iptables/nftables 显式拒绝跨网卡通信,例如:iptables -A INPUT -i eth0 -o eth1 -j DROP(注意:-i/-o 在 INPUT 链中实际不可用,应改用 -i eth1 -s 192.168.1.0/24 等基于源IP+入接口组合判断)
- 更稳妥做法是按入接口 + 源IP网段限制:iptables -A INPUT -i eth1 -s 192.168.1.0/24 -j DROP
服务监听与应用层访问控制
操作系统路由隔离后,还需确保上层服务不监听错误网卡,或被非授权网络访问。
- 检查服务绑定地址:如 Nginx 的 listen 192.168.1.100:80,而非 listen *:80;MySQL 的 bind-address = 127.0.0.1 或具体内网IP
- 数据库、Redis 等中间件默认只绑本地,若开放远程,务必限定 bind-address 为对应业务网卡IP
- 配合防火墙放行策略:只允许特定网段通过指定网卡访问端口,例如:iptables -A INPUT -i eth0 -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
- 对于容器环境(如 Docker),注意 --network=host 会绕过主机网络策略,建议使用自定义 bridge 并配合 host 网络命名空间隔离











