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?
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ů)
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:
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.