nftables 伪装

nftables 伪装

在运行 rhel8 的 kvm 主机中,我有一些输入和转发规则工作正常,但现在我想伪装特定桥 virbr0 的流量以在不使用转发链的情况下到达互联网。因此,不使用此 virbr0 网桥的虚拟机或系统容器不应伪装其传出流量。

此 virbr0 网桥的 IP 为 192.168.100.1/24。使用此网桥的虚拟机具有 192.168.200.2/24,其默认 gw 的 IP 地址为 virbr0。我可以从虚拟机解析指向 kvm 主机上的 dns 解析器的 dns 查询。

这是我的 nft 列表规则集

table inet host {
   chain input {
     type filter hook input priority filter; policy drop;
     iif lo accept
     ct state established,related accept
     iifname eth0 tcp dpor { port, port } accept
   }
   chain forward {
     type filter hook forward priority filter; policy drop;
     ct state established,related accept
     # several rules similar to this one
     iifname other-brige oifname tun0 ip saddr x.x.x.x/xx ip daddr { set addresses } tcp dports { set ports } accept
     # here I allow http traffic coming from virbr0 or it will be dropped by nftables (seen in log)
     iifname virbr0 oifname gw0 tcp dport { 80, 443 } accept
     
   }
}
table ip nat {
    chain prerouting {
      type nat hook prerouting priority filter; policy accept; 
    }
    chain postrouting {
      type nat hook postrouting priority mangle; policy accept;
      oifname virbr0 masquerade
    }
}

我一定做错了什么,因为我看到流量从 kvm 主机上的正确接口流出,但它可能没有正确伪装,因此互联网主机不知道如何处理它并丢弃它。

答案1

是的,我做错了什么。

在后路由 nat 链中,我需要添加源 nat 地址:

所以:

table ip nat {
  chain postrouting {
    type nat hook postrouting priority srcnat; policy accept; 
    ip saddr 192.168.100.0/24 iifname virbr0 oifname gw0 snat to x.x.x.x
    oifname virbr0 masquerade
  }
}

现在它满足了我的需要。

相关内容