<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Tedson Myriam</title>
    <description>The latest articles on Forem by Tedson Myriam (@tedson_myriam_d315b5e36e2).</description>
    <link>https://forem.com/tedson_myriam_d315b5e36e2</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3765033%2F7393de7a-5aec-49ce-9258-d2058b9ecb16.png</url>
      <title>Forem: Tedson Myriam</title>
      <link>https://forem.com/tedson_myriam_d315b5e36e2</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/tedson_myriam_d315b5e36e2"/>
    <language>en</language>
    <item>
      <title>FreeBSD Jails VNET Configuration Guide 2026 — Synthetic Context</title>
      <dc:creator>Tedson Myriam</dc:creator>
      <pubDate>Tue, 10 Feb 2026 21:07:32 +0000</pubDate>
      <link>https://forem.com/tedson_myriam_d315b5e36e2/freebsd-jails-vnet-configuration-guide-2026-synthetic-context-32f3</link>
      <guid>https://forem.com/tedson_myriam_d315b5e36e2/freebsd-jails-vnet-configuration-guide-2026-synthetic-context-32f3</guid>
      <description>&lt;h1&gt;
  
  
  Setting Up FreeBSD 14 VNET Jails with IPv6-Only Networking
&lt;/h1&gt;

&lt;p&gt;I've been running FreeBSD jails for years, but when I discovered VNET jails with proper network isolation, my infrastructure game changed completely. The ability to give each service its own network stack with full firewall control is a game-changer for security and flexibility. Let me walk you through how I set up modern VNET jails with IPv6-only networking on FreeBSD 14.&lt;/p&gt;

&lt;h2&gt;
  
  
  What You'll Learn
&lt;/h2&gt;

&lt;p&gt;This guide covers setting up FreeBSD 14 VNET jails with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Robust network isolation using &lt;code&gt;epair&lt;/code&gt; interfaces and &lt;code&gt;bridge&lt;/code&gt; networking&lt;/li&gt;
&lt;li&gt;IPv6-only architecture for modern networking&lt;/li&gt;
&lt;li&gt;PF firewall integration at both host and jail levels&lt;/li&gt;
&lt;li&gt;Practical troubleshooting techniques&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;FreeBSD Jails offer lightweight virtualization with process and filesystem isolation. While traditional jails share the host's network stack, VNET jails get their own independent network environment. This setup gives you complete control over each jail's networking, including IP addresses, routing tables, and firewalls.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Preparing Your Host System
&lt;/h2&gt;

&lt;p&gt;Before creating VNET jails, you need to configure your FreeBSD host properly.&lt;/p&gt;

&lt;h3&gt;
  
  
  1.1 Kernel Modules and rc.conf Configuration
&lt;/h3&gt;

&lt;p&gt;First, let's load the necessary kernel modules and configure them to load automatically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Load modules immediately&lt;/span&gt;
kldload if_epair
kldload if_bridge
kldload pf
kldload pflog

&lt;span class="c"&gt;# Add to /etc/rc.conf for persistent loading&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'if_epair_load="YES"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/rc.conf
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'if_bridge_load="YES"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/rc.conf
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'pf_enable="YES"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/rc.conf
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'pflog_enable="YES"'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/rc.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Next, configure the bridge interface in &lt;code&gt;/etc/rc.conf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/rc.conf additions&lt;/span&gt;
&lt;span class="nv"&gt;cloned_interfaces&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bridge0"&lt;/span&gt;
&lt;span class="nv"&gt;ifconfig_bridge0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"inet6 -ifdisabled up"&lt;/span&gt; &lt;span class="c"&gt;# IPv6-only bridge&lt;/span&gt;
&lt;span class="nv"&gt;ipv6_enable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"YES"&lt;/span&gt;
&lt;span class="nv"&gt;ipv6_gateway_enable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"YES"&lt;/span&gt;
&lt;span class="nv"&gt;rtsold_enable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"YES"&lt;/span&gt; &lt;span class="c"&gt;# If host needs to get IPv6 from upstream&lt;/span&gt;
&lt;span class="nv"&gt;rtadvd_enable&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"YES"&lt;/span&gt; &lt;span class="c"&gt;# If host acts as a router for jails&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1.2 sysctl Tunings
&lt;/h3&gt;

