nftables配置:通过宿主机IP实现虚拟机间邮件流量路由
nftables配置:通过宿主机IP实现虚拟机间邮件流量路由
嘿,这个问题我太熟悉了!你遇到的核心问题是:同一宿主机上的非邮件VM通过宿主机公网IP访问邮件VM时,当前的DNAT规则只对来自WAN接口的流量生效,而内部VM的流量是从桥接接口($dev_bridge)进来的,所以没被转发到邮件VM。
下面给你具体的修改方案:
1. 更新NAT表的规则
你需要在nat表的prerouting链里添加一条针对内部VM流量的DNAT规则,同时补充postrouting链的SNAT规则,确保回复流量能正确返回发起请求的VM。
修改后的nat表配置如下:
table inet nat { chain prerouting { type nat hook prerouting priority -100; policy accept; # 原有:处理来自WAN接口的外部邮件流量 iifname $dev_wan ip daddr $wan_ipv4 tcp dport $mail_tcp_ports dnat to $ip_mail4 # 新增:处理来自内部VM桥接接口、目标为宿主机WAN IP的邮件流量 iifname $dev_bridge ip daddr $wan_ipv4 tcp dport $mail_tcp_ports dnat to $ip_mail4 } # 新增POSTROUTING链规则:确保邮件VM的回复能正确回到发起请求的内部VM chain postrouting { type nat hook postrouting priority 100; policy accept; # 对内部VM访问邮件VM的流量做SNAT,源IP替换为宿主机的桥接接口IP($ip_host4) ip saddr $vm_net4 ip daddr $ip_mail4 tcp dport $mail_tcp_ports snat to $ip_host4 } }
为什么需要这条SNAT规则?如果不做SNAT,邮件VM收到的请求源IP是发起请求的VM的IP,它会直接回复给那个VM,但发起请求的VM原本是向宿主机WAN IP发起的连接,会认为这个回复来自未知源,可能直接丢弃,导致连接失败。
2. 确认Forward链规则
你的现有forward链里已经有iifname $dev_bridge oifname $dev_bridge accept这条规则,它已经允许内部VM之间的所有流量,所以邮件流量的转发是被允许的。如果想要更严格的控制,也可以单独添加一条明确允许邮件流量的规则:
chain forward { type filter hook forward priority 0; policy drop; # 原有规则保持不变... # 可选:明确允许内部VM到邮件VM的邮件端口流量 iifname $dev_bridge oifname $dev_bridge ip saddr $vm_net4 ip daddr $ip_mail4 tcp dport $mail_tcp_ports accept }
3. 验证配置
修改完规则后,记得重新加载nftables配置:
nft -f /etc/nftables.conf
然后可以从内部VM测试连接邮件服务器的端口(比如25、465、587),看看是否能正常建立连接。
备注:内容来源于stack exchange,提问作者jb_alvarado
相关产品推荐
相关产品推荐

