On Mon, Jul 20, 2020 at 12:03:57PM +0300, Антон Касимов wrote:
> I am using OpenBSD 6.7
> iked does not respect mixing ports in the source and the destination of
> traffic selectors.
> 
> Such policy in iked.conf
> ikev2 "epsilon" active \
>         proto tcp \
>         from aaaa:aaaa:aaaa::30 to bbbb:bbbb:bbbb:10::2 port 8000 \
>         from aaaa:aaaa:aaaa::30 port postgresql to cccc:cccc:cccc::/48 \
>         from aaaa:aaaa:aaaa::30 port postgresql to bbbb:bbbb:bbbb::/48 \
>         peer d.d.d
> 
> Produces wrong flows (specifying only destination port from first selector):
> 
> flow esp in proto tcp from cccc:cccc:cccc::/48 port 8000 to
> aaaa:aaaa:aaaa::30 peer d.d.d srcid FQDN/a.a.a dstid FQDN/d.d.d type require
> flow esp in proto tcp from bbbb:bbbb:bbbb::/48 *port 8000* to
> aaaa:aaaa:aaaa::30 peer d.d.d srcid FQDN/a.a.a dstid FQDN/d.d.d type require
> flow esp in proto tcp from bbbb:bbbb:bbbb::2 *port 8000* to
> aaaa:aaaa:aaaa::30 peer d.d.d srcid FQDN/a.a.a dstid FQDN/d.d.d type require
> flow esp out proto tcp from aaaa:aaaa:aaaa::30 to cccc:cccc:cccc::/48 port
> 8000  peer d.d.d srcid FQDN/a.a.a dstid FQDN/d.d.d type require
> flow esp out proto tcp from 2a04:5200:fff5::30 to fdd3:d128:dc2d::/48 *port
> 8000* peer d.d.d srcid FQDN/a.a.a dstid FQDN/d.d.d type require
> flow esp out proto tcp from 2a04:5200:fff5::30 to fdd3:d128:dc2d:10::2 *port
> 8000* peer d.d.d srcid FQDN/a.a.a dstid FQDN/d.d.d type require
> 
> -- 
> Антон Касимов / Anton Kasimov

Hi Anton,

thanks for the report.
Below is a diff that should fix your problem.

Index: parse.y
===================================================================
RCS file: /mount/openbsd/cvs/src/sbin/iked/parse.y,v
retrieving revision 1.102
diff -u -p -r1.102 parse.y
--- parse.y     25 Jun 2020 13:05:58 -0000      1.102
+++ parse.y     20 Jul 2020 20:06:53 -0000
@@ -344,6 +344,7 @@ struct ipsec_addr_wrap {
        sa_family_t              af;
        unsigned int             type;
        unsigned int             action;
+       uint16_t                 port;
        char                    *name;
        struct ipsec_addr_wrap  *next;
        struct ipsec_addr_wrap  *tail;
@@ -353,8 +354,6 @@ struct ipsec_addr_wrap {
 struct ipsec_hosts {
        struct ipsec_addr_wrap  *src;
        struct ipsec_addr_wrap  *dst;
-       uint16_t                 sport;
-       uint16_t                 dport;
 };
 
 struct ipsec_filters {
@@ -649,9 +648,9 @@ hosts               : FROM host port TO host port           
{
                                err(1, "hosts: calloc");
 
                        $$->src = $2;
-                       $$->sport = $3;
+                       $$->src->port = $3;
                        $$->dst = $5;
-                       $$->dport = $6;
+                       $$->dst->port = $6;
                }
                | TO host port FROM host port           {
                        struct ipsec_addr_wrap *ipa;
@@ -667,9 +666,9 @@ hosts               : FROM host port TO host port           
{
                                err(1, "hosts: calloc");
 
                        $$->src = $5;
-                       $$->sport = $6;
+                       $$->src->port = $6;
                        $$->dst = $2;
-                       $$->dport = $3;
+                       $$->dst->port = $3;
                }
                ;
 
@@ -2936,14 +2935,14 @@ create_ike(char *name, int af, uint8_t i
                flow->flow_src.addr_af = ipa->af;
                flow->flow_src.addr_mask = ipa->mask;
                flow->flow_src.addr_net = ipa->netaddress;
-               flow->flow_src.addr_port = hosts->sport;
+               flow->flow_src.addr_port = ipa->port;
 
                memcpy(&flow->flow_dst.addr, &ipb->address,
                    sizeof(ipb->address));
                flow->flow_dst.addr_af = ipb->af;
                flow->flow_dst.addr_mask = ipb->mask;
                flow->flow_dst.addr_net = ipb->netaddress;
-               flow->flow_dst.addr_port = hosts->dport;
+               flow->flow_dst.addr_port = ipb->port;
 
                ippn = ipa->srcnat;
                if (ippn) {

Reply via email to