Skip to content

Commit d35c771

Browse files
committed
add trasparent proxy support
1 parent cdcf527 commit d35c771

File tree

7 files changed

+795
-31
lines changed

7 files changed

+795
-31
lines changed

configure

Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -640,6 +640,8 @@ PTHREAD_LIBS
640640
PTHREAD_CC
641641
acx_pthread_config
642642
LIBOBJS
643+
BUILD_REDIRECTOR_FALSE
644+
BUILD_REDIRECTOR_TRUE
643645
CPP
644646
OTOOL64
645647
OTOOL
@@ -12542,8 +12544,30 @@ fi
1254212544

1254312545

1254412546

12545-
# Checks for libraries.
12546-
# AC_SEARCH_LIBS([ev_io_start], [ev], [ ], AC_MSG_ERROR([libev not found.]))
12547+
# Checks for host.
12548+
12549+
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for what kind of host" >&5
12550+
$as_echo_n "checking for what kind of host... " >&6; }
12551+
case $host in
12552+
*-linux*)
12553+
os_support=linux
12554+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: Linux" >&5
12555+
$as_echo "Linux" >&6; }
12556+
;;
12557+
*)
12558+
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: transparent proxy does not support for $host" >&5
12559+
$as_echo "transparent proxy does not support for $host" >&6; }
12560+
;;
12561+
esac
12562+
12563+
if test "$os_support" = "linux"; then
12564+
BUILD_REDIRECTOR_TRUE=
12565+
BUILD_REDIRECTOR_FALSE='#'
12566+
else
12567+
BUILD_REDIRECTOR_TRUE='#'
12568+
BUILD_REDIRECTOR_FALSE=
12569+
fi
12570+
1254712571

1254812572
# Checks for header files.
1254912573
for ac_header in stdint.h inttypes.h arpa/inet.h fcntl.h langinfo.h locale.h netdb.h netinet/in.h stdlib.h string.h strings.h sys/socket.h unistd.h
@@ -14399,6 +14423,10 @@ if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then
1439914423
as_fn_error $? "conditional \"am__fastdepCC\" was never defined.
1440014424
Usually this means the macro was only invoked conditionally." "$LINENO" 5
1440114425
fi
14426+
if test -z "${BUILD_REDIRECTOR_TRUE}" && test -z "${BUILD_REDIRECTOR_FALSE}"; then
14427+
as_fn_error $? "conditional \"BUILD_REDIRECTOR\" was never defined.
14428+
Usually this means the macro was only invoked conditionally." "$LINENO" 5
14429+
fi
1440214430
1440314431
1440414432
: "${CONFIG_STATUS=./config.status}"

configure.ac

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,20 @@ AC_PROG_MAKE_SET
1818

1919
m4_include([libev/libev.m4])
2020

21-
# Checks for libraries.
22-
# AC_SEARCH_LIBS([ev_io_start], [ev], [ ], AC_MSG_ERROR([libev not found.]))
21+
# Checks for host.
22+
23+
AC_MSG_CHECKING(for what kind of host)
24+
case $host in
25+
*-linux*)
26+
os_support=linux
27+
AC_MSG_RESULT(Linux)
28+
;;
29+
*)
30+
AC_MSG_RESULT(transparent proxy does not support for $host)
31+
;;
32+
esac
33+
34+
AM_CONDITIONAL(BUILD_REDIRECTOR, test "$os_support" = "linux")
2335

2436
# Checks for header files.
2537
AC_CHECK_HEADERS([stdint.h inttypes.h arpa/inet.h fcntl.h langinfo.h locale.h netdb.h netinet/in.h stdlib.h string.h strings.h sys/socket.h unistd.h])

