⇤ ← 2011-10-25 21:26:58時点のリビジョン1
サイズ: 4189
コメント:
|
サイズ: 4324
コメント:
|
削除された箇所はこのように表示されます。 | 追加された箇所はこのように表示されます。 |
行 2: | 行 2: |
riseに設置してあるHTTPSの透過プロキシssl-forwardは、今まで接続元アドレスを指定していなかったため mma-gw-outではないアドレスで接続してしまっていた。 |
riseに設置してあるHTTPSの透過プロキシssl-forwardは、pfと協調して外部の443番ポートへの通信を透過的にHTTPプロキシサーバに転送するプログラムである。 今まで接続元アドレスを指定していなかったためmma-gw-outではないアドレスで接続してしまっていた。 |
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側から接続元アドレスを渡してやるように書き変えを行って動作を確認した。