das mit den ports ist so: es funktioniert, sagen wir im LAN, so wie du es dir wahrscheinlich denkst. der router nimmt aber den platz eines rechners im internet an und ist quasi für den rest im internet ein rechner, dessen bestimmte ports angesprochen werden sollen. der router selbst ist quasi (u.a.) ein multiplexer für mehrere rechner (oder eben auch nur einen). damit die daten an port 1234 aber an einem rechner ankommen, muss der router, der sie empfängt, sie auch weiterleiten. damit er weiß wohin, gibt es eben das port-forwarding.
wenn nun aber z.b. vier rechner im LAN hinter dem router sind, können nicht alle port 1234 verwenden. wenn diese rechner alle bswp. einen webserver betreiben, könnten sie das jeweils auf port 80 tun und sind darüber im LAN, eindeutig identifiziert durch die kombination aus ip-adresse und port, zu erreichen. damit alle vier webserver aber aus dem internet - über die eine ip-adresse und die eine range von ports des routers - zu erreichen sind, behilft man sich momentan mit NAT (network address translation). dabei werden nun vier - natürlich verschiedene - ports am router geöffnet und der datenverkehr je nach routerkonfiguration weitergereicht, also etwa 8001->pc1, 8002->pc2, etc. dabei ist es auch unerheblich, auf welchem port die webserver auf den rechnern laufen, hauptsache die zuordnungen nach dem schema port-am-router<->server-ip&server-port stimmen.
wenn rechner nun von innen nach außen wollen, etwa zum surfen, dann müssen gewöhnlich ja auch daten - in diesem fall die HTML-dokumente, bilder usw. - auch wieder zurück zum anfragenden rechner. dies löst der router mittels NAT über eine (weitere) interne tabelle. geht eine HTTP-anfrage von pc1 auf dessen lokalem port 12000 (vollkommen egal) an port 80 auf www.web.com raus, so versendet der router das paket auf einem von ihm gewählten (router-)lokalen port, z.b. 6789 an www.web.com:80. kommt nun vom webserver was zurück, entsprechend der anfrage also an port 6789, kann der router nachsehen, von welchem rechner im LAN ursprünglich die anfrage kam. andere rechner, die ins web wollen, werden dann von anderen router-ports rausgeschickt und wieder empfangen. so behält der router den überblick, was woher kam. wenn er nur alles an www.web.com:80 auf einem lokalen port weiterleitet, weiß er ja nicht, "wer was bestellt hat".
und wenn du nun von außen daten empfangen können willst, sei es instant-messaging, bittorrent oder sonstwas, dann musst du eben eine verknüpfung zwischen einem oder mehreren im internet sichtbaren router-port(s) und dem jeweiligen PC und dessen port(s) herstellen.
dass du in (besseren) programmen selbst festlegen kannst, auf welchen ports daten getauscht werden sollen, liegt eben daran, dass man meist durch firewalls, router o.ä. beschränkungen unterliegt, die man so manchmal umgehen kann. zudem macht es z.b. auch sinn, eine server-software wie SSH, VNC oder auch FTP aus sicherheitsgründen nicht auf dem standard-port laufen zu lassen, um scannern und sniffern nicht so leicht ins netz zu gehen.
alles klar?