src/Makefile.am

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,17 @@ ss_server_SOURCES = utils.c jconf.c json.c \
66
rc4.c md5.c encrypt.c \
77
server.c
88
ss_local_LDADD = $(top_builddir)/libev/libev.la
9-
ss_local_LDADD += $(top_builddir)/libasyncns/libasyncns.la
109
ss_server_LDADD = $(top_builddir)/libev/libev.la
1110
ss_server_LDADD += $(top_builddir)/libasyncns/libasyncns.la
11+
12+
if BUILD_REDIRECTOR
13+
bin_PROGRAMS += ss-redir
14+
ss_redir_SOURCES = utils.c jconf.c json.c \
15+
rc4.c md5.c encrypt.c \
16+
redir.c
17+
ss_redir_LDADD = $(top_builddir)/libev/libev.la
18+
endif
19+
1220
AM_CFLAGS = -g -O2 -Wall -fno-strict-aliasing
1321
AM_LDFLAGS = -static
1422
AM_CFLAGS += -I$(top_builddir)/libev

src/Makefile.in

Lines changed: 26 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,8 @@ PRE_UNINSTALL = :
5050
POST_UNINSTALL = :
5151
build_triplet = @build@
5252
host_triplet = @host@
53-
bin_PROGRAMS = ss-local$(EXEEXT) ss-server$(EXEEXT)
53+
bin_PROGRAMS = ss-local$(EXEEXT) ss-server$(EXEEXT) $(am__EXEEXT_1)
54+
@BUILD_REDIRECTOR_TRUE@am__append_1 = ss-redir
5455
subdir = src
5556
DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \
5657
$(top_srcdir)/depcomp
@@ -66,13 +67,22 @@ mkinstalldirs = $(install_sh) -d
6667
CONFIG_HEADER = $(top_builddir)/config.h
6768
CONFIG_CLEAN_FILES =
6869
CONFIG_CLEAN_VPATH_FILES =
70+
@BUILD_REDIRECTOR_TRUE@am__EXEEXT_1 = ss-redir$(EXEEXT)
6971
am__installdirs = "$(DESTDIR)$(bindir)"
7072
PROGRAMS = $(bin_PROGRAMS)
7173
am_ss_local_OBJECTS = utils.$(OBJEXT) jconf.$(OBJEXT) json.$(OBJEXT) \
7274
rc4.$(OBJEXT) md5.$(OBJEXT) encrypt.$(OBJEXT) local.$(OBJEXT)
7375
ss_local_OBJECTS = $(am_ss_local_OBJECTS)
74-
ss_local_DEPENDENCIES = $(top_builddir)/libev/libev.la \
75-
$(top_builddir)/libasyncns/libasyncns.la
76+
ss_local_DEPENDENCIES = $(top_builddir)/libev/libev.la
77+
am__ss_redir_SOURCES_DIST = utils.c jconf.c json.c rc4.c md5.c \
78+
encrypt.c redir.c
79+
@BUILD_REDIRECTOR_TRUE@am_ss_redir_OBJECTS = utils.$(OBJEXT) \
80+
@BUILD_REDIRECTOR_TRUE@ jconf.$(OBJEXT) json.$(OBJEXT) \
81+
@BUILD_REDIRECTOR_TRUE@ rc4.$(OBJEXT) md5.$(OBJEXT) \
82+
@BUILD_REDIRECTOR_TRUE@ encrypt.$(OBJEXT) redir.$(OBJEXT)
83+
ss_redir_OBJECTS = $(am_ss_redir_OBJECTS)
84+
@BUILD_REDIRECTOR_TRUE@ss_redir_DEPENDENCIES = \
85+
@BUILD_REDIRECTOR_TRUE@ $(top_builddir)/libev/libev.la
7686
am_ss_server_OBJECTS = utils.$(OBJEXT) jconf.$(OBJEXT) json.$(OBJEXT) \
7787
rc4.$(OBJEXT) md5.$(OBJEXT) encrypt.$(OBJEXT) server.$(OBJEXT)
7888
ss_server_OBJECTS = $(am_ss_server_OBJECTS)
@@ -91,8 +101,9 @@ CCLD = $(CC)
91101
LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) \
92102
--mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) \
93103
$(LDFLAGS) -o $@
94-
SOURCES = $(ss_local_SOURCES) $(ss_server_SOURCES)
95-
DIST_SOURCES = $(ss_local_SOURCES) $(ss_server_SOURCES)
104+
SOURCES = $(ss_local_SOURCES) $(ss_redir_SOURCES) $(ss_server_SOURCES)
105+
DIST_SOURCES = $(ss_local_SOURCES) $(am__ss_redir_SOURCES_DIST) \
106+
$(ss_server_SOURCES)
96107
am__can_run_installinfo = \
97108
case $$AM_UPDATE_INFO_DIR in \
98109
n|no|NO) false;; \
@@ -226,10 +237,14 @@ ss_server_SOURCES = utils.c jconf.c json.c \
226237
rc4.c md5.c encrypt.c \
227238
server.c
228239

