Ir local é mais rápido e mais eficiente para sua pergunta, então (1).
Isso tudo envolve como o seu pacote é encaminhado pela sua rede.
A diferença que eu posso identificar imediatamente a partir de sua descrição simples aqui é usar um gateway em vez de ir diretamente para o PC. Indo para o endereço externo, você usará o roteador (gateway padrão) e seus recursos para fazer a conexão. Se esse roteador estiver sendo muito utilizado, você notará uma redução significativa na taxa de transferência do tráfego.
Primeiramente, sugiro verificar sua tabela de roteamento no sistema local
user@server:~$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.11.0.1 0.0.0.0 UG 0 0 0 eth0
10.11.0.0 0.0.0.0 255.255.252.0 U 0 0 0 eth0
Você pode ver com minha configuração que, se eu fizer referência a um sistema na rede local (ou seja, 10.11.2.200), ele será direcionado diretamente para esse sistema. Se eu tiver um endereço NAT para ele (isto é, 10.11.2.200 NAT www.somedomain.net), ele irá primeiro viajar para o roteador e depois NAT de volta para a rede.
Você pode testar isso executando um traceroute no endereço IP interno e comparando-o ao endereço IP NAT. (É preferível desabilitar a resolução de nomes no seu traceroute).
user@server:~$ traceroute -n www.xxx.yyy.zzz
traceroute to www.xxx.yyy.zzz (www.xxx.yyy.zzz), 30 hops max, 60 byte packets
1 10.11.0.1 0.598 ms 0.717 ms 0.792 ms
2 10.10.1.3 0.710 ms 0.788 ms 0.896 ms
3 www.xxx.yyy.zzz 0.609 ms 0.496 ms 0.439 ms
Você deve perceber que acessa seu gateway padrão (roteador) antes de retornar à rede.
Compare isso com o seu traceroute direto
user@server:~$ traceroute -n 10.11.0.64
traceroute to 10.11.0.64 (10.11.0.64), 30 hops max, 60 byte packets
1 10.11.0.64 0.349 ms 0.343 ms 0.336 ms
A razão pela qual a pequena velocidade de transferência de arquivos era perceptível é por causa de seu tamanho extremamente pequeno, que levou tempo para alocar os recursos no roteador. Em uma transferência de arquivos maior, o tempo será estatisticamente insignificante, pois você está abrindo uma conexão e deixando-a aberta. Um teste que lhe daria resultados diferentes seria enviar o arquivo de tamanho pequeno, mas executando-o número de vezes X para igualar seu tamanho de arquivo de 100MB. Tente isso com um script executando o comando 20.000.000 vezes, você deve obter 100MB.
cmd="ssh ... echo hello"; for ((i=0;i<10000000;i++)); do $cmd;done
(10.000.000 execuções porque 'echo_hello' tem 10 bytes, embora a saída seja maior do que seria recebida de um pacote ACK simples para o SCP). Este script é apenas uma prova rápida de conceito.
Espero que isso resolva sua pergunta corretamente. Eu gostaria de adicionar isso fica mais complicado se o sistema de origem e / ou destino tiver várias interfaces em redes diferentes.