ログイン
編集不可のページディスカッション情報添付ファイル
ytoku/daily-record/2011-10-25

MMA

ssl-forwardの接続元アドレス

riseに設置してあるHTTPSの透過プロキシssl-forwardは、pfと協調して外部の443番ポートへの通信を透過的にHTTPプロキシサーバに転送するプログラムである。 今まで接続元アドレスを指定していなかったためmma-gw-outではないアドレスで接続してしまっていた。

connect.cに丸投げしていたのだけれど、connect.cには接続元アドレスを指定する機能がない。 netcatであれば-sを与えることで接続元アドレスを指定できるのだが、こちらはHTTPプロキシを越える機能が無い。 一旦はncを用いて実装を試みたが、やはりssl-forward側で入出力双方向についてブロックせずに流し込んでやる必要があるようで 実相が面倒であった。

そこで方針を変えてconnect.cを改造することにした。netcat (/usr/src/contrib/netcat/netcat.c)を参考にした。

 568                 /* Bind to a local port or source address if specified. */
 569                 if (sflag || pflag) {
 570                         struct addrinfo ahints, *ares;
 571 
 572                         /* try IP_BINDANY, but don't insist */
 573                         setsockopt(s, IPPROTO_IP, IP_BINDANY, &on, sizeof(on));
 574                         memset(&ahints, 0, sizeof(struct addrinfo));
 575                         ahints.ai_family = res0->ai_family;
 576                         ahints.ai_socktype = uflag ? SOCK_DGRAM : SOCK_STREAM;
 577                         ahints.ai_protocol = uflag ? IPPROTO_UDP : IPPROTO_TCP;
 578                         ahints.ai_flags = AI_PASSIVE;
 579                         if ((error = getaddrinfo(sflag, pflag, &ahints, &ares)))
 580                                 errx(1, "getaddrinfo: %s", gai_strerror(error));
 581 
 582                         if (bind(s, (struct sockaddr *)ares->ai_addr,
 583                             ares->ai_addrlen) < 0)
 584                                 errx(1, "bind failed: %s", strerror(errno));
 585                         freeaddrinfo(ares);
 586                 }

なるほど、listenするときと同様にbindすればいいのか。

そういうわけで、connect.cの接続部分を改造した。

   1 diff --git a/connect.c b/connect.c
   2 index f574711..5d57868 100644
   3 --- a/connect.c
   4 +++ b/connect.c
   5 @@ -301,6 +301,7 @@ const char *dotdigits = "0123456789.";
   6  
   7  /* options */
   8  int f_debug = 0;
   9 +char *source_addr = NULL;                       /* option 'A' */
  10  
  11  /* report flag to hide secure information */
  12  int f_report = 1;
  13 @@ -1608,6 +1609,16 @@ getarg( int argc, char **argv )
  14                  }
  15                  break;
  16  
  17 +            case 'A':
  18 +                if ( 1 < argc ) {
  19 +                    argv++, argc--;
  20 +                    source_addr = *argv;
  21 +                } else {
  22 +                    error("option '-%c' needs argument.\n", *ptr);
  23 +                    err++;
  24 +                }
  25 +                break;
  26 +
  27              case 'V':                           /* print version */
  28                  fprintf(stderr, "%s\nVersion %s\n", progdesc, revstr);
  29                  exit(0);
  30 @@ -1784,6 +1795,23 @@ open_connection( const char *host, u_short port )
  31  
  32      debug("connecting to %s:%u\n", inet_ntoa(saddr.sin_addr), port);
  33      s = socket( AF_INET, SOCK_STREAM, 0 );
  34 +
  35 +    if ( source_addr ) {
  36 +        int error;
  37 +        struct addrinfo hints, *res;
  38 +        memset(&hints, 0, sizeof(hints));
  39 +        hints.ai_family = AF_INET;
  40 +        hints.ai_socktype = SOCK_STREAM;
  41 +        hints.ai_protocol = IPPROTO_TCP;
  42 +        hints.ai_flags = AI_PASSIVE;
  43 +        error = getaddrinfo(source_addr, NULL, &hints, &res);
  44 +        if ( error )
  45 +            debug( "getaddrinfo() failed: %s\n", strerror(error));
  46 +        if ( bind( s, (struct sockaddr *)res->ai_addr, res->ai_addrlen ) < 0)
  47 +            debug( "bind() failed: %s\n", strerror(errno));
  48 +        freeaddrinfo(res);
  49 +    }
  50 +
  51      if ( connect( s, (struct sockaddr *)&saddr, sizeof(saddr))
  52           == SOCKET_ERROR) {
  53          debug( "connect() failed.\n");

あとはssl-forward側から接続元アドレスを渡してやるように書き変えを行って動作を確認した。

fusefs on FreeBSD

新端末イメージにfusefsとsshfsをインストールした。

$ sudo portmaster sysutils/fusefs-sshfs

インストール後の指示に従って起動時にロードされるようにして: /etc/rc.conf

fusefs_enable="YES"

ユーザ権限でマウントできるようにした: /etc/sysctl.conf

vfs.usermount=1

ytoku/daily-record/2011-10-25 (最終更新日時 2011-10-25 21:38:54 更新者 ytoku)