2017-07-07 4 views
0

Mon poste de travail est derrière un proxy d'entreprise, j'ai défini des variables d'environnement et je suis capable d'utiliser tout sauf aws-sdk avec NodeJS. Ici, une décharge de la connexion TCP:AWS SDK ne peut pas se connecter derrière le proxy d'entreprise

No.  Time   Source    Destination   Protocol Length Info 
    2 1.834143  105.103.15.106  105.103.82.47   TCP  74  54952 → 8080 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=497254718 TSecr=0 WS=128 
    3 1.836141  105.103.82.47   105.103.15.106  TCP  74  8080 → 54952 [SYN, ACK] Seq=0 Ack=1 Win=14480 Len=0 MSS=1460 SACK_PERM=1 TSval=3399116010 TSecr=497254718 WS=128 
    4 1.836165  105.103.15.106  105.103.82.47   TCP  66  54952 → 8080 [ACK] Seq=1 Ack=1 Win=29312 Len=0 TSval=497254719 TSecr=3399116010 
    5 1.836779  105.103.15.106  105.103.82.47   TCP  310 54952 → 8080 [PSH, ACK] Seq=1 Ack=1 Win=29312 Len=244 TSval=497254719 TSecr=3399116010 
    6 1.838250  105.103.82.47   105.103.15.106  TCP  66  8080 → 54952 [ACK] Seq=1 Ack=245 Win=15616 Len=0 TSval=3399116012 TSecr=497254719 
20 123.670911  105.103.82.47   105.103.15.106  TCP  66  8080 → 54952 [FIN, ACK] Seq=1 Ack=245 Win=15616 Len=0 TSval=3399237839 TSecr=497254719 
21 123.674168  105.103.15.106  105.103.82.47   TCP  66  54952 → 8080 [FIN, ACK] Seq=245 Ack=2 Win=29312 Len=0 TSval=497285178 TSecr=3399237839 
22 123.676592  105.103.82.47   105.103.15.106  TCP  66  8080 → 54952 [ACK] Seq=2 Ack=246 Win=15616 Len=0 TSval=3399237843 TSecr=497285178 

Notez que poignée de main à trois voies va bien, que le client (IP se terminant 106) envoie des données (PSH, ack) sur le numéro de paquet 5 et immédiatement, receiveis proxy' s ACK (numéro de paquet 6). Puis aucune communication pendant une longue période (les paquets entre 7 et 19 ne proviennent pas de cette conversation tcp), le paquet 20 est un FIN (délai d'expiration du proxy dû à l'absence de paquets envoyés). Cette conversation a été créée par example provided by Amazon.

versions Node: testé sur 6.10.0, 6.11.0 et 8.1.3 SDK installé aujourd'hui (2.82.0)

A titre de comparaison, je cours un aws cloudformatin describe-stack-resources --stack-name my-stack sur la même machine Ubuntu. Comme on le sait, aws CLI est python, la commande passe OK, et la conversation va comme:

No.  Time   Source    Destination   Protocol Length Info 
    1 0.000000  105.103.15.106  105.103.82.47   TCP  74  54940 → 8080 [SYN] Seq=0 Win=29200 Len=0 MSS=1460 SACK_PERM=1 TSval=496906305 TSecr=0 WS=128 
    2 0.001987  105.103.82.47   105.103.15.106  TCP  74  8080 → 54940 [SYN, ACK] Seq=0 Ack=1 Win=14480 Len=0 MSS=1460 SACK_PERM=1 TSval=3397722434 TSecr=496906305 WS=128 
    3 0.002008  105.103.15.106  105.103.82.47   TCP  66  54940 → 8080 [ACK] Seq=1 Ack=1 Win=29312 Len=0 TSval=496906305 TSecr=3397722434 
    4 0.002100  105.103.15.106  105.103.82.47   TCP  127 [TCP segment of a reassembled PDU] 
    5 0.003967  105.103.82.47   105.103.15.106  TCP  66  8080 → 54940 [ACK] Seq=1 Ack=62 Win=14592 Len=0 TSval=3397722436 TSecr=496906306 
    6 0.003974  105.103.15.106  105.103.82.47   HTTP  68  CONNECT cloudformation.us-east-1.amazonaws.com:443 HTTP/1.0 
    7 0.006035  105.103.82.47   105.103.15.106  TCP  66  8080 → 54940 [ACK] Seq=1 Ack=64 Win=14592 Len=0 TSval=3397722438 TSecr=496906306 
    8 0.247802  105.103.82.47   105.103.15.106  HTTP  185 HTTP/1.0 200 Connection established 
    9 0.247810  105.103.15.106  105.103.82.47   TCP  66  54940 → 8080 [ACK] Seq=64 Ack=120 Win=29312 Len=0 TSval=496906367 TSecr=3397722681 
