TCP server na portu 502 - permission denied

Dobrý den,
mám následující problém:
píšu program, který má sloužit jako MODBUS TCP server, tzn. poslouchat na portu 502 a číst a posílat data, jak je psáno ve specifikaci MODBUS.
To by nebyl problém, ale funkce bind mi vrací Permission denied, jelikož a protože je to port 502/TCP a porty s číslem pod 1024 jdou přibindit pouze s právy roota.
Samozřejmě to jde obejít tak, že změním port například na 2502, ale požadavek zákazníka je port 502. Koneckonců je to tak přímo ve specifikaci.
Na internetu jsem našel ještě další knížecí radu, a to je spustit daný program s právy roota. To se mi ale vůbec nechce, ten program si spouští zákazník a ten by heslo k rootu vůbec nemusel znát. Vlastně ani není jiný důvod to spouštět pod rootem, ten program jenom čte data ze sdílené paměti nebo z MySQL a balíkuje je do protokolu MODBUS (a naopak).

Dá se nějak v systému nastavit, že řadový uživatel xx má právo pustit program, který vytvoří tcp port 502?

Obecně se na takové granularizované udělování práv používá Polkit. Jak to přesně udělat, neporadím. Je to docela komplexní věc: https://wiki.archlinux.org/index.php/Polkit

Jo, je to docela komplexní věc. :S

Co takhle dát uživatele do nějaké skupiny? Takhle jsem povolil přístup s sériovému portu.

Zdravim

napadaji me dva pristupy: a) poslouchat na neprivilegovanem portu a interne (pomoci iptables, firewalld) smerovat provoz portu 502 na neprivilegovany port nebo b) zkusit authbind.

Jj, našel jsem na webu takovouhle obezličku:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 943 -j REDIRECT --to-port 1300
je to ono? (jen jiná čísla portů)

Zdravim

Ano, to by melo fungovat. Jen pripominka, ze PREROUTING nefunguje pro localhost, tzn. ze pokud by jsi chtel pristupovat na privilegovany port na localhostu a pouzit REDIRECT na jiny (treba ten neprivilegovany), je potreba “stejne” pravidlo (lisi se v miste aplikovani pravidla, tedy na kterem interfacu) pridat i pro OUTPUT:

iptables [b]-A OUTPUT -t nat -o lo[/b] -p tcp --dport 943 -j REDIRECT --to-port 1300
  1. stare dobre reseni pres suid bit - pokud si to klient nemuze editovat tak je to tak bezpecne jak je program napsany
  2. capabilities - pravdepodobne bude stacit programu pridelit CAP_NET_BIND_SERVICE pres setcap

Jj, funguje prerouting i capabilities…
Takhle:
sudo setcap cap_net_bind_service+ep ./mbsrv
Akorát se ten setcap musí udělat po každém překladu.
Mohl bych ten setcap dát do Makefile, ale stejně by to otravovalo s heslem.

Jinak dík všem za spolupráci.