IPv6 does not seem to be working on PPPoE interfaces since 1.3rolling

I just tested the below minimal configuration on a range of older VyOS ISO images I had, and it appears to have stopped providing an ipv6 address on pppoe sometime between VyOS 1.3-rolling-202006101523 and VyOS 1.3.1.
It does ipv6 prefix delegation fine on every version.

I ran up the same minimal ipv6 config below (with changes due to syntax variation between versions etc) on 1.3-rolling-202006101523, 1.3.1, 1.3.6 and 1.4.2 - and all but 1.3-rolling-202006101523 did not work.

Checking the differences between the generated /run/dhcp6c/dhcp6c.pppoe1.conf I can see that the later versions of this file miss the send ia-na 1; / id-assoc na 1 etc config lines.

When I added the line to the generated /run/dhcp6c/dhcp6c.pppoe1.conf file when running VyOS 1.4.2 and manually killed/ restarted /usr/sbin/dhcp6c it came up with the ipv6 on pppoe1 as expected - I did have to also change the pd number in the config so it was at “id-assoc pd 2” but not sure how relevant this is.

from 1.3-rolling-202006101523

cat /run/dhcp6c/dhcp6c.pppoe1.conf
# generated by dhcp.py
# man https://www.unix.com/man-page/debian/5/dhcp6c.conf/

interface pppoe1 {
    request domain-name-servers;
    request domain-name;
    send ia-na 1; # non-temporary address
    send ia-pd 2; # prefix delegation
};

id-assoc na 1 {
    # Identity association NA
};

id-assoc pd 2 {
    prefix ::/48 infinity;
    prefix-interface eth1.102 {
        sla-id 0;
        sla-len 8;
        ifid 1;
    };
};

from 1.3.1

cat /run/dhcp6c/dhcp6c.pppoe1.conf
### Autogenerated by interface.py ###

# man https://www.unix.com/man-page/debian/5/dhcp6c.conf/
interface pppoe1 {
    send ia-pd 0; # prefix delegation #0
};


id-assoc pd 0 {
    prefix ::/48 infinity;
    prefix-interface eth1.102 {
        sla-len 16;
        sla-id 0;
        ifid 1;
    };
};

config used on 1.3-rolling-202006101523

show configuration commands | strip-private 
set interfaces ethernet eth0 description 'WAN SIDE for VLAN2  pppoe'
set interfaces ethernet eth0 hw-id 'XX:XX:XX:XX:XX:0e'
set interfaces ethernet eth1 hw-id 'XX:XX:XX:XX:XX:0f'
set interfaces ethernet eth1 vif 1 address 'xxx.xxx.0.1/24'
set interfaces ethernet eth1 vif 1 description 'VLAN1-mgmt'
set interfaces ethernet eth1 vif 102 address 'xxx.xxx.102.1/24'
set interfaces ethernet eth1 vif 102 description 'VLAN102'
set interfaces ethernet eth1 vif 102 ipv6 address
set interfaces ethernet eth1 vif 102 ipv6 dup-addr-detect-transmits '1'
set interfaces loopback lo
set interfaces pppoe pppoe1 authentication password xxxxxx
set interfaces pppoe pppoe1 authentication user xxxxxx
set interfaces pppoe pppoe1 dhcpv6-options prefix-delegation interface eth1.102 address '1'
set interfaces pppoe pppoe1 dhcpv6-options prefix-delegation interface eth1.102 sla-id '0'
set interfaces pppoe pppoe1 dhcpv6-options prefix-delegation interface eth1.102 sla-len '8'
set interfaces pppoe pppoe1 dhcpv6-options prefix-delegation length '48'
set interfaces pppoe pppoe1 ipv6 address autoconf
set interfaces pppoe pppoe1 ipv6 enable
set interfaces pppoe pppoe1 mtu '1492'
set interfaces pppoe pppoe1 source-interface 'eth0'
set service ssh port '4522'
set system config-management commit-revisions '40'
set system host-name xxxxxx
set system ipv6
set system login user xxxxxx authentication encrypted-password xxxxxx
set system login user xxxxxx authentication plaintext-password xxxxxx
set system login user xxxxxx authentication public-keys [email protected] key xxxxxx
set system login user xxxxxx authentication public-keys [email protected] type ssh-xxx
set system name-server 'xxx.xxx.1.2'
set system name-server 'xxx.xxx.0.2'
set system name-server 'xxxx:xxxx:4700::1112'
set system name-server 'xxxx:xxxx:4700::1002'
set system syslog global facility all level 'notice'
set system syslog global facility local7 level 'debug'
set system syslog host xxx.xxx.102.100 facility all level 'all'
set system time-zone 'Australia/Melbourne'

