aboutgitcodebugslistschat
path: root/conf.c
diff options
context:
space:
mode:
authorStefano Brivio <sbrivio@redhat.com>2022-10-07 04:53:40 +0200
committerStefano Brivio <sbrivio@redhat.com>2022-10-15 02:10:36 +0200
commitc1eff9a3c622516c7bb9194a1df50dfe01281c56 (patch)
tree01dc155f0b38022a511f37e3760b0844ffa195e2 /conf.c
parenta62ed181db9ba7d85d057365d5331dd35026247f (diff)
downloadpasst-c1eff9a3c622516c7bb9194a1df50dfe01281c56.tar
passt-c1eff9a3c622516c7bb9194a1df50dfe01281c56.tar.gz
passt-c1eff9a3c622516c7bb9194a1df50dfe01281c56.tar.bz2
passt-c1eff9a3c622516c7bb9194a1df50dfe01281c56.tar.lz
passt-c1eff9a3c622516c7bb9194a1df50dfe01281c56.tar.xz
passt-c1eff9a3c622516c7bb9194a1df50dfe01281c56.tar.zst
passt-c1eff9a3c622516c7bb9194a1df50dfe01281c56.zip
conf, tcp, udp: Allow specification of interface to bind to
Since kernel version 5.7, commit c427bfec18f2 ("net: core: enable SO_BINDTODEVICE for non-root users"), we can bind sockets to interfaces, if they haven't been bound yet (as in bind()). Introduce an optional interface specification for forwarded ports, prefixed by %, that can be passed together with an address. Reported use case: running local services that use ports we want to have externally forwarded: https://github.com/containers/podman/issues/14425 Signed-off-by: Stefano Brivio <sbrivio@redhat.com> Reviewed-by: David Gibson <david@gibson.dropbear.id.au>
Diffstat (limited to 'conf.c')
-rw-r--r--conf.c31
1 files changed, 21 insertions, 10 deletions
diff --git a/conf.c b/conf.c
index 779371f..56f33f0 100644
--- a/conf.c
+++ b/conf.c
@@ -180,8 +180,8 @@ static int conf_ports(const struct ctx *c, char optname, const char *optarg,
struct port_fwd *fwd)
{
char addr_buf[sizeof(struct in6_addr)] = { 0 }, *addr = addr_buf;
+ char buf[BUFSIZ], *spec, *ifname = NULL, *p;
uint8_t exclude[PORT_BITMAP_SIZE] = { 0 };
- char buf[BUFSIZ], *spec, *p;
sa_family_t af = AF_UNSPEC;
bool exclude_only = true;
@@ -209,9 +209,9 @@ static int conf_ports(const struct ctx *c, char optname, const char *optarg,
for (i = 0; i < PORT_EPHEMERAL_MIN; i++) {
if (optname == 't')
- tcp_sock_init(c, 0, AF_UNSPEC, NULL, i);
+ tcp_sock_init(c, 0, AF_UNSPEC, NULL, NULL, i);
else if (optname == 'u')
- udp_sock_init(c, 0, AF_UNSPEC, NULL, i);
+ udp_sock_init(c, 0, AF_UNSPEC, NULL, NULL, i);
}
return 0;
@@ -231,6 +231,14 @@ static int conf_ports(const struct ctx *c, char optname, const char *optarg,
if (optname != 't' && optname != 'u')
goto bad;
+ if ((ifname = strchr(buf, '%'))) {
+ if (spec - ifname >= IFNAMSIZ - 1)
+ goto bad;
+
+ *ifname = 0;
+ ifname++;
+ }
+
if (inet_pton(AF_INET, buf, addr))
af = AF_INET;
else if (inet_pton(AF_INET6, buf, addr))
@@ -278,9 +286,9 @@ static int conf_ports(const struct ctx *c, char optname, const char *optarg,
bitmap_set(fwd->map, i);
if (optname == 't')
- tcp_sock_init(c, 0, af, addr, i);
+ tcp_sock_init(c, 0, af, addr, ifname, i);
else if (optname == 'u')
- udp_sock_init(c, 0, af, addr, i);
+ udp_sock_init(c, 0, af, addr, ifname, i);
}
return 0;
@@ -324,9 +332,9 @@ static int conf_ports(const struct ctx *c, char optname, const char *optarg,
fwd->delta[i] = mapped_range.first - orig_range.first;
if (optname == 't')
- tcp_sock_init(c, 0, af, addr, i);
+ tcp_sock_init(c, 0, af, addr, ifname, i);
else if (optname == 'u')
- udp_sock_init(c, 0, af, addr, i);
+ udp_sock_init(c, 0, af, addr, ifname, i);
}
} while ((p = next_chunk(p, ',')));
@@ -720,8 +728,9 @@ static void usage(const char *name)
info( " 'all': forward all unbound, non-ephemeral ports");
info( " a comma-separated list, optionally ranged with '-'");
info( " and optional target ports after ':', with optional");
- info( " address specification suffixed by '/'. Ranges can be");
- info( " reduced by excluding ports or ranges prefixed by '~'");
+ info( " address specification suffixed by '/' and optional");
+ info( " interface prefixed by '%%'. Ranges can be reduced by");
+ info( " excluding ports or ranges prefixed by '~'");
info( " Examples:");
info( " -t 22 Forward local port 22 to 22 on guest");
info( " -t 22:23 Forward local port 22 to 23 on guest");
@@ -740,6 +749,7 @@ static void usage(const char *name)
exit(EXIT_FAILURE);
pasta_opts:
+
info( " -t, --tcp-ports SPEC TCP port forwarding to namespace");
info( " can be specified multiple times");
info( " SPEC can be:");
@@ -747,7 +757,8 @@ pasta_opts:
info( " 'auto': forward all ports currently bound in namespace");
info( " a comma-separated list, optionally ranged with '-'");
info( " and optional target ports after ':', with optional");
- info( " address specification suffixed by '/'. Examples:");
+ info( " address specification suffixed by '/' and optional");
+ info( " interface prefixed by '%%'. Examples:");
info( " -t 22 Forward local port 22 to port 22 in netns");
info( " -t 22:23 Forward local port 22 to port 23");
info( " -t 22,25 Forward ports 22, 25 to ports 22, 25");