]> git.ipfire.org Git - thirdparty/bird.git/commitdiff
RPKI: Add 'local address' configuration option
authorJob Snijders <job@fastly.com>
Thu, 22 Feb 2024 13:58:29 +0000 (14:58 +0100)
committerOndrej Zajicek <santiago@crfreenet.org>
Thu, 22 Feb 2024 13:58:29 +0000 (14:58 +0100)
Allow to explicitly configure the source IP address for RPKI-To-Router
sessions. Predictable source addresses are useful for minimizing the
holes to be poked in ACLs.

Changed from 'source address' to 'local address' by committer.

doc/bird.sgml
proto/rpki/config.Y
proto/rpki/rpki.h
proto/rpki/transport.c

index 76ca7f75a6dded87b0ed346860e9896fc24bbfc2..aeecb1dcc7bd87d46a0f1b1469b1794d2278c73e 100644 (file)
@@ -5697,6 +5697,7 @@ protocol rpki [&lt;name&gt;] {
         roa6 { table &lt;tab&gt;; };
         remote &lt;ip&gt; | "&lt;domain&gt;" [port &lt;num&gt;];
         port &lt;num&gt;;
+        local address &lt;ip&gt;;
         refresh [keep] &lt;num&gt;;
         retry [keep] &lt;num&gt;;
         expire [keep] &lt;num&gt;;
@@ -5726,6 +5727,9 @@ specify both channels.
         number is 323 for transport without any encryption and 22 for transport
         with SSH encryption.
 
+        <tag>local address <m/ip/</tag>
+        Define local address we should use as a source address for the RTR session.
+
         <tag>refresh [keep] <m/num/</tag> Time period in seconds. Tells how
         long to wait before next attempting to poll the cache using a Serial
         Query or a Reset Query packet. Must be lower than 86400 seconds (one
index c28cab7a661c92fb111e3cd44661c261ad434406..769ebb2c8284bfa07b197f0c89661afe10e8d849 100644 (file)
@@ -32,7 +32,7 @@ rpki_check_unused_transport(void)
 CF_DECLS
 
 CF_KEYWORDS(RPKI, REMOTE, BIRD, PRIVATE, PUBLIC, KEY, TCP, SSH, TRANSPORT, USER,
-           RETRY, REFRESH, EXPIRE, KEEP, IGNORE, MAX, LENGTH)
+           RETRY, REFRESH, EXPIRE, KEEP, IGNORE, MAX, LENGTH, LOCAL, ADDRESS)
 
 %type <i> rpki_keep_interval
 
@@ -60,6 +60,7 @@ rpki_proto_item:
  | REMOTE rpki_cache_addr
  | REMOTE rpki_cache_addr rpki_proto_item_port
  | rpki_proto_item_port
+ | LOCAL ADDRESS ipa { RPKI_CFG->local_ip = $3; }
  | TRANSPORT rpki_transport
  | REFRESH rpki_keep_interval expr {
      if (rpki_check_refresh_interval($3))
index 8a5c38fda4e1652dda2a5e502fc7574eb1be29c2..e67eb0e3b0646bfa95140ffb9195f91a4db1a5c8 100644 (file)
@@ -116,6 +116,7 @@ struct rpki_proto {
 struct rpki_config {
   struct proto_config c;
   const char *hostname;                        /* Full domain name or stringified IP address of cache server */
+  ip_addr local_ip;                    /* Source address to use */
   ip_addr ip;                          /* IP address of cache server or IPA_NONE */
   u16 port;                            /* Port number of cache server */
   struct rpki_tr_config tr_config;     /* Specific transport configuration structure */
index 81bd6dd8d3c747a137e26883ae721d2685c0ffd4..265719770bfe5f9b29abedc69bdfdb89c2d471a5 100644 (file)
@@ -82,6 +82,7 @@ rpki_tr_open(struct rpki_tr_sock *tr)
   sk->daddr = cf->ip;
   sk->dport = cf->port;
   sk->host = cf->hostname;
+  sk->saddr = cf->local_ip;
   sk->rbsize = RPKI_RX_BUFFER_SIZE;
   sk->tbsize = RPKI_TX_BUFFER_SIZE;
   sk->tos = IP_PREC_INTERNET_CONTROL;