229-
ss_local_LDADD = $(top_builddir)/libev/libev.la \
230-
$(top_builddir)/libasyncns/libasyncns.la
240+
ss_local_LDADD = $(top_builddir)/libev/libev.la
231241
ss_server_LDADD = $(top_builddir)/libev/libev.la \
232242
$(top_builddir)/libasyncns/libasyncns.la
243+
@BUILD_REDIRECTOR_TRUE@ss_redir_SOURCES = utils.c jconf.c json.c \
244+
@BUILD_REDIRECTOR_TRUE@ rc4.c md5.c encrypt.c \
245+
@BUILD_REDIRECTOR_TRUE@ redir.c
246+
247+
@BUILD_REDIRECTOR_TRUE@ss_redir_LDADD = $(top_builddir)/libev/libev.la
233248
AM_CFLAGS = -g -O2 -Wall -fno-strict-aliasing -I$(top_builddir)/libev \
234249
-I$(top_builddir)/libasyncns
235250
AM_LDFLAGS = -static
@@ -316,6 +331,9 @@ clean-binPROGRAMS:
316331
ss-local$(EXEEXT): $(ss_local_OBJECTS) $(ss_local_DEPENDENCIES) $(EXTRA_ss_local_DEPENDENCIES)
317332
@rm -f ss-local$(EXEEXT)
318333
$(LINK) $(ss_local_OBJECTS) $(ss_local_LDADD) $(LIBS)
334+
ss-redir$(EXEEXT): $(ss_redir_OBJECTS) $(ss_redir_DEPENDENCIES) $(EXTRA_ss_redir_DEPENDENCIES)
335+
@rm -f ss-redir$(EXEEXT)
336+
$(LINK) $(ss_redir_OBJECTS) $(ss_redir_LDADD) $(LIBS)
319337
ss-server$(EXEEXT): $(ss_server_OBJECTS) $(ss_server_DEPENDENCIES) $(EXTRA_ss_server_DEPENDENCIES)
320338
@rm -f ss-server$(EXEEXT)
321339
$(LINK) $(ss_server_OBJECTS) $(ss_server_LDADD) $(LIBS)
@@ -332,6 +350,7 @@ distclean-compile:
332350
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/local.Po@am__quote@
333351
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/md5.Po@am__quote@
334352
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rc4.Po@am__quote@
353+
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/redir.Po@am__quote@
335354
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/server.Po@am__quote@
336355
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@
337356

src/local.c

Lines changed: 18 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -99,18 +99,11 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) {
9999
return;
100100
}
101101

102-
char *buf = remote->buf;
103-
int *buf_len = &remote->buf_len;
104-
if (server->stage != 5) {
105-
buf = server->buf;
106-
buf_len = &server->buf_len;
107-
}
108-
109-
ssize_t r = recv(server->fd, buf, BUF_SIZE, 0);
102+
ssize_t r = recv(server->fd, remote->buf, BUF_SIZE, 0);
110103

