[megoldva] ssh ProxyCommand; Protocol mismatch

 ( zamboriz | 2011. július 7., csütörtök - 16:34 )

Elkezdtem írni egy ProxyCommand-ként használandó programot linux-ra. Napok óta nem tudom kitalálni, miért nem működik.

Indítottam egy ssh tunnelt; kipróbáltam, működik:

ssh -AxfNy -D '127.0.0.1:1089' 127.0.0.1
ssh 127.0.0.1 -o "ProxyCommand nc -X 4 -x 127.0.0.1:1089 %h %p" echo OK

Írtam egy kis programot:

#include <unistd.h>
#include <arpa/inet.h>
#include <string.h>

#define BUFFLEN (4096)
char buff[BUFFLEN];

int main( void ){
  int s = socket( AF_INET, SOCK_STREAM, 0 );
  struct sockaddr_in sa;
  memset( &sa, 0, sizeof(sa) );
  sa.sin_family      = AF_INET;
  sa.sin_addr.s_addr = inet_addr("127.0.0.1");
  sa.sin_port        = htons(1089);
  connect( s, (struct sockaddr*)&sa, sizeof(sa) );

  struct socks4_cmd {
    uint8_t  ver;
    uint8_t  dir;
    uint16_t port;
    uint32_t addr;
    uint8_t  user;
  } cmd = (struct socks4_cmd){4,1,htons(22),inet_addr("127.0.0.1"),0};

  write( s, &cmd, sizeof(cmd) );
  int len=read( s, &cmd, 8 );
  if( cmd.dir == 0x5A ){
    int ret=fork();
         if( ret == 0 ){ while( (len=read(0,buff,BUFFLEN))>0 ) write(s,buff,len); }
    else if( ret >  0 ){ while( (len=read(s,buff,BUFFLEN))>0 ) write(1,buff,len); }
  }
  return 0;
}

Kipróbáltam, de nem működik:

# ssh 127.0.0.1 -o "ProxyCommand ./test" echo OK
Bad packet length 1349676916.
Disconnecting: Packet corrupt

A 1349676916 igazából egy szöveg első 4 karaktere: 'Protolcol mismatch'. Ezt az sshd küldi vissza, a sikeresen felépült socks4 tunnel-en keresztül, a kapcsolatfelvétel (SSH2_MSG_KEXINIT) során.

Úgy tűnik, mintha a fork() utáni sorokban lenne a hiba. Szóljon akinek van ötlete hogy mi lehet a hiba oka.


Elszoktam a C-től, nem vitás. A hibás részlet:

write( s, &cmd, sizeof(cmd) );

Helyesen:

write( s, &cmd, 9 );

Tanulság: a forráskód publikálása segíti a hibakeresést :-)

Hozzászólás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

Sztem ezt igy ne. Inkabb: sizeof(struct socks4_cmd)
--
Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. | Gentoo Portal

Rontsam el vele a működő kódot? :-)