&lt;p&gt;We need to adjust some sysctl parameters for proper networking:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# Enable IP forwarding for IPv4 and IPv6&lt;/span&gt;
sysctl net.inet.ip.forwarding&lt;span class="o"&gt;=&lt;/span&gt;1
sysctl net.inet6.ip6.forwarding&lt;span class="o"&gt;=&lt;/span&gt;1

&lt;span class="c"&gt;# Configure bridge filtering&lt;/span&gt;
sysctl net.link.bridge.pfil_member&lt;span class="o"&gt;=&lt;/span&gt;0
sysctl net.link.bridge.pfil_bridge&lt;span class="o"&gt;=&lt;/span&gt;1

&lt;span class="c"&gt;# Add to /etc/sysctl.conf for persistence&lt;/span&gt;
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'net.inet.ip.forwarding=1'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/sysctl.conf
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'net.inet6.ip6.forwarding=1'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/sysctl.conf
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'net.link.bridge.pfil_member=0'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/sysctl.conf
&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s1"&gt;'net.link.bridge.pfil_bridge=1'&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; /etc/sysctl.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1.3 Basic Host pf.conf
&lt;/h3&gt;

&lt;p&gt;Here's a basic PF configuration for the host:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/pf.conf on the host
&lt;/span&gt;&lt;span class="n"&gt;ext_if&lt;/span&gt; = &lt;span class="s2"&gt;"vtnet0"&lt;/span&gt;
&lt;span class="n"&gt;bridge_if&lt;/span&gt; = &lt;span class="s2"&gt;"bridge0"&lt;/span&gt;
&lt;span class="n"&gt;jail_net&lt;/span&gt; = &lt;span class="s2"&gt;"2001:db8:jails::/64"&lt;/span&gt;

&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;skip&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;lo0&lt;/span&gt;
&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;skip&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; $&lt;span class="n"&gt;bridge_if&lt;/span&gt;

&lt;span class="n"&gt;scrub&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; $&lt;span class="n"&gt;ext_if&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="n"&gt;fragment&lt;/span&gt; &lt;span class="n"&gt;reassemble&lt;/span&gt;
&lt;span class="n"&gt;scrub&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; $&lt;span class="n"&gt;ext_if&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="n"&gt;fragment&lt;/span&gt; &lt;span class="n"&gt;reassemble&lt;/span&gt;

&lt;span class="c"&gt;# Default deny everything
&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;

&lt;span class="c"&gt;# Allow all outbound traffic from jails
&lt;/span&gt;&lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; $&lt;span class="n"&gt;ext_if&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; $&lt;span class="n"&gt;jail_net&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;keep&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;

&lt;span class="c"&gt;# Allow specific inbound traffic to jails
&lt;/span&gt;&lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; $&lt;span class="n"&gt;ext_if&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt; &lt;span class="n"&gt;tcp&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; $&lt;span class="n"&gt;jail_net&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; { &lt;span class="n"&gt;ssh&lt;/span&gt;, &lt;span class="n"&gt;http&lt;/span&gt;, &lt;span class="n"&gt;https&lt;/span&gt; } &lt;span class="n"&gt;keep&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;

&lt;span class="c"&gt;# Allow host to communicate with jails
&lt;/span&gt;&lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;quick&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; $&lt;span class="n"&gt;bridge_if&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; $&lt;span class="n"&gt;jail_net&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;keep&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;
&lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="n"&gt;quick&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; $&lt;span class="n"&gt;bridge_if&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; $&lt;span class="n"&gt;jail_net&lt;/span&gt; &lt;span class="n"&gt;keep&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;