111104
if (r == 0) {
112105
// connection closed
113-
*buf_len = 0;
106+
remote->buf_len = 0;
114107
close_and_free_server(EV_A_ server);
115108
if (remote != NULL) {
116109
ev_io_start(EV_A_ &remote->send_ctx->io);
@@ -162,7 +155,7 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) {
162155
server->stage = 1;
163156
return;
164157
} else if (server->stage == 1) {
165-
struct socks5_request *request = (struct socks5_request *)server->buf;
158+
struct socks5_request *request = (struct socks5_request *)remote->buf;
166159

167160
if (request->cmd != 1) {
168161
LOGE("unsupported cmd: %d", request->cmd);
@@ -186,24 +179,24 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) {
186179
if (request->atyp == 1) {
187180
// IP V4
188181
size_t in_addr_len = sizeof(struct in_addr);
189-
memcpy(addr_to_send + addr_len, server->buf + 4, in_addr_len + 2);
182+
memcpy(addr_to_send + addr_len, remote->buf + 4, in_addr_len + 2);
190183
addr_len += in_addr_len + 2;
191184

192185
} else if (request->atyp == 3) {
193186
// Domain name
194-
uint8_t name_len = *(uint8_t *)(server->buf + 4);
187+
uint8_t name_len = *(uint8_t *)(remote->buf + 4);
195188
addr_to_send[addr_len++] = name_len;
196-
memcpy(addr_to_send + addr_len, server->buf + 4 + 1, name_len);
189+
memcpy(addr_to_send + addr_len, remote->buf + 4 + 1, name_len);
197190
addr_len += name_len;
198191

199192
// get port
200-
addr_to_send[addr_len++] = *(uint8_t *)(server->buf + 4 + 1 + name_len);
201-
addr_to_send[addr_len++] = *(uint8_t *)(server->buf + 4 + 1 + name_len + 1);
193+
addr_to_send[addr_len++] = *(uint8_t *)(remote->buf + 4 + 1 + name_len);
194+
addr_to_send[addr_len++] = *(uint8_t *)(remote->buf + 4 + 1 + name_len + 1);
202195

203196
} else if (request->atyp == 4) {
204197
// IP V6
205198
size_t in6_addr_len = sizeof(struct in6_addr);
206-
memcpy(addr_to_send + addr_len, server->buf + 4, in6_addr_len + 2);
199+
memcpy(addr_to_send + addr_len, remote->buf + 4, in6_addr_len + 2);
207200
addr_len += in6_addr_len + 2;
208201

209202
} else {
@@ -214,7 +207,13 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) {
214207
}
215208

216209
encrypt_ctx(addr_to_send, addr_len, server->e_ctx);
217-
send(remote->fd, addr_to_send, addr_len, 0);
210+
int s = send(remote->fd, addr_to_send, addr_len, 0);
211+
if (s < addr_len) {
212+
LOGE("failed to send remote addr.");
213+
close_and_free_remote(EV_A_ remote);
214+
close_and_free_server(EV_A_ server);
215+
return;
216+
}
218217

219218
// Fake reply
220219
struct socks5_response response;
@@ -230,9 +229,9 @@ static void server_recv_cb (EV_P_ ev_io *w, int revents) {
230229
memset(server->buf + 4, 0, sizeof(struct in_addr) + sizeof(uint16_t));
231230

232231
int reply_size = 4 + sizeof(struct in_addr) + sizeof(uint16_t);
233-
int s = send(server->fd, server->buf, reply_size, 0);
232+
s = send(server->fd, server->buf, reply_size, 0);
234233
if (s < reply_size) {
235-
LOGE("header not complete sent");
234+
LOGE("failed to send fake reply.");
236235
close_and_free_remote(EV_A_ remote);
237236
close_and_free_server(EV_A_ server);
238237
return;

0 commit comments

Comments
 (0)