show interfaces showing ipv6 on pppoe on 1.3-rolling-202006101523

show interfaces  | strip-private 
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
eth0             -                                 u/u  WAN SIDE for VLAN2 pppoe
                                                        pppoe
eth1             -                                 u/u  
eth1.1           xxx.xxx.0.1/24                    u/u  VLAN1-mgmt
eth1.102         xxx.xxx.102.1/24                  u/u  VLAN102
                 xxxx:xxxx:4067::1/56                   
lo               xxx.xxx.0.1/8                       u/u  
                 ::1/128                                
pppoe1           xxx.xxx.128.152/32                u/u  
                 xxxx:xxxx:8000:631::aa3:6c52/128  

Oudated rolling release :slight_smile:

1 Like

…that it works on as it should, while every release after I tried, it does not :slight_smile:

showing the issue on 1.4.2, where I was able to get the ipv6 address by modding the generated /run/dhcp6c/dhcp6c.pppoe1.conf with the extra config stanzas that have vanished…

I slightly modified config on 1.4.2 so it generates the pd with 2, so I don’t change the generated file to much, so as to illustrate the issue:

show configuration commands | strip-private |grep "set interfaces pppoe pppoe1" 
set interfaces pppoe pppoe1 authentication password xxxxxx
set interfaces pppoe pppoe1 authentication username xxxxxx
set interfaces pppoe pppoe1 dhcpv6-options pd 2 interface eth1.102 address '1'
set interfaces pppoe pppoe1 dhcpv6-options pd 2 interface eth1.102 sla-id '0'
set interfaces pppoe pppoe1 dhcpv6-options pd 2 interface eth1.112 address '1'
set interfaces pppoe pppoe1 dhcpv6-options pd 2 interface eth1.112 sla-id '1'
set interfaces pppoe pppoe1 dhcpv6-options pd 2 length '48'
set interfaces pppoe pppoe1 ip adjust-mss 'clamp-mss-to-pmtu'
set interfaces pppoe pppoe1 ipv6 address autoconf
set interfaces pppoe pppoe1 ipv6 adjust-mss 'clamp-mss-to-pmtu'
set interfaces pppoe pppoe1 mtu '1492'
set interfaces pppoe pppoe1 source-interface 'eth0'

this will generate the following:

cat /run/dhcp6c/dhcp6c.pppoe1.conf
### Autogenerated by interface.py ###

# man https://www.unix.com/man-page/debian/5/dhcp6c.conf/
interface pppoe1 {
    send ia-pd 2; # prefix delegation #2
    script "/etc/wide-dhcpv6/dhcp6c.pppoe1.script";
};


id-assoc pd 2 {
    prefix ::/48 infinity;
    prefix-interface eth1.102 {
        sla-len 16;
        sla-id 0;
        ifid 1;
    };
    prefix-interface eth1.112 {
        sla-len 16;
        sla-id 1;
        ifid 1;
    };
};

which does not create the " send ia-na 1" (etc) which appears to be needed to get an ipv6 address on pppoe1

if I edit this to the following, and kill and restart it, it works…

cat /run/dhcp6c/dhcp6c.pppoe1.conf 
### Autogenerated by interface.py ###

# man https://www.unix.com/man-page/debian/5/dhcp6c.conf/
interface pppoe1 {
    send ia-na 1;
    send ia-pd 2; # prefix delegation #2
    script "/etc/wide-dhcpv6/dhcp6c.pppoe1.script";
};

id-assoc na 1 {						      
    # Identity association NA				      
};

id-assoc pd 2 {
    prefix ::/48 infinity;
    prefix-interface eth1.102 {
        sla-len 16;
        sla-id 0;
        ifid 1;
    };
    prefix-interface eth1.112 {
        sla-len 16;
        sla-id 1;
        ifid 1;
    };
};
# keep copying over the /run/dhcp6c/dhcp6c.pppoe1.conf in another session in case it gets re-written...
 kill -HUP $(pidof pppd) ; kill $(pidof dhcp6c)  ; /usr/sbin/dhcp6c -D -k /run/dhcp6c/dhcp6c.pppoe1.sock -c /run/dhcp6c/dhcp6c.pppoe1.conf -p /run/dhcp6c/dhcp6c.pppoe1.pid pppoe1