&lt;span class="c"&gt;# Basic host protection
&lt;/span&gt;&lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; $&lt;span class="n"&gt;ext_if&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt; &lt;span class="n"&gt;icmp6&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;icmp6&lt;/span&gt;-&lt;span class="n"&gt;type&lt;/span&gt; { &lt;span class="n"&gt;echoreq&lt;/span&gt;, &lt;span class="n"&gt;routeradvert&lt;/span&gt;, &lt;span class="n"&gt;routersol&lt;/span&gt; } &lt;span class="n"&gt;keep&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;
&lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; $&lt;span class="n"&gt;ext_if&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt; &lt;span class="n"&gt;icmp6&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;icmp6&lt;/span&gt;-&lt;span class="n"&gt;type&lt;/span&gt; { &lt;span class="n"&gt;echoreq&lt;/span&gt;, &lt;span class="n"&gt;routeradvert&lt;/span&gt;, &lt;span class="n"&gt;routersol&lt;/span&gt; } &lt;span class="n"&gt;keep&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;
&lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; $&lt;span class="n"&gt;ext_if&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt; &lt;span class="n"&gt;tcp&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; ($&lt;span class="n"&gt;ext_if&lt;/span&gt;) &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="n"&gt;keep&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After configuring, enable PF:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;pfctl &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="nt"&gt;-f&lt;/span&gt; /etc/pf.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  2. Creating VNET Jails with epair and bridge
&lt;/h2&gt;

&lt;p&gt;Now let's create our first VNET jail with proper network isolation.&lt;/p&gt;

&lt;h3&gt;
  
  
  2.1 Understanding epair and bridge Interaction
&lt;/h3&gt;

&lt;p&gt;An &lt;code&gt;epair&lt;/code&gt; interface is a virtual network device that comes in pairs (&lt;code&gt;epairXa&lt;/code&gt; and &lt;code&gt;epairXb&lt;/code&gt;). Here's how it works with VNET jails:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;epairXa&lt;/code&gt; goes into the jail's network stack&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;epairXb&lt;/code&gt; stays on the host and connects to the bridge&lt;/li&gt;
&lt;li&gt;The bridge acts as a virtual switch connecting all jail interfaces&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2.2 jail.conf Structure for VNET Jails
&lt;/h3&gt;

&lt;p&gt;Here's an example &lt;code&gt;jail.conf&lt;/code&gt; entry for an IPv6-only VNET jail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/jail.conf
&lt;/span&gt;&lt;span class="n"&gt;vnet_base&lt;/span&gt; {
    &lt;span class="n"&gt;path&lt;/span&gt; = &lt;span class="s2"&gt;"/jails/basejail"&lt;/span&gt;;
    &lt;span class="n"&gt;mount&lt;/span&gt;.&lt;span class="n"&gt;devfs&lt;/span&gt;;
    &lt;span class="n"&gt;allow&lt;/span&gt;.&lt;span class="n"&gt;raw_sockets&lt;/span&gt;;
    &lt;span class="n"&gt;exec&lt;/span&gt;.&lt;span class="n"&gt;start&lt;/span&gt; = &lt;span class="s2"&gt;"/bin/sh /etc/rc"&lt;/span&gt;;
    &lt;span class="n"&gt;exec&lt;/span&gt;.&lt;span class="n"&gt;stop&lt;/span&gt; = &lt;span class="s2"&gt;"/bin/sh /etc/rc.shutdown"&lt;/span&gt;;
}

