Att förstå portnumrering
Varje nod i ett nätverk identifieras av en IP adress, som består av ett 32-bitars nummer. (Version 6 av IP protokollet ändrar detta till ett 128-bitars nummer, men version 6 har för närvarande inget stöd i OS/2-versionen av tcp/ip.) I det enklaste fallet, har en dator en enda IP adress, men det är möjligt - och har blivit vanligare - för en dator att ha mer än ett nätverks-interface, och därför också mer än en IP adress.
IP adresser har formen
- (Klass A) 10.*.*.*
- (Klass B) 172.16.*.* till 172.31.*.*
- (Klass C) 192.168.*.*
är speciella, på det sättet att de är privata i det lokala nätverk (LAN) där de används. För de flesta LAN är Klass C adresser de mest lämpade, medan Klass A och Klass B områdena är tillgängliga för väldigt stora LAN. Fördelen med dessa adresser är att du kan använda dom för noder i ett LAN utan att behöva gå igenom någon officiell process för att få IP adresserna allokerade. Nackdelen är att adresserna är osynliga utanför LAN'et; vilket betyder att noderna inte kan kommunicera med det globala Internet. Vägen runt detta är att använda en firewall som implementerar Network Address Translation (NAT). NAT kommer att gås igenom i en senare sektion.
Vid varje given tidpunkt, kan en nätverks-nod ha flera samtidiga anslutningar igång med olika maskiner i nätverket. Det betyder att vi måste märka upp de olika uppkopplingarna, så att de går att hålla isär. Metoden är att tilldela portnummer till (vår ände av) uppkopplingarna.Portnumren har ingenting att göra med hårdvarans I/O portar. Istället, är det helt enkelt ett system att numrera uppkopplingarna. Ett portnummer är ett osignerat 16-bitars nummer. Den ena änden på anslutningen är unikt identifierad av paret (IP adress, port nummer). En uppkoppling definieras av två av dessa par, en var varje ände.
Programvarumekanismen för att sätta upp detta är känd som en "Socket". Du kan betrakta socket som en datastruktur som håller kontroll på två IP adresser och två portnummer involverade i en överföring, tillsammans med all övrig statusinformation som är nödvändig. (Data-buffrar, byte-räknare, etc.)
När en socket först skapas, vet vi endast IP adressen och portnumret i vår egen ände. När en uppkoppling är etablerad, måste vi ta reda på IP adressen och portnumret i den andra änden. Av naturliga skäl måste en av ändpunkterna initiera uppkopplingen. Den vanliga mekanismen är att servern intar ett "Listening" state där den väntar på klient-uppkopplingar, och sedan låter klienten etablera uppkopplingen.
Portnummer i området 0 till 49151 är reserverade för "Server" portar. Mer exakt, de som finns i området 0 till 1023 är definierade av officiella standarder; de i området 1024 till 49151 har en mindre officiell status, men de betraktas fortfarande som "Registered ports" vilka är allokerade till kända applikationer. En lista över reserverade portnummer kan hittas i filen MPTN\ETC\SERVICES.
Portnummer i området 49152 till 65535 formar en pool av "Available ports" vilka används när en ny port behövs. Typiskt är en sådan port allokerad för en kortvarig uppkoppling, och sedan avallokerad när operationen är klar.
I ett klient/server protokoll, behöver klienterna något sätt att hitta servrarna. Av det skälet, lyssnar alltid servrar på "Well known ports" vilka är reserverade för detta ändamål. FTP protokollet använder två uppkopplingskanaler, en för kommandon och en för data. Konsekvent nog har det två välkända portar, port 21 för kommandon och port 20 för data. Detta är, naturligtvis i serveränden. I klientänden, kan klienten använda vilka portar som helst, och normalt väljer klienten sina portar från en pool med tillgängliga portar.
FTP protokollet tillåter två typer av uppkopplingar. I så kallad "Passive ftp" initieras transfern från klientänden. I icke-passiv ftp, också känd som "Port ftp", initieras transfern från serveränden. I båda fallen använder uppkopplingen port 21 i serveränden. Skillnaden mellan de olika metoderna ligger i hur data-porten allokeras.
Passiv FTP
Passiv FTP initieras när klienten sänder ett PASV kommando. (Effekten av detta varar endast för en filöverföring. Om ytterligare en fil skall överföras, måste klienten sända ett andra PASV kommando.) Serverns respons på detta kommando är en rad liknande
227 Entering passive mode (127,0,0,1,203,197)De första fyra numren specificerar IP adressen på servern. De återstående två specifierar ett port nummer. I praktiken är säger PASV kommandot "Please choose a data port, and tell me what port it is". Servern väljer port, normalt från en stor pool av tillgängliga portnummer, och rapporterar sitt nummer tillbaka till klienten. Servern lyssnar sedan på den porten där klienten initierar en data uppkoppling. Naturligtvis måste klienten också välja en data port i sin egen ände; servern upptäcker senare när uppkopplingen är utförd vilken port som använts.
I passiv ftp, beter sig kommandokanalen och datakanalen på samma sätt. Servern lyssnar på en känd port. Klienten vet vilket portnummer som används, så att den kan initiera en uppkoppling till den porten.
Port (icke-passiv) FTP
De tidigaste utkasten till ftp standarden innehöll inte passiv ftp. Det "Normala" sättet att överföra data, och även nu det vanligaste sättet, är att datauppkopplingen etableras från server sidan. (Undantaget är de flesta Web browsers, som till skillnad från fristående ftp klienter, verkar använda uteslutande passiv ftp. Fristående ftp klienter ger vanligtvis användaren möjlighet att välja.) För att port ftp skall fungera, måste servern känna till vilken port som klienten lyssnar på.
Detta specificeras med ett PORT kommando från klienten. Ett exempel på kommandot är
PORT 127,0,0,1,203,201Detta specificerar IP adressen för klienten, och det portnummer som klienten önskar använda för dataöverföringen. Det betyder, att klienten väljer ett portnummer, lyssnar på porten, och servern gör en uppkoppling till porten. I båda detta och i PASV exemplet, var IP adressen 127.0.0.1. Det beror på att jag använt en loopback uppkoppling på min dator för att generera exemplen. I praktiken, blir IP adressen den som tillhör din egen maskin.
Under tiden, måste också servern välja en port i sin egen ände. Standarmässigt, är den nästan alltid port 20.
Notera att klienten alltid måste ge antingen ett PASV kommando eller ett PORT kommando innan den startar en upp eller nerladdning. Beroende av vilket blir det antingen en passiv elle icke-passiv överföring.
Effekten av en firewall
En firewall kan antingen ha eller inte ha en inkluderad NAT option. I den här sektionen kommer jag att ignorera NAT.
Funktionen hos en firewall är att tillåta vissa paket att passera, medan andra förvägras passage. Detta regleras av ett antal regler som skapas av systemadministratören. Administratören måste bestämma vilka klasser av trafik som är tillåtna.
Jag har ingen större erfarenhet av firewalls, så jag kan inte ge dig någon expertbeskrivning av vad som sker. Jag tror däremot, att reglerna vanligtvis baseras på portnummer. Trafik till/från vissa portar är tillåten, medan andra portar är blockerade. Reglerna blir av naturliga skäl asymmetriska, eftersom reglerna för utgående paket bör bli rätt annorlunda mot för inkommande paket.
Betänk fallet där en ftp klient befinner sig bakom en firewall, och kommunicerar med en server som inte är bakom en firewall. Ett typisk val av firewall-regler skulle gör icke-passiv ftp illegal, därför att icke-passiv ftp erfordrar att servern - maskinen utanför firewallen - tar initiativet till data-uppkopplingen. En firewall sätts ofta upp så att maskiner utanför firewallen inte tillåts initiera en uppkoppling. I praktiken, är detta en betydande orsak för att lägga till passiv ftp till ftp standarden. Om klienten befinner sig bakom en firewall, skall den normalt endast använda passiv ftp.
Omvänt, om servern befinner som bakom en firewall och klienten inte, kommer troligtvis passiv ftp att bli blockerad och port ftp är den enda rimliga lösningen.
Om klienten är bakom en firewall, och servern är bakom en annan firewall, då är vi verkligen utsatta för problem. 'Firewall'-koncept designades inte med tanke på den här situationen. Servrar skall inte befinna sig bakom en firewall, undantaget naturligtvis servrar som är avsedda att vara privata i ett LAN. Om du har en firewall som skyddar ditt LAN, skall du normalt lägga dina offentliga server-applikationer på samma maskin som kör firewall-programmen. Om du gör det, då är din server tekniskt sätt utanför firewallen.
Om du, av något skäl, verkligen måste ha din server innanför en firewall, bör du vara expert på att designa regler för firewalls. Du bör läsa de föregående avsnitten väldigt noga, för att se vilka portar som skall aktiveras i firewall reglerna. Faktiskt, den delen är den enkla. Den svåra delen är att göra det på ett sånt sätt att du tillåter ftp servern att fungera, utan att kompromissa med säkerheten i ditt LAN. Om du tillämpar reglerna för släpphänt, kan du lika gärna vara utan en firewall.
Firewalls med implementerad NAT
Den bästa sortens firewalls är de som erbjuder Network Address Translation (NAT). Detta innebär att dina maskiner inom LAN'et har sina egna IP adresser, men låter dom uppträda som om de hade en annan IP adress sett från utsidan. I bästa fall kan alla maskiner i ditt LAN dela på samma "External" IP adress.
Ett IP data paket har en header som specificerar, bland annat, en käll- och destinations IP adress. Som säger vem som skickar paketet, och vilken som antas ta emot det. Med hjälp av NAT altenativet, kommer firewallen att alternera käll-IP adressen, så att det verkar som om paketen kom från en annan adress. Det är för utgående trafik. För inkommande trafik, snappar firewallen upp paketen som är destinerade till den "Fake" IP adressen, och sänder dom vidare påtänkta mottagaren.
Betänk det fall där du har en ftp klient bakom en firewall, och en ftp server utanför firewallen. När klienten kopplar upp till servern, ser inte servern klientens verkliga IP adress. Istället, ser den adressen hos firewallen. Servern vet inte ens att det finns en firewall. Istället växelverkar den med adressen, som den skulle har gjort med vilken annan klient som helst. Ur servern synvinkel, är klienten firewall maskinen. Emellertid, förmedlar firewallen servern svar till den verkliga klienten.
Liknande, en server bakom en firewall antar att varje klient har samma adress som firewall maskinen. Firewallen förmedlar trafiken till den verkliga klienten.
Allt detta skulle fungera bra undantaget två små detaljer. Som vi har sett i tidigare exempel, sänder PASV och PORT kommandona hos ftp protokollet IP adresser som data. Detta är de riktiga IP adresserna, inte de adresser som är alternerade av NAT programvaran. Detta kan leda till att data sänds till fel adress.
Den logiska lösningen på problemet skulle vara att NAT programvaran fångade upp PASV och PORT kommandona, och alternerade numren i raderna. Vissa firewall programvaror är smarta nog att göra detta. Olyckligtvis nog, är vissa andra inte så bra genomtänkta.
Tidigare, tänke inte människor i termer av att sätta en ftp server bakom en firewall. Nu när det finns kabelmodem, ADSL, och en mängd andra sätt att få höghastighets datalänkar, har optionen blivit mera vanlig. För att kunna hantera komplikationen, har FtpServer en 'behind firewall' option för att kompensera för det som NAT programvaran skulle ha gjort, men inte gör. Se sidan med Optioner i den här manualen för att sätta upp alternativet.