Re: SSH question

From: Joseph M McKenna (jmcmat_private)
Date: Tue Apr 07 1998 - 05:21:46 PDT

  • Next message: Eric Vyncke: "Re: DMZ config question"

    You can use the following script to tunnel through a Netscape proxy or the
    TIS http-gw.  Thanks to Urban Kaveus <urbanat_private>.
    
    #!/usr/local/bin/perl5 -w
    #
    # ssh-tunnel.pl 
    #
    # Usage: ssh-tunnel.pl ssl-proxy port destination_host port
    #
    # This script can be used by ssh as a "ProxyCommand" to
    # traverse a www-proxy/firewall that supports the http CONNECT
    # command described in
    # http://home.netscape.com/newsref/std/tunneling_ssl.html
    #
    # Example, connect to host named "remote" outside of your firewall:
    #
    # $ ssh remote -o'ProxyCommand ssh-tunnel.pl www-proxy 80 remote 22'
    #
    # Better yet, insert the ProxyCommand definition for host "remote" in
    # your $HOME/.ssh/config file:
    #
    #      .
    #      .
    #    Host remote
    #      ProxyCommand /usr/local/bin/ssh-tunnel.pl www-proxy 80 %h %p
    #      .
    #      .
    #
    # Written by Urban Kaveus <urbanat_private>
    # deleted by declan, not actually required just specify AF_INET
    # and SOCK_STREAM explicitly
    #require 'sys/socket.ph';
    # replace references to &SOCK_STREAM with $SOCK_STREAM and
    # &AF_INET with $AF_INET
    # Parse command line arguments
    
    if ( $#ARGV != 3 ) {
        print STDERR "Usage: $0 ssl-proxy port destination port\n";
        exit(1);
    }
    $AF_INET = 2;
    
    #
    #
    #
    #if ($ENV{"OSTYPE"} eq "SunOS5") {
            $SOCK_STREAM = 2;
    #} else {
    #       $SOCK_STREAM = 1;
    #}
    #
    #
    #
    
    $sslproxy    = shift;
    $proxyport   = shift;
    $destination = shift;
    $destport    = shift;
    
    # Set up network communication
    
    ($protocol) = (getprotobyname("tcp"))[2];
    ($proxyip)  = (gethostbyname($sslproxy))[4];
    $localaddr  = pack('S n a4 x8', $AF_INET, 0, "\0\0\0\0");
    $proxyaddr  = pack('S n a4 x8', $AF_INET, $proxyport, $proxyip);
    
    socket (PROXY, $AF_INET, $SOCK_STREAM, $protocol) or
        die("Failed to create socket: $!\n");
    bind (PROXY, $localaddr) or
        die("Failed to bind socket");
    connect (PROXY, $proxyaddr) or
        die("Failed to connect to $sslproxy port $proxyport");
    
    # Force flushing of socket buffers
    
    select (PROXY);  $| = 1;
    select (STDOUT); $| = 1;
    
    # Send a "CONNECT" command to proxy:
    
    print PROXY "CONNECT $destination:$destport HTTP/1.0\r\n\r\n";
    
    # Wait for HTTP status code, bail out if you don't get back a 2xx code.
    
    $_ = <PROXY>;
    ($status) = (split())[1];
    
    die("Received a bad status code \"$status\" from proxy server. \n")
        if ( int($status/100) != 2 );
    
    # Skip through remaining part of MIME header
    
    while(<PROXY>) {
        chomp;   # Strip <LF>
        last if /^[\r]*$/;  # Empty line or a single <CR> left
    }
    
    # Start copying packets in both directions.
    
    if($child = fork) { # Parent process
        while (sysread(STDIN,$_,4096)) {
            print PROXY;
        }
        sleep 2;
        kill(15,$child) if $child;
    }
    
    else { # Child process
        while (sysread(PROXY,$_,4096)) {
            print STDOUT;
        }
    }
    
    Joe
    
    
    At 11:46 AM 4/6/98 -0500, Roy Stevens wrote:
    >I have started research into running ssh across the INTERNET.
    >My preliminary research has shown much promise.
    >
    >I would appreciate any feedback on this.
    >
    >I am particularly interested in firewall issues, i.e. proxy or IP 
    >forwarding problems.
    >
    >Thanks for any correspondence.
    >
    >TOBOR
    > 
    



    This archive was generated by hypermail 2b30 : Fri Apr 13 2001 - 12:54:07 PDT