10 0.248938  105.103.15.106  105.103.82.47   TLSv1.2 583 Client Hello 
11 0.250985  105.103.82.47   105.103.15.106  TCP  66  8080 → 54940 [ACK] Seq=120 Ack=581 Win=15616 Len=0 TSval=3397722683 TSecr=496906367 
12 0.684003  105.103.82.47   105.103.15.106  TLSv1.2 1995 Server Hello 
13 0.684011  105.103.15.106  105.103.82.47   TCP  66  54940 → 8080 [ACK] Seq=581 Ack=2049 Win=33152 Len=0 TSval=496906476 TSecr=3397723117 
14 0.690001  105.103.82.47   105.103.15.106  TLSv1.2 1488 CertificateServer Key Exchange, Server Hello Done 
15 0.690866  105.103.15.106  105.103.82.47   TLSv1.2 216 Client Key Exchange, Change Cipher Spec, Encrypted Handshake Message 
16 0.692974  105.103.82.47   105.103.15.106  TCP  66  8080 → 54940 [ACK] Seq=3471 Ack=731 Win=16640 Len=0 TSval=3397723125 TSecr=496906478 
17 0.968807  105.103.82.47   105.103.15.106  TLSv1.2 141 Change Cipher Spec, Encrypted Handshake Message 
18 0.969476  105.103.15.106  105.103.82.47   TLSv1.2 679 Application Data 
19 0.970992  105.103.82.47   105.103.15.106  TCP  66  8080 → 54940 [ACK] Seq=3546 Ack=1344 Win=17920 Len=0 TSval=3397723403 TSecr=496906547 
20 1.319977  105.103.82.47   105.103.15.106  TLSv1.2 617 Application Data 
21 1.324998  105.103.82.47   105.103.15.106  TCP  2114 [TCP segment of a reassembled PDU] 
22 1.325003  105.103.15.106  105.103.82.47   TCP  66  54940 → 8080 [ACK] Seq=1344 Ack=6145 Win=43008 Len=0 TSval=496906636 TSecr=3397723753 
23 1.329979  105.103.82.47   105.103.15.106  TLSv1.2 133 Application Data 
24 1.332987  105.103.15.106  105.103.82.47   TCP  66  54940 → 8080 [FIN, ACK] Seq=1344 Ack=6212 Win=43008 Len=0 TSval=496906638 TSecr=3397723763 
25 1.373825  105.103.82.47   105.103.15.106  TCP  66  8080 → 54940 [ACK] Seq=6212 Ack=1345 Win=17920 Len=0 TSval=3397723807 TSecr=496906638 
26 1.606041  105.103.82.47   105.103.15.106  TLSv1.2 119 Encrypted Alert 
27 1.606063  105.103.15.106  105.103.82.47   TCP  54  54940 → 8080 [RST] Seq=1345 Win=0 Len=0 

Notez que les paquets de 1 à 3 sont poignée de main à trois voies et même exactement comme avec JS SDK, paquet 4 est similaire à paquets 5 de JS SDK, il n'est pas montré sur le résumé mais il a aussi l'indicateur PSH et ACK, les différences sont le contenu (attendu) et le paquet 5 est le proxy ACK à ces données. A partir de ce point, les choses sont différentes, aws CLI envoie le prochain paquet dès que l'ACK arrive sur le paquet 6. Après les données reçues, aws CLI envoie FIN, reçoit ACK, Crypter Alerte et envoie un RST (ceci est dû Encrypt Alert pas prévu) .

Je ne trouve pas pourquoi JS SDK s'arrête d'envoyer des données après le dernier ACK du serveur. Mais depuis les temps de proxy et envoyer FIN ACK après un certain temps, mon script de nœud semble se bloquer pendant longtemps jusqu'à ce que abort avec l'erreur ci-dessous:

{ NetworkingError: socket hang up 
at TLSSocket.onHangUp (_tls_wrap.js:1124:19) 
at TLSSocket.g (events.js:292:16) 
at emitNone (events.js:91:20) 
at TLSSocket.emit (events.js:185:7) 
at endReadableNT (_stream_readable.js:974:12) 
at _combinedTickCallback (internal/process/next_tick.js:80:11) 
at process._tickDomainCallback (internal/process/next_tick.js:128:9) 

message: 'socket raccrocher', le code : 'NetworkingError', région : 'us-west-2', nom d'hôte: 'bucket.s3-us-west-2.amazonaws.com', réessayable: true, time: 2017-07-07T19: 31: 29.494Z} null

Une idée?

Répondre

2

En examinant la sortie, la connexion CLI utilise CONNECT (HTTP tunneling) comme décrit here alors que votre appel NodeJS SDK ne semble pas le faire. Il semble que NodeJS SDK avec des proxies de type CONNECT est un peu bizarre. Je recommande avec vue sur la bug on it qui mentionne en utilisant node-tunnel pour donner quelque chose comme ceci:

var AWS = require('aws-sdk'); 
var tunnel = require('tunnel'); 

var tunnelingAgent = tunnel.httpsOverHttp({ 
    proxy: { // Proxy settings 
    host: 'proxyhost', 
    port: 8080, 
    proxyAuth: "user:pass", 
    } 
}); 

AWS.config.update({ 
    httpOptions: { 
    agent: tunnelingAgent 
    } 
}); 

var s3 = new AWS.S3({region: 'us-west-2'}); 
s3.getObject({Bucket: 'bucket', Key: 'key'}, function (err, data) { 
    console.log(err, data); 
}); 

Bien que je n'ai malheureusement pas une configuration de l'environnement pour tester ce que j'espère que ce sera au moins vous donner un nouveau départ sur la façon pour aborder le problème.

+0

Bonne trouvaille. Comme c'est étrange qu'ils ne supportent pas CONNECT. Notez le dernier commentaire sur le rapport de bug, en mentionnant un module additionnel, https://www.npmjs.com/package/aws-sdk-proxy. –

+0

Il n'est toujours pas capable de se connecter, mais maintenant la conversation avec proxy est longue. Je vais continuer l'enquête. @ Michael-sqlbot, le proxy aws-sdk n'a pas fonctionné, même comportement que précédemment. – JrBenito

+0

TunnelAgent fonctionne avec aws-sdk – JrBenito