Posts on tag: freebsd

Table of contents

jaildk vnet support and pf generation

The latest version of jaildk supports FreeBSD vnet networking and pf filter rule generation.

For vnet support you need to configure the following in your rc.conf

# internal bridge to vnet jails
cloned_interfaces="bridge0"

# v6 address of the bridge (must be reachable from the internet)
# I just created a subnet of my official /64
ipv6_ifconfig_bridge0="2a01:*:*:80e1:1e::1/80"

# v4 RFC address, this will be the default gw for jails
ifconfig_bridge0="name jailsw0 up 172.20.20.1/24"

# allow routing
gateway_enable="YES"
ipv6_gateway_enable="YES"

Next you need to configure your jail for vnet support:

myjail {
    vnet;
    exec.created = "/jail/bin/jaildk vnet $name start -b jailsw0";
    exec.prestop = "/jail/bin/jaildk vnet $name stop -b jailsw0";
}

This will automatically configure vnet networking for the jail, it wil also configure IP inside the jail, including v4+v6 routing.

Finally in order to be reachable you’ll need to have a jail.conf like this:

base=12.2-RELEASE-p7
name=myjail
version=20210521

# vnet config
ip="172.20.20.33/24"
ip6="2a01:*:*:80e1::33"
gw="172.20.20.1"
gw6="2a01:*:*:80e1:1e::1"
myjail4="144.*.*.249"

# incoming maps
maps="prom web"

# allow and nat incoming v4 web access
map_web_exposed_port="80 443"
map_web_exposed_ip="$myjail4"

# allow and nat incoming v4 prometheus access
map_prom_exposed_port="9100 8888"
map_prom_exposed_ip="$myjail4"
map_prom_allow_from="iapetus.prometheus.finca"

# outgoing masquerading (v6 will be routed)
masq_ip="$myjail4"

# allow incoming v6, this will just be routed to us 
rules="web"
rule_web_proto="tcp"
rule_web_port="{80,443}"

And last but not least, you need to have a local dns cache inside your jail or run one on your host on the bridge ip address (172.20.20.1 in my case) and use this in your jails resolv.conf. Just in case this is my unbound.conf:

server: 
        directory: "/var/unbound"
        pidfile: "/var/run/local_unbound.pid"
        interface: 127.0.0.1
        interface: 172.20.20.1
        interface: 2a01:*:*:80e1:1e::1
        interface: ::1

        cache-max-ttl: 14400
        cache-min-ttl: 1200
        hide-identity: yes
        hide-version: yes
        prefetch: yes
        rrset-roundrobin: yes
        so-reuseport: yes
        use-caps-for-id: yes
        verbosity: 1
        outgoing-range: 465
        num-queries-per-thread: 256

        use-syslog: yes
        log-servfail: yes

        root-hints: /var/unbound/root.hints

        access-control: 127.0.0.0/8 allow
        access-control: ::ffff:127.0.0.1 allow
        access-control: ::1 allow
        access-control: fe80::/10 allow
        access-control: 172.20.20.0/24 allow
        access-control: 2a01:*:*:80e1:1e::/80 allow

        local-zone: "17.172.in-addr.arpa." nodefault
        local-zone: "20.172.in-addr.arpa." nodefault
        local-zone: "27.172.in-addr.arpa." nodefault
        local-zone: "16.172.in-addr.arpa." nodefault
        local-zone: "168.192.in-addr.arpa." nodefault

remote-control:
        control-enable: yes
        control-interface: /var/run/local_unbound.ctl
        control-use-cert: no

forward-zone:
        name: .
        forward-addr: 213.133.98.98
        forward-addr: 213.133.99.99
        forward-addr: 213.133.100.100
        forward-addr: 2a01:4f8:0:1::add:1010
        forward-addr: 2a01:4f8:0:1::add:9999
        forward-addr: 2a01:4f8:0:1::add:9898

If everything is setup correctly it should look like this:

root@host: # ifconfig jailsw0|  sed 's/scipown/myjail/g'
jailsw0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        ether 02:bd:fc:61:71:01
        inet 172.20.20.1 netmask 0xffffff00 broadcast 172.20.20.255
        inet6 2a01:*:*:80e1:1e::1 prefixlen 80
        id 00:00:00:00:00:00 priority 32768 hellotime 2 fwddelay 15
        maxage 20 holdcnt 6 proto stp-rstp maxaddr 2000 timeout 1200
        root id 00:00:00:00:00:00 priority 32768 ifcost 0 port 0
        member: epmyjail.h flags=143<LEARNING,DISCOVER,AUTOEDGE,AUTOPTP>
                ifmaxaddr 0 port 5 priority 128 path cost 2000
        groups: bridge
        nd6 options=1<PERFORMNUD>

root@host: # pfctl -a /jail/myjail-jaildk -s nat
nat on em0 inet from 172.20.20.33 to any -> 144.*.*.249
rdr pass on em0 inet proto tcp from 185.*.*.170 to 144.*.*.249 port = jetdirect -> 172.20.20.33 port 9100
rdr pass on em0 inet proto tcp from 185.*.*.170 to 144.*.*.249 port = 8888 -> 172.20.20.33 port 8888
rdr pass on em0 inet proto tcp from any to 144.*.*.249 port = http -> 172.20.20.33 port 80
rdr pass on em0 inet proto tcp from any to 144.*.*.249 port = https -> 172.20.20.33 port 443

root@host: # pfctl -a /jail/scipown-jaildk -s rules
pass in quick on em0 inet6 proto tcp from any to 2a01:*:*:80e1::33 port = http flags S/SA keep state
pass in quick on em0 inet6 proto tcp from any to 2a01:*:*:80e1::33 port = https flags S/SA keep state

root@host: # jaildk login myjail

###### NOW WE ARE INSIDE THE JAIL #####

root@jail: # ifconfig 
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> metric 0 mtu 16384
        options=680003<RXCSUM,TXCSUM,LINKSTATE,RXCSUM_IPV6,TXCSUM_IPV6>
        inet6 ::1 prefixlen 128
        inet6 fe80::1%lo0 prefixlen 64 scopeid 0x1
        inet 127.0.0.1 netmask 0xff000000
        groups: lo
        nd6 options=21<PERFORMNUD,AUTO_LINKLOCAL>
pflog0: flags=0<> metric 0 mtu 33160
        groups: pflog
epmyjail.j: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500
        options=8<VLAN_MTU>
        ether 02:7e:0c:c3:18:0b
        inet6 fe80::7e:cff:fec3:180b%epscipown.j prefixlen 64 tentative scopeid 0x3
        inet6 2a01:*:*:80e1::33 prefixlen 64 tentative
        inet 172.20.20.33 netmask 0xffffff00 broadcast 172.20.20.255
        groups: epair
        media: Ethernet 10Gbase-T (10Gbase-T <full-duplex>)
        status: active
        nd6 options=29<PERFORMNUD,IFDISABLED,AUTO_LINKLOCAL>

root@jail: # netstat -rn
Routing tables

Internet:
Destination        Gateway            Flags     Netif Expire
default            172.20.20.1        UGS    epscipow
127.0.0.1          link#1             UH          lo0
172.20.20.0/24     link#3             U      epscipow
172.20.20.33       link#3             UHS         lo0

Internet6:
Destination                       Gateway                       Flags     Netif Expire
::/96                             ::1                           UGRS        lo0
default                           2a01:4f8:191:80e1:1e::1       UGS    epscipow
::1                               link#1                        UH          lo0
::ffff:0.0.0.0/96                 ::1                           UGRS        lo0
2a01:4f8:191:80e1::/64            link#3                        U      epscipow
2a01:4f8:191:80e1::33             link#3                        UHS         lo0
fe80::/10                         ::1                           UGRS        lo0
fe80::%lo0/64                     link#1                        U           lo0
fe80::1%lo0                       link#1                        UHS         lo0
fe80::%epscipown.j/64             link#3                        U      epscipow
fe80::dc:7aff:fea2:580b%epscipown.j link#3                      UHS         lo0
ff02::/16                         ::1                           UGRS        lo0

root@jail: # ping -c 1 141.1.1.1
PING 141.1.1.1 (141.1.1.1): 56 data bytes
64 bytes from 141.1.1.1: icmp_seq=0 ttl=55 time=12.702 ms

--- 141.1.1.1 ping statistics ---
1 packets transmitted, 1 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 12.702/12.702/12.702/0.000 ms

↷ 06.07.2021 🠶 #freebsd