From: himazu@isl.mei.co.jp (IMAZU Hideyo)
Real-Date: Mon, 6 Dec 93 22:47:24 +0900
Subject: [infotalk,00571] firewall and SOCKS
Message-Id: <9312061347.AA04619@aria.isl.mei.co.jp>


松下電器の今津です。

御多分に洩れずインターネットに直接パケットを送れるホストは2台だけ
(Firewalls メーリングリスト(firewalls@greatcircle.com)では要塞ホスト
(bastion host)と呼ばれてます)にしています。

うちでも SOCKS を結構使ってます。
1つのデーモンで telnet, ftp, gopher なんでもいけるのがいいですね。
クライアントの変更が必要ですが、割と簡単です。telnet, gopher なら、
connect() を Rconnect() に変更して SOCKS のライブラリーをリンクするだけ
です。
SOCKS版 ftp では ftp.uu.net など幾つかのマシンにはちゃんと FTP できない
んですが、その理由はちゃんと追っていません。

FTP が自分のマシンからできるようになると、archie もしたいわけですが、
archie は UDP なんで SOCKS は役に立たないんですよね。そこで、

#!/bin/sh
PATH=/usr/local/bin:/usr/ucb:/usr/bin
IFS="$IFS
"
exec >&- >&0
read i
archie $i

こんなやつを要塞ホストの inetd から起動されるようにして、

-----ここから
#!/usr/local/bin/perl

require 'sys/socket.ph';

$servername = 'bastionhost';
$PORT = 2010;
$sockaddr='S n a4 x8';

dump QUICKSTART if $ARGV[0] eq '-dump';
QUICKSTART:

@ARGV > 0 || die "args expected.\n";

chop($localname = `hostname`);
$localaddr = (gethostbyname($localname))[4];
$serveraddr = (gethostbyname($servername))[4];
$this = pack($sockaddr, &AF_INET, 0, $localaddr);
$that = pack($sockaddr, &AF_INET, $PORT, $serveraddr);

socket(SERVER, &AF_INET, &SOCK_STREAM, &PF_UNSPEC) || die "socket: $!";
bind(SERVER, $this) || die "bind: $!";
connect(SERVER, $that) || die "connect: $!";

select(SERVER);
$| = 1;
select(STDOUT);
$| = 1;

print SERVER join(' ', @ARGV), "\n";
print <SERVER>;
shutdown(SERVER, 2);
exit(0);
-----ここまで

こんなクライアントを使ってます。
最近、UDP を中継するデーモン

ftp.wang.com:/pub/fitz/udprelay-0.2.tar.Z

なんてのもあるようなので、これを使った方がいいのかも知れませんが。
--
今津 英世(いまづ ひでよ)	松下電器 情報システム研究所