mirror of
https://github.com/shadowsocks/shadowsocks-libev.git
synced 2026-10-30 13:13:44 +00:00
Merge pull request #308 from shadowsocks/tproxy-int
Add TPROXY support for redir mode
This commit is contained in:
@@ -11,7 +11,7 @@ It is a port of [shadowsocks](https://github.com/shadowsocks/shadowsocks)
|
||||
created by [@clowwindy](https://github.com/clowwindy) maintained by
|
||||
[@madeye](https://github.com/madeye) and [@linusyang](https://github.com/linusyang).
|
||||
|
||||
Current version: 2.1.4 | [Changelog](Changes)
|
||||
Current version: 2.2.0 | [Changelog](Changes)
|
||||
|
||||
Travis CI: [](https://travis-ci.org/shadowsocks/shadowsocks-libev) | Jenkins Matrix: [](https://jenkins.shadowvpn.org/job/Shadowsocks-libev/)
|
||||
|
||||
@@ -273,6 +273,7 @@ The latest shadowsocks-libev has provided a *redir* mode. You can configure your
|
||||
|
||||
# Create new chain
|
||||
root@Wrt:~# iptables -t nat -N SHADOWSOCKS
|
||||
root@Wrt:~# iptables -t mangle -N SHADOWSOCKS
|
||||
|
||||
# Ignore your shadowsocks server's addresses
|
||||
# It's very IMPORTANT, just be careful.
|
||||
@@ -292,12 +293,18 @@ The latest shadowsocks-libev has provided a *redir* mode. You can configure your
|
||||
|
||||
# Anything else should be redirected to shadowsocks's local port
|
||||
root@Wrt:~# iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345
|
||||
|
||||
# Add any UDP rules
|
||||
root@Wrt:~# ip rule add fwmark 0x01/0x01 table 100
|
||||
root@Wrt:~# ip route add local 0.0.0.0/0 dev lo table 100
|
||||
root@Wrt:~# iptables -t mangle -A SHADOWSOCKS -p udp --dport 53 -j TPROXY --on-port 12345 --tproxy-mark 0x01/0x01
|
||||
|
||||
# Apply the rules
|
||||
root@Wrt:~# iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS
|
||||
|
||||
root@Wrt:~# iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
|
||||
root@Wrt:~# iptables -t mangle -A PREROUTING -j SHADOWSOCKS
|
||||
|
||||
# Start the shadowsocks-redir
|
||||
root@Wrt:~# ss-redir -c /etc/config/shadowsocks.json -f /var/run/shadowsocks.pid
|
||||
root@Wrt:~# ss-redir -u -c /etc/config/shadowsocks.json -f /var/run/shadowsocks.pid
|
||||
|
||||
## Security Tips
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
#! /bin/sh
|
||||
# Guess values for system-dependent variables and create Makefiles.
|
||||
# Generated by GNU Autoconf 2.69 for shadowsocks-libev 2.1.4.
|
||||
# Generated by GNU Autoconf 2.69 for shadowsocks-libev 2.2.0.
|
||||
#
|
||||
# Report bugs to <max.c.lv@gmail.com>.
|
||||
#
|
||||
@@ -590,8 +590,8 @@ MAKEFLAGS=
|
||||
# Identity of this package.
|
||||
PACKAGE_NAME='shadowsocks-libev'
|
||||
PACKAGE_TARNAME='shadowsocks-libev'
|
||||
PACKAGE_VERSION='2.1.4'
|
||||
PACKAGE_STRING='shadowsocks-libev 2.1.4'
|
||||
PACKAGE_VERSION='2.2.0'
|
||||
PACKAGE_STRING='shadowsocks-libev 2.2.0'
|
||||
PACKAGE_BUGREPORT='max.c.lv@gmail.com'
|
||||
PACKAGE_URL=''
|
||||
|
||||
@@ -1336,7 +1336,7 @@ if test "$ac_init_help" = "long"; then
|
||||
# Omit some internal or obsolete options to make the list less imposing.
|
||||
# This message is too long to be a string in the A/UX 3.1 sh.
|
||||
cat <<_ACEOF
|
||||
\`configure' configures shadowsocks-libev 2.1.4 to adapt to many kinds of systems.
|
||||
\`configure' configures shadowsocks-libev 2.2.0 to adapt to many kinds of systems.
|
||||
|
||||
Usage: $0 [OPTION]... [VAR=VALUE]...
|
||||
|
||||
@@ -1407,7 +1407,7 @@ fi
|
||||
|
||||
if test -n "$ac_init_help"; then
|
||||
case $ac_init_help in
|
||||
short | recursive ) echo "Configuration of shadowsocks-libev 2.1.4:";;
|
||||
short | recursive ) echo "Configuration of shadowsocks-libev 2.2.0:";;
|
||||
esac
|
||||
cat <<\_ACEOF
|
||||
|
||||
@@ -1528,7 +1528,7 @@ fi
|
||||
test -n "$ac_init_help" && exit $ac_status
|
||||
if $ac_init_version; then
|
||||
cat <<\_ACEOF
|
||||
shadowsocks-libev configure 2.1.4
|
||||
shadowsocks-libev configure 2.2.0
|
||||
generated by GNU Autoconf 2.69
|
||||
|
||||
Copyright (C) 2012 Free Software Foundation, Inc.
|
||||
@@ -2051,7 +2051,7 @@ cat >config.log <<_ACEOF
|
||||
This file contains any messages produced by compilers while
|
||||
running configure, to aid debugging if configure makes a mistake.
|
||||
|
||||
It was created by shadowsocks-libev $as_me 2.1.4, which was
|
||||
It was created by shadowsocks-libev $as_me 2.2.0, which was
|
||||
generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
$ $0 $@
|
||||
@@ -2872,7 +2872,7 @@ fi
|
||||
|
||||
# Define the identity of the package.
|
||||
PACKAGE='shadowsocks-libev'
|
||||
VERSION='2.1.4'
|
||||
VERSION='2.2.0'
|
||||
|
||||
|
||||
cat >>confdefs.h <<_ACEOF
|
||||
@@ -15636,7 +15636,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1
|
||||
# report actual input values of CONFIG_FILES etc. instead of their
|
||||
# values after options handling.
|
||||
ac_log="
|
||||
This file was extended by shadowsocks-libev $as_me 2.1.4, which was
|
||||
This file was extended by shadowsocks-libev $as_me 2.2.0, which was
|
||||
generated by GNU Autoconf 2.69. Invocation command line was
|
||||
|
||||
CONFIG_FILES = $CONFIG_FILES
|
||||
@@ -15702,7 +15702,7 @@ _ACEOF
|
||||
cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1
|
||||
ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`"
|
||||
ac_cs_version="\\
|
||||
shadowsocks-libev config.status 2.1.4
|
||||
shadowsocks-libev config.status 2.2.0
|
||||
configured by $0, generated by GNU Autoconf 2.69,
|
||||
with options \\"\$ac_cs_config\\"
|
||||
|
||||
|
||||
+1
-1
@@ -2,7 +2,7 @@ dnl -*- Autoconf -*-
|
||||
dnl Process this file with autoconf to produce a configure script.
|
||||
|
||||
AC_PREREQ([2.67])
|
||||
AC_INIT([shadowsocks-libev], [2.1.4], [max.c.lv@gmail.com])
|
||||
AC_INIT([shadowsocks-libev], [2.2.0], [max.c.lv@gmail.com])
|
||||
AC_CONFIG_SRCDIR([src/encrypt.c])
|
||||
AC_CONFIG_HEADERS([config.h])
|
||||
AC_CONFIG_AUX_DIR(auto)
|
||||
|
||||
Vendored
+6
@@ -1,3 +1,9 @@
|
||||
shadowsocks-libev (2.2.0-1) unstable; urgency=low
|
||||
|
||||
* Add TPROXY support in redir mode.
|
||||
|
||||
-- Max Lv <max.c.lv@gmail.com> Mon, 04 May 2015 02:44:17 -0300
|
||||
|
||||
shadowsocks-libev (2.1.4-1) unstable; urgency=low
|
||||
|
||||
* Fix a bug of server mode ACL.
|
||||
|
||||
+8
-2
@@ -124,11 +124,17 @@ Enable ACL (Access Control List).
|
||||
# Anything else should be redirected to shadowsocks's local port
|
||||
root@Wrt:~# iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345
|
||||
|
||||
# Add any UDP rules
|
||||
root@Wrt:~# ip rule add fwmark 0x01/0x01 table 100
|
||||
root@Wrt:~# ip route add local 0.0.0.0/0 dev lo table 100
|
||||
root@Wrt:~# iptables -t mangle -A SHADOWSOCKS -p udp --dport 53 -j TPROXY --on-port 12345 --tproxy-mark 0x01/0x01
|
||||
|
||||
# Apply the rules
|
||||
root@Wrt:~# iptables -t nat -A OUTPUT -p tcp -j SHADOWSOCKS
|
||||
root@Wrt:~# iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS
|
||||
root@Wrt:~# iptables -t mangle -A PREROUTING -j SHADOWSOCKS
|
||||
|
||||
# Start the shadowsocks-redir
|
||||
root@Wrt:~# ss-redir -c /etc/config/shadowsocks.json -f /var/run/shadowsocks.pid
|
||||
root@Wrt:~# ss-redir -u -c /etc/config/shadowsocks.json -f /var/run/shadowsocks.pid
|
||||
|
||||
.SH SEE ALSO
|
||||
.BR iptables (8),
|
||||
|
||||
@@ -40,6 +40,7 @@ ss_tunnel_SOURCES = utils.c \
|
||||
tunnel.c
|
||||
|
||||
ss_server_SOURCES = utils.c \
|
||||
netutils.c \
|
||||
jconf.c \
|
||||
json.c \
|
||||
encrypt.c \
|
||||
@@ -72,7 +73,10 @@ ss_redir_SOURCES = utils.c \
|
||||
json.c \
|
||||
encrypt.c \
|
||||
netutils.c \
|
||||
cache.c \
|
||||
udprelay.c \
|
||||
redir.c
|
||||
ss_redir_CFLAGS = $(AM_CFLAGS) -DUDPRELAY_REDIR -DUDPRELAY_LOCAL
|
||||
ss_redir_LDADD = $(SS_COMMON_LIBS)
|
||||
ss_redir_LDADD += $(top_builddir)/libudns/libudns.la
|
||||
endif
|
||||
|
||||
+157
-16
@@ -150,19 +150,27 @@ ss_local_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(ss_local_CFLAGS) \
|
||||
$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||
am__ss_redir_SOURCES_DIST = utils.c jconf.c json.c encrypt.c \
|
||||
netutils.c redir.c
|
||||
@BUILD_REDIRECTOR_TRUE@am_ss_redir_OBJECTS = utils.$(OBJEXT) \
|
||||
@BUILD_REDIRECTOR_TRUE@ jconf.$(OBJEXT) json.$(OBJEXT) \
|
||||
@BUILD_REDIRECTOR_TRUE@ encrypt.$(OBJEXT) netutils.$(OBJEXT) \
|
||||
@BUILD_REDIRECTOR_TRUE@ redir.$(OBJEXT)
|
||||
netutils.c cache.c udprelay.c redir.c
|
||||
@BUILD_REDIRECTOR_TRUE@am_ss_redir_OBJECTS = ss_redir-utils.$(OBJEXT) \
|
||||
@BUILD_REDIRECTOR_TRUE@ ss_redir-jconf.$(OBJEXT) \
|
||||
@BUILD_REDIRECTOR_TRUE@ ss_redir-json.$(OBJEXT) \
|
||||
@BUILD_REDIRECTOR_TRUE@ ss_redir-encrypt.$(OBJEXT) \
|
||||
@BUILD_REDIRECTOR_TRUE@ ss_redir-netutils.$(OBJEXT) \
|
||||
@BUILD_REDIRECTOR_TRUE@ ss_redir-cache.$(OBJEXT) \
|
||||
@BUILD_REDIRECTOR_TRUE@ ss_redir-udprelay.$(OBJEXT) \
|
||||
@BUILD_REDIRECTOR_TRUE@ ss_redir-redir.$(OBJEXT)
|
||||
ss_redir_OBJECTS = $(am_ss_redir_OBJECTS)
|
||||
@BUILD_REDIRECTOR_TRUE@ss_redir_DEPENDENCIES = $(am__DEPENDENCIES_2) \
|
||||
@BUILD_REDIRECTOR_TRUE@ $(top_builddir)/libudns/libudns.la
|
||||
ss_redir_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \
|
||||
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(ss_redir_CFLAGS) \
|
||||
$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@
|
||||
am_ss_server_OBJECTS = ss_server-utils.$(OBJEXT) \
|
||||
ss_server-jconf.$(OBJEXT) ss_server-json.$(OBJEXT) \
|
||||
ss_server-encrypt.$(OBJEXT) ss_server-udprelay.$(OBJEXT) \
|
||||
ss_server-cache.$(OBJEXT) ss_server-acl.$(OBJEXT) \
|
||||
ss_server-resolv.$(OBJEXT) ss_server-server.$(OBJEXT)
|
||||
ss_server-netutils.$(OBJEXT) ss_server-jconf.$(OBJEXT) \
|
||||
ss_server-json.$(OBJEXT) ss_server-encrypt.$(OBJEXT) \
|
||||
ss_server-udprelay.$(OBJEXT) ss_server-cache.$(OBJEXT) \
|
||||
ss_server-acl.$(OBJEXT) ss_server-resolv.$(OBJEXT) \
|
||||
ss_server-server.$(OBJEXT)
|
||||
ss_server_OBJECTS = $(am_ss_server_OBJECTS)
|
||||
ss_server_DEPENDENCIES = $(am__DEPENDENCIES_2) \
|
||||
$(top_builddir)/libudns/libudns.la
|
||||
@@ -363,6 +371,7 @@ ss_local_SOURCES = utils.c jconf.c json.c encrypt.c udprelay.c cache.c \
|
||||
ss_tunnel_SOURCES = utils.c jconf.c json.c encrypt.c udprelay.c \
|
||||
cache.c netutils.c tunnel.c $(am__append_3)
|
||||
ss_server_SOURCES = utils.c \
|
||||
netutils.c \
|
||||
jconf.c \
|
||||
json.c \
|
||||
encrypt.c \
|
||||
@@ -383,8 +392,11 @@ ss_server_CFLAGS = $(AM_CFLAGS) -DUDPRELAY_REMOTE
|
||||
@BUILD_REDIRECTOR_TRUE@ json.c \
|
||||
@BUILD_REDIRECTOR_TRUE@ encrypt.c \
|
||||
@BUILD_REDIRECTOR_TRUE@ netutils.c \
|
||||
@BUILD_REDIRECTOR_TRUE@ cache.c \
|
||||
@BUILD_REDIRECTOR_TRUE@ udprelay.c \
|
||||
@BUILD_REDIRECTOR_TRUE@ redir.c
|
||||
|
||||
@BUILD_REDIRECTOR_TRUE@ss_redir_CFLAGS = $(AM_CFLAGS) -DUDPRELAY_REDIR -DUDPRELAY_LOCAL
|
||||
@BUILD_REDIRECTOR_TRUE@ss_redir_LDADD = $(SS_COMMON_LIBS) \
|
||||
@BUILD_REDIRECTOR_TRUE@ $(top_builddir)/libudns/libudns.la
|
||||
lib_LTLIBRARIES = libshadowsocks.la
|
||||
@@ -512,7 +524,7 @@ ss-local$(EXEEXT): $(ss_local_OBJECTS) $(ss_local_DEPENDENCIES) $(EXTRA_ss_local
|
||||
$(AM_V_CCLD)$(ss_local_LINK) $(ss_local_OBJECTS) $(ss_local_LDADD) $(LIBS)
|
||||
ss-redir$(EXEEXT): $(ss_redir_OBJECTS) $(ss_redir_DEPENDENCIES) $(EXTRA_ss_redir_DEPENDENCIES)
|
||||
@rm -f ss-redir$(EXEEXT)
|
||||
$(AM_V_CCLD)$(LINK) $(ss_redir_OBJECTS) $(ss_redir_LDADD) $(LIBS)
|
||||
$(AM_V_CCLD)$(ss_redir_LINK) $(ss_redir_OBJECTS) $(ss_redir_LDADD) $(LIBS)
|
||||
ss-server$(EXEEXT): $(ss_server_OBJECTS) $(ss_server_DEPENDENCIES) $(EXTRA_ss_server_DEPENDENCIES)
|
||||
@rm -f ss-server$(EXEEXT)
|
||||
$(AM_V_CCLD)$(ss_server_LINK) $(ss_server_OBJECTS) $(ss_server_LDADD) $(LIBS)
|
||||
@@ -526,9 +538,6 @@ mostlyclean-compile:
|
||||
distclean-compile:
|
||||
-rm -f *.tab.c
|
||||
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/encrypt.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/jconf.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/json.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_la-acl.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_la-cache.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_la-encrypt.Plo@am__quote@
|
||||
@@ -539,8 +548,6 @@ distclean-compile:
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_la-udprelay.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_la-utils.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_la-win32.Plo@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netutils.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/redir.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-acl.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-cache.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-encrypt.Po@am__quote@
|
||||
@@ -551,11 +558,20 @@ distclean-compile:
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-udprelay.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-utils.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-win32.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-cache.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-encrypt.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-jconf.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-json.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-netutils.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-redir.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-udprelay.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-utils.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-acl.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-cache.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-encrypt.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-jconf.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-json.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-netutils.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-resolv.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-server.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-udprelay.Po@am__quote@
|
||||
@@ -569,7 +585,6 @@ distclean-compile:
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_tunnel-udprelay.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_tunnel-utils.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_tunnel-win32.Po@am__quote@
|
||||
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@
|
||||
|
||||
.c.o:
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\
|
||||
@@ -805,6 +820,118 @@ ss_local-win32.obj: win32.c
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-win32.obj `if test -f 'win32.c'; then $(CYGPATH_W) 'win32.c'; else $(CYGPATH_W) '$(srcdir)/win32.c'; fi`
|
||||
|
||||
ss_redir-utils.o: utils.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-utils.o -MD -MP -MF $(DEPDIR)/ss_redir-utils.Tpo -c -o ss_redir-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-utils.Tpo $(DEPDIR)/ss_redir-utils.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='ss_redir-utils.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c
|
||||
|
||||
ss_redir-utils.obj: utils.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-utils.obj -MD -MP -MF $(DEPDIR)/ss_redir-utils.Tpo -c -o ss_redir-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-utils.Tpo $(DEPDIR)/ss_redir-utils.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='ss_redir-utils.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`
|
||||
|
||||
ss_redir-jconf.o: jconf.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-jconf.o -MD -MP -MF $(DEPDIR)/ss_redir-jconf.Tpo -c -o ss_redir-jconf.o `test -f 'jconf.c' || echo '$(srcdir)/'`jconf.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-jconf.Tpo $(DEPDIR)/ss_redir-jconf.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='jconf.c' object='ss_redir-jconf.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-jconf.o `test -f 'jconf.c' || echo '$(srcdir)/'`jconf.c
|
||||
|
||||
ss_redir-jconf.obj: jconf.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-jconf.obj -MD -MP -MF $(DEPDIR)/ss_redir-jconf.Tpo -c -o ss_redir-jconf.obj `if test -f 'jconf.c'; then $(CYGPATH_W) 'jconf.c'; else $(CYGPATH_W) '$(srcdir)/jconf.c'; fi`
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-jconf.Tpo $(DEPDIR)/ss_redir-jconf.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='jconf.c' object='ss_redir-jconf.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-jconf.obj `if test -f 'jconf.c'; then $(CYGPATH_W) 'jconf.c'; else $(CYGPATH_W) '$(srcdir)/jconf.c'; fi`
|
||||
|
||||
ss_redir-json.o: json.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-json.o -MD -MP -MF $(DEPDIR)/ss_redir-json.Tpo -c -o ss_redir-json.o `test -f 'json.c' || echo '$(srcdir)/'`json.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-json.Tpo $(DEPDIR)/ss_redir-json.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='json.c' object='ss_redir-json.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-json.o `test -f 'json.c' || echo '$(srcdir)/'`json.c
|
||||
|
||||
ss_redir-json.obj: json.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-json.obj -MD -MP -MF $(DEPDIR)/ss_redir-json.Tpo -c -o ss_redir-json.obj `if test -f 'json.c'; then $(CYGPATH_W) 'json.c'; else $(CYGPATH_W) '$(srcdir)/json.c'; fi`
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-json.Tpo $(DEPDIR)/ss_redir-json.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='json.c' object='ss_redir-json.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-json.obj `if test -f 'json.c'; then $(CYGPATH_W) 'json.c'; else $(CYGPATH_W) '$(srcdir)/json.c'; fi`
|
||||
|
||||
ss_redir-encrypt.o: encrypt.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-encrypt.o -MD -MP -MF $(DEPDIR)/ss_redir-encrypt.Tpo -c -o ss_redir-encrypt.o `test -f 'encrypt.c' || echo '$(srcdir)/'`encrypt.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-encrypt.Tpo $(DEPDIR)/ss_redir-encrypt.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='encrypt.c' object='ss_redir-encrypt.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-encrypt.o `test -f 'encrypt.c' || echo '$(srcdir)/'`encrypt.c
|
||||
|
||||
ss_redir-encrypt.obj: encrypt.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-encrypt.obj -MD -MP -MF $(DEPDIR)/ss_redir-encrypt.Tpo -c -o ss_redir-encrypt.obj `if test -f 'encrypt.c'; then $(CYGPATH_W) 'encrypt.c'; else $(CYGPATH_W) '$(srcdir)/encrypt.c'; fi`
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-encrypt.Tpo $(DEPDIR)/ss_redir-encrypt.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='encrypt.c' object='ss_redir-encrypt.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-encrypt.obj `if test -f 'encrypt.c'; then $(CYGPATH_W) 'encrypt.c'; else $(CYGPATH_W) '$(srcdir)/encrypt.c'; fi`
|
||||
|
||||
ss_redir-netutils.o: netutils.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-netutils.o -MD -MP -MF $(DEPDIR)/ss_redir-netutils.Tpo -c -o ss_redir-netutils.o `test -f 'netutils.c' || echo '$(srcdir)/'`netutils.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-netutils.Tpo $(DEPDIR)/ss_redir-netutils.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='netutils.c' object='ss_redir-netutils.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-netutils.o `test -f 'netutils.c' || echo '$(srcdir)/'`netutils.c
|
||||
|
||||
ss_redir-netutils.obj: netutils.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-netutils.obj -MD -MP -MF $(DEPDIR)/ss_redir-netutils.Tpo -c -o ss_redir-netutils.obj `if test -f 'netutils.c'; then $(CYGPATH_W) 'netutils.c'; else $(CYGPATH_W) '$(srcdir)/netutils.c'; fi`
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-netutils.Tpo $(DEPDIR)/ss_redir-netutils.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='netutils.c' object='ss_redir-netutils.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-netutils.obj `if test -f 'netutils.c'; then $(CYGPATH_W) 'netutils.c'; else $(CYGPATH_W) '$(srcdir)/netutils.c'; fi`
|
||||
|
||||
ss_redir-cache.o: cache.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-cache.o -MD -MP -MF $(DEPDIR)/ss_redir-cache.Tpo -c -o ss_redir-cache.o `test -f 'cache.c' || echo '$(srcdir)/'`cache.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-cache.Tpo $(DEPDIR)/ss_redir-cache.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cache.c' object='ss_redir-cache.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-cache.o `test -f 'cache.c' || echo '$(srcdir)/'`cache.c
|
||||
|
||||
ss_redir-cache.obj: cache.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-cache.obj -MD -MP -MF $(DEPDIR)/ss_redir-cache.Tpo -c -o ss_redir-cache.obj `if test -f 'cache.c'; then $(CYGPATH_W) 'cache.c'; else $(CYGPATH_W) '$(srcdir)/cache.c'; fi`
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-cache.Tpo $(DEPDIR)/ss_redir-cache.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='cache.c' object='ss_redir-cache.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-cache.obj `if test -f 'cache.c'; then $(CYGPATH_W) 'cache.c'; else $(CYGPATH_W) '$(srcdir)/cache.c'; fi`
|
||||
|
||||
ss_redir-udprelay.o: udprelay.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-udprelay.o -MD -MP -MF $(DEPDIR)/ss_redir-udprelay.Tpo -c -o ss_redir-udprelay.o `test -f 'udprelay.c' || echo '$(srcdir)/'`udprelay.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-udprelay.Tpo $(DEPDIR)/ss_redir-udprelay.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='udprelay.c' object='ss_redir-udprelay.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-udprelay.o `test -f 'udprelay.c' || echo '$(srcdir)/'`udprelay.c
|
||||
|
||||
ss_redir-udprelay.obj: udprelay.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-udprelay.obj -MD -MP -MF $(DEPDIR)/ss_redir-udprelay.Tpo -c -o ss_redir-udprelay.obj `if test -f 'udprelay.c'; then $(CYGPATH_W) 'udprelay.c'; else $(CYGPATH_W) '$(srcdir)/udprelay.c'; fi`
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-udprelay.Tpo $(DEPDIR)/ss_redir-udprelay.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='udprelay.c' object='ss_redir-udprelay.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-udprelay.obj `if test -f 'udprelay.c'; then $(CYGPATH_W) 'udprelay.c'; else $(CYGPATH_W) '$(srcdir)/udprelay.c'; fi`
|
||||
|
||||
ss_redir-redir.o: redir.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-redir.o -MD -MP -MF $(DEPDIR)/ss_redir-redir.Tpo -c -o ss_redir-redir.o `test -f 'redir.c' || echo '$(srcdir)/'`redir.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-redir.Tpo $(DEPDIR)/ss_redir-redir.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='redir.c' object='ss_redir-redir.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-redir.o `test -f 'redir.c' || echo '$(srcdir)/'`redir.c
|
||||
|
||||
ss_redir-redir.obj: redir.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-redir.obj -MD -MP -MF $(DEPDIR)/ss_redir-redir.Tpo -c -o ss_redir-redir.obj `if test -f 'redir.c'; then $(CYGPATH_W) 'redir.c'; else $(CYGPATH_W) '$(srcdir)/redir.c'; fi`
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-redir.Tpo $(DEPDIR)/ss_redir-redir.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='redir.c' object='ss_redir-redir.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-redir.obj `if test -f 'redir.c'; then $(CYGPATH_W) 'redir.c'; else $(CYGPATH_W) '$(srcdir)/redir.c'; fi`
|
||||
|
||||
ss_server-utils.o: utils.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-utils.o -MD -MP -MF $(DEPDIR)/ss_server-utils.Tpo -c -o ss_server-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-utils.Tpo $(DEPDIR)/ss_server-utils.Po
|
||||
@@ -819,6 +946,20 @@ ss_server-utils.obj: utils.c
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`
|
||||
|
||||
ss_server-netutils.o: netutils.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-netutils.o -MD -MP -MF $(DEPDIR)/ss_server-netutils.Tpo -c -o ss_server-netutils.o `test -f 'netutils.c' || echo '$(srcdir)/'`netutils.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-netutils.Tpo $(DEPDIR)/ss_server-netutils.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='netutils.c' object='ss_server-netutils.o' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-netutils.o `test -f 'netutils.c' || echo '$(srcdir)/'`netutils.c
|
||||
|
||||
ss_server-netutils.obj: netutils.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-netutils.obj -MD -MP -MF $(DEPDIR)/ss_server-netutils.Tpo -c -o ss_server-netutils.obj `if test -f 'netutils.c'; then $(CYGPATH_W) 'netutils.c'; else $(CYGPATH_W) '$(srcdir)/netutils.c'; fi`
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-netutils.Tpo $(DEPDIR)/ss_server-netutils.Po
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='netutils.c' object='ss_server-netutils.obj' libtool=no @AMDEPBACKSLASH@
|
||||
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
|
||||
@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-netutils.obj `if test -f 'netutils.c'; then $(CYGPATH_W) 'netutils.c'; else $(CYGPATH_W) '$(srcdir)/netutils.c'; fi`
|
||||
|
||||
ss_server-jconf.o: jconf.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-jconf.o -MD -MP -MF $(DEPDIR)/ss_server-jconf.Tpo -c -o ss_server-jconf.o `test -f 'jconf.c' || echo '$(srcdir)/'`jconf.c
|
||||
@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-jconf.Tpo $(DEPDIR)/ss_server-jconf.Po
|
||||
|
||||
+2
-2
@@ -42,7 +42,7 @@
|
||||
#include "netutils.h"
|
||||
#include "utils.h"
|
||||
|
||||
int get_sockaddr_len(struct sockaddr *addr)
|
||||
size_t get_sockaddr_len(struct sockaddr *addr)
|
||||
{
|
||||
if (addr->sa_family == AF_INET) {
|
||||
return sizeof(struct sockaddr_in);
|
||||
@@ -52,7 +52,7 @@ int get_sockaddr_len(struct sockaddr *addr)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int get_sockaddr(char *host, char *port, struct sockaddr_storage *storage, int block)
|
||||
size_t get_sockaddr(char *host, char *port, struct sockaddr_storage *storage, int block)
|
||||
{
|
||||
struct cork_ip ip;
|
||||
if (cork_ip_init(&ip, host) != -1) {
|
||||
|
||||
+2
-2
@@ -20,5 +20,5 @@
|
||||
* <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
int get_sockaddr_len(struct sockaddr *addr);
|
||||
int get_sockaddr(char *host, char *port, struct sockaddr_storage *storage, int block);
|
||||
size_t get_sockaddr_len(struct sockaddr *addr);
|
||||
size_t get_sockaddr(char *host, char *port, struct sockaddr_storage *storage, int block);
|
||||
|
||||
+21
-6
@@ -80,6 +80,8 @@ static void close_and_free_remote(EV_P_ struct remote *remote);
|
||||
static void free_server(struct server *server);
|
||||
static void close_and_free_server(EV_P_ struct server *server);
|
||||
|
||||
int verbose = 0;
|
||||
int udprelay = 0;
|
||||
|
||||
int getdestaddr(int fd, struct sockaddr_storage *destaddr)
|
||||
{
|
||||
@@ -611,7 +613,7 @@ int main(int argc, char **argv)
|
||||
|
||||
opterr = 0;
|
||||
|
||||
while ((c = getopt(argc, argv, "f:s:p:l:k:t:m:c:b:a:")) != -1) {
|
||||
while ((c = getopt(argc, argv, "f:s:p:l:k:t:m:c:b:a:vu")) != -1) {
|
||||
switch (c) {
|
||||
case 's':
|
||||
if (remote_num < MAX_REMOTE_NUM) {
|
||||
@@ -647,6 +649,12 @@ int main(int argc, char **argv)
|
||||
case 'a':
|
||||
user = optarg;
|
||||
break;
|
||||
case 'u':
|
||||
udprelay = 1;
|
||||
break;
|
||||
case 'v':
|
||||
verbose = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -654,13 +662,13 @@ int main(int argc, char **argv)
|
||||
usage();
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if(argc == 1) {
|
||||
if(conf_path == NULL) {
|
||||
conf_path = DEFAULT_CONF_PATH;
|
||||
|
||||
if (argc == 1) {
|
||||
if (conf_path == NULL) {
|
||||
conf_path = DEFAULT_CONF_PATH;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (conf_path != NULL) {
|
||||
jconf_t *conf = read_jconf(conf_path);
|
||||
if (remote_num == 0) {
|
||||
@@ -751,6 +759,13 @@ int main(int argc, char **argv)
|
||||
ev_io_init(&listen_ctx.io, accept_cb, listenfd, EV_READ);
|
||||
ev_io_start(loop, &listen_ctx.io);
|
||||
|
||||
// Setup UDP
|
||||
if (udprelay) {
|
||||
LOGI("udprelay enabled");
|
||||
init_udprelay(local_addr, local_port, listen_ctx.remote_addr[0],
|
||||
get_sockaddr_len(listen_ctx.remote_addr[0]), m, listen_ctx.timeout, NULL);
|
||||
}
|
||||
|
||||
// setuid
|
||||
if (user != NULL) {
|
||||
run_as(user);
|
||||
|
||||
+7
-7
@@ -1154,13 +1154,13 @@ int main(int argc, char **argv)
|
||||
usage();
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if(argc == 1) {
|
||||
if(conf_path == NULL) {
|
||||
conf_path = DEFAULT_CONF_PATH;
|
||||
|
||||
if (argc == 1) {
|
||||
if (conf_path == NULL) {
|
||||
conf_path = DEFAULT_CONF_PATH;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (conf_path != NULL) {
|
||||
jconf_t *conf = read_jconf(conf_path);
|
||||
if (server_num == 0) {
|
||||
@@ -1218,7 +1218,7 @@ int main(int argc, char **argv)
|
||||
if (method == NULL) {
|
||||
method = "table";
|
||||
}
|
||||
|
||||
|
||||
if (timeout == NULL) {
|
||||
timeout = "60";
|
||||
}
|
||||
@@ -1293,7 +1293,7 @@ int main(int argc, char **argv)
|
||||
FATAL("listen() error");
|
||||
}
|
||||
setnonblocking(listenfd);
|
||||
LOGI("listening at %s:%s", host?host:"*", server_port);
|
||||
LOGI("listening at %s:%s", host ? host : "*", server_port);
|
||||
|
||||
struct listen_ctx *listen_ctx = &listen_ctx_list[index];
|
||||
|
||||
|
||||
+5
-5
@@ -709,13 +709,13 @@ int main(int argc, char **argv)
|
||||
usage();
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
|
||||
if(argc == 1) {
|
||||
if(conf_path == NULL) {
|
||||
conf_path = DEFAULT_CONF_PATH;
|
||||
|
||||
if (argc == 1) {
|
||||
if (conf_path == NULL) {
|
||||
conf_path = DEFAULT_CONF_PATH;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (conf_path != NULL) {
|
||||
jconf_t *conf = read_jconf(conf_path);
|
||||
if (remote_num == 0) {
|
||||
|
||||
+178
-37
@@ -57,6 +57,7 @@
|
||||
#include <udns.h>
|
||||
|
||||
#include "utils.h"
|
||||
#include "netutils.h"
|
||||
#include "cache.h"
|
||||
#include "udprelay.h"
|
||||
|
||||
@@ -137,6 +138,37 @@ static int set_nosigpipe(int socket_fd)
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef UDPRELAY_REDIR
|
||||
|
||||
#ifndef IP_TRANSPARENT
|
||||
#define IP_TRANSPARENT 19
|
||||
#endif
|
||||
|
||||
#ifndef IP_RECVORIGDSTADDR
|
||||
#define IP_RECVORIGDSTADDR 20
|
||||
#endif
|
||||
|
||||
static int get_dstaddr(struct msghdr *msg, struct sockaddr_storage *dstaddr)
|
||||
{
|
||||
struct cmsghdr *cmsg;
|
||||
|
||||
for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) {
|
||||
if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVORIGDSTADDR) {
|
||||
memcpy(dstaddr, CMSG_DATA(cmsg), sizeof(struct sockaddr_in));
|
||||
dstaddr->ss_family = AF_INET;
|
||||
return 0;
|
||||
|
||||
} else if (cmsg->cmsg_level == SOL_IPV6 && cmsg->cmsg_type == IP_RECVORIGDSTADDR) {
|
||||
memcpy(dstaddr, CMSG_DATA(cmsg), sizeof(struct sockaddr_in6));
|
||||
dstaddr->ss_family = AF_INET6;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
static char *hash_key(const char *header, const int header_len,
|
||||
const struct sockaddr_storage *addr)
|
||||
{
|
||||
@@ -366,6 +398,15 @@ int create_server_socket(const char *host, const char *port)
|
||||
set_nosigpipe(server_sock);
|
||||
#endif
|
||||
|
||||
#ifdef UDPRELAY_REDIR
|
||||
if (setsockopt(server_sock, SOL_IP, IP_TRANSPARENT, &opt, sizeof(opt))) {
|
||||
FATAL("[udp] setsockopt IP_TRANSPARENT");
|
||||
}
|
||||
if (setsockopt(server_sock, IPPROTO_IP, IP_RECVORIGDSTADDR, &opt, sizeof(opt))) {
|
||||
FATAL("[udp] setsockopt IP_RECVORIGDSTADDR");
|
||||
}
|
||||
#endif
|
||||
|
||||
s = bind(server_sock, rp->ai_addr, rp->ai_addrlen);
|
||||
if (s == 0) {
|
||||
/* We managed to bind successfully! */
|
||||
@@ -440,6 +481,9 @@ void close_and_free_remote(EV_P_ struct remote_ctx *ctx)
|
||||
if (ctx != NULL) {
|
||||
ev_timer_stop(EV_A_ & ctx->watcher);
|
||||
ev_io_stop(EV_A_ & ctx->io);
|
||||
if (ctx->src_fd != 0) {
|
||||
close(ctx->src_fd);
|
||||
}
|
||||
close(ctx->fd);
|
||||
free(ctx);
|
||||
}
|
||||
@@ -504,10 +548,7 @@ static void query_resolve_cb(struct sockaddr *addr, void *data)
|
||||
memcpy(remote_ctx->addr_header, query_ctx->addr_header,
|
||||
query_ctx->addr_header_len);
|
||||
|
||||
size_t addr_len = sizeof(struct sockaddr_in);
|
||||
if (remote_ctx->dst_addr.ss_family == AF_INET6) {
|
||||
addr_len = sizeof(struct sockaddr_in6);
|
||||
}
|
||||
size_t addr_len = get_sockaddr_len((struct sockaddr *)&remote_ctx->dst_addr);
|
||||
int s = sendto(remote_ctx->fd, query_ctx->buf, query_ctx->buf_len,
|
||||
0, (struct sockaddr *)&remote_ctx->dst_addr,
|
||||
addr_len);
|
||||
@@ -590,7 +631,7 @@ static void remote_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
// server may return using a different address type other than the type we
|
||||
// have used during sending
|
||||
|
||||
#ifdef UDPRELAY_TUNNEL
|
||||
#if defined(UDPRELAY_TUNNEL) || defined(UDPRELAY_REDIR)
|
||||
// Construct packet
|
||||
buf_len -= len;
|
||||
memmove(buf, buf + len, buf_len);
|
||||
@@ -616,17 +657,48 @@ static void remote_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
buf = ss_encrypt_all(BUF_SIZE, buf, &buf_len, server_ctx->method);
|
||||
#endif
|
||||
|
||||
size_t addr_len = sizeof(struct sockaddr_in);
|
||||
if (remote_ctx->src_addr.ss_family == AF_INET6) {
|
||||
addr_len = sizeof(struct sockaddr_in6);
|
||||
}
|
||||
int s = sendto(server_ctx->fd, buf, buf_len, 0,
|
||||
(struct sockaddr *)&remote_ctx->src_addr, addr_len);
|
||||
size_t remote_src_addr_len = get_sockaddr_len((struct sockaddr *)&remote_ctx->src_addr);
|
||||
|
||||
if (s == -1) {
|
||||
ERROR("[udp] sendto_local");
|
||||
#ifdef UDPRELAY_REDIR
|
||||
size_t remote_dst_addr_len = get_sockaddr_len((struct sockaddr *)&remote_ctx->dst_addr);
|
||||
|
||||
if (remote_ctx->src_fd == 0) {
|
||||
int src_sock = socket(remote_ctx->src_addr.ss_family, SOCK_DGRAM, 0);
|
||||
if (src_sock < 0) {
|
||||
ERROR("[udp] remote_recv_socket");
|
||||
}
|
||||
int opt = 1;
|
||||
if (setsockopt(src_sock, SOL_IP, IP_TRANSPARENT, &opt, sizeof(opt))) {
|
||||
ERROR("[udp] remote_recv_setsockopt");
|
||||
close(src_sock);
|
||||
goto CLEAN_UP;
|
||||
}
|
||||
if (setsockopt(src_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {
|
||||
ERROR("[udp] remote_recv_setsockopt");
|
||||
close(src_sock);
|
||||
goto CLEAN_UP;
|
||||
}
|
||||
if (bind(src_sock, (struct sockaddr *)&remote_ctx->dst_addr, remote_dst_addr_len) != 0) {
|
||||
ERROR("[udp] remote_recv_bind");
|
||||
close(src_sock);
|
||||
goto CLEAN_UP;
|
||||
}
|
||||
remote_ctx->src_fd = src_sock;
|
||||
}
|
||||
|
||||
int s = sendto(remote_ctx->src_fd, buf, buf_len, 0,
|
||||
(struct sockaddr *)&remote_ctx->src_addr, remote_src_addr_len);
|
||||
if (s == -1) {
|
||||
ERROR("[udp] remote_recv_sendto");
|
||||
}
|
||||
#else
|
||||
int s = sendto(server_ctx->fd, buf, buf_len, 0,
|
||||
(struct sockaddr *)&remote_ctx->src_addr, remote_src_addr_len);
|
||||
if (s == -1) {
|
||||
ERROR("[udp] remote_recv_sendto");
|
||||
}
|
||||
#endif
|
||||
|
||||
CLEAN_UP:
|
||||
free(buf);
|
||||
|
||||
@@ -642,6 +714,34 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
socklen_t src_addr_len = sizeof(struct sockaddr_storage);
|
||||
unsigned int offset = 0;
|
||||
|
||||
#ifdef UDPRELAY_REDIR
|
||||
char control_buffer[64] = { 0 };
|
||||
struct msghdr msg;
|
||||
struct iovec iov[1];
|
||||
struct sockaddr_storage dst_addr;
|
||||
memset(&dst_addr, 0, sizeof(struct sockaddr_storage));
|
||||
|
||||
msg.msg_name = &src_addr;
|
||||
msg.msg_namelen = src_addr_len;
|
||||
msg.msg_control = control_buffer;
|
||||
msg.msg_controllen = sizeof(control_buffer);
|
||||
|
||||
iov[0].iov_base = buf;
|
||||
iov[0].iov_len = BUF_SIZE;
|
||||
msg.msg_iov = iov;
|
||||
msg.msg_iovlen = 1;
|
||||
|
||||
ssize_t buf_len = recvmsg(server_ctx->fd, &msg, 0);
|
||||
if (buf_len == -1) {
|
||||
ERROR("[udp] server_recvmsg");
|
||||
goto CLEAN_UP;
|
||||
}
|
||||
|
||||
if (get_dstaddr(&msg, &dst_addr)) {
|
||||
LOGE("[udp] unable to get dest addr");
|
||||
goto CLEAN_UP;
|
||||
}
|
||||
#else
|
||||
ssize_t buf_len =
|
||||
recvfrom(server_ctx->fd, buf, BUF_SIZE, 0, (struct sockaddr *)&src_addr,
|
||||
&src_addr_len);
|
||||
@@ -654,6 +754,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
}
|
||||
goto CLEAN_UP;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (verbose) {
|
||||
LOGI("[udp] server receive a packet");
|
||||
@@ -670,7 +771,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
#endif
|
||||
|
||||
#ifdef UDPRELAY_LOCAL
|
||||
#ifndef UDPRELAY_TUNNEL
|
||||
#if !defined(UDPRELAY_TUNNEL) && !defined(UDPRELAY_REDIR)
|
||||
uint8_t frag = *(uint8_t *)(buf + 2);
|
||||
offset += 3;
|
||||
#endif
|
||||
@@ -715,7 +816,39 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
*
|
||||
*/
|
||||
|
||||
#ifdef UDPRELAY_TUNNEL
|
||||
#ifdef UDPRELAY_REDIR
|
||||
char addr_header[256] = { 0 };
|
||||
int addr_header_len = 0;
|
||||
|
||||
if (dst_addr.ss_family == AF_INET) {
|
||||
struct sockaddr_in *addr = (struct sockaddr_in *)&dst_addr;
|
||||
size_t addr_len = sizeof(struct in_addr);
|
||||
addr_header[addr_header_len++] = 1;
|
||||
memcpy(addr_header + addr_header_len, &addr->sin_addr, addr_len);
|
||||
addr_header_len += addr_len;
|
||||
memcpy(addr_header + addr_header_len, &addr->sin_port, 2);
|
||||
addr_header_len += 2;
|
||||
} else if (dst_addr.ss_family == AF_INET6) {
|
||||
struct sockaddr_in6 *addr = (struct sockaddr_in6 *)&dst_addr;
|
||||
size_t addr_len = sizeof(struct in6_addr);
|
||||
addr_header[addr_header_len++] = 4;
|
||||
memcpy(addr_header + addr_header_len, &addr->sin6_addr, addr_len);
|
||||
addr_header_len += addr_len;
|
||||
memcpy(addr_header + addr_header_len, &addr->sin6_port, 2);
|
||||
addr_header_len += 2;
|
||||
} else {
|
||||
LOGE("[udp] failed to parse tproxy addr");
|
||||
goto CLEAN_UP;
|
||||
}
|
||||
|
||||
// reconstruct the buffer
|
||||
buf = realloc(buf, buf_len + addr_header_len);
|
||||
memmove(buf + addr_header_len, buf, buf_len);
|
||||
memcpy(buf, addr_header, addr_header_len);
|
||||
buf_len += addr_header_len;
|
||||
|
||||
#elif UDPRELAY_TUNNEL
|
||||
|
||||
char addr_header[256] = { 0 };
|
||||
char *host = server_ctx->tunnel_addr.host;
|
||||
char *port = server_ctx->tunnel_addr.port;
|
||||
@@ -767,7 +900,9 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
memmove(buf + addr_header_len, buf, buf_len);
|
||||
memcpy(buf, addr_header, addr_header_len);
|
||||
buf_len += addr_header_len;
|
||||
|
||||
#else
|
||||
|
||||
char host[256] = { 0 };
|
||||
char port[64] = { 0 };
|
||||
struct sockaddr_storage storage;
|
||||
@@ -799,29 +934,45 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
|
||||
if (remote_ctx == NULL) {
|
||||
if (verbose) {
|
||||
LOGI("[udp] cache missed: %s:%s <-> %s", host, port,
|
||||
#ifdef UDPRELAY_REDIR
|
||||
char src[SS_ADDRSTRLEN];
|
||||
char dst[SS_ADDRSTRLEN];
|
||||
strcpy(src, get_addr_str((struct sockaddr *)&src_addr));
|
||||
strcpy(dst, get_addr_str((struct sockaddr *)&dst_addr));
|
||||
LOGI("[udp] cache miss: %s <-> %s", dst, src);
|
||||
#else
|
||||
LOGI("[udp] cache miss: %s:%s <-> %s", host, port,
|
||||
get_addr_str((struct sockaddr *)&src_addr));
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
if (verbose) {
|
||||
#ifdef UDPRELAY_REDIR
|
||||
char src[SS_ADDRSTRLEN];
|
||||
char dst[SS_ADDRSTRLEN];
|
||||
strcpy(src, get_addr_str((struct sockaddr *)&src_addr));
|
||||
strcpy(dst, get_addr_str((struct sockaddr *)&dst_addr));
|
||||
LOGI("[udp] cache hit: %s <-> %s", dst, src);
|
||||
#else
|
||||
LOGI("[udp] cache hit: %s:%s <-> %s", host, port,
|
||||
get_addr_str((struct sockaddr *)&src_addr));
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef UDPRELAY_LOCAL
|
||||
|
||||
#ifndef UDPRELAY_TUNNEL
|
||||
#if !defined(UDPRELAY_TUNNEL) && !defined(UDPRELAY_REDIR)
|
||||
if (frag) {
|
||||
LOGE("[udp] drop a message since frag is not 0, but %d", frag);
|
||||
goto CLEAN_UP;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (remote_ctx == NULL) {
|
||||
const struct sockaddr *remote_addr = server_ctx->remote_addr;
|
||||
const int remote_addr_len = server_ctx->remote_addr_len;
|
||||
const struct sockaddr *remote_addr = server_ctx->remote_addr;
|
||||
const int remote_addr_len = server_ctx->remote_addr_len;
|
||||
|
||||
if (remote_ctx == NULL) {
|
||||
// Bind to any port
|
||||
int remotefd = create_remote_socket(remote_addr->sa_family == AF_INET6);
|
||||
if (remotefd < 0) {
|
||||
@@ -842,7 +993,9 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
// Init remote_ctx
|
||||
remote_ctx = new_remote(remotefd, server_ctx);
|
||||
remote_ctx->src_addr = src_addr;
|
||||
memcpy(&(remote_ctx->dst_addr), remote_addr, remote_addr_len);
|
||||
#ifdef UDPRELAY_REDIR
|
||||
memcpy(&(remote_ctx->dst_addr), &dst_addr, get_sockaddr_len((struct sockaddr *)&dst_addr));
|
||||
#endif
|
||||
remote_ctx->addr_header_len = addr_header_len;
|
||||
memcpy(remote_ctx->addr_header, addr_header, addr_header_len);
|
||||
|
||||
@@ -860,12 +1013,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
|
||||
buf = ss_encrypt_all(BUF_SIZE, buf, &buf_len, server_ctx->method);
|
||||
|
||||
size_t addr_len = sizeof(struct sockaddr_in);
|
||||
if (remote_ctx->dst_addr.ss_family == AF_INET6) {
|
||||
addr_len = sizeof(struct sockaddr_in6);
|
||||
}
|
||||
int s = sendto(remote_ctx->fd, buf, buf_len, 0,
|
||||
(struct sockaddr *)&remote_ctx->dst_addr, addr_len);
|
||||
int s = sendto(remote_ctx->fd, buf, buf_len, 0, remote_addr, remote_addr_len);
|
||||
|
||||
if (s == -1) {
|
||||
ERROR("[udp] sendto_remote");
|
||||
@@ -889,18 +1037,14 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
setinterface(remotefd, server_ctx->iface);
|
||||
}
|
||||
#endif
|
||||
struct remote_ctx *remote_ctx =
|
||||
new_remote(remotefd, server_ctx);
|
||||
struct remote_ctx *remote_ctx = new_remote(remotefd, server_ctx);
|
||||
remote_ctx->src_addr = src_addr;
|
||||
remote_ctx->dst_addr = storage;
|
||||
remote_ctx->server_ctx = server_ctx;
|
||||
remote_ctx->addr_header_len = addr_header_len;
|
||||
memcpy(remote_ctx->addr_header, addr_header, addr_header_len);
|
||||
|
||||
size_t addr_len = sizeof(struct sockaddr_in);
|
||||
if (remote_ctx->dst_addr.ss_family == AF_INET6) {
|
||||
addr_len = sizeof(struct sockaddr_in6);
|
||||
}
|
||||
size_t addr_len = get_sockaddr_len((struct sockaddr *)&remote_ctx->dst_addr);
|
||||
int s = sendto(remote_ctx->fd, buf + addr_header_len,
|
||||
buf_len - addr_header_len, 0,
|
||||
(struct sockaddr *)&remote_ctx->dst_addr,
|
||||
@@ -948,10 +1092,7 @@ static void server_recv_cb(EV_P_ ev_io *w, int revents)
|
||||
query_ctx->query = query;
|
||||
}
|
||||
} else {
|
||||
size_t addr_len = sizeof(struct sockaddr_in);
|
||||
if (remote_ctx->dst_addr.ss_family == AF_INET6) {
|
||||
addr_len = sizeof(struct sockaddr_in6);
|
||||
}
|
||||
size_t addr_len = get_sockaddr_len((struct sockaddr *)&remote_ctx->dst_addr);
|
||||
int s = sendto(remote_ctx->fd, buf + addr_header_len,
|
||||
buf_len - addr_header_len, 0,
|
||||
(struct sockaddr *)&remote_ctx->dst_addr, addr_len);
|
||||
|
||||
@@ -74,6 +74,7 @@ struct remote_ctx {
|
||||
ev_io io;
|
||||
ev_timer watcher;
|
||||
int fd;
|
||||
int src_fd;
|
||||
int addr_header_len;
|
||||
char addr_header[384];
|
||||
struct sockaddr_storage src_addr;
|
||||
|
||||
+1
-1
@@ -240,7 +240,7 @@ void usage()
|
||||
printf(
|
||||
" [-u] enable udprelay mode,\n");
|
||||
printf(
|
||||
" not available in redir mode\n");
|
||||
" TPROXY is required in redir mode\n");
|
||||
printf("\n");
|
||||
printf(
|
||||
" [-L <addr>:<port>] specify destination server address and port\n");
|
||||
|
||||
+11
-11
@@ -121,10 +121,10 @@ extern FILE * logfile;
|
||||
#include <syslog.h>
|
||||
|
||||
extern int use_tty;
|
||||
#define USE_TTY() \
|
||||
do { \
|
||||
use_tty = isatty(STDERR_FILENO); \
|
||||
} while (0) \
|
||||
#define USE_TTY() \
|
||||
do { \
|
||||
use_tty = isatty(STDERR_FILENO); \
|
||||
} while (0) \
|
||||
|
||||
#define HAS_SYSLOG
|
||||
extern int use_syslog;
|
||||
@@ -145,14 +145,14 @@ extern int use_syslog;
|
||||
time_t now = time(NULL); \
|
||||
char timestr[20]; \
|
||||
strftime(timestr, 20, TIME_FORMAT, localtime(&now)); \
|
||||
if(use_tty) { \
|
||||
if (use_tty) { \
|
||||
fprintf(stderr, "\e[01;32m %s INFO: \e[0m" format "\n", timestr, \
|
||||
## __VA_ARGS__); \
|
||||
} else { \
|
||||
fprintf(stderr, "%s INFO: " format "\n", timestr, \
|
||||
} else { \
|
||||
fprintf(stderr, "%s INFO: " format "\n", timestr, \
|
||||
## __VA_ARGS__); \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
while (0)
|
||||
|
||||
@@ -164,13 +164,13 @@ extern int use_syslog;
|
||||
time_t now = time(NULL); \
|
||||
char timestr[20]; \
|
||||
strftime(timestr, 20, TIME_FORMAT, localtime(&now)); \
|
||||
if(use_tty) { \
|
||||
if (use_tty) { \
|
||||
fprintf(stderr, "\e[01;35m %s ERROR: \e[0m" format "\n", timestr, \
|
||||
## __VA_ARGS__); \
|
||||
} else { \
|
||||
fprintf(stderr, " %s ERROR: " format "\n", timestr, \
|
||||
## __VA_ARGS__); \
|
||||
} \
|
||||
} \
|
||||
} } \
|
||||
while (0)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user