[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[debian-users:29218] ssh を使った Firewall 越え



和田と申します.

firewall の内側の Debian マシンから, 外側にある Debian マシンへの ssh
の接続を試みているのですが, ちょっとつまづいております.

http://hp.vector.co.jp/authors/VA000770/docs/NikkeiLinux00-12/config.ja.html 
を参考にしてやったことは以下の通りです.


Kernel 2.4.6                                   Microsoft Proxy Server 2.0
+----------------+ STDIN  +------------+       +-----------+
|                |------->|	       |-------|           |
| ssh 2.5.2p2-3  |        | proxy-klab |       | web proxy |
|                |<-------| command    |<------|           |
+----------------+ STDOUT +------------+ https +-----------+
  Client Machine                                  ^   |
                                            https |   | https
<inside>					  |   |      
----------Firewall--------------------------------+---+----- 
<outside>                    kernel-2.2.19        |   |      
                          +-----------------+     |   |
                          |                 |-----+   |
                          |  ssh 2.5.2p2-3  |         |
                          |    port 443     |<--------+
			  +-----------------+
			     Server Machine 


Firewall の内側にある, Microsoft Proxy Server 2.0 がうけつけているポー
トは, 80 番 (http) と, 21 番 (ftp) と, 443 番 (https) にあてたものだけ
です. やろうとしているのは, Firewall の外側にある Server Machine の 
sshd サーバを, port 443 (https) で走らせ, FIrewall の内側の Client
Machine の ssh クライアントから, proxy-klab という perl script を介し
て, web proxy 経由で, Server Machine の https の 443 番ポートにアクセ
スし, ssh コネクションをはるということです.

そのために, まず, Firewall の外側にある Server Machine の 
/etc/ssh/sshd_config において, 「Port 22」という記述を,「Port 443」に
書き変えて, 「/etc/init.d/ssh restart」とし, port 443 番 (https) で sshd を立ち上げ直しました. 

次に, Firewall の内側にある Client Machine の ~/.ssh/config で,

Compression  yes
Host ip.address.of.Server.Machine
    Port 443
    ForwardAgent yes
    ForwardX11 yes
    ProxyCommand /path/to/proxy-klab %h %p

としました. そして, 本メール末尾に添える proxy-klab という perl script 
を用意し, 以下のようにすると,

# ssh -v -l UID ip.address.of.Server.Machine
OpenSSH_2.5.2p2, SSH protocols 1.5/2.0, OpenSSL 0x0090601f
debug1: Seeding random number generator
debug1: Rhosts Authentication disabled, originating port will not be trusted.
debug1: ssh_connect: getuid 1000 geteuid 1000 anon 1
debug1: Executing proxy command:  /path/to/proxy-klab ip.address.of.Server.Machine 443
debug1: unknown identity file /home/UID/.ssh/identity
debug1: identity file /home/UID/.ssh/identity type -1
debug1: unknown identity file /home/UID/.ssh/id_rsa
debug1: identity file /home/UID/.ssh/id_rsa type -1
debug1: unknown identity file /home/UID/.ssh/id_dsa
debug1: identity file /home/UID/.ssh/id_dsa type -1

と, ここでネゴシエーションが止まってしまいます. この時, サーバ側には,

Jul 18 23:03:33 phys5 sshd[2222]: Did not receive identification string from ipp.address.of.client.Machine

というログが残っていました. 

同様の環境で, proxy server が 「Microsoft Proxy Server 2.0」ではなく, 
「squid-1.1.20」に変えたものだと, この方法で ssh で上手く外に出られる
ことは確認できています. したがって, 怪しいのは, この方法と MS の proxy
server との相性 (もしくは設定の違い) ということになるのですが, どなた
か同様の状況に遭遇された方はいらっしゃいますでしょうか. MS Proxy が返
すメッセージについてもう少し調べてみようと思いますが, 何でもよいので情
報を頂けたら有難いです. よろしくお願いします.

# Microsoft Proxy Server 2.0 の web proxy は ftp URL もうけつけるので
# すが, 愛用の ncftp だと外に出ることができません. Netscape では, 
# ftp://UID:passward@xxxxxxxxxxxxxxxxxxxxxxxxxxxx とアドレスを指定する
# と, うまくログインでき, ファイルのダウンロードはできるのですが, ファ
# イルのアップロードはできません. ncftp の作者は,
# FIREWALL-PROXY-README で「Note that NcFTP does _not_ work with HTTP
# proxies that accept FTP URLs.  Why?  Because they accept HTTP 
# requests, silly, not FTP, which this program does.」とちょっとお怒り
# の様子です. ssh で上手く接続できれば ftp はいらないのですが, 
# HTTP proxy を経由で, ftp で接続することができるクライアントがもしあ
# れば, 教えて下さい. 

---
wada


# dpkg -l ssh
ii  ssh            2.5.2p2-3      Secure rlogin/rsh/rcp replacement (OpenSSH)

# cat proxy-klab
#! /usr/bin/perl
$PROXY_KLAB = "ip.address.of.proxy.server";
$PROXY_KLAB_PORT = 80;
$Verbose = 0;

while ($_ = shift) {
    last if ! /^-(.*)/;
    if ($1 =~ /^v+$/) { $Verbose += length($&); next; }
    print <<EOF;
Usage: proxy [option...] <host> <port>
 Options:
     -v    Verbose mode
EOF
}
$HOST = $_;
if ($_ = shift) {
    $PORT = $_;
} else {
    $PORT = 23;
}
print "Verbose Level: $Verbose\n" if $Verbose;
use Socket;
($name, $aliases, $proto) = getprotobyname('tcp');
($name, $aliases, $type, $len, $thataddr) = gethostbyname($PROXY_KLAB);
$that = sockaddr_in($PROXY_KLAB_PORT, $thataddr);
socket(S, PF_INET, SOCK_STREAM, $proto) || die "socket: $!";
connect(S, $that) || die "connect: $!";
if ($Verbose > 1) {
    $Rin = &fhbits('STDIN S');
} else {
    $Rin = &fhbits('S');
}
&login;
&connect;
exit 0;
# login 処理
sub login {
    &receive(0.1);
    &send("CONNECT $HOST:$PORT HTTP/1.0\r\n\r\n");
    do { &receive(0.1); } until (/HTTP\/[\d\.]+ 200.*\n\n/);
    $Raw =~ m/HTTP\/[\d\.]+ 200.*[\r\n]+/;
    $Raw = $';
}
# connect
sub connect {
    local($rout);
    print "CONNECT\n" if $Verbose;
    $Rin = &fhbits('STDIN S');
    syswrite(STDOUT,$Raw,length($Raw));
    while ((select($rout=$Rin,undef,undef,undef))[0]) {
	if (vec($rout,fileno(S),1)) {
	    return if sysread(S,$_,1024) <= 0;  # EOF
	    syswrite(STDOUT,$_,length);
	}
	if (vec($rout,fileno(STDIN),1)) {
	    return if sysread(STDIN,$_,1024) <= 0; # EOF
	    syswrite(S,$_,length);
	}
    }
}
# send(str);
# str を送る
sub send {
    undef $Buffer;
    undef $Raw;
    while( $_ = shift ) {
	print if $Verbose > 2;
	syswrite(S,$_,length);
    }
}
# receive(s);
# s 秒入力が途絶えるまで待つ
sub receive {
    local($timeout) = shift;
    local($rout);
    while ((select($rout=$Rin,undef,undef,$timeout))[0]) {
	if (vec($rout,fileno(S),1)) {
	    &abort if sysread(S,$_,1024) <= 0;  # EOF
	    $Raw .= $_;
	    tr/\r\000\012\021\023\032/\n/d;
	    $Buffer .= $_;
	    print if $Verbose > 1;
	}
	if (vec($rout,fileno(STDIN),1)) {
	    &abort if sysread(STDIN,$_,1024) <= 0; # EOF
	    s/\n/\r/g;
	    syswrite(S,$_,length);
	}
    }
    $_ = $Buffer;
}
sub fhbits {
    local(@fhlist) = split(' ',$_[0]);
    local($bits);
    for (@fhlist) {
	vec($bits,fileno($_),1) = 1;
    }
    $bits;
}
sub abort {
    exit(1);
}