{"id":1925,"date":"2026-02-19T12:20:19","date_gmt":"2026-02-19T04:20:19","guid":{"rendered":"https:\/\/mylinuxsite.com\/wordpress\/?p=1925"},"modified":"2026-02-19T12:29:44","modified_gmt":"2026-02-19T04:29:44","slug":"my-journey-to-proxmox-part-2","status":"publish","type":"post","link":"https:\/\/mylinuxsite.com\/wordpress\/?p=1925","title":{"rendered":"My Journey to Proxmox \u2013 Part 2"},"content":{"rendered":"\n<p>In Part 1 of this blog, I discussed how my decision to replace my ageing home lab\/server\/workstation led me to adopt Proxmox. I ended the blog with a summary of the new machine&#8217;s network setup. In Part 2 of this blog, I will delve into the network configuration of the new machine. In particular, I will discuss Linux bridges, the virtual interfaces that provide network connectivity between guests and to the outside world, and how I assign dynamic IPs to guest machines without using Proxmox&#8217;s DHCP feature.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Linux Bridges<\/h2>\n\n\n\n<p>As I mentioned in Part 1, the new machine includes a Wi-Fi adapter designated for ingress and an Ethernet adapter for egress. The Linux bridges created that will use these adapters are summarised in the diagram below. <\/p>\n\n\n\n<p><span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">Proxmox uses&nbsp;<em>ifupdown2<\/em>&nbsp;as its network manager, so the network configurations are stored in&nbsp;<em>\/etc\/network\/interfaces<\/em>.<\/span> This file can be edited directly or modified through the Proxmox GUI.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"661\" height=\"682\" src=\"https:\/\/mylinuxsite.com\/wordpress\/wp-content\/uploads\/2026\/01\/Proxmox-Network.drawio.png\" alt=\"\" class=\"wp-image-1895\" srcset=\"https:\/\/mylinuxsite.com\/wordpress\/wp-content\/uploads\/2026\/01\/Proxmox-Network.drawio.png 661w, https:\/\/mylinuxsite.com\/wordpress\/wp-content\/uploads\/2026\/01\/Proxmox-Network.drawio-291x300.png 291w\" sizes=\"auto, (max-width: 661px) 100vw, 661px\" \/><\/figure>\n\n\n\n<p><\/p>\n\n\n\n<h4 class=\"wp-block-heading\">VMBR0<\/h4>\n\n\n\n<p>The VMBR0 is the Linux bridge that enslaves the Ethernet adapter and is responsible for obtaining the machine&#8217;s public IP from the ISP via DHCP. This bridge enslaves the Ethernet adapter <span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">via the&nbsp;<em>bridge-ports directive,<\/em>&nbsp;and the IP address is obtained via<\/span> DHCP, hence the <em>dhcp<\/em> method in the configuration file. The Ethernet adapter is not automatically brought up; therefore, it is set to <em>manual<\/em>. <\/p>\n\n\n\n<p>Since the bridge IP is obtained from the ISP, it will only have one (1) IP address, and it will be dynamic (assuming you are just a home broadband user), so no guest VM will use this bridge directly.<\/p>\n\n\n\n<p>Below is the complete VMBR0 and Ethernet adapter configuration:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>allow-mgmt enp10s0\niface enp10s0 inet <strong>manual<\/strong>\n#       Ethernet network interface.\n\nauto vmbr0\nallow-mgmt vmbr0\niface vmbr0 inet <strong>dhcp<\/strong>\n#       Main internet gateway. ISP provided IP Address via DHCP.\n        bridge-ports <strong>enp10s0<\/strong>\n        bridge-stp off\n        bridge-fd 0\n\n        post-up   echo 1 &gt; \/proc\/sys\/net\/ipv4\/ip_forward<\/code><\/pre>\n\n\n\n<p>The <em><strong>allow-mgmt <\/strong><\/em>method on each interface ensures the interface is brought up before any other. It is necessary that these interfaces be the first to go up because they are referenced later in other bridges.<\/p>\n\n\n\n<p>The <em><strong>post-up<\/strong><\/em> command in this bridge configuration enables IP forwarding on the nodes&#8217; network.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">VMBR1<\/h4>\n\n\n\n<p>This Linux bridge is designated for virtual machines  that expect ingress traffic from the internet.  Incoming traffic is forwarded from the Ethernet adapter to this bridge via IP Tables port forwarding; therefore, the virtual machines created under this subnet will have static IP addresses. As of this writing, three (3) ports are open, namely: 80 (HTTP), 443 (HTTPS), and 25 (SMTP).  Ports 80 and 443 are served by <em>Nginx<\/em>, which acts as a proxy for this website and file hosting service. Port 25 is served by <em>Postfix<\/em>, the MTA for my mail server.<\/p>\n\n\n\n<p>Below is the complete VMBR1 bridge configuration.<\/p>\n\n\n\n<pre id=\"postupwifi\" class=\"wp-block-code\"><code>auto vmbr1\niface vmbr1 inet static\n#       External services. Fix IP. Gateway via vmbr0.\n        address 192.168.1.1\/24\n        bridge-ports none\n        bridge-stp off\n        bridge-fd 0\n\n        post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 25  -j DNAT --to-destination 192.168.1.2:25\n        post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 80  -j DNAT --to-destination 192.168.1.3:80\n        post-up iptables -t nat -A PREROUTING -i vmbr0 -p tcp --dport 443 -j DNAT --to-destination 192.168.1.3:443\n        post-up iptables -t nat -A POSTROUTING -s '192.168.1.0\/24' -o vmbr0 -j MASQUERADE\n\n        post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 25  -j DNAT --to-destination 192.168.1.2:25\n        post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 80  -j DNAT --to-destination 192.168.1.3:80\n        post-down iptables -t nat -D PREROUTING -i vmbr0 -p tcp --dport 443 -j DNAT --to-destination 192.168.1.3:443\n        post-down iptables -t nat -D POSTROUTING -s '192.168.1.0\/24' -o vmbr0 -j MASQUERADE\n\n        post-up   ip route add 192.168.1.0\/24 dev vmbr1 src 192.168.1.1 table wifi\n        post-down ip route del 192.168.1.0\/24 dev vmbr1 src 192.168.1.1 table wifi<\/code><\/pre>\n\n\n\n<p>The<strong> <em>post-up<\/em><span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">&nbsp;<\/span><\/strong><span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">(and its corresponding&nbsp;<em>post-down<\/em><\/span>) command sets up the port-forwarding rule of each opened port. There is also a <em>post-up<\/em> (and <em>post-down<\/em>) that adds (or deletes) an entry in the custom routing table used for WiFi traffic. Refer to VMBR2 for details on why this configuration exists.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">VMBR2<\/h4>\n\n\n\n<p>This Linux bridge is intended for guests that require only egress traffic, such as my workstation.  Outgoing traffic is forwarded to the Wi-Fi adapter.   This is accomplished by creating a POSTROUTING NAT rule, a custom routing table named <em>wifi, <\/em>and a custom routing rule that points to it.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>post-up   iptables -t nat -A POSTROUTING -s '192.168.2.0\/24' -o wlp11s0 -j MASQUERADE\n   :\npost-up   ip rule add from 192.168.2.0\/24 table wifi\npost-up   ip rule add to   192.168.2.0\/24 table wifi<\/code><\/pre>\n\n\n\n<p>For guests in this subnet to reach other guests in other subnets, we need to add a routing entry in this custom table that points to the gateway of the target subnet. You can see this in the <span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\"><a href=\"#postupwifi\" data-type=\"internal\" data-id=\"#postupwifi\">VMBR1<\/a> configuration, where a<\/span><span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">&nbsp;<em>post<\/em>-up&nbsp;command adds the VMBR1  CIDR and gateway to the Wi-Fi route table<\/span>. So this would allow my workstation to access VMs on this bridge.<\/p>\n\n\n\n<p>A Wi-Fi adapter cannot be enslaved by a bridge, unlike an Ethernet adapter, so it will issue a DHCP request for an IP address to the Wi-Fi router independently of the bridge.  The IP address will be dynamic, and since <span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">it will be the default gateway in the&nbsp;<em>Wi-Fi<\/em>&nbsp;routing table, we need to <\/span>update the table whenever it changes.  This is accomplished by using DHCP exit hooks, <span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">implemented as scripts in the&nbsp;<em>\/etc\/dhcp\/dhclient-exit-hooks directory,&nbsp;<\/em>which are executed whenever a DHCP event occurs<\/span>.<\/p>\n\n\n\n<p>Below is a snippet of this DHCP exit hook script:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>echo \"${reason}\" &gt;&gt; $LOGFILE\n\ncase ${interface} in\n     wlp11s0)\n        case ${reason} in\n           BOUND)\n                ip route add default via ${new_routers} dev ${interface} table wifi | tee -a \"$LOGFILE\"\n                ip rule add from ${new_ip_address}\/32 table wifi | tee -a \"$LOGFILE\"\n                ip rule add to   ${new_ip_address}\/32 table wifi | tee -a \"$LOGFILE\"<\/code><\/pre>\n\n\n\n<p>In the script, whenever a new IP is leased (BOUND), the custom table is updated to set the new IP as the default gateway. In addition, a custom rule is added to ensure that incoming and outgoing traffic destined for this IP uses the custom table.<\/p>\n\n\n\n<p>The complete VMBR2 bridge configuration is shown below:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>auto wlp11s0\niface wlp11s0 inet dhcp\n#       Wifi network interface.\n        wpa-conf \/etc\/wpa_supplicant\/wpa_supplicant.conf\n\nauto vmbr2\niface vmbr2 inet static\n#       Egress only VMs. Gateway is via wlp11s0.\n        address 192.168.2.1\/24\n        bridge-ports none\n        bridge-stp off\n        bridge-fd 0\n\n        post-up   iptables -t nat -A POSTROUTING -s '192.168.2.0\/24' -o wlp11s0 -j MASQUERADE\n        post-down iptables -t nat -D POSTROUTING -s '192.168.2.0\/24' -o wlp11s0 -j MASQUERADE\n\n        #for firewall \n        post-up   iptables -t raw -I PREROUTING -i fwbr+ -j CT --zone 1\n        post-down iptables -t raw -D PREROUTING -i fwbr+ -j CT --zone 1\n\n        #routes and rules\n        post-up   ip route add 192.168.2.0\/24 dev vmbr2 src 192.168.2.1 table wifi\n        post-down ip route del 192.168.2.0\/24 dev vmbr2 src 192.168.2.1 table wifi\n\n        post-up   ip rule add from 192.168.2.0\/24 table wifi\n        post-up   ip rule add to   192.168.2.0\/24 table wifi\n        post-down ip rule del from 192.168.2.0\/24 table wifi\n        post-down ip rule del to   192.168.2.0\/24 table wifi<\/code><\/pre>\n\n\n\n<p>When the entire configuration is applied, the custom routing rule and routing rule tables should resemble the outputs below:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>$ ip route show table wifi\ndefault via 192.168.0.1 dev wlp11s0 \n192.168.1.0\/24 dev vmbr1 scope link src 192.168.1.1 \n192.168.2.0\/24 dev vmbr2 scope link src 192.168.2.1 \n192.168.3.0\/24 dev vmbr3 scope link src 192.168.3.1 \n192.168.4.0\/24 dev vmbr4 scope link src 192.168.4.1 \n\n$ ip rule show\n0:      from all lookup local\n32762:  from all to 192.168.2.0\/24 lookup wifi\n32763:  from 192.168.2.0\/24 lookup wifi\n32764:  from all to 192.168.0.168 lookup wifi\n32765:  from 192.168.0.168 lookup wifi\n32766:  from all lookup main\n32767:  from all lookup default<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">VMBR3<\/h4>\n\n\n\n<p>This Linux bridge is intended for a private subnet that does not expect any traffic to and from the internet. So its entry in the configuration file is straightforward, i.e. no NATs or port forwarding. <\/p>\n\n\n\n<p>The complete VMBR3 bridge configuration is shown below:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>auto vmbr3\niface vmbr3 inet static\n#       Internal VMs. No Ingress or Egress.\n        address 192.168.3.1\/24\n        bridge-ports none\n        bridge-stp off\n        bridge-fd 0\n\n        post-up   ip route add 192.168.3.0\/24 dev vmbr3 src 192.168.3.1 table wifi\n        post-down ip route del 192.168.3.0\/24 dev vmbr3 src 192.168.3.1 table wifi<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">VMBR4<\/h4>\n\n\n\n<p>This Linux bridge is intended for services used solely by other guests. Network services such as DNS, DHCP, and storage services like NAS run in this subnet. The network is considered private, although some VMs with services that require internet connectivity, like NTP, are given internet access via VMBR0. VMs created in this bridge have a static IP address because they either need to be referenced directly by IP (e.g., a DNS server) or because internet access is granted per-VM. <\/p>\n\n\n\n<p>The complete VMBR4 bridge configuration is shown below:<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>auto vmbr4\niface vmbr4 inet static\n#       Internal services. Selective Egress. Gateway via vmbr0.\n        address 192.168.4.1\/24\n        bridge-ports none\n        bridge-stp off\n        bridge-fd 0\n\n        post-up   iptables -t nat -A POSTROUTING -s '192.168.4.2\/32' -o vmbr0 -j MASQUERADE\n        post-down iptables -t nat -D POSTROUTING -s '192.168.4.2\/32' -o vmbr0 -j MASQUERADE\n\n        post-up   ip route add 192.168.4.0\/24 dev vmbr4 src 192.168.4.1 table wifi\n        post-down ip route del 192.168.4.0\/24 dev vmbr4 src 192.168.4.1 table wifi<\/code><\/pre>\n\n\n\n<h4 class=\"wp-block-heading\">DHCP and Dynamic DNS<\/h4>\n\n\n\n<p>Proxmox can be configured to provide a DHCP service. This is done through a <a href=\"https:\/\/pve.proxmox.com\/wiki\/Setup_Simple_Zone_With_SNAT_and_DHCP\">VNet<\/a> in an SDN. Unfortunately, this feature does not work when the bridge uses a Wi-Fi interface via a custom routing table and routing rule, such as <strong>VMBR3<\/strong>.  An alternative is to create a dedicated VM that runs a DHCP service, which is what I end up doing.<\/p>\n\n\n\n<p>So within the VMB4 subnet, I created a VM running&nbsp;<em>dnsmasq<\/em>. &nbsp;There are several DHCP packages to choose from, but I chose <em>dnsmasq <\/em>because it not only provides DHCP but also a dynamic DNS service. <span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">How this works is that when a client with a hostname, say <em>myworkstation<\/em>,<\/span><span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">&nbsp;requests an IP address, the DNS service automatically maps the client&#8217;s hostname to an IP address, giving it a canonical name,<em>&nbsp;hostname.domain_name,<\/em>&nbsp;e.g.,<\/span> <em>myworkstation.mylinuxsite.com.<\/em><\/p>\n\n\n\n<p><span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">If you are using Fedora as your server to host&nbsp;<em>dnsmasq<\/em>, you can c<\/span>onfigure it as a <a href=\"https:\/\/docs.fedoraproject.org\/en-US\/fedora-server\/administration\/dnsmasq\/\">NetworkManager plugin<\/a>. If you take this option, as I did in my installation, you will be working on a different set of configuration files rather than the standard <em>\/etc\/dnsmasq.conf <\/em>file.<\/p>\n\n\n\n<p>At a minimum, you need to create three (3) configuration files. <\/p>\n\n\n\n<ol style=\"list-style-type:upper-roman\" class=\"wp-block-list\">\n<li style=\"border-style:none;border-width:0px;margin-right:var(--wp--preset--spacing--40);margin-left:var(--wp--preset--spacing--40);padding-right:0;padding-left:0\"><strong>\/etc\/NetworkManager\/conf.d\/00-enable-dnsmasq.conf<\/strong><\/li>\n<\/ol>\n\n\n\n<p>This configuration file enables the dnsmasq plugin.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># \/etc\/NetworkManager\/conf.d\/00-enable-dnsmasq.conf #\n# This enabled the dnsmasq plugin.\n&#91;main]\ndns=dnsmasq<\/code><\/pre>\n\n\n\n<ol start=\"2\" style=\"list-style-type:upper-roman\" class=\"wp-block-list\">\n<li style=\"margin-right:var(--wp--preset--spacing--40);margin-left:var(--wp--preset--spacing--40)\"><strong>\/etc\/NetworkManager\/dnsmasq.d\/01-dns.conf<\/strong><\/li>\n<\/ol>\n\n\n\n<p>This configuration file is the setting for the DNS service. <\/p>\n\n\n\n<p>Two (2) parameter entries in this file are worth noting here, namely: <\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li style=\"margin-right:var(--wp--preset--spacing--50);margin-left:var(--wp--preset--spacing--50)\"><em><strong>addn-hosts &#8211; <\/strong><\/em>This parameter<em> l<\/em>ets you point to a file containing a static mapping.  In this configuration, it points to <em>\/etc\/hosts<\/em>.  Servers with static IP addresses, such as those in VMBR1 and VMBR4, are defined in this file.<\/li>\n\n\n\n<li style=\"margin-right:var(--wp--preset--spacing--50);margin-left:var(--wp--preset--spacing--50)\"><strong><em>server<\/em>  <\/strong><span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">&#8211; This parameter&nbsp;specifies the resolver that&nbsp;<em>dnsmasq&nbsp;<\/em>will use<\/span> if it cannot resolve a given name within itself. In this configuration, it points to Google&#8217;s recursive resolvers.<\/li>\n<\/ol>\n\n\n\n<pre class=\"wp-block-code\"><code> # \/etc\/NetworkManager\/dnsmasq.d\/01-dns.conf\n # This file sets up DNS for the private local net domain mylinuxsite.com\n local=\/mylinuxsite.com\/\n # file where to find the list of IP - hostname mapping\n addn-hosts=\/etc\/hosts\n \n domain-needed\n bogus-priv\n \n # Automatically add &lt;domain&gt; to simple names in a hosts-file.\n expand-hosts\n \n # interfaces to listen on\n interface=lo\n interface=ens18\n # in case of a bridge don't use the attached server virtual ethernet interface\n \n # The below defines a Wildcard DNS Entry.\n #address=\/.localnet\/10.10.10.zzz\n \n # Upstream public net DNS server (max.three)\n no-poll\n server=8.8.8.8\n server=8.8.4.4<\/code><\/pre>\n\n\n\n<ol start=\"3\" style=\"list-style-type:upper-roman\" class=\"wp-block-list\">\n<li style=\"margin-right:var(--wp--preset--spacing--40);margin-left:var(--wp--preset--spacing--40)\"><strong>\/etc\/NetworkManager\/dnsmasq.d\/02-dhcp.conf<\/strong><\/li>\n<\/ol>\n\n\n\n<p>The configuration file is the setting for the DHCP service. <\/p>\n\n\n\n<p>Parameters worth nothing here include:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li style=\"margin-right:var(--wp--preset--spacing--50);margin-left:var(--wp--preset--spacing--50)\"><strong>dhcp-option=6,192.168.4.2<\/strong>: specifies the list of name servers available to the client. The value <strong>6<\/strong> is the code for the Domain Name System (DNS) option (<a href=\"https:\/\/datatracker.ietf.org\/doc\/html\/rfc2132\">see RFC 2132<\/a>).<\/li>\n\n\n\n<li style=\"margin-right:var(--wp--preset--spacing--50);margin-left:var(--wp--preset--spacing--50)\"><strong>dhcp-range<\/strong>: specifies the IP range that can be assigned and the leased time. The name appearing before the IP is simply a tag which is referenced by another <em>dhcp-option<\/em> parameter.<\/li>\n\n\n\n<li style=\"margin-right:var(--wp--preset--spacing--50);margin-left:var(--wp--preset--spacing--50)\"><strong>dhcp-option=vmbr2,option:router,192.168.2.1<\/strong>: specifies that traffic requests coming from this gateway(router) should reference the <em>dhcp-range<\/em> parameter with the same tag to determine the IP range and leased time.<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-code\"><code> # etc\/NetworkManager\/dnsmasq.d\/02-dhcp.conf\n # This file sets up DHCP for the private local net domain mylinuxsite.com\n \ndomain=mylinuxsite.com\n \nlog-dhcp\n \ninterface=ens18\n \ndhcp-authoritative\n \ndhcp-option=6,192.168.4.2\n \ndhcp-range=vmbr2,192.168.2.10,192.168.2.200,255.255.255.0,12h\ndhcp-range=vmbr3,192.168.3.10,192.168.3.250,255.255.255.0,12h\n \ndhcp-option=vmbr2,option:router,192.168.2.1\ndhcp-option=vmbr3,option:router,192.168.3.1<\/code><\/pre>\n\n\n\n<p>Note that you don&#8217;t need to give these files the same name that I have. You can have your own naming convention.<\/p>\n\n\n\n<h5 class=\"wp-block-heading\">The DHCP Relay<\/h5>\n\n\n\n<p>With the DHCP service running on another subnet (or bridge), how can VMs on another subnet find or forward their requests to this DHCP service? The solution is to use a <em>DHCP relay<\/em>.  A DHCP request is sent as a broadcast, but only within a subnet, including the subnet gateway.  The DHCP relay can listen for this broadcast on the bridge&#8217;s interface and relay that request to a DHCP server. <\/p>\n\n\n\n<p>The DHCP relay service must be running on the node, not on a guest machine. For the package, there are a few to choose from; in this installation, I selected <a href=\"https:\/\/kb.isc.org\/docs\/isc-dhcp-44-manual-pages-dhcrelay\">isc-dhcp-relay<\/a>.<\/p>\n\n\n\n<p>The <span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\"><em>isc-dhcp-relay<\/em> configuration file is located at&nbsp;<u><em>\/etc\/default\/isc-dhcp-relay<\/em><\/u>, <\/span>where you need to supply the following: 1) the location of the DHCP server, 2) the interfaces the relay should listen to, 3) which interfaces are upstream (-iu) and downstream (-id).<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code># Defaults for isc-dhcp-relay initscript\n# sourced by \/etc\/init.d\/isc-dhcp-relay\n# installed at \/etc\/default\/isc-dhcp-relay by the maintainer scripts\n\n#\n# This is a POSIX shell fragment\n#\n\n# What servers should the DHCP relay forward requests to?\nSERVERS=\"192.168.4.2\"\n\n# On what interfaces should the DHCP relay (dhrelay) serve DHCP requests?\nINTERFACES=\"vmbr3 vmbr2\"\n\n# Additional options that are passed to the DHCP relay daemon?\nOPTIONS=\"-iu vmbr4 -id vmbr3 -id vmbr2\"<\/code><\/pre>\n\n\n\n<p><span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">In the next part of this blog, I will discuss in more detail the other services running <span style=\"box-sizing: border-box; margin: 0px; padding: 0px;\">on my installation:&nbsp;<em>WordPress<\/em>&nbsp;for Web,&nbsp;<em>Postfix<\/em>&nbsp;for SMTP,&nbsp;<em>Nextcloud<\/em>&nbsp;for collaboration,&nbsp;<\/span>and&nbsp;<em>TrueNAS<\/em>&nbsp;for cloud storage.<\/span><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>In Part 1 of this blog, I discussed how my decision to replace my ageing home lab\/server\/workstation led me to adopt Proxmox. I ended the blog with a summary of the new machine&#8217;s network setup. In Part 2 of this blog, I will delve into the network configuration of the new machine. In particular, I [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":true,"template":"","format":"standard","meta":{"site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","ast-disable-related-posts":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"var(--ast-global-color-4)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[12],"tags":[],"class_list":["post-1925","post","type-post","status-publish","format-standard","hentry","category-articles"],"_links":{"self":[{"href":"https:\/\/mylinuxsite.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1925","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/mylinuxsite.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/mylinuxsite.com\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/mylinuxsite.com\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/mylinuxsite.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1925"}],"version-history":[{"count":42,"href":"https:\/\/mylinuxsite.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1925\/revisions"}],"predecessor-version":[{"id":1970,"href":"https:\/\/mylinuxsite.com\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/1925\/revisions\/1970"}],"wp:attachment":[{"href":"https:\/\/mylinuxsite.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1925"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/mylinuxsite.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1925"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/mylinuxsite.com\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1925"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}