diff --git a/opts.c b/opts.c index f8273d0..73af2c0 100644 --- a/opts.c +++ b/opts.c @@ -333,23 +333,7 @@ proxyspec_parse(int *argc, char **argv[], const char *natengine) break; case 1: /* listenaddr */ - addr = **argv; - - // @todo Make this a command line or conf file option? - // @todo Need IPv6? - int rv = sys_sockaddr_parse(&spec->parent_dst_addr, - &spec->parent_dst_addrlen, - "127.0.0.1", "8080", AF_INET, 0); - if (rv == -1) { - exit(EXIT_FAILURE); - } - rv = sys_sockaddr_parse(&spec->child_src_addr, - &spec->child_src_addrlen, - "127.0.0.1", "0", AF_INET, 0); - if (rv == -1) { - exit(EXIT_FAILURE); - } - + addr = **argv; state++; break; case 2: @@ -383,6 +367,27 @@ proxyspec_parse(int *argc, char **argv[], const char *natengine) state++; break; case 3: + /* UTM service port is mandatory */ + // The UTM port is set/used in pf and UTM service config. + // @todo Make this a conf file option? + // @todo Need IPv6? + if (strstr(**argv, "up:")) { + af = sys_sockaddr_parse(&spec->parent_dst_addr, + &spec->parent_dst_addrlen, + "127.0.0.1", **argv+3, AF_INET, EVUTIL_AI_PASSIVE); + if (af == -1) { + exit(EXIT_FAILURE); + } + af = sys_sockaddr_parse(&spec->child_src_addr, + &spec->child_src_addrlen, + "127.0.0.1", "0", AF_INET, EVUTIL_AI_PASSIVE); + if (af == -1) { + exit(EXIT_FAILURE); + } + state++; + } + break; + case 4: /* [ natengine | dstaddr ] */ if (!strcmp(**argv, "tcp") || !strcmp(**argv, "ssl") || @@ -404,7 +409,7 @@ proxyspec_parse(int *argc, char **argv[], const char *natengine) "\n"); exit(EXIT_FAILURE); } - state = 5; + state = 6; } else if (nat_exist(**argv)) { /* natengine */ @@ -425,7 +430,7 @@ proxyspec_parse(int *argc, char **argv[], const char *natengine) state++; } break; - case 4: + case 5: /* dstport */ af = sys_sockaddr_parse(&spec->connect_addr, &spec->connect_addrlen, @@ -435,7 +440,7 @@ proxyspec_parse(int *argc, char **argv[], const char *natengine) } state = 0; break; - case 5: + case 6: /* SNI dstport */ spec->sni_port = atoi(**argv); if (!spec->sni_port) { @@ -449,7 +454,7 @@ proxyspec_parse(int *argc, char **argv[], const char *natengine) } (*argv)++; } - if (state != 0 && state != 3) { + if (state != 0 && state != 4) { fprintf(stderr, "Incomplete proxyspec!\n"); exit(EXIT_FAILURE); } diff --git a/pxyconn.c b/pxyconn.c index dfd6c25..7dd6068 100644 --- a/pxyconn.c +++ b/pxyconn.c @@ -2120,9 +2120,9 @@ pxy_bev_readcb(struct bufferevent *bev, void *arg) free(header_head); free(header_tail); } else { - log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>>>>,,,,,,,,,,,,,,,,,,,,,,, pxy_bev_readcb: No CRLF in packet\n"); - packet_size-= strlen(ctx->child_addr_str) + 2 + 1; - packet_size++; + log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>,,,,,,,,,,,,,,,,,,,,,,, pxy_bev_readcb: No CRLF in packet\n"); + // +2 is for \r\n + packet_size-= strlen(ctx->child_addr_str) + 2; } // Decrement packet_size to avoid copying the null termination @@ -2195,18 +2195,6 @@ pxy_bev_readcb_child(struct bufferevent *bev, void *arg) } if (bev == ctx->src.bev) { - struct sockaddr_in peeraddr; - socklen_t peeraddrlen = sizeof(peeraddr); - getpeername(ctx->fd, (struct sockaddr *)&peeraddr, &peeraddrlen); - - char peer[INET_ADDRSTRLEN]; - if (!inet_ntop(AF_INET, &peeraddr.sin_addr, peer, INET_ADDRSTRLEN)) { - pxy_conn_free(parent); - return; - } - - log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>.................................................................................... pxy_bev_readcb_child: PEER [%s]:%d <<<<< fd=%d, parent fd=%d\n", peer, (int)ntohs(peeraddr.sin_port), ctx->fd, pfd); - /* request header munging */ if (parent->spec->http) { if (!ctx->seen_req_header) { @@ -2217,13 +2205,6 @@ pxy_bev_readcb_child(struct bufferevent *bev, void *arg) evbuffer_add_buffer(outbuf, inbuf); } } else { - struct evbuffer_ptr ebp = evbuffer_search(inbuf, SSLPROXY_ADDR_KEY, SSLPROXY_ADDR_KEY_LEN, NULL); - if (ebp.pos != -1) { - log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>....................... pxy_bev_readcb_child: evbuffer_search FOUND SSLproxy-Addr at %ld\n", ebp.pos); - } else { - log_dbg_level_printf(LOG_DBG_MODE_FINE, ">>>>>....................... pxy_bev_readcb_child: evbuffer_search FAILED\n"); - } - size_t packet_size = evbuffer_get_length(inbuf); // ATTENTION: +1 is for null termination char *packet = malloc(packet_size + 1); @@ -2233,8 +2214,6 @@ pxy_bev_readcb_child(struct bufferevent *bev, void *arg) return; } - log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>....................... pxy_bev_readcb_child: packet_size\n"); - if (packet_size > 0) { int bytes_read = evbuffer_remove(inbuf, packet, packet_size); if (bytes_read < 0) { @@ -2255,14 +2234,9 @@ pxy_bev_readcb_child(struct bufferevent *bev, void *arg) char *header_tail = strdup(pos2 + 2); int header_tail_len = strlen(header_tail); - log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>....................... pxy_bev_readcb_child: REMOVED SSLproxy-Addr, packet_size old=%lu, new=%d <<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n", + log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>....................... pxy_bev_readcb_child: packet_size old=%lu, new=%d <<<<<<<<<<<<<<<<<<<<<<<<<<<<< REMOVED SSLproxy-Addr\n", packet_size, header_head_len + header_tail_len); - log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>....................... pxy_bev_readcb_child: header_head (size = %d):\n%s\n", - header_head_len, header_head); - log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>....................... pxy_bev_readcb_child: header_tail (size = %d):\n%s\n", - header_tail_len, header_tail); - // ATTENTION: Do not add 1 to packet_size for null termination, do that in snprintf(), // otherwise we get an extra byte in the outbuf packet_size = header_head_len + header_tail_len; @@ -2274,8 +2248,6 @@ pxy_bev_readcb_child(struct bufferevent *bev, void *arg) free(header_head); } - log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>>....................... pxy_bev_readcb_child: bufferevent_get_output\n"); - int add_result = evbuffer_add(outbuf, packet, packet_size); if (add_result < 0) { log_err_printf("ERROR: evbuffer_add failed\n"); @@ -2364,7 +2336,9 @@ pxy_conn_connect_child(pxy_conn_child_ctx_t *ctx) parent->evbase, ctx->dst.bev, ctx->dst.ssl, BUFFEREVENT_SSL_ACCEPTING, BEV_OPT_DEFER_CALLBACKS); - bufferevent_setcb(ctx->dst.bev, pxy_bev_readcb_child, pxy_bev_writecb_child, pxy_bev_eventcb_child, ctx); + if (ctx->dst.bev) { + bufferevent_setcb(ctx->dst.bev, pxy_bev_readcb_child, pxy_bev_writecb_child, pxy_bev_eventcb_child, ctx); + } } else { log_dbg_level_printf(LOG_DBG_MODE_FINEST, ">>>>> pxy_conn_connect_child: SETUP dst.bev fd=%d\n", ctx->fd); ctx->dst.bev = pxy_bufferevent_setup_child(ctx, -1, ctx->dst.ssl);