Nat /
            Configure NAT inside VMM
Network address translation? can be configured for virtual machines run inside vmm.
First, in the hypervisor, we configure the proper interfaces:
# cat /etc/hostname.veb0
add tap0
add vport0
link1
# cat /etc/hostname.vport0
inet 10.0.5.1 0xffffff00
up
# cat /etc/vm.conf
socket owner :vmdusers
switch "switch0" {
    locked lladdr
    interface veb0
}
bsdiso="/home/iso/install75.iso"
vm "user" {
    owner user
    memory 2G
    cdrom $bsdiso
    disk /home/user/user.qcow2 format qcow2
    interface tap0 { 
        locked lladdr ab:cd:ef:01:23:45
        switch "switch0"
    }
}
# cat /etc/sysctl.conf
net.inet.ip.arpq.maxlen=1024
net.inet.ip.forwarding=1
net.inet6.ip6.forwarding=1
In the virtual machine:
$ cat /etc/hostname.vio0 inet 10.0.5.2 0xffffff00 up
Packet Filter
Finally, we add this line inside /etc/pf.conf:
match out on egress from !(egress:network) to any nat-to (egress:0)
This rule matches packets that leave out on the egress (any interface that can reach the default route). It applies only to packets that come from a network that doesn't match the egress's network. If those conditions are met, we automatically perform NAT to the non-aliased IP address of egress.
Bi-directional NAT
If you want to provide public services, bi-directional NAT can provide a 1-to-1 mapping of ports between the public and internal IP address:
match on egress from 10.0.5.2 to any binat-to 192.168.0.1
Replace 192.168.0.1 with your actual, public IP.
