> Då den inkommande porten är dynamisk allokerad så är det dessutom mer eller mindre
> omöjligt att göra en portforwarding också. (när det gäller FTP)
Det där håller inte riktigt...
När jag kör en passiv FTP från min laptop mot min server på kontoret
och loggar trafiken med de aktuella portarna ser det ut så här:
Först kommer det allra första anropet från min PC (port 20865) mot server (FTP porten 21):
Kod: Markera allt
TCPtrace RCV packet 2 at 4-SEP-2010 14:12:42.22
IP Address Port Seq # Ack #
Source 81.232.163.33 20865 33201857 0
Destination 192.168.1.10 21
Packet Length 48
TCP flags SYN
window 65535
Detta svarar servern med en "SYN ACK" som vanligt.
Sedan följer en rad med paket mellan dessa två portar med påloggning o.s.v.
Sedan kommer ett paket från klienten där klienten begär passiv mode (PASV):
Kod: Markera allt
TCPtrace RCV packet 19 at 4-SEP-2010 14:12:42.56
IP Address Port Seq # Ack #
Source 81.232.163.33 20865 33201903 4239474526
Destination 192.168.1.10 21
Packet Length 46
TCP flags PSH ACK
window 65293
Hex Count Ascii
-------- -------- -------- -------- ---- ----------------
21A3E851 B7BB067D 0040568B 2E000045 0000 E....V@.}...Q..!
5E3FB1FC EF9EFA01 15008151 | 0A01A8C0 0010 ....Q.........?^
0A0D 56534150 | 0000CB1A 0DFF1850 0020 P.......PASV..
Servern svarar med ett paket där den port som ska användas är angiven :
Kod: Markera allt
TCPtrace XMT packet 20 at 4-SEP-2010 14:12:42.57
IP Address Port Seq # Ack #
Source 192.168.1.10 21 4239474526 33201909
Destination 81.232.163.33 20865
Packet Length 90
TCP flags PSH ACK
window 61740
Hex Count Ascii
-------- -------- -------- -------- ---- ----------------
0A01A8C0 28DA0680 0040B969 5A000045 0000 E..Zi.@....(....
F59EFA01 5E3FB1FC 81511500 | 21A3E851 0010 Q..!..Q...?^....
65746E45 20373232 | 00009A4F 2CF11850 0020 P..,O...227 Ente
646F4D20 65766973 73615020 676E6972 0030 ring Passive Mod
2C30312C 312C3836 312C3239 31282065 0040 e (192,168,1,10,
0A0D 29363231 2C333931 0050 193,126)..
"193, 126" ska läsas som "193x256 + 126", alltså 49534 decimalt eller C17E i hex.
Nästa sak som händer är att klienten öppnar port 49534 (från en ny lokal port 20866) :
Kod: Markera allt
TCPtrace RCV packet 21 at 4-SEP-2010 14:12:42.58
IP Address Port Seq # Ack #
Source 81.232.163.33 20866 4211660429 0
Destination 192.168.1.10 49534
Packet Length 48
TCP flags SYN
window 65535
Här måste ju alltså routern/gatewayen på mitt kontor redan veta vad den ska
göra med anropet till port 49534. Det är en helt ny channel som öppnas. Jag kan
inte se annat en att routern har sparat/analyserat paketet som gick till klienten
så att den vet vart den aktuella porten ska forwardas.
Efter detta ACK'ar servern anropet mot port 49534 (en "SYN ACK") och det hela "rullar på" som vanligt.
OK, om jag nu kör med "passive" avslaget så blir det lite annorlunda.
Skillnaden är att nu är det klienten som skickar ett högt portnummer till servern
med PORT kommandot (alltså istället för PASV kommandot), Servern svara med ett "OK" :
Kod: Markera allt
TCPtrace RCV packet 18 at 4-SEP-2010 14:38:23.74
IP Address Port Seq # Ack #
Source 81.232.163.33 21012 1873923971 28645467
Destination 192.168.1.10 21
Packet Length 66
TCP flags PSH ACK
window 65293
Hex Count Ascii
-------- -------- -------- -------- ---- ----------------
21A3E851 AA25067D 00405021 42000045 0000 E..B!P@.}.%.Q..!
5B18B501 83CFB16F 15001452 | 0A01A8C0 0010 ....R...o......[
2C313820 54524F50 | 0000DDC0 0DFF1850 0020 P.......PORT 81,
31322C32 382C3333 2C333631 2C323332 0030 232,163,33,82,21
0A0D 0040 ..
--------------------------------------------------------------------------------
TCPtrace XMT packet 19 at 4-SEP-2010 14:38:23.74
IP Address Port Seq # Ack #
Source 192.168.1.10 21 28645467 1873923997
Destination 81.232.163.33 21012
Packet Length 70
TCP flags PSH ACK
window 61740
Hex Count Ascii
-------- -------- -------- -------- ---- ----------------
0A01A8C0 B7D30680 00403E70 46000045 0000 E..Fp>@.........
9DCFB16F 5B18B501 14521500 | 21A3E851 0010 Q..!..R....[o...
54524F50 20303032 | 0000559F 2CF11850 0020 P..,.U..200 PORT
73736563 63757320 646E616D 6D6F6320 0030 command success
0A0D 2E6C7566 0040 ful...
"82,21" i PORT kommandot ska läsas som "82x256 + 21" = 21013 decimalt eller 5215 i hex.
Klienten skickar sedan ett LIST kommando precis som vanligt mot port 21 varvid servern
(från port 20 på server) öppnar port 21013 på klienten och påbörjar dataöverföringen
ungefär som tidigare.
Det är alltså klienten som istället skickar ett högt/dynamiskt nummer till server
som sedan servern öppnar mot klienten. D.v.s att vi har samma "problem"
med att routern/gatewayen måste veta vart detta höga/dynamiska nummer
ska "forwardas". Jag har samma router/gateway i båda ändar (hemma och
på kontoret) så scenariot blir precis detsamma, fast i andra riktningen/änden.
D.v.s att om *båda* sidor har dynamisk forwarding av höga portnummer avslaget
så skulle inte FTP fungera i varken passiv eller active mode.
Och jag kan inte se att det kan fungera på något annat sätt än att routern
"ser" vilket högt/dynamiskt portnummer som skickas över och sparar det
temporärt så att anropet mot den porten sen kan routas rätt, så att säga.