[{"data":1,"prerenderedAt":30},["ShallowReactive",2],{"doc-en-additional-ip-vps":3},{"path":4,"slug":5,"title":6,"description":7,"category":8,"subcategory":9,"icon":10,"date":11,"author":12,"order":13,"image":14,"tags":15,"keywords":20,"docGroup":26,"docGroupIcon":27,"link_fr":28,"bodyHtml":29},"\u002Fdocs\u002Fen\u002Fvps\u002Fvps-linux\u002Fadditional-ip-vps","additional-ip-vps","How to configure an additional IP on your VPS","Configure an additional IP on your Winheberg VPS, automatic script method or manual setup depending on your distribution.","vps","vps-linux","tabler:file-text","2026-07-23","Winheberg",63,"\u002Fstatics\u002Fimages\u002Fdocs\u002Fen\u002Fvps-linux\u002Fadditional-ip-vps.webp",[8,16,17,18,19],"additional ip","netplan","networkmanager","network",[21,22,23,24,25],"additional ip vps","add ip address vps","netplan additional ip","networkmanager additional ip","winheberg vps","test1","tabler:layout-list","\u002Fdocs\u002Fvps-linux\u002Fip-supplementaire","\u003Ch2>Context\u003C\u002Fh2>\n\u003Cp>By default, every Winheberg VPS comes with one IPv4 address. If your project needs multiple addresses, for example to isolate several services, manage separate TLS certificates, or split traffic, you can order one or more additional IPs from your client area.\u003C\u002Fp>\n\u003Cp>On our VPS, an additional IP is added in the same network as your primary IP, as a \u003Ccode>\u002F25\u003C\u002Fcode> for IPv4 and a \u003Ccode>\u002F64\u003C\u002Fcode> for IPv6. Unlike a fully isolated address, it doesn&#39;t need a dedicated gateway or a special routing rule, the default route already present on your VPS is enough for it to respond correctly from the outside. All you need to do is add the address on your existing network interface.\u003C\u002Fp>\n\u003Cp>The typical symptom of an IP added with the wrong prefix, or not added at all, is no response to a ping from the outside.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">$ ping 82.153.202.X\nRequest timeout for icmp_seq 0\nRequest timeout for icmp_seq 1\nRequest timeout for icmp_seq 2\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2>Prerequisites\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>An active Winheberg VPS with root SSH access\u003C\u002Fli>\n\u003Cli>An additional IP already ordered on your product and visible in the IP Address section of your client area\u003C\u002Fli>\n\u003Cli>Access to your client area at \u003Ccode>https:\u002F\u002Fbilling.winheberg.com\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>A recent backup of your VPS\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cdiv class=\"markdown-alert markdown-alert-warning\">\u003Cspan class=\"alert-icon\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\u003Cpath d=\"M10.29 3.86L1.82 18a2 2 0 0 0 1.71 3h16.94a2 2 0 0 0 1.71-3L13.71 3.86a2 2 0 0 0-3.42 0z\"\u002F>\u003Cline x1=\"12\" y1=\"9\" x2=\"12\" y2=\"13\"\u002F>\u003Cline x1=\"12\" y1=\"17\" x2=\"12.01\" y2=\"17\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\u003Cdiv class=\"markdown-alert-body\">\u003Cp>Changing network configuration always carries some risk. The steps in this guide are additive and don&#39;t touch your primary IP, so your SSH access on the primary address stays intact. Still keep a recent backup as a precaution, since our VPS don&#39;t have a boot console.\u003C\u002Fp>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Ch2>1. Get your additional IP&#39;s details\u003C\u002Fh2>\n\u003Cp>An additional IP is ordered from your client area, on the relevant product&#39;s page, through the Upgrade\u002FDowngrade Options. Once the address is provisioned, it appears in the IP Address section of your product page. Note this value down, the examples in this guide use demo addresses.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Parameter\u003C\u002Fth>\n\u003Cth>IPv4 example\u003C\u002Fth>\n\u003Cth>IPv6 example\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Additional address\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>82.153.202.X\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>2001:db8:1::X\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Prefix\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002F25\u003C\u002Fcode>\u003C\u002Ftd>\n\u003Ctd>\u003Ccode>\u002F64\u003C\u002Fcode>\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cdiv class=\"markdown-alert markdown-alert-important\">\u003Cspan class=\"alert-icon\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\u003Cpath d=\"M12 22c5.523 0 10-4.477 10-10S17.523 2 12 2 2 6.477 2 12s4.477 10 10 10z\"\u002F>\u003Cpath d=\"M12 8v4\"\u002F>\u003Cpath d=\"M12 16h.01\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\u003Cdiv class=\"markdown-alert-body\">\u003Cp>The exact address, for both IPv4 and IPv6, is shown in the IP Address section of your product page. The values in this guide are examples and don&#39;t match your network. No dedicated gateway is needed for an additional IP, it shares your primary IP&#39;s default route.\u003C\u002Fp>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Ch2>2. Identify the right method for your VPS\u003C\u002Fh2>\n\u003Cp>Persistence across reboots doesn&#39;t depend on the distribution itself, but on the tool managing your network. The table below summarizes which sub-tab to follow.\u003C\u002Fp>\n\u003Ctable>\n\u003Cthead>\n\u003Ctr>\n\u003Cth>Distribution\u003C\u002Fth>\n\u003Cth>Detected network tool\u003C\u002Fth>\n\u003Cth>Sub-tab to follow\u003C\u002Fth>\n\u003C\u002Ftr>\n\u003C\u002Fthead>\n\u003Ctbody>\u003Ctr>\n\u003Ctd>Debian 12+, Ubuntu 22.04+\u003C\u002Ftd>\n\u003Ctd>netplan\u003C\u002Ftd>\n\u003Ctd>Debian 12+ and Ubuntu 22.04+ (netplan)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>AlmaLinux 9, Rocky 9\u003C\u002Ftd>\n\u003Ctd>NetworkManager\u003C\u002Ftd>\n\u003Ctd>AlmaLinux, Rocky, Fedora (NetworkManager)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>AlmaLinux 10, Rocky 10\u003C\u002Ftd>\n\u003Ctd>NetworkManager\u003C\u002Ftd>\n\u003Ctd>AlmaLinux, Rocky, Fedora (NetworkManager)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Fedora 41, 42\u003C\u002Ftd>\n\u003Ctd>NetworkManager\u003C\u002Ftd>\n\u003Ctd>AlmaLinux, Rocky, Fedora (NetworkManager)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Debian 11\u003C\u002Ftd>\n\u003Ctd>neither netplan nor NetworkManager, systemd only\u003C\u002Ftd>\n\u003Ctd>Debian 11 (systemd)\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003Ctr>\n\u003Ctd>Alpine 3.22\u003C\u002Ftd>\n\u003Ctd>OpenRC\u003C\u002Ftd>\n\u003Ctd>Alpine\u003C\u002Ftd>\n\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>If you&#39;re unsure which tool is active, the commands below will tell you, in this order of priority.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\"># Is netplan present?\nls \u002Fetc\u002Fnetplan\u002F 2&gt;\u002Fdev\u002Fnull\n\n# Is NetworkManager active?\nsystemctl is-active NetworkManager 2&gt;\u002Fdev\u002Fnull\n\n# Is it Alpine?\ncat \u002Fetc\u002Falpine-release 2&gt;\u002Fdev\u002Fnull\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>If none of these three commands return a positive result but \u003Ccode>systemctl\u003C\u002Fcode> works, your system runs on systemd alone, which is the case for Debian 11 on our images.\u003C\u002Fp>\n\u003Cdiv class=\"markdown-alert markdown-alert-note\">\u003Cspan class=\"alert-icon\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cline x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"\u002F>\u003Cline x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\u003Cdiv class=\"markdown-alert-body\">\u003Cp>If your interface isn&#39;t named \u003Ccode>eth0\u003C\u002Fcode>, adapt the commands. The \u003Ccode>ip -br link\u003C\u002Fcode> command lists your network interfaces.\u003C\u002Fp>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Ch2>3. Configure the additional IP\u003C\u002Fh2>\n\u003Cp>Two approaches are possible. Our automatic script detects your distribution and applies everything through a menu. Manual configuration gives you full control, with one method per network tool.\u003C\u002Fp>\n\u003Ch3>Automatic method with our script\u003C\u002Fh3>\n\u003Cp>Our script automatically detects your network tool and shows a menu to add or remove an additional IP, for both IPv4 and IPv6. It applies the configuration and handles persistence across reboots, without ever touching your primary IP. This is the method we recommend, the manual configuration below reproduces exactly what the script does, for those who prefer to do everything by hand.\u003C\u002Fp>\n\u003Cp>Download the script from our GitHub repository, make it executable, then run it with root privileges.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">curl -o \u002Fusr\u002Flocal\u002Fsbin\u002Fwinheberg-additional-ip.sh REPLACE-WITH-GITHUB-LINK\nchmod +x \u002Fusr\u002Flocal\u002Fsbin\u002Fwinheberg-additional-ip.sh\nsudo \u002Fusr\u002Flocal\u002Fsbin\u002Fwinheberg-additional-ip.sh\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Enter your address when the script asks for it, for example \u003Ccode>82.153.202.X\u003C\u002Fcode>, and it configures the interface for you.\u003C\u002Fp>\n\u003Ch3>Manual configuration\u003C\u002Fh3>\n\u003Cp>Choose IPv4 or IPv6 first, then the method suited to your network tool. Each method simply adds the address to the existing interface, in the same network as your primary IP, without a gateway or dedicated routing table.\u003C\u002Fp>\n\u003Cdiv class=\"md-tabs\" data-md-tabs>\u003Cdiv class=\"md-tabs__nav\" role=\"tablist\">\u003Cbutton type=\"button\" role=\"tab\" class=\"md-tabs__btn md-tabs__btn--active\" data-md-tab=\"0\" aria-selected=\"true\">IPv4\u003C\u002Fbutton>\u003Cbutton type=\"button\" role=\"tab\" class=\"md-tabs__btn\" data-md-tab=\"1\" aria-selected=\"false\">IPv6\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cdiv class=\"md-tabs__body\">\u003Cdiv role=\"tabpanel\" class=\"md-tab__panel md-tab__panel--active\" data-md-panel=\"0\">\u003Cdiv class=\"md-tabs\" data-md-tabs>\u003Cdiv class=\"md-tabs__nav\" role=\"tablist\">\u003Cbutton type=\"button\" role=\"tab\" class=\"md-tabs__btn md-tabs__btn--active\" data-md-tab=\"0\" aria-selected=\"true\">Debian 12+ and Ubuntu 22.04+ (netplan)\u003C\u002Fbutton>\u003Cbutton type=\"button\" role=\"tab\" class=\"md-tabs__btn\" data-md-tab=\"1\" aria-selected=\"false\">AlmaLinux, Rocky, Fedora (NetworkManager)\u003C\u002Fbutton>\u003Cbutton type=\"button\" role=\"tab\" class=\"md-tabs__btn\" data-md-tab=\"2\" aria-selected=\"false\">Debian 11 (systemd)\u003C\u002Fbutton>\u003Cbutton type=\"button\" role=\"tab\" class=\"md-tabs__btn\" data-md-tab=\"3\" aria-selected=\"false\">Alpine (OpenRC)\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cdiv class=\"md-tabs__body\">\u003Cdiv role=\"tabpanel\" class=\"md-tab__panel md-tab__panel--active\" data-md-panel=\"0\">\u003Cp>Create a dedicated netplan file, for example \u003Ccode>\u002Fetc\u002Fnetplan\u002F70-additional.yaml\u003C\u002Fcode>, with the content below. netplan merges this file with your primary IP&#39;s existing configuration, there&#39;s no need to disable cloud-init&#39;s network management, cloud-init only rewrites its own file (\u003Ccode>50-cloud-init.yaml\u003C\u002Fcode>), not the additional files you create.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yaml\">network:\n  version: 2\n  ethernets:\n    eth0:\n      addresses:\n        - 82.153.202.X\u002F25\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>The netplan file must be readable only by root, otherwise netplan shows a warning.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo chmod 600 \u002Fetc\u002Fnetplan\u002F70-additional.yaml\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Apply the configuration by testing it first, which allows an automatic rollback if you lose the connection.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo netplan try\nsudo netplan apply\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"markdown-alert markdown-alert-note\">\u003Cspan class=\"alert-icon\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cline x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"\u002F>\u003Cline x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\u003Cdiv class=\"markdown-alert-body\">\u003Cp>\u003Ccode>netplan try\u003C\u002Fcode> applies the configuration and then waits for confirmation. Without validation within the given time, it automatically restores the previous state, which protects your SSH access.\u003C\u002Fp>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cdiv role=\"tabpanel\" class=\"md-tab__panel\" data-md-panel=\"1\" hidden>\u003Cp>On these distributions, NetworkManager manages the interface. Rather than modifying the existing connection profile, we add a dispatcher script that reapplies the address on every network event, without touching the NetworkManager configuration already in place.\u003C\u002Fp>\n\u003Cp>First, find your interface&#39;s name.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">ip -br link\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Create the dispatcher script.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo tee \u002Fetc\u002FNetworkManager\u002Fdispatcher.d\u002F50-additional-ip &lt;&lt; &#39;EOF&#39;\n#!\u002Fbin\u002Fsh\n[ &quot;$1&quot; = &quot;eth0&quot; ] || exit 0\ncase &quot;$2&quot; in up|dhcp4-change|dhcp6-change|connectivity-change) ;; *) exit 0 ;; esac\nip addr replace 82.153.202.X\u002F25 dev eth0\nEOF\nsudo chmod +x \u002Fetc\u002FNetworkManager\u002Fdispatcher.d\u002F50-additional-ip\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Apply the address right away, without waiting for the next network event.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo ip addr replace 82.153.202.X\u002F25 dev eth0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"markdown-alert markdown-alert-note\">\u003Cspan class=\"alert-icon\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cline x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"\u002F>\u003Cline x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\u003Cdiv class=\"markdown-alert-body\">\u003Cp>This script fires again every time NetworkManager reconfigures the interface (reboot, reconnection), which makes the address persistent without modifying your existing ifcfg or keyfile connection profile.\u003C\u002Fp>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cdiv role=\"tabpanel\" class=\"md-tab__panel\" data-md-panel=\"2\" hidden>\u003Cp>Debian 11 doesn&#39;t install netplan by default and generally doesn&#39;t run NetworkManager on our images. Persistence therefore goes through a dedicated systemd service that reapplies the address on every boot.\u003C\u002Fp>\n\u003Cp>Create the apply script.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo tee \u002Fusr\u002Flocal\u002Fsbin\u002Fwinheberg-additional-ip-apply.sh &lt;&lt; &#39;EOF&#39;\n#!\u002Fbin\u002Fsh\nip addr replace 82.153.202.X\u002F25 dev eth0\nEOF\nsudo chmod +x \u002Fusr\u002Flocal\u002Fsbin\u002Fwinheberg-additional-ip-apply.sh\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Create the associated systemd service.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo tee \u002Fetc\u002Fsystemd\u002Fsystem\u002Fwinheberg-additional-ip.service &lt;&lt; &#39;EOF&#39;\n[Unit]\nDescription=Winheberg - additional IP\nAfter=network-online.target\nWants=network-online.target\n\n[Service]\nType=oneshot\nRemainAfterExit=yes\nExecStart=\u002Fusr\u002Flocal\u002Fsbin\u002Fwinheberg-additional-ip-apply.sh\n\n[Install]\nWantedBy=multi-user.target\nEOF\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Enable the service so it fires on future boots, then apply the address right away.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo systemctl daemon-reload\nsudo systemctl enable winheberg-additional-ip.service\nsudo ip addr replace 82.153.202.X\u002F25 dev eth0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Cdiv role=\"tabpanel\" class=\"md-tab__panel\" data-md-panel=\"3\" hidden>\u003Cp>First, install \u003Ccode>iproute2\u003C\u002Fcode>, if not already done.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">apk add iproute2\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Create a startup script that applies the address on every boot.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">cat &gt; \u002Fetc\u002Flocal.d\u002Fadditional-ip.start &lt;&lt; &#39;EOF&#39;\n#!\u002Fbin\u002Fsh\nip addr replace 82.153.202.X\u002F25 dev eth0\nEOF\nchmod +x \u002Fetc\u002Flocal.d\u002Fadditional-ip.start\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Enable OpenRC&#39;s \u003Ccode>local\u003C\u002Fcode> service, then run the script without waiting for the next reboot.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">rc-update add local default\nrc-service local start\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"markdown-alert markdown-alert-tip\">\u003Cspan class=\"alert-icon\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cpath d=\"M12 16v-4\"\u002F>\u003Cpath d=\"M12 8h.01\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\u003Cdiv class=\"markdown-alert-body\">\u003Cp>The \u003Ccode>\u002Fetc\u002Flocal.d\u002F\u003C\u002Fcode> folder is provided by OpenRC for this kind of startup command. Your address is thus automatically reapplied on every boot.\u003C\u002Fp>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003Cdiv role=\"tabpanel\" class=\"md-tab__panel\" data-md-panel=\"1\" hidden>\u003Cdiv class=\"md-tabs\" data-md-tabs>\u003Cdiv class=\"md-tabs__nav\" role=\"tablist\">\u003Cbutton type=\"button\" role=\"tab\" class=\"md-tabs__btn md-tabs__btn--active\" data-md-tab=\"0\" aria-selected=\"true\">Debian 12+ and Ubuntu 22.04+ (netplan)\u003C\u002Fbutton>\u003Cbutton type=\"button\" role=\"tab\" class=\"md-tabs__btn\" data-md-tab=\"1\" aria-selected=\"false\">AlmaLinux, Rocky, Fedora (NetworkManager)\u003C\u002Fbutton>\u003Cbutton type=\"button\" role=\"tab\" class=\"md-tabs__btn\" data-md-tab=\"2\" aria-selected=\"false\">Debian 11 (systemd)\u003C\u002Fbutton>\u003Cbutton type=\"button\" role=\"tab\" class=\"md-tabs__btn\" data-md-tab=\"3\" aria-selected=\"false\">Alpine (OpenRC)\u003C\u002Fbutton>\u003C\u002Fdiv>\u003Cdiv class=\"md-tabs__body\">\u003Cdiv role=\"tabpanel\" class=\"md-tab__panel md-tab__panel--active\" data-md-panel=\"0\">\u003Cp>Complete the same \u003Ccode>\u002Fetc\u002Fnetplan\u002F70-additional.yaml\u003C\u002Fcode> file with the IPv6 block, or create the file if you haven&#39;t configured IPv4. When both families coexist, group the \u003Ccode>addresses\u003C\u002Fcode> entries in the same \u003Ccode>eth0\u003C\u002Fcode> block.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yaml\">network:\n  version: 2\n  ethernets:\n    eth0:\n      addresses:\n        - &quot;2001:db8:1::X\u002F64&quot;\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Secure and apply the file the same way as for IPv4.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo chmod 600 \u002Fetc\u002Fnetplan\u002F70-additional.yaml\nsudo netplan try\nsudo netplan apply\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Cdiv role=\"tabpanel\" class=\"md-tab__panel\" data-md-panel=\"1\" hidden>\u003Cp>Add the IPv6 line to the same dispatcher script, after the IPv4 line.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo tee -a \u002Fetc\u002FNetworkManager\u002Fdispatcher.d\u002F50-additional-ip &lt;&lt; &#39;EOF&#39;\nip -6 addr replace 2001:db8:1::X\u002F64 dev eth0\nEOF\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Apply right away.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo ip -6 addr replace 2001:db8:1::X\u002F64 dev eth0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Cdiv role=\"tabpanel\" class=\"md-tab__panel\" data-md-panel=\"2\" hidden>\u003Cp>Add the IPv6 line to the same apply script, after the IPv4 line.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo tee -a \u002Fusr\u002Flocal\u002Fsbin\u002Fwinheberg-additional-ip-apply.sh &lt;&lt; &#39;EOF&#39;\nip -6 addr replace 2001:db8:1::X\u002F64 dev eth0\nEOF\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Apply right away, the systemd service will replay this line on the next boot.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">sudo ip -6 addr replace 2001:db8:1::X\u002F64 dev eth0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003Cdiv role=\"tabpanel\" class=\"md-tab__panel\" data-md-panel=\"3\" hidden>\u003Cp>Add the IPv6 line to the \u003Ccode>\u002Fetc\u002Flocal.d\u002Fadditional-ip.start\u003C\u002Fcode> script, after the IPv4 line.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">ip -6 addr replace 2001:db8:1::X\u002F64 dev eth0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Then restart the local service to apply it.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">rc-service local restart\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Ch2>4. Check that the IP responds\u003C\u002Fh2>\n\u003Cp>Check that the address is present on the interface.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">ip -br addr show eth0\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>You should see your additional IP in the address list, with the correct prefix (\u003Ccode>\u002F25\u003C\u002Fcode> for IPv4, \u003Ccode>\u002F64\u003C\u002Fcode> for IPv6). From another machine, a ping to the additional IP should now respond.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">ping 82.153.202.X\nping -6 2001:db8:1::X\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cdiv class=\"markdown-alert markdown-alert-note\">\u003Cspan class=\"alert-icon\">\u003Csvg xmlns=\"http:\u002F\u002Fwww.w3.org\u002F2000\u002Fsvg\" width=\"16\" height=\"16\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\u003Ccircle cx=\"12\" cy=\"12\" r=\"10\"\u002F>\u003Cline x1=\"12\" y1=\"16\" x2=\"12\" y2=\"12\"\u002F>\u003Cline x1=\"12\" y1=\"8\" x2=\"12.01\" y2=\"8\"\u002F>\u003C\u002Fsvg>\u003C\u002Fspan>\u003Cdiv class=\"markdown-alert-body\">\u003Cp>This verification command is the same across all network tools. It relies on iproute2, present by default everywhere except Alpine, where it&#39;s installed with \u003Ccode>apk add iproute2\u003C\u002Fcode>.\u003C\u002Fp>\n\u003C\u002Fdiv>\u003C\u002Fdiv>\n\u003Ch2>If you run into trouble\u003C\u002Fh2>\n\u003Ch3>❌ The additional IP doesn&#39;t respond to ping\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Check that the address shows up in \u003Ccode>ip -br addr show eth0\u003C\u002Fcode> with the correct prefix\u003C\u002Fli>\n\u003Cli>Make sure you haven&#39;t used a \u003Ccode>\u002F32\u003C\u002Fcode> or \u003Ccode>\u002F128\u003C\u002Fcode> prefix by mistake, the additional IP must stay in the same network as your primary IP, \u003Ccode>\u002F25\u003C\u002Fcode> for IPv4 and \u003Ccode>\u002F64\u003C\u002Fcode> for IPv6\u003C\u002Fli>\n\u003Cli>Check that your firewall (ufw, firewalld, or iptables) isn&#39;t blocking ICMP traffic or the relevant services on the new address\u003C\u002Fli>\n\u003Cli>Confirm you&#39;re targeting the right interface, \u003Ccode>eth0\u003C\u002Fcode> on some images, \u003Ccode>ens3\u003C\u002Fcode> or another name on others\u003C\u002Fli>\n\u003Cli>Compare the configured address with the exact value shown in the IP Address section\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>❌ The configuration disappears after a reboot\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>netplan, the file must be located in \u003Ccode>\u002Fetc\u002Fnetplan\u002F\u003C\u002Fcode> with a \u003Ccode>.yaml\u003C\u002Fcode> extension\u003C\u002Fli>\n\u003Cli>NetworkManager, the dispatcher script must exist in \u003Ccode>\u002Fetc\u002FNetworkManager\u002Fdispatcher.d\u002F\u003C\u002Fcode> and be executable, check with \u003Ccode>ls -l\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Debian 11, the service must be enabled, check with \u003Ccode>systemctl is-enabled winheberg-additional-ip.service\u003C\u002Fcode> and \u003Ccode>systemctl status winheberg-additional-ip.service\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>Alpine, check that \u003Ccode>rc-update add local default\u003C\u002Fcode> was run and that the \u003Ccode>.start\u003C\u002Fcode> script is executable\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>❌ The IP responds but some remote services reject it\u003C\u002Fh3>\n\u003Cul>\n\u003Cli>Check that the service is actually listening on this address and not only on the primary IP, especially if your application binds to a specific address\u003C\u002Fli>\n\u003Cli>Check that no firewall rule specifically targets the primary IP and effectively excludes the new address\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Best practices\u003C\u002Fh2>\n\u003Cul>\n\u003Cli>Prefer our automatic script, it applies exactly the methods described in this guide and handles detecting your network tool for you\u003C\u002Fli>\n\u003Cli>On netplan systems (Debian 12+ and Ubuntu), test with \u003Ccode>netplan try\u003C\u002Fcode>, it restores the previous configuration if you lose access\u003C\u002Fli>\n\u003Cli>Keep your changes additive and never modify your primary IP&#39;s configuration\u003C\u002Fli>\n\u003Cli>Always respect the given prefix, \u003Ccode>\u002F25\u003C\u002Fcode> for IPv4 and \u003Ccode>\u002F64\u003C\u002Fcode> for IPv6, a \u003Ccode>\u002F32\u003C\u002Fcode> or \u003Ccode>\u002F128\u003C\u002Fcode> prefix would isolate the address and prevent it from responding correctly\u003C\u002Fli>\n\u003Cli>Document each additional IP&#39;s address and the method used to apply it\u003C\u002Fli>\n\u003Cli>Check your firewall after adding the address and only open the services you want on the new address\u003C\u002Fli>\n\u003Cli>Back up your network configuration files before any change\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2>Need help?\u003C\u002Fh2>\n\u003Cp>To order an additional IP, go to the relevant product&#39;s page in your client area at \u003Ccode>https:\u002F\u002Fbilling.winheberg.com\u003C\u002Fcode> and use the Upgrade\u002FDowngrade Options. The assigned address then appears in the IP Address section of the product page.\u003C\u002Fp>\n\u003Cp>If your additional IP still doesn&#39;t respond after configuration, open a ticket with our support. Choose the Technical department and fill in the Produit lié field with the VPS in question. Specify the configured address, the network tool used, and the result of the verification commands, this helps our team diagnose the issue faster.\u003C\u002Fp>\n\u003Cp>Your VPS can now properly expose multiple addresses, each added on the same network as your primary IP 🐧\u003C\u002Fp>\n",1788993143785]