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
}
}
이제는 내 요구 사항을 충족합니다.