{ "meta": { "title": "Post-Install: Network | ProxMenux Documentation", "description": "Network-related optimizations in the ProxMenux Customizable post-install script: force APT over IPv4, apply a curated sysctl tuning profile, install Open vSwitch, enable TCP BBR + Fast Open, and pin interface names to their MAC addresses." }, "header": { "title": "Post-Install: Network", "section": "Settings post-install Proxmox" }, "intro": { "title": "What this category covers", "body": "Five independent network options. Two are small (APT over IPv4, Open vSwitch install), two tune TCP behaviour (network sysctl profile, BBR + Fast Open), and one fixes a common operational headache — pinning interface names so a new NIC or a BIOS update doesn't rename enp3s0 to enp4s0 and break your bridges." }, "ipv4": { "heading": "Force APT to use IPv4", "intro": "Writes Acquire::ForceIPv4 \"true\"; to /etc/apt/apt.conf.d/99-force-ipv4. APT then refuses to use IPv6 for package downloads, even if the host has IPv6 connectivity.", "tipTitle": "Who benefits", "tipBody": "Useful when your IPv6 path is flaky, slower than IPv4, or the Debian/Proxmox mirror occasionally breaks over IPv6 (it happens). Harmless on hosts without IPv6. On a healthy dual-stack network, it's just a guarantee of predictable behaviour — apt won't surprise you with an IPv6 timeout." }, "sysctl": { "heading": "Apply network optimizations", "intro": "Writes a curated sysctl profile to /etc/sysctl.d/99-network.conf covering core socket buffers, ICMP hardening, basic spoof protection, and TCP buffer sizes that make sense on a hypervisor with lots of concurrent flows.", "tunedTitle": "What gets tuned", "headerArea": "Area", "headerSettings": "Key settings", "rows": [ { "area": "Core socket buffers", "settings": "netdev_max_backlog=8192, rmem_max=16M, wmem_max=16M, somaxconn=8192" }, { "area": "ICMP hardening", "settings": "icmp_echo_ignore_broadcasts=1, icmp_ignore_bogus_error_responses=1" }, { "area": "Routing safety", "settings": "accept_redirects=0, accept_source_route=0, secure_redirects=0, send_redirects=0" }, { "area": "Reverse path filter", "settings": "rp_filter=2 (loose mode, see note below)" }, { "area": "TCP", "settings": "tcp_mtu_probing=1, tcp_rfc1337=1, tcp_sack=1, tcp_rmem=8K/87K/16M, tcp_wmem=8K/64K/16M" }, { "area": "Ports", "settings": "ip_local_port_range=1024 65535 (ephemeral port pool)" }, { "area": "Unix sockets", "settings": "net.unix.max_dgram_qlen=4096" } ], "sourceOutro": "It also adds source /etc/network/interfaces.d/* to /etc/network/interfaces if not already present — standard practice so you can drop modular interface snippets without editing the main file.", "fwbrTitle": "Automatic tuning of virtual firewall bridges", "fwbrBody": "Alongside the sysctl profile, ProxMenux installs a helper at /usr/local/sbin/proxmenux-fwbr-tune that applies rp_filter=0 and log_martians=0 to the fwbr* / fwln* / fwpr* / tap* interfaces Proxmox creates around VMs and containers. The helper is invoked by the proxmenux-fwbr-tune.service one-shot unit at boot, and by the /etc/udev/rules.d/99-proxmenux-fwbr-tune.rules rule on every net add event matching those prefixes — covering interfaces that Proxmox recreates on VM start/stop, reboot and live migration.", "rpFilterTitle": "Why rp_filter=2 (loose) instead of 1 (strict)", "rpFilterBody": "Strict reverse-path filtering drops packets whose source would be routed out a different interface. That's the right default on a client machine, but breaks badly on a Proxmox host where VM traffic often arrives on a bridge and leaves on an uplink with asymmetric routes. rp_filter=2 (loose) only drops packets with truly unroutable sources. It's a pragmatic trade-off — slight reduction in local-IP-spoof detection in exchange for not breaking your VM network." }, "ovs": { "heading": "Install Open vSwitch", "intro": "Installs openvswitch-switch + openvswitch-common. These packages add OVS as a bridge implementation alternative to the standard Linux bridges that Proxmox uses by default. The install alone doesn't change any networking — existing vmbrX bridges keep working. OVS becomes available in the Proxmox UI when you create a new bridge and pick it from the type dropdown.", "tipTitle": "When OVS makes sense", "tipBody": "Consider OVS if you need VLAN trunking with non-contiguous VLAN IDs, LACP with LLDP on specific modes, fine-grained flow programming (OpenFlow), or interoperation with SDN controllers. For a home lab with a couple of VLANs and a single LACP uplink, standard Linux bridges + vmbrX.VID are simpler and perfectly fine.", "revertTitle": "Not reversible from the Uninstall menu", "revertBody": "Installing OVS is not tracked in Uninstall Optimizations. If you decide you don't want it, remove it manually — but only after migrating any bridges back to Linux bridges first:" }, "bbr": { "heading": "Enable TCP BBR + TCP Fast Open", "intro": "Writes two sysctl files and reloads them. BBR replaces the default CUBIC congestion control with Google's bandwidth-based algorithm, which handles long-fat pipes and lossy links much better. TCP Fast Open (TFO) eliminates a round trip on repeat TCP connections by piggy-backing data on the SYN.", "verifyTitle": "Verification", "impactTitle": "Impact is workload-dependent", "impactBody": "BBR shines on high-latency or lossy links (cross-continent replication, VPN tunnels, mobile clients). On a LAN between two machines on the same switch, the difference is often within noise. TFO helps short, repeated HTTP connections the most.", "revertTitle": "Not reversible from the Uninstall menu", "revertBody": "BBR/TFO aren't tracked. To revert, remove the two sysctl files and reload:" }, "names": { "heading": "Interface Names (persistent)", "intro": "Iterates over every physical NIC the host has (skipping loopback, Docker veths, bridges, TAP devices, bonds, Cilium, ZeroTier, WireGuard) and writes a systemd .link file binding the current interface name to the current MAC address. The kernel's naming logic can then no longer rename that NIC — the MAC wins.", "whyTitle": "Why this matters", "whyItems": [ "Adding or removing PCIe devices can shift the bus numbering, turning enp3s0 into enp4s0. If your /etc/network/interfaces references the old name, the bridge vanishes on reboot.", "BIOS / firmware updates sometimes change how devices enumerate, with the same effect.", "LXC containers with hotplug NICs and bonded links can race on boot and end up named inconsistently. Pinning fixes that." ], "writtenTitle": "What gets written", "writtenIntro": "One file per physical NIC, at /etc/systemd/network/10-proxmenux-<iface>.link. Each file starts with the header # Managed by ProxMenux — do not edit so ProxMenux can distinguish its own files from user- or package-provided .link files.", "writtenOutro": ".link files from other packages or hand-written by the user are left in place — only files carrying the ProxMenux header are managed. On re-run, the function reconciles its own set: it re-reads MACAddress= from every 10-proxmenux-*.link and drops any whose MAC no longer appears under /sys/class/net/. Files written by an earlier ProxMenux release in the old 10-<iface>.link format are migrated automatically the first time.", "pveTitle": "PVE 9 vs PVE 8", "pveBody": "On Proxmox VE 9 (systemd-networkd native), the script reloads udev rules after writing the .link files so new hotplug NICs pick up the correct name without a reboot. On PVE 8 (ifupdown2), interface naming is resolved at boot anyway — a reboot is required for the changes to take effect. The script sets the reboot flag either way so Customizable prompts you.", "reviewTitle": "Review existing /etc/network/interfaces first", "reviewBody": "If your host has legacy configuration in /etc/network/interfaces that references NIC names generated by the kernel's default scheme, pinning today's names is exactly what you want. But if you've already manually customised the config around specific names, double-check the pinning matches what the interfaces file expects before rebooting.", "revertTitle": "Reversible from the Uninstall menu", "revertBody": "Uninstall Optimizations deletes only the 10-proxmenux-*.link files carrying the ProxMenux header from /etc/systemd/network/. Any .link file added by the user or by another package is preserved. Interface names return to systemd's default behaviour on next reboot." }, "related": { "heading": "Related", "items": [ { "label": "Network Management", "href": "/docs/network", "tail": " — diagnostics, bridge analysis, guided repairs." }, { "label": "Persistent interface names", "href": "/docs/network/persistent-names", "tail": " — same idea exposed as its own menu later (use either, not both)." }, { "label": "Network commands reference", "href": "/docs/help-info/network-commands", "tail": " — ip, ss, ethtool, sysctl." }, { "label": "Uninstall Optimizations", "href": "/docs/post-install/uninstall", "tail": " — revert any of these network changes." }, { "label": "Customizable Post-Install", "href": "/docs/post-install/customizable", "tail": " — back to the parent menu." } ] } }