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 xxxx@xxx.xxx key xxxxxx
set system login user xxxxxx authentication public-keys xxxx@xxx.xxx 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 dhcp6c@pppoe1.service | 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.

This topic was automatically closed 60 days after the last reply. New replies are no longer allowed.