Index | Thread | Search

From:
dns@strangeloop.cc
Subject:
Re: BGPd "prepend-as" feature
To:
dns@strangeloop.cc
Cc:
tech@openbsd.org
Date:
Thu, 21 May 2026 13:46:08 +0300

Download raw body.

Thread
Hei

No problem. I obviously know the risks attached to this. Just wandered 
if you were interested in adding such a feature from a technical point 
of view. I can keep my diffs :)
I think BIRD has this feature as well... but let's say kindly I don't 
particularily like that software!

Actually I used to inject a different AS number on prefixes coming from 
an OpenVPN link, so that those routes look like they are originating 
from their true AS.. but I don't have this around any longer.

BR,
Dennis

On 2026-05-20 14:50, Claudio Jeker wrote:
> On Wed, May 20, 2026 at 11:13:49AM +0300, dns@strangeloop.cc wrote:
>> Hi guys!
>> 
>> I thought I'd post this, been hanging around for awhile, just in case 
>> if any
>> maintainer is interested. :)
>> On my network, I "need" the ability to prepend a specific AS number 
>> for some
>> routes so I made these additions.
> 
> Please explain why you need this. I don't want to add a way to modify
> ASPATH with random AS numbers unless there is a very good reason.
> Many route leaks come from such dangerous syntax options and people fat
> fingering an ASN.
> 
>> TIA,
>> Dennis
>> OpenBSD (alpha) since 2001
>> 
>> --- rde_filter.c.orig	Fri Oct 20 22:39:00 2023
>> +++ rde_filter.c	Thu Oct  3 21:46:12 2024
>> @@ -125,6 +125,14 @@
>>  			state->aspath.aspath = aspath_get(np, nl);
>>  			free(np);
>>  			break;
>> +		case ACTION_SET_PREPEND_AS:
>> +			prep_as = set->action.id;
>> +			np = aspath_prepend(state->aspath.aspath, prep_as,
>> +			    1, &nl);
>> +			aspath_put(state->aspath.aspath);
>> +			state->aspath.aspath = aspath_get(np, nl);
>> +			free(np);
>> +			break;
>>  		case ACTION_SET_AS_OVERRIDE:
>>  			if (from == NULL)
>>  				break;
>> @@ -609,6 +617,11 @@
>>  			    a->action.prepend == b->action.prepend)
>>  				continue;
>>  			break;
>> +		case ACTION_SET_PREPEND_AS:
>> +			if (a->type == b->type &&
>> +			    a->action.id == b->action.id)
>> +				continue;
>> +			break;
>>  		case ACTION_SET_AS_OVERRIDE:
>>  			if (a->type == b->type)
>>  				continue;
>> @@ -717,6 +730,8 @@
>>  		return ("prepend-self");
>>  	case ACTION_SET_PREPEND_PEER:
>>  		return ("prepend-peer");
>> +	case ACTION_SET_PREPEND_AS:
>> +		return ("prepend-as");
>>  	case ACTION_SET_AS_OVERRIDE:
>>  		return ("as-override");
>>  	case ACTION_SET_NEXTHOP:
>> --- parse.y.orig	Wed May 20 10:24:41 2026
>> +++ parse.y	Fri May  2 12:35:28 2025
>> @@ -264,8 +264,8 @@
>>  %token	ASPASET ROASET ORIGINSET OVS AVS EXPIRES
>>  %token	ASSET SOURCEAS TRANSITAS PEERAS PROVIDERAS CUSTOMERAS MAXASLEN
>> MAXASSEQ
>>  %token	SET LOCALPREF MED METRIC NEXTHOP REJECT BLACKHOLE NOMODIFY 
>> SELF
>> -%token	PREPEND_SELF PREPEND_PEER PFTABLE WEIGHT RTLABEL ORIGIN 
>> PRIORITY
>> -%token	ERROR INCLUDE
>> +%token	PREPEND_SELF PREPEND_PEER PREPEND_AS PFTABLE WEIGHT RTLABEL 
>> ORIGIN
>> +%token	PRIORITY ERROR INCLUDE
>>  %token	IPSEC ESP AH SPI IKE
>>  %token	IPV4 IPV6 EVPN
>>  %token	QUALIFY VIA
>> @@ -3322,6 +3322,12 @@
>>  			$$->type = ACTION_SET_PREPEND_SELF;
>>  			$$->action.prepend = $2;
>>  		}
>> +		| PREPEND_AS NUMBER		{
>> +			if (($$ = calloc(1, sizeof(struct filter_set))) == NULL)
>> +				fatal(NULL);
>> +			$$->type = ACTION_SET_PREPEND_AS;
>> +			$$->action.id = $2;
>> +		}
>>  		| PREPEND_PEER NUMBER		{
>>  			if ($2 < 0 || $2 > 128) {
>>  				yyerror("bad number of prepends");
>> @@ -3656,6 +3662,7 @@
>>  		{ "prefix",		PREFIX },
>>  		{ "prefix-set",		PREFIXSET },
>>  		{ "prefixlen",		PREFIXLEN },
>> +		{ "prepend-as",		PREPEND_AS},
>>  		{ "prepend-neighbor",	PREPEND_PEER },
>>  		{ "prepend-self",	PREPEND_SELF },
>>  		{ "priority",		PRIORITY },
>> --- bgpd.conf.5.orig	Wed May 20 10:28:10 2026
>> +++ bgpd.conf.5	Tue Oct 28 13:52:52 2025
>> @@ -2358,6 +2358,12 @@
>>  times to the
>>  .Em AS path .
>>  .Pp
>> +.It Ic prepend-as Ar number
>> +Prepend AS
>> +.Ar number
>> +to the
>> +.Em AS path .
>> +.Pp
>>  .It Ic rtlabel Ar label
>>  Add the prefix to the kernel routing table with the specified
>>  .Ar label .
>>