and I get the ipv6 address assigned…

show interfaces pppoe | strip-private 
Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
---------        ----------                        ---  -----------
pppoe1           xxx.xxx.123.22/32                 u/u  
                 xxxx:xxxx:8000:631::75a0:df9f/128
                                                        

more succinct info after further checking (using VyOS 1.4.2):

extra lines that need to be generated in dhcp6c.pppoe1.conf for pppoe ipv6 to work completely:

diff -c /run/dhcp6c/dhcp6c.pppoe1.conf /tmp/dhcp6c.pppoe1.conf 
*** /run/dhcp6c/dhcp6c.pppoe1.conf	2025-05-24 12:37:39.797774760 +1000
--- /tmp/dhcp6c.pppoe1.conf	2025-05-24 12:40:38.079022479 +1000
***************
*** 2,11 ****
--- 2,15 ----
  
  # man https://www.unix.com/man-page/debian/5/dhcp6c.conf/
  interface pppoe1 {
+     send ia-na 1;
      send ia-pd 2; # prefix delegation #2
      script "/etc/wide-dhcpv6/dhcp6c.pppoe1.script";
  };
  
+ id-assoc na 1 {						      <
+     # Identity association NA				      <
+ };
  
  id-assoc pd 2 {
      prefix ::/48 infinity;

when ipv6 is working on the ppp interface the following string shows in the log…

journalctl -u [email protected] | strip-private | grep "get_ia: make an IA: NA-1"

May 24 12:51:42 vyos dhcp6c[1263336]: get_ia: make an IA: NA-1

I can crudely force an ipv6 as a workaround by copying the working file in the background and then restarting the interface… I don’t know enough about the VyOS process flow to do this less crudely, but the below works:

# in sesssion one

while ! ip -6 addr show dev pppoe1  |  grep "inet6.*scope global" ; do cp /tmp/dhcp6c.pppoe1.conf /run/dhcp6c/dhcp6c.pppoe1.conf;   done

# then in session two

 disconnect interface pppoe1 ; sleep 1 ; connect interface pppoe1

There is a template to generate DHCP configuration https://github.com/vyos/vyos-1x/blob/590843d77e1add0dca25605c35e4098b54a81bed/data/templates/dhcp-client/ipv6.j2#L22

1 Like

Thanks!

I now have a much better workaround with the following quick mod:

iff -c /usr/share/vyos/templates/dhcp-client/ipv6.j2-orig /usr/share/vyos/templates/dhcp-client/ipv6.j2 
*** /usr/share/vyos/templates/dhcp-client/ipv6.j2-orig	2025-05-24 15:26:58.062417373 +1000
--- /usr/share/vyos/templates/dhcp-client/ipv6.j2	2025-05-24 15:44:36.774032682 +1000
***************
*** 23,28 ****
--- 23,29 ----
      send ia-pd {{ pd }}; # prefix delegation #{{ pd }}
  {%     endfor %}
  {% endif %}
+     send ia-na 0;
      script "{{ dhcp6_script_file }}";
  };
  
***************
*** 34,39 ****
--- 35,44 ----
  {%     endif %}
  {% endif %}
  
+ id-assoc na 0 {
+     # Identity association NA
+ };
+ 
  {% if dhcpv6_options.pd is vyos_defined %}
  {%     for pd, pd_config in dhcpv6_options.pd.items() %}
  id-assoc pd {{ pd }} {

and I get an ipv6 address on the pppoe interface after re-connecting it.

I can see these dhcp6c.conf options should be generated from this template if the following conditions are met:

{% if address is vyos_defined and 'dhcpv6' in address %}
{%     if dhcpv6_options.temporary is not vyos_defined %}

is there a combination of VyOS config commands that can meet these conditions? I guess if not, that is the bug narrowed down a bit more?

You can open a bug report on https://vyos.dev/
Feel free to create a PR with a fix.
Thanks.

1 Like

I registered an account just then, but appears my username, ZOGVYOS1 “has been disabled”.

i renamed your user, You should not use vyos in usernames
Re-register at vyos.dev as that account is disabled

1 Like

ok done, I’m regged as ZOGVBUGS there.

it’s like the time the security at the nightclub told me to take my bomber jacket off cos I looked like one of them :slight_smile:

created at âš“ T7485 pppoe interfaces do not get assigned an ipv6 address with pppoe ipv6 enabled. ipv6 prefix delegation works.