Home assistant started refusing its static IP configuration

I have had a home assistant installation running as a proxmox vm for years now. For all this time, I have been using statically configured IP of 192.168.0.60/24 configured from the hass web ui. This wasn’t a problem until first update of 2026.1.x I believe. After this update, on reboot the IP address wouldn’t be there and vm didn’t have network connectivity. Since then I tried many various things to troubleshoot this for weeks, including setting home assistant to dhcp and then making a dhcp reservation for it. My current HAOS status that the system boots into looks like this:

# ha net info
docker:
  address: 172.30.32.0/23
  dns: 172.30.32.3
  gateway: 172.30.32.1
  interface: hassio
host_internet: false
interfaces:
- connected: true
  enabled: true
  interface: enp6s18
  ipv4:
    address: []
    gateway: null
    method: auto
    nameservers: []
    ready: false
  ipv6:
    addr_gen_mode: default
    address: []
    gateway: null
    ip6_privacy: default
    method: auto
    nameservers: []
    ready: false
  llmnr: announce
  mac: BC:24:11:A1:6D:E8
  mdns: announce
  primary: false
  type: ethernet
  vlan: null
  wifi: null
supervisor_internet: false
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: enp6s18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether bc:24:11:a1:6d:e8 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::347:b726:4a2c:d083/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 26:1e:b2:26:f1:72 brd ff:ff:ff:ff:ff:ff
    inet 172.30.232.1/23 brd 172.30.233.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::241e:b2ff:fe26:f172/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
4: hassio: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 6a:87:56:21:3f:50 brd ff:ff:ff:ff:ff:ff
    inet 172.30.32.1/23 brd 172.30.33.255 scope global hassio
       valid_lft forever preferred_lft forever
    inet6 fd0c:ac1e:2100::1/48 scope global nodad 
       valid_lft forever preferred_lft forever
    inet6 fe80::6887:56ff:fe21:3f50/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
5: vethb25707c@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master hassio state UP group default 
    link/ether 4a:36:c1:b4:d0:49 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::4836:c1ff:feb4:d049/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
6: veth6252234@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default 
    link/ether ae:2e:2a:6e:fc:d9 brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::ac2e:2aff:fe6e:fcd9/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
7: veth07a85b4@if3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master hassio state UP group default 
    link/ether 56:62:b9:86:c7:ce brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet6 fe80::5462:b9ff:fe86:c7ce/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
8: veth008965b@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master hassio state UP group default 
    link/ether 92:ef:07:c8:51:05 brd ff:ff:ff:ff:ff:ff link-netnsid 2
    inet6 fe80::90ef:7ff:fec8:5105/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
9: veth08f09a2@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master hassio state UP group default 
    link/ether 96:8b:49:16:57:06 brd ff:ff:ff:ff:ff:ff link-netnsid 3
    inet6 fe80::948b:49ff:fe16:5706/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
10: vethb58ccba@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master hassio state UP group default 
    link/ether ce:fc:18:e4:11:7a brd ff:ff:ff:ff:ff:ff link-netnsid 4
    inet6 fe80::ccfc:18ff:fee4:117a/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
11: vethbfb0db7@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master hassio state UP group default 
    link/ether 0a:ce:68:90:ba:be brd ff:ff:ff:ff:ff:ff link-netnsid 5
    inet6 fe80::8ce:68ff:fe90:babe/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
12: vethc16d473@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master hassio state UP group default 
    link/ether 56:ac:fd:18:fe:db brd ff:ff:ff:ff:ff:ff link-netnsid 6
    inet6 fe80::54ac:fdff:fe18:fedb/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
13: ztyxau7zuq: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2800 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 56:d1:45:89:e2:0e brd ff:ff:ff:ff:ff:ff
    inet 192.168.194.2/24 brd 192.168.194.255 scope global ztyxau7zuq
       valid_lft forever preferred_lft forever
    inet6 fdb6:79f:73c6:d095:5699:9344:954f:9191/88 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::54d1:45ff:fe89:e20e/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
