Ubuntu双网卡环境下Postfix指定网卡发件及多服务分网卡使用的路由配置问题
看起来你遇到的是双网卡环境下策略路由配置的典型问题——当前混乱的默认路由导致服务流量选路冲突,要么Postfix发件超时,要么其他服务无法正常工作。我来一步步帮你解决:
第一步:先清理现有混乱的路由表
你当前的路由表有重复的默认路由,这会导致系统随机选择网关,是问题的根源。先删除所有默认路由:
sudo ip route del default via 192.168.18.1 dev eth0 sudo ip route del default via 192.168.1.1 dev eth1 # 确保把所有Metric为0和100的默认路由都删掉
第二步:创建专属路由表
我们要给每个网卡单独配置路由表,让不同来源IP的流量走对应网关:
先编辑路由表配置文件,添加自定义表:
echo "10 eth1table" | sudo tee -a /etc/iproute2/rt_tables echo "20 eth0table" | sudo tee -a /etc/iproute2/rt_tables这里
eth1table是给eth1用的路由表(编号10),eth0table给eth0用(编号20)。给eth1的路由表添加路由(替换成你实际的eth1本机IP,比如假设是
192.168.1.10):sudo ip route add 192.168.1.0/24 dev eth1 src 192.168.1.10 table eth1table sudo ip route add default via 192.168.1.1 dev eth1 table eth1table给eth0的路由表添加路由(替换成你实际的eth0本机IP,比如假设是
192.168.18.20):sudo ip route add 192.168.18.0/24 dev eth0 src 192.168.18.20 table eth0table sudo ip route add default via 192.168.18.1 dev eth0 table eth0table
第三步:添加策略路由规则
让系统根据流量的来源IP选择对应的路由表:
sudo ip rule add from 192.168.1.10 table eth1table sudo ip rule add from 192.168.18.20 table eth0table
这样,从eth1 IP发出的流量会走eth1的网关,从eth0 IP发出的流量会走eth0的网关,完美隔离。
第四步:配置Postfix绑定到eth1
修改Postfix的配置文件,强制它从eth1的IP收发邮件:
- 编辑
/etc/postfix/main.cf:sudo nano /etc/postfix/main.cf - 修改以下参数(替换成你的eth1 IP):
inet_interfaces = localhost, 192.168.1.10 smtp_bind_address = 192.168.1.10 - 重启Postfix生效:
sudo systemctl restart postfix
第五步:配置其他服务绑定到eth0
对于HTTP、FTP等需要走eth0的服务,同样设置它们监听eth0的IP:
- 比如Nginx/Apache,在配置文件里设置
listen 192.168.18.20:80; - FTP服务(比如vsftpd)设置
listen_address=192.168.18.20
这样这些服务的流量会从eth0的IP发出,自动走eth0的网关。
第六步:保存配置确保重启生效
上面的路由配置是临时的,重启后会丢失,我们需要把它们保存下来:
如果你用的是传统的ifupdown,可以把路由和规则命令放到/etc/rc.local(记得给文件加执行权限);如果是Ubuntu 18.04+的Netplan,需要编辑Netplan配置文件(比如/etc/netplan/00-installer-config.yaml),添加路由表和规则的配置,示例如下:
network: ethernets: eth0: addresses: [192.168.18.20/24] routes: - to: default via: 192.168.18.1 table: 20 routing-policy: - from: 192.168.18.20/32 table: 20 eth1: addresses: [192.168.1.10/24] routes: - to: default via: 192.168.1.1 table: 10 routing-policy: - from: 192.168.1.10/32 table: 10 version: 2
然后执行sudo netplan apply生效。
为什么之前的配置会出问题?
- 你之前有多个默认路由,系统会随机选择网关,导致Postfix绑定到eth1时,可能用了eth0的网关,从而无法正确发件(超时)。
- 直接把默认路由改成eth1的话,所有流量都会走eth1,eth0上的服务收到请求后,返回流量会走eth1的网关,导致客户端无法收到响应,所以HTTP/FTP等服务失效。
备注:内容来源于stack exchange,提问作者cianyika

