Am Donnerstag, 30. Juli 2020 08:56 CEST, schrieb "Wolfgang Nothdurft"
<[email protected]>:
> Am Donnerstag, 30. Juli 2020 03:44 CEST, schrieb Paul Wouters
> <[email protected]>:
>
> > On Wed, 29 Jul 2020, Wolfgang Nothdurft wrote:
> >
> > > Am Dienstag, 28. Juli 2020 20:25 CEST, schrieb Antony Antony
> > > <[email protected]>:
> > >
> > >> ipsec-interface=0 would translate to
> > >>
> > >> ip link add ipsec0 type xfrm dev enp0s5 if_id 0
> > >>
> > >> when I started adding xfrmi I wasn't sure xfrm if_id 0 would work
> > >> properly.
> > >> if_id is a lookup key to find policy and state. I wonder if 0 would mean
> > >> also a policy with no xfrmi if_id.
> >
> > AFAIK, if_id 0 means the same as "no if_id mark". So it cannot be used.
> >
> > >> and also to avoid confusion from klips.
> >
> > That was a reason too, but as Wolfgang points out, perhaps the wrong
> > consideration to have made.
> >
> > > I think the problem with if_id 0 could be the fwmark that is used to
> > > route the encrypted packets on the base interface.
> > >
> > > 100: from all to 10.0.12.2 fwmark 0x1 lookup 50
> > >
> > > With fwmark 0x0 all unmarked traffic to the destination would go through
> > > the base interface instead of the ipsec interface.
> >
> > I thought fwmark and if_id were different type of marks?
> >
> > > But ipsec-interface=0 for ipsec0 would be very useful. All our customers
> > > use ipsec0 for the first ipsec device, so the change from klips to xfrmi
> > > would either confusing for them or a technical problem that we have to
> > > solve.
> > >
> > > At the moment I test patching libreswan to map if_id to device name
> > > if_id-1, which works properly.
> >
> > That is not a patch we could easilly carry. And as an option it is a bit
> > confusing. How about mapping ipsec0 to max(if_id) - 1 ?
>
> Tthat would also be a solution I could work with.
>
> > > But the next problem is that we use the lower 24 bit fwmarks for our
> > > firewall rule set. The upper 8 bit was reserved for ipsec (saref) long
> > > time ago. So the next problem is that actual the fwmark is not
> > > configurable and I have also to patch either libreswan or overwork our
> > > complete rule set to reserve the lower bits for ipsec devices.
> > > Maybe a configurable minimal fwmark could be a nice feature.
> >
> > I don't think if_id marks are related to fwmarks ?
>
> At the moment it is statically mapped:
>
> /* XFRMA_SET_MARK = XFRMA_IF_ID/0xffffffff */
>
> The a simple solution I test for me at the moment is to add a minimal mark
> to the netlink call and for the environment variable.
>
> attr->rta_type = XFRMA_SET_MARK + 0xfff;
> ........
> jam(buf, "PLUTO_XFRMI_FWMARK='%" PRIu32 "/0xffffffff' ",
> c->xfrmi->if_id + 0xfff);
Sorry, what I have written this morning is of course wrong. That's what
happens when you write in the morning without thinking. ;)
The attached patch uses a static base value for fwmark. The static value could
also be replaced by a variable to make this configurable.
Wolfgang
--- a/programs/pluto/kernel.c.orig 2020-07-29 09:45:39.561145559 +0200
+++ b/programs/pluto/kernel.c 2020-07-29 13:53:27.185782803 +0200
@@ -562,7 +562,7 @@
if (c->xfrmi != NULL && c->xfrmi->if_id > 0) {
if (addrinsubnet(&sr->that.host_addr, &sr->that.client)) {
jam(buf, "PLUTO_XFRMI_FWMARK='%" PRIu32 "/0xffffffff' ",
- c->xfrmi->if_id);
+ c->xfrmi->if_id + 0xffffff);
} else {
address_buf bpeer;
subnet_buf peerclient_str;
--- a/programs/pluto/kernel_xfrm.c.orig 2020-07-30 14:41:37.773609907 +0200
+++ b/programs/pluto/kernel_xfrm.c 2020-07-30 14:41:41.353610060 +0200
@@ -725,6 +725,7 @@
}
if (xfrm_if_id > 0) {
#ifdef USE_XFRM_INTERFACE
+ uint32_t xfrm_fwmark = xfrm_if_id + 0xffffff;
struct rtattr *attr = (struct rtattr *)((char *)&req + req.n.nlmsg_len);
DBG(DBG_KERNEL, DBG_log("%s netlink: XFRMA_IF_ID %" PRIu32 " req.n.nlmsg_type=%" PRIu32, __func__, xfrm_if_id, req.n.nlmsg_type));
attr->rta_type = XFRMA_IF_ID;
@@ -736,7 +737,7 @@
attr = (struct rtattr *)((char *)&req + req.n.nlmsg_len);
attr->rta_type = XFRMA_SET_MARK;
attr->rta_len = RTA_LENGTH(sizeof(uint32_t));
- memcpy(RTA_DATA(attr), &xfrm_if_id, sizeof(uint32_t));
+ memcpy(RTA_DATA(attr), &xfrm_fwmark, sizeof(uint32_t));
req.n.nlmsg_len += attr->rta_len;
#endif
}
@@ -1524,6 +1525,8 @@
if (sa->xfrm_if_id > 0) {
#ifdef USE_XFRM_INTERFACE
+ uint32_t xfrm_fwmark = sa->xfrm_if_id + 0xffffff;
+
DBG(DBG_KERNEL, DBG_log("%s netlink: XFRMA_IF_ID %" PRIu32 " req.n.nlmsg_type=%" PRIu32, __func__, sa->xfrm_if_id, req.n.nlmsg_type));
attr->rta_type = XFRMA_IF_ID;
attr->rta_len = RTA_LENGTH(sizeof(uint32_t));
@@ -1534,7 +1537,7 @@
/* XFRMA_SET_MARK = XFRMA_IF_ID/0xffffffff */
attr->rta_type = XFRMA_SET_MARK;
attr->rta_len = RTA_LENGTH(sizeof(uint32_t));
- memcpy(RTA_DATA(attr), &sa->xfrm_if_id, sizeof(uint32_t));
+ memcpy(RTA_DATA(attr), &xfrm_fwmark, sizeof(uint32_t));
req.n.nlmsg_len += attr->rta_len;
attr = (struct rtattr *)((char *)attr + attr->rta_len);
#endif
_______________________________________________
Swan mailing list
[email protected]
https://lists.libreswan.org/mailman/listinfo/swan