How do I configure NAT so that my jails can access the internet? My jail is nating using it's gateway address, but isn't translating that gateway to a routable address. I'm guessing it has something to do with the fact that my GUEST.em0 interface is inside the pubbridge bridge. The jail is sending traffic out it's default gateway, 10.0.0.1, but I must not be natting from that gateway to em0?
Here's my setup:
I have tcpdump capturing packets at LAPTOP.re0 and GUEST.em0. icmp tests show:
FROM -> TO : icmp packets
laptop -> 8.8.8.8 : yes
guest -> laptop -> 8.8.8.8 : yes
jail -> guest -> laptop -> 8.8.8.8 : yes // but the packets from the jail show an origination as the jail's gateway 10.0.0.1... that's an un-routable address...shouldn't NAT have re-written it?
8.8.8.8 -> laptop : yes
8.8.8.8 -> laptop -> guest : yes
8.8.8.8 -> laptop -> guest -> jail : no
Here's some more info on my setup:
LAPTOP
FreeBSD system76 15.0-RELEASE-p12 FreeBSD 15.0-RELEASE-p12 releng/15.0-n281099-7b527b9b97ba GENERIC amd64
LAPTOP: rc.conf
LAPTOP: ifconfig
GUEST (jail host) : rc.conf
GUEST (jail host) : pf.conf
GUEST (jail host) : ifconfig
GUEST (jail host) : jls
JAIL ifconfig
Jail ARP
JAIL Netstat
Here's what tcpdumps are capturing while i'm running pings from both the jail, the guest, and the laptop:
GUEST em0 tcpdump
LAPTOP re0 tcpdump
So you can see that only the jail is not getting icmp responses, and that's certainly b/c it is sending the icmp requests as 10.0.0.1, an un-routable address. So my question is, what's wrong with my NAT stanza in my pf.conf?
Here's my setup:
Code:
LAPTOP (FreeBSD 15.0) -> GUEST (VirtualBox running FreeBSD 15.1 OS) -> Jail (FreeBSD 15.1)
I have tcpdump capturing packets at LAPTOP.re0 and GUEST.em0. icmp tests show:
FROM -> TO : icmp packets
laptop -> 8.8.8.8 : yes
guest -> laptop -> 8.8.8.8 : yes
jail -> guest -> laptop -> 8.8.8.8 : yes // but the packets from the jail show an origination as the jail's gateway 10.0.0.1... that's an un-routable address...shouldn't NAT have re-written it?
8.8.8.8 -> laptop : yes
8.8.8.8 -> laptop -> guest : yes
8.8.8.8 -> laptop -> guest -> jail : no
Here's some more info on my setup:
LAPTOP
FreeBSD system76 15.0-RELEASE-p12 FreeBSD 15.0-RELEASE-p12 releng/15.0-n281099-7b527b9b97ba GENERIC amd64
LAPTOP: rc.conf
Bash:
hostname="foobar"
ifconfig_re0="DHCP"
ifconfig_re0_ipv6="inet6 accept_rtadv"
sshd_enable="YES"
ntpd_enable="YES"
ntpd_sync_on_start="YES"
powerd_enable="YES"
moused_nondefault_enable="NO"
vboxnet_enable="YES"
dumpdev="AUTO"
zfs_enable="YES"
moused_port=/dev/psm0
moused_enable=YES
ntpdate_enable="YES"
ntpdate_flags="-u pool.ntp.org"
nfs_client_enable=YES
rpc_statd_enable=YES
rpc_lockd_enable=YES
autofs_enable=YES
devd_enable=YES
devfs_system_ruleset="system"
dbus_enable=YES
kld_list="fusefs nvidia-drm"
ifconfig_wlan0="WPA DHCP"
LAPTOP: ifconfig
Bash:
re0: flags=1008943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
options=8209b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MAGIC,LINKSTATE>
ether d4:93:90:3c:84:69
inet 192.168.0.230 netmask 0xffffff00 broadcast 192.168.0.255
inet6 fe80::d693:90ff:fe3c:8469%re0 prefixlen 64 scopeid 0x1
inet6 2601:602:8100:d9a0:d693:90ff:fe3c:8469 prefixlen 64 autoconf pltime 229139 vltime 229139
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
GUEST (jail host) : rc.conf
Bash:
hostname="server_a"
ifconfig_em0_ipv6="inet6 accept_rtadv"
sshd_enable="YES"
moused_nondefault_enable="NO"
dumpdev="AUTO"
zfs_enable="YES"
pf_enable="YES"
pf_fallback_rules_enable="YES"
pf_fallback_rules="block drop log all
pass quick on em0"
pflog_enable="YES"
syslogd_flags="-ss"
jail_enable="YES"
jail_parallel_start="NO"
gateway_enable="YES"
ipv6_gateway_enable="NO"
ifconfig_em0="up"
cloned_interfaces="bridge0 bridge1"
ifconfig_bridge0_name="pubbridge"
ifconfig_bridge1_name="prvbridge"
ifconfig_pubbridge="addm em0 SYNCDHCP up descr 'public jails bridge, connects to external interface'"
ifconfig_pubbridge_alias0="inet 10.0.0.1 netmask 0xFFFFFF00"
ifconfig_prvbridge="descr 'private bridge, no connection to external interface' up"
GUEST (jail host) : pf.conf
Bash:
# --------------------------------------------------------------
# Macros
# --------------------------------------------------------------
# The external interface has been put into a bridge, so reference
# the bridge as the external interface going forward.
ext_if = "pubbridge"
# JAIL_HOST pf.conf
jail_net = "{ 10.0.0.1/24 }"
# Jail groupings
glb_jails = "{ 10.0.0.2 }"
# ICMP types
icmp_types = "{ unreach, echoreq }"
icmp6_types = "{ unreach, echoreq, timex, paramprob routeradv, neighbradv, neighbrsol }"
# Ingress Groupings
prometheus_tcp_ingress = "{ 192.168.0.0/16 }"
nodeexporter_tcp_ingress = "{ 192.168.0.0/16 }"
ssh_tcp_ingress = "{ 192.168.0.0/16 }"
http_tcp_ingress = "{ 192.168.0.0/16 }"
https_tcp_ingress = "{ 192.168.0.0/16 }"
# The book of pf, 4th edition page 93, defines martians as non-routable
# ip address (RFC-1918) traffic on an external interface. Of course we
# want to block that bullshit. But we also don't want to block our internal
# 10.0.0.0/28 traffic, either.
# TODO: figure out how to block external 10.0.0.0/28 traffic but allow
# TODO: internal 10.0.0.0./28 and internal 192.168.0.0/24 traffic
martian_nets = "{
172.16.0.0/12,0.0.0.0/8,127.0.0.0/8
}"
# --------------------------------------------------------------
# Tables
# --------------------------------------------------------------
# Dynamic lists of addresses
# martians table
table <martians> { $martian_nets }
# bruteforce blackhole for bad ips
table <bruteforce> persist
# table for the entire interal jail network
table <jails_v4> { $jail_net }
# jail tables
table <glb_jails> { $glb_jails }
# ingress tables
table <prometheus_tcp_ingress> { $prometheus_tcp_ingress }
table <nodeexporter_tcp_ingress> { $nodeexporter_tcp_ingress }
table <ssh_tcp_ingress> { $ssh_tcp_ingress }
table <http_tcp_ingress> { $http_tcp_ingress }
table <https_tcp_ingress> { $https_tcp_ingress }
# --------------------------------------------------------------
# Options
# --------------------------------------------------------------
# Global behavior settings
set skip on lo0
set block-policy drop
set loginterface $ext_if
logopt = "log"
logall = "log"
# --------------------------------------------------------------
# Ethernet
# --------------------------------------------------------------
#
# --------------------------------------------------------------
# Normalization
# --------------------------------------------------------------
scrub in all fragment reassemble
scrub out all random-id max-mss 1500
# --------------------------------------------------------------
# Queueing
# --------------------------------------------------------------
# --------------------------------------------------------------
# Translations (NAT)
# --------------------------------------------------------------
nat on $ext_if inet from <jails_v4> to any -> ($ext_if)
# --------------------------------------------------------------
# Filtering
# --------------------------------------------------------------
# Port redirections
rdr pass on $ext_if inet proto tcp from <http_tcp_ingress> to ($ext_if) port 80 -> <glb_jails> port 8080
rdr pass on $ext_if inet proto tcp from <https_tcp_ingress> to ($ext_if) port 443 -> <glb_jails> port 8443
# Default deny everything
block log all
# Allow port redirections from external clients to the jail
pass in quick on $ext_if inet proto tcp from <http_tcp_ingress> to <glb_jails> port 8080 keep state label port_fwd
pass in quick on $ext_if inet proto tcp from <https_tcp_ingress> to <glb_jails> port 8443 keep state label port_fwd
# Ingress
pass in quick on $ext_if proto tcp from <prometheus_tcp_ingress> to any port { 9090 3000 }
pass in quick on $ext_if proto tcp from <nodeexporter_tcp_ingress> to any port 9100
pass in quick on $ext_if proto tcp from <ssh_tcp_ingress> to any port 22 flags S/SA keep state (max-src-conn 5, max-src-conn-rate 3/30 overload <bruteforce> flush global) label 'allow_ssh_from_trusted'
pass in quick on $ext_if proto tcp from <http_tcp_ingress> to any port 80
pass in quick on $ext_if proto tcp from <https_tcp_ingress> to any port 443
# Jail to Jail Traffic
# Block known bad actors immediately
block quick from <bruteforce>
block in quick on $ext_if from <martians> to any
block out quick on $ext_if from any to <martians>
# Allow all established connections out
pass out on $ext_if proto { tcp, udp } from ($ext_if) modulate state
# Anti-spoofing
antispoof quick for { $ext_if }
# Block and log all other SSH attempts (for monitoring)
block in log quick on $ext_if proto tcp from any to any port 22 label "ssh_blocked"
# Useful ICMP
pass log inet proto icmp icmp-type $icmp_types
pass inet6 proto icmp6 icmp6-type $icmp6_types
# Jail Egress
pass in quick on $ext_if proto tcp from <glb_jails> to any port { 80 } keep state # packages
pass in quick on $ext_if proto tcp from <glb_jails> to any port { 443 } keep state # packages
# Enable DNS Queries
# enable outbound dns queries from the external interface
pass out quick on $ext_if proto { tcp udp } from ($ext_if) to any port 53 keep state
# TODO is this required? If not then close it
# enable inbound dns queries to the external interface from the jails
pass in quick on $ext_if proto { tcp udp } from <jails_v4> to any port 53 keep state
# TEMPORARY : GIVE ALL JAILS FULL EGRESS
pass in quick on $ext_if from <jails_v4> to ! <jails_v4> keep state
GUEST (jail host) : ifconfig
Bash:
toddg@server_a ~ $ ifconfig
em0: flags=1008943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
options=8500bb<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,JUMBO_MTU,VLAN_HWCSUM,VLAN_HWFILTER,VLAN_HWTSO,HWSTATS>
ether 08:00:27:7f:a5:81
inet6 fe80::a00:27ff:fe7f:a581%em0 prefixlen 64 scopeid 0x1
inet6 2601:602:8100:d9a0:a00:27ff:fe7f:a581 prefixlen 64 autoconf pltime 229139 vltime 229139
media: Ethernet autoselect (1000baseT <full-duplex>)
status: active
nd6 options=23<PERFORMNUD,ACCEPT_RTADV,AUTO_LINKLOCAL>
lo0: flags=1008049<UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 16384
options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0x2
groups: lo
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
pubbridge: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
description: public jails bridge, connects to external interface
options=10<VLAN_HWTAGGING>
ether 58:9c:fc:10:7e:44
inet 192.168.0.40 netmask 0xffffff00 broadcast 192.168.0.255
inet 10.0.0.1 netmask 0xffffff00 broadcast 10.0.0.255
id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
bridge flags=0<>
member: ep_stgjh0a flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
port 18 priority 128 path cost 2000 vlan protocol 802.1q
member: ep_prdjh0a flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
port 14 priority 128 path cost 2000 vlan protocol 802.1q
member: ep_glb0a flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
port 10 priority 128 path cost 2000 vlan protocol 802.1q
member: ep_devjh0a flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
port 6 priority 128 path cost 2000 vlan protocol 802.1q
member: em0 flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
port 1 priority 128 path cost 20000 vlan protocol 802.1q
groups: bridge
nd6 options=9<PERFORMNUD,IFDISABLED>
prvbridge: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
description: private bridge, no connection to external interface
options=10<VLAN_HWTAGGING>
ether 58:9c:fc:10:57:49
id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
maxage 20 holdcnt 6 proto rstp maxaddr 2000 timeout 1200
root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
bridge flags=0<>
groups: bridge
nd6 options=9<PERFORMNUD,IFDISABLED>
pflog0: flags=1000141<UP,RUNNING,PROMISC,LOWER_UP> metric 0 mtu 33152
options=0
groups: pflog
ep_devjh0a: flags=1008943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
description: jail:vnet:devjh0
options=20001b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,RXCSUM_IPV6>
ether 58:9c:fc:10:78:27
groups: epair
media: Ethernet 10Gbase-T (10Gbase-T <full-duplex>)
status: active
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
ep_glb0a: flags=1008943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
description: jail:vnet:glb0
options=20001b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,RXCSUM_IPV6>
ether 58:9c:fc:10:a9:c6
groups: epair
media: Ethernet 10Gbase-T (10Gbase-T <full-duplex>)
status: active
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
ep_prdjh0a: flags=1008943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
description: jail:vnet:prdjh0
options=20001b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,RXCSUM_IPV6>
ether 58:9c:fc:10:bd:bc
groups: epair
media: Ethernet 10Gbase-T (10Gbase-T <full-duplex>)
status: active
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
ep_stgjh0a: flags=1008943<UP,BROADCAST,RUNNING,PROMISC,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
description: jail:vnet:stgjh0
options=20001b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,RXCSUM_IPV6>
ether 58:9c:fc:10:61:02
groups: epair
media: Ethernet 10Gbase-T (10Gbase-T <full-duplex>)
status: active
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
GUEST (jail host) : jls
Bash:
toddg@server_a ~ $ jls
JID IP Address Hostname Path
1 devjh0 /jails/containers/devjh0
2 glb0 /jails/containers/glb0
3 prdjh0 /jails/containers/prdjh0
4 stgjh0 /jails/containers/stgjh0
JAIL ifconfig
Code:
root@glb0 / $ ifconfig
lo0: flags=1008049<UP,LOOPBACK,RUNNING,MULTICAST,LOWER_UP> metric 0 mtu 16384
options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
inet 127.0.0.1 netmask 0xff000000
inet6 ::1 prefixlen 128
inet6 fe80::1%lo0 prefixlen 64 scopeid 0xc
groups: lo
nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
pflog0: flags=0 metric 0 mtu 33152
options=0
groups: pflog
ep_glb0b: flags=1008843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST,LOWER_UP> metric 0 mtu 1500
options=20001b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,RXCSUM_IPV6>
ether 58:9c:fc:10:37:76
inet 10.0.0.2 netmask 0xffffff00 broadcast 10.0.0.255
groups: epair
media: Ethernet 10Gbase-T (10Gbase-T <full-duplex>)
status: active
nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>
Jail ARP
Code:
root@glb0 / $ arp -na
? (10.0.0.2) at 58:9c:fc:10:37:76 on ep_glb0b permanent [ethernet]
? (10.0.0.1) at 58:9c:fc:10:7e:44 on ep_glb0b expires in 524 seconds [ethernet]
JAIL Netstat
Code:
root@glb0 / $ netstat -arn
Routing tables
Internet:
Destination Gateway Flags Netif Expire
default 10.0.0.1 UGS ep_glb0b
10.0.0.0/24 link#11 U ep_glb0b
10.0.0.2 link#12 UHS lo0
127.0.0.1 link#12 UH lo0
Here's what tcpdumps are capturing while i'm running pings from both the jail, the guest, and the laptop:
GUEST em0 tcpdump
Code:
toddg@server_a ~ $ sudo tcpdump -n -e -ttt -i em0 | grep -i icmp
tcpdump: verbose output suppressed, use -v[v]... for full protocol decode
listening on em0, link-type EN10MB (Ethernet), snapshot length 262144 bytes
00:00:00.019205 58:9c:fc:10:7e:44 > a4:01:de:2f:38:95, ethertype IPv4 (0x0800), length 98: 192.168.0.40 > 8.8.8.8: ICMP echo request, id 37147, seq 20, length 64
00:00:00.000201 58:9c:fc:10:7e:44 > a4:01:de:2f:38:95, ethertype IPv4 (0x0800), length 98: 10.0.0.1 > 8.8.8.8: ICMP echo request, id 18124, seq 587, length 64
00:00:00.011344 a4:01:de:2f:38:95 > 58:9c:fc:10:7e:44, ethertype IPv4 (0x0800), length 98: 8.8.8.8 > 192.168.0.40: ICMP echo reply, id 37147, seq 20, length 64
00:00:00.010748 58:9c:fc:10:7e:44 > a4:01:de:2f:38:95, ethertype IPv4 (0x0800), length 98: 192.168.0.40 > 8.8.8.8: ICMP echo request, id 37147, seq 21, length 64
00:00:00.000112 58:9c:fc:10:7e:44 > a4:01:de:2f:38:95, ethertype IPv4 (0x0800), length 98: 10.0.0.1 > 8.8.8.8: ICMP echo request, id 18124, seq 588, length 64
00:00:00.011859 a4:01:de:2f:38:95 > 58:9c:fc:10:7e:44, ethertype IPv4 (0x0800), length 98: 8.8.8.8 > 192.168.0.40: ICMP echo reply, id 37147, seq 21, length 64
00:00:00.007728 a4:01:de:2f:38:95 > 33:33:00:00:00:01, ethertype IPv6 (0x86dd), length 198: fe80::a601:deff:fe2f:3895 > ff02::1: ICMP6, router advertisement, length 144
00:00:00.000103 58:9c:fc:10:7e:44 > a4:01:de:2f:38:95, ethertype IPv4 (0x0800), length 98: 192.168.0.40 > 8.8.8.8: ICMP echo request, id 37147, seq 22, length 64
00:00:00.000038 58:9c:fc:10:7e:44 > a4:01:de:2f:38:95, ethertype IPv4 (0x0800), length 98: 10.0.0.1 > 8.8.8.8: ICMP echo request, id 18124, seq 589, length 64
00:00:00.010987 a4:01:de:2f:38:95 > 58:9c:fc:10:7e:44, ethertype IPv4 (0x0800), length 98: 8.8.8.8 > 192.168.0.40: ICMP echo reply, id 37147, seq 22, length 64
^C362 packets captured
400 packets received by filter
0 packets dropped by kernel
LAPTOP re0 tcpdump
Code:
$ sudo tcpdump -n -e -ttt -i re0 | grep -i icmp
...
00:00:00.195978 d4:93:90:3c:84:69 > a4:01:de:2f:38:95, ethertype IPv4 (0x0800), length 98: 192.168.0.230 > 8.8.8.8: ICMP echo request, id 14369, seq 144, length 64
00:00:00.010988 a4:01:de:2f:38:95 > d4:93:90:3c:84:69, ethertype IPv4 (0x0800), length 98: 8.8.8.8 > 192.168.0.230: ICMP echo reply, id 14369, seq 144, length 64
00:00:00.183349 58:9c:fc:10:7e:44 > a4:01:de:2f:38:95, ethertype IPv4 (0x0800), length 98: 10.0.0.1 > 8.8.8.8: ICMP echo request, id 11383, seq 3, length 64
00:00:00.610894 58:9c:fc:10:7e:44 > a4:01:de:2f:38:95, ethertype IPv4 (0x0800), length 98: 192.168.0.40 > 8.8.8.8: ICMP echo request, id 37147, seq 268, length 64
00:00:00.011264 a4:01:de:2f:38:95 > 58:9c:fc:10:7e:44, ethertype IPv4 (0x0800), length 98: 8.8.8.8 > 192.168.0.40: ICMP echo reply, id 37147, seq 268, length 64
00:00:00.234684 d4:93:90:3c:84:69 > a4:01:de:2f:38:95, ethertype IPv4 (0x0800), length 98: 192.168.0.230 > 8.8.8.8: ICMP echo request, id 14369, seq 145, length 64
00:00:00.012756 a4:01:de:2f:38:95 > d4:93:90:3c:84:69, ethertype IPv4 (0x0800), length 98: 8.8.8.8 > 192.168.0.230: ICMP echo reply, id 14369, seq 145, length 64
00:00:00.125514 58:9c:fc:10:7e:44 > a4:01:de:2f:38:95, ethertype IPv4 (0x0800), length 98: 10.0.0.1 > 8.8.8.8: ICMP echo request, id 11383, seq 4, length 64
00:00:00.000400 58:9c:fc:10:7e:44 > a4:01:de:2f:38:95, ethertype IPv4 (0x0800), length 98: 192.168.0.40 > 8.8.8.8: ICMP echo request, id 37147, seq 269, length 64
00:00:00.011320 a4:01:de:2f:38:95 > 58:9c:fc:10:7e:44, ethertype IPv4 (0x0800), length 98: 8.8.8.8 > 192.168.0.40: ICMP echo reply, id 37147, seq 269, length 64
00:00:00.190911 d4:93:90:3c:84:69 > a4:01:de:2f:38:95, ethertype IPv4 (0x0800), length 98: 192.168.0.230 > 8.8.8.8: ICMP echo request, id 14369, seq 146, length 64
00:00:00.012459 a4:01:de:2f:38:95 > d4:93:90:3c:84:69, ethertype IPv4 (0x0800), length 98: 8.8.8.8 > 192.168.0.230: ICMP echo reply, id 14369, seq 146, length 64
00:00:00.054228 a4:01:de:2f:38:95 > 33:33:00:00:00:01, ethertype IPv6 (0x86dd), length 198: fe80::a601:deff:fe2f:3895 > ff02::1: ICMP6, router advertisement, length 144
00:00:00.123029 58:9c:fc:10:7e:44 > a4:01:de:2f:38:95, ethertype IPv4 (0x0800), length 98: 10.0.0.1 > 8.8.8.8: ICMP echo request, id 11383, seq 5, length 64
00:00:00.119316 58:9c:fc:10:7e:44 > a4:01:de:2f:38:95, ethertype IPv4 (0x0800), length 98: 192.168.0.40 > 8.8.8.8: ICMP echo request, id 37147, seq 270, length 64
00:00:00.013492 a4:01:de:2f:38:95 > 58:9c:fc:10:7e:44, ethertype IPv4 (0x0800), length 98: 8.8.8.8 > 192.168.0.40: ICMP echo reply, id 37147, seq 270, length 64
00:00:00.128123 d4:93:90:3c:84:69 > a4:01:de:2f:38:95, ethertype IPv4 (0x0800), length 98: 192.168.0.230 > 8.8.8.8: ICMP echo request, id 14369, seq 147, length 64
^C786 packets captured
794 packets received by filter
0 packets dropped by kernel
So you can see that only the jail is not getting icmp responses, and that's certainly b/c it is sending the icmp requests as 10.0.0.1, an un-routable address. So my question is, what's wrong with my NAT stanza in my pf.conf?