14: ztveku7j76: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 2800 qdisc fq_codel state UNKNOWN group default qlen 1000
    link/ether 0e:c6:c9:be:b4:82 brd ff:ff:ff:ff:ff:ff
    inet 10.121.15.2/24 brd 10.121.15.255 scope global ztveku7j76
       valid_lft forever preferred_lft forever
    inet6 fd8c:e413:25f1:5c82:f99:9344:954f:9191/88 scope global 
       valid_lft forever preferred_lft forever
    inet6 fc7d:b891:2a44:954f:9191::1/40 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::cc6:c9ff:febe:b482/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
15: veth660ff8b@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master hassio state UP group default 
    link/ether 8a:9b:16:bd:c0:ab brd ff:ff:ff:ff:ff:ff link-netnsid 7
    inet6 fe80::889b:16ff:febd:c0ab/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
16: veth375b144@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master hassio state UP group default 
    link/ether 6e:60:9c:1c:20:59 brd ff:ff:ff:ff:ff:ff link-netnsid 8
    inet6 fe80::6c60:9cff:fe1c:2059/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever
17: veth1e75983@if2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master hassio state UP group default 
    link/ether b6:a8:06:b4:8f:9f brd ff:ff:ff:ff:ff:ff link-netnsid 9
    inet6 fe80::b4a8:6ff:feb4:8f9f/64 scope link proto kernel_ll 
       valid_lft forever preferred_lft forever

Now, the logs of my router hint at the following:
client BC:24:11:A1:6D:E8 declines IP address 192.168.0.60

And as it turns out my HASS Install is very much willing to assign almost any other ip address to the interface. .61? sure. .59? also no problem. But for some insane reason I can’t figure out, it’s absolutely unwilling to assign the address .60 that it had for years without any problems.

Now this isn’t linux kernel issue. Because I can successfully assign correct ip address using ip addr add 192.168.0.60/24 dev enp6s18 and after adding correct default route manually as well, the connection works flawlessly. So there isn’t anything in the linux kernel that’s preventing the system to keep using that IP address. However both running dhcpclient manually or setting that IP manually via ha network update ... command or letting home asssistant configured to use dhcp and then letting the dhcp offer it the .60 address result in the interface not actually having any IP assigned:

# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host noprefixroute 
       valid_lft forever preferred_lft forever
2: enp6s18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether bc:24:11:a1:6d:e8 brd ff:ff:ff:ff:ff:ff
    inet6 fe80::347:b726:4a2c:d083/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

And I really want to figure this out. Also, while yes, I could technically just change the IP to like .61 and live with it, It would require some network reconfiguration that I’d like to avoid not to mention that this issue is just super strange. I actually think there might be some leftover / corrupted network configuration that’s casing this issue.

Logs such as supervisor log or dmesg also don’t show any errors so I’m not including them here as this post is already long.

Anyone up to the challenge to help me solve this networking mystery?

Okay turns out it was some strange IP conflict. Looks like supervisor is setting IP by asking NetworkManager to set the IP, network manager logs warning about it (use journalctl -u NetworkManager.service to read log) and doesn’t assign any IP. Supervisor doesn’t handle nor logs this in any way so everything just silently fails with result that there is no ipv4 address set on the interface.

To diagnose this, install arping on some linux box that’s connected to the same L2 network as home assistant’s interface, and run arping 192.168.0.60 (or your desired IP) to figure out which mac is claiming the same IP address. In my case it was a smart socket that already had pinned DHCP ip address and was also using it. So for some insane reason it just started claiming 192.168.0.60 in addition to its already asigned IP which is honestly making me a bit uncomfortable. That said, unplugging it did solve the IP conflict issue and restored ability to assign 192.168.0.60 back to home assistant.

I hope this helps someone in the future (likely me lol)