&lt;span class="n"&gt;vnet&lt;/span&gt;-&lt;span class="n"&gt;jail&lt;/span&gt;-&lt;span class="m"&gt;01&lt;/span&gt; {
    &lt;span class="n"&gt;host&lt;/span&gt;.&lt;span class="n"&gt;hostname&lt;/span&gt; = &lt;span class="s2"&gt;"vnet-jail-01"&lt;/span&gt;;
    &lt;span class="n"&gt;path&lt;/span&gt; = &lt;span class="s2"&gt;"/jails/vnet-jail-01"&lt;/span&gt;;
    &lt;span class="n"&gt;vnet&lt;/span&gt;;
    &lt;span class="n"&gt;vnet&lt;/span&gt;.&lt;span class="n"&gt;interface&lt;/span&gt; = &lt;span class="s2"&gt;"epair0a"&lt;/span&gt;;

    &lt;span class="c"&gt;# Commands executed on the host before jail starts
&lt;/span&gt;    &lt;span class="n"&gt;exec&lt;/span&gt;.&lt;span class="n"&gt;prestart&lt;/span&gt; += &lt;span class="s2"&gt;"ifconfig epair0 create"&lt;/span&gt;;
    &lt;span class="n"&gt;exec&lt;/span&gt;.&lt;span class="n"&gt;prestart&lt;/span&gt; += &lt;span class="s2"&gt;"ifconfig bridge0 addm epair0b"&lt;/span&gt;;

    &lt;span class="c"&gt;# Commands executed inside the jail after it starts
&lt;/span&gt;    &lt;span class="n"&gt;exec&lt;/span&gt;.&lt;span class="n"&gt;start&lt;/span&gt; += &lt;span class="s2"&gt;"ifconfig epair0a up"&lt;/span&gt;;
    &lt;span class="n"&gt;exec&lt;/span&gt;.&lt;span class="n"&gt;start&lt;/span&gt; += &lt;span class="s2"&gt;"ifconfig epair0a inet6 accept_rtadv"&lt;/span&gt;;
    &lt;span class="n"&gt;exec&lt;/span&gt;.&lt;span class="n"&gt;start&lt;/span&gt; += &lt;span class="s2"&gt;"route add -inet6 default fe80::1%epair0a"&lt;/span&gt;;

    &lt;span class="c"&gt;# Commands executed on the host after jail stops
&lt;/span&gt;    &lt;span class="n"&gt;exec&lt;/span&gt;.&lt;span class="n"&gt;poststop&lt;/span&gt; += &lt;span class="s2"&gt;"ifconfig bridge0 deletem epair0b"&lt;/span&gt;;
    &lt;span class="n"&gt;exec&lt;/span&gt;.&lt;span class="n"&gt;poststop&lt;/span&gt; += &lt;span class="s2"&gt;"ifconfig epair0b destroy"&lt;/span&gt;;

    &lt;span class="n"&gt;mount&lt;/span&gt;.&lt;span class="n"&gt;devfs&lt;/span&gt;;
    &lt;span class="n"&gt;allow&lt;/span&gt;.&lt;span class="n"&gt;raw_sockets&lt;/span&gt;;
    &lt;span class="n"&gt;exec&lt;/span&gt;.&lt;span class="n"&gt;clean&lt;/span&gt;;
    &lt;span class="n"&gt;exec&lt;/span&gt;.&lt;span class="n"&gt;consolelog&lt;/span&gt; = &lt;span class="s2"&gt;"/var/log/jail_vnet-jail-01_console.log"&lt;/span&gt;;
    &lt;span class="n"&gt;exec&lt;/span&gt;.&lt;span class="n"&gt;start&lt;/span&gt; = &lt;span class="s2"&gt;"/bin/sh /etc/rc"&lt;/span&gt;;
    &lt;span class="n"&gt;exec&lt;/span&gt;.&lt;span class="n"&gt;stop&lt;/span&gt; = &lt;span class="s2"&gt;"/bin/sh /etc/rc.shutdown"&lt;/span&gt;;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To start the jail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jail &lt;span class="nt"&gt;-c&lt;/span&gt; vnet-jail-01
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;To enter the jail's console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;jexec vnet-jail-01 /bin/csh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  3. Configuring IPv6-Only Networking
&lt;/h2&gt;

&lt;p&gt;An IPv6-only architecture simplifies network management and prepares your infrastructure for the future.&lt;/p&gt;

&lt;h3&gt;
  
  
  3.1 Host rtadvd Configuration
&lt;/h3&gt;

&lt;p&gt;Configure the host to act as a router for the jails:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/rc.conf (ensure these are present)
&lt;/span&gt;&lt;span class="n"&gt;ipv6_enable&lt;/span&gt;=&lt;span class="s2"&gt;"YES"&lt;/span&gt;
&lt;span class="n"&gt;ipv6_gateway_enable&lt;/span&gt;=&lt;span class="s2"&gt;"YES"&lt;/span&gt;
&lt;span class="n"&gt;rtadvd_enable&lt;/span&gt;=&lt;span class="s2"&gt;"YES"&lt;/span&gt;

&lt;span class="c"&gt;# /etc/rtadvd.conf
&lt;/span&gt;&lt;span class="n"&gt;bridge0&lt;/span&gt;:\
    :&lt;span class="n"&gt;addrs&lt;/span&gt;&lt;span class="c"&gt;#1:prefix:2001:db8:jails::/64:
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Start the rtadvd service:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;service rtadvd start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.2 Jail rc.conf and DNS Configuration
&lt;/h3&gt;

&lt;p&gt;Inside the jail, ensure IPv6 is enabled:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# /jails/vnet-jail-01/etc/rc.conf
&lt;/span&gt;&lt;span class="n"&gt;ipv6_enable&lt;/span&gt;=&lt;span class="s2"&gt;"YES"&lt;/span&gt;
&lt;span class="n"&gt;rtsol_enable&lt;/span&gt;=&lt;span class="s2"&gt;"YES"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Configure DNS in the jail:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# /jails/vnet-jail-01/etc/resolv.conf
&lt;/span&gt;&lt;span class="n"&gt;nameserver&lt;/span&gt; &lt;span class="m"&gt;2001&lt;/span&gt;:&lt;span class="m"&gt;4860&lt;/span&gt;:&lt;span class="m"&gt;4860&lt;/span&gt;::&lt;span class="m"&gt;8888&lt;/span&gt;
&lt;span class="n"&gt;nameserver&lt;/span&gt; &lt;span class="m"&gt;2001&lt;/span&gt;:&lt;span class="m"&gt;4860&lt;/span&gt;:&lt;span class="m"&gt;4860&lt;/span&gt;::&lt;span class="m"&gt;8844&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3.3 Static IPv6 Addressing (Alternative)
&lt;/h3&gt;

&lt;p&gt;For services needing stable addresses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# In /etc/jail.conf for vnet-jail-01
# ...
&lt;/span&gt;&lt;span class="n"&gt;exec&lt;/span&gt;.&lt;span class="n"&gt;start&lt;/span&gt; += &lt;span class="s2"&gt;"ifconfig epair0a inet6 2001:db8:jails::10/64 up"&lt;/span&gt;;
&lt;span class="n"&gt;exec&lt;/span&gt;.&lt;span class="n"&gt;start&lt;/span&gt; += &lt;span class="s2"&gt;"route add -inet6 default 2001:db8:jails::1"&lt;/span&gt;;
&lt;span class="c"&gt;# ...
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  4. Implementing PF Firewall for Enhanced Security
&lt;/h2&gt;

&lt;p&gt;PF provides powerful firewall capabilities at both host and jail levels.&lt;/p&gt;

&lt;h3&gt;
  
  
  4.1 Host PF for VNET Jails
&lt;/h3&gt;

&lt;p&gt;The host's PF controls traffic between external networks and the jail bridge:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/pf.conf (host)
# ...
# Define tags for specific jail services
&lt;/span&gt;&lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; $&lt;span class="n"&gt;ext_if&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt; &lt;span class="n"&gt;tcp&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; $&lt;span class="n"&gt;jail_net&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="n"&gt;SSH_JAIL&lt;/span&gt;
&lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; $&lt;span class="n"&gt;ext_if&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt; &lt;span class="n"&gt;tcp&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; $&lt;span class="n"&gt;jail_net&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="n"&gt;HTTP_JAIL&lt;/span&gt;

&lt;span class="c"&gt;# Example: allow SSH to specific jail IP
&lt;/span&gt;&lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; $&lt;span class="n"&gt;ext_if&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt; &lt;span class="n"&gt;tcp&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="m"&gt;2001&lt;/span&gt;:&lt;span class="n"&gt;db8&lt;/span&gt;:&lt;span class="n"&gt;jails&lt;/span&gt;::&lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="n"&gt;keep&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="n"&gt;SSH_JAIL_01&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4.2 Jail-Specific PF Configuration
&lt;/h3&gt;

&lt;p&gt;Each jail can run its own PF instance:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="c"&gt;# /jails/vnet-jail-01/etc/pf.conf
&lt;/span&gt;&lt;span class="n"&gt;int_if&lt;/span&gt; = &lt;span class="s2"&gt;"epair0a"&lt;/span&gt;

&lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;skip&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; &lt;span class="n"&gt;lo0&lt;/span&gt;

&lt;span class="c"&gt;# Default deny all
&lt;/span&gt;&lt;span class="n"&gt;block&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt;

&lt;span class="c"&gt;# Allow outbound connections
&lt;/span&gt;&lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="n"&gt;out&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; $&lt;span class="n"&gt;int_if&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="n"&gt;keep&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;

&lt;span class="c"&gt;# Allow inbound SSH
&lt;/span&gt;&lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; $&lt;span class="n"&gt;int_if&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt; &lt;span class="n"&gt;tcp&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;port&lt;/span&gt; &lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="n"&gt;keep&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;

&lt;span class="c"&gt;# Allow ICMP6 for network diagnostics
&lt;/span&gt;&lt;span class="n"&gt;pass&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="n"&gt;on&lt;/span&gt; $&lt;span class="n"&gt;int_if&lt;/span&gt; &lt;span class="n"&gt;proto&lt;/span&gt; &lt;span class="n"&gt;icmp6&lt;/span&gt; &lt;span class="n"&gt;from&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;any&lt;/span&gt; &lt;span class="n"&gt;icmp6&lt;/span&gt;-&lt;span class="n"&gt;type&lt;/span&gt; { &lt;span class="n"&gt;echoreq&lt;/span&gt;, &lt;span class="n"&gt;echorep&lt;/span&gt;, &lt;span class="n"&gt;routersol&lt;/span&gt;, &lt;span class="n"&gt;routeradvert&lt;/span&gt;, &lt;span class="n"&gt;neighbrsol&lt;/span&gt;, &lt;span class="n"&gt;neighbradvert&lt;/span&gt; } &lt;span class="n"&gt;keep&lt;/span&gt; &lt;span class="n"&gt;state&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Enable PF in the jail's &lt;code&gt;/etc/rc.conf&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight conf"&gt;&lt;code&gt;&lt;span class="n"&gt;pf_enable&lt;/span&gt;=&lt;span class="s2"&gt;"YES"&lt;/span&gt;
&lt;span class="n"&gt;pf_rules&lt;/span&gt;=&lt;span class="s2"&gt;"/etc/pf.conf"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  5. Advanced VNET Features and Troubleshooting
&lt;/h2&gt;

&lt;h3&gt;
  
  
  5.1 Multiple Bridges and VLANs
&lt;/h3&gt;

&lt;p&gt;For more complex setups:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# /etc/rc.conf&lt;/span&gt;
&lt;span class="nv"&gt;cloned_interfaces&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"bridge0 bridge1"&lt;/span&gt;
&lt;span class="nv"&gt;ifconfig_bridge0&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"inet6 -ifdisabled up"&lt;/span&gt;
&lt;span class="nv"&gt;ifconfig_bridge1&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;"inet6 -ifdisabled up"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5.2 Jail Management Tools
&lt;/h3&gt;

&lt;p&gt;Consider using tools like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;CBSD&lt;/strong&gt;: Powerful framework for managing jails, bhyve, and other virtual environments&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Pot&lt;/strong&gt;: Lightweight ZFS-based jail manager focused on immutable infrastructure&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5.3 Monitoring and Troubleshooting
&lt;/h3&gt;

&lt;p&gt;Key commands for debugging:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;ifconfig -a&lt;/code&gt; (host and jail)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;netstat -rn&lt;/code&gt; (host and jail)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;pfctl -sr&lt;/code&gt;, &lt;code&gt;pfctl -sa&lt;/code&gt; (host and jail)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tcpdump -i &amp;lt;interface&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;dmesg&lt;/code&gt;, &lt;code&gt;/var/log/messages&lt;/code&gt;, jail console logs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Setting up VNET jails with proper network isolation gives you incredible flexibility and security for your FreeBSD infrastructure. The IPv6-only approach simplifies configuration while preparing your systems for the future.&lt;/p&gt;

&lt;p&gt;Have you tried setting up VNET jails before? What challenges did you face? I'd love to hear about your experiences in the comments below!&lt;/p&gt;




&lt;p&gt;&lt;em&gt;Originally published on &lt;a href="https://synthetic-context.net/docs/freebsd-jails-vnet-2026" rel="noopener noreferrer"&gt;synthetic-context.net&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

</description>
      <category>freebsd</category>
      <category>devops</category>
      <category>security</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
