Unter Linux (und UNIX) kann man die Ports bis 1024 (die sogenannten Well Known Ports) nur dann binden, wenn man über root Rechte verfügt. Das ist natürlich unschön wenn man einen Server z.B. auf Port 80 laufen lassen will, dieser aber keine dementsprechenden Rechte bekommen darf.
So läuft bei mir zum Beispiel ein Etherpad Light auf dem Port 9001. Jetzt wäre es natürlich schön wenn dieser auf dem Port 80 erreichbar wäre. Dazu würde eine iptables Regel reichen:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 9001
Das Problem an dieser Regel ist zum ersten das die Anwendung damit unter Port 80 und Port 9001 zu erreichen ist. Das zweite Problem ist das jeder unprivilegierte Nutzer ebenfalls den Port 9001 öffnen kann und damit auch die Daten von Port 80 bekommt. Und es gibt auch noch ein drittes Problem. Das ganze funktioniert nicht auf Maschinen die mit dem Linux VServer betrieben werden. Dort funktioniert das IP Tables nämlich nicht:
iptables v1.4.4: can't initialize iptables table `nat': Permission denied (you must be root)
Eine weitere Variante wäre setpcaps was allerdings problematisch ist da man diese einem Programm geben muss, was dann bei Skripten nicht funktionieren sollte:
setcap 'cap_net_bind_service=+ep' /path/to/program
Weitere Informationen gibt es unter:
http://www.wensley.org.uk/info#setpcaps
http://serverfault.com/questions/112795/how-can-i-run-a-server-on-linux-on-port-80-as-a-normal-user
http://stackoverflow.com/questions/413807/is-there-a-way-for-non-root-processes-to-bind-to-privileged-ports-1024-on-li
Für iptables brauchst du aber auch root-Rechnte…
Ja, du musst es ja nur einmal mit root Rechten ausführen und dann hat sich die Sache.
Nein, du musst das bei jedem Neustart neu eingeben.
Das kann ja automatisch beim Start geschehen. Der Serverprozess benötigt dann trotzdem keine Root Rechte.