在运行 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
}
}
现在它满足了我的需要。