HevSocks5TProxy: Add support for set socket mark.
This commit is contained in:
parent
4c38aa8d32
commit
120ec94713
|
@ -71,6 +71,8 @@ socks5:
|
|||
username: 'username'
|
||||
# Socks5 server password
|
||||
password: 'password'
|
||||
# Socket mark
|
||||
mark: 0
|
||||
|
||||
tcp:
|
||||
port: 1088
|
||||
|
|
|
@ -11,6 +11,8 @@ socks5:
|
|||
username: 'username'
|
||||
# Socks5 server password
|
||||
password: 'password'
|
||||
# Socket mark
|
||||
mark: 0
|
||||
|
||||
tcp:
|
||||
# TCP port
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
============================================================================
|
||||
Name : hev-config.c
|
||||
Author : Heiher <r@hev.cc>
|
||||
Copyright : Copyright (c) 2017 - 2021 hev
|
||||
Copyright : Copyright (c) 2017 - 2023 hev
|
||||
Description : Config
|
||||
============================================================================
|
||||
*/
|
||||
|
@ -43,6 +43,7 @@ hev_config_parse_server (yaml_document_t *doc, yaml_node_t *base,
|
|||
const char *udpm = NULL;
|
||||
const char *user = NULL;
|
||||
const char *pass = NULL;
|
||||
const char *mark = NULL;
|
||||
|
||||
if (!base || YAML_MAPPING_NODE != base->type || !srv)
|
||||
return -1;
|
||||
|
@ -75,6 +76,8 @@ hev_config_parse_server (yaml_document_t *doc, yaml_node_t *base,
|
|||
user = value;
|
||||
else if (0 == strcmp (key, "password"))
|
||||
pass = value;
|
||||
else if (0 == strcmp (key, "mark"))
|
||||
mark = value;
|
||||
}
|
||||
|
||||
if (!port) {
|
||||
|
@ -105,6 +108,9 @@ hev_config_parse_server (yaml_document_t *doc, yaml_node_t *base,
|
|||
srv->pass = _pass;
|
||||
}
|
||||
|
||||
if (mark)
|
||||
srv->mark = strtoul (mark, NULL, 16);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
============================================================================
|
||||
Name : hev-config.h
|
||||
Author : Heiher <r@hev.cc>
|
||||
Copyright : Copyright (c) 2017 - 2021 hev
|
||||
Copyright : Copyright (c) 2017 - 2023 hev
|
||||
Description : Config
|
||||
============================================================================
|
||||
*/
|
||||
|
@ -16,6 +16,7 @@ struct _HevConfigServer
|
|||
{
|
||||
const char *user;
|
||||
const char *pass;
|
||||
unsigned int mark;
|
||||
short udp_in_udp;
|
||||
unsigned short port;
|
||||
char addr[256];
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
============================================================================
|
||||
Name : hev-socks5-session-tcp.c
|
||||
Author : Heiher <r@hev.cc>
|
||||
Copyright : Copyright (c) 2017 - 2021 hev
|
||||
Copyright : Copyright (c) 2017 - 2023 hev
|
||||
Description : Socks5 Session TCP
|
||||
============================================================================
|
||||
*/
|
||||
|
@ -14,6 +14,7 @@
|
|||
#include <hev-socks5-client-tcp.h>
|
||||
#include <hev-memory-allocator.h>
|
||||
|
||||
#include "hev-config.h"
|
||||
#include "hev-logger.h"
|
||||
|
||||
#include "hev-socks5-session-tcp.h"
|
||||
|
@ -39,6 +40,33 @@ hev_socks5_session_tcp_new (struct sockaddr *addr, int fd)
|
|||
return self;
|
||||
}
|
||||
|
||||
static int
|
||||
hev_socks5_session_tcp_bind (HevSocks5 *self, int fd,
|
||||
const struct sockaddr *dest)
|
||||
{
|
||||
HevConfigServer *srv;
|
||||
|
||||
LOG_D ("%p socks5 session tcp bind", self);
|
||||
|
||||
srv = hev_config_get_socks5_server ();
|
||||
|
||||
if (srv->mark) {
|
||||
unsigned int mark;
|
||||
int res = 0;
|
||||
|
||||
mark = srv->mark;
|
||||
#if defined(__linux__)
|
||||
res = setsockopt (fd, SOL_SOCKET, SO_MARK, &mark, sizeof (mark));
|
||||
#elif defined(__FreeBSD__)
|
||||
res = setsockopt (fd, SOL_SOCKET, SO_USER_COOKIE, &mark, sizeof (mark));
|
||||
#endif
|
||||
if (res < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
hev_socks5_session_tcp_splice (HevSocks5Session *base)
|
||||
{
|
||||
|
@ -119,6 +147,7 @@ hev_socks5_session_tcp_class (void)
|
|||
HevObjectClass *okptr = HEV_OBJECT_CLASS (kptr);
|
||||
|
||||
if (!okptr->name) {
|
||||
HevSocks5Class *skptr;
|
||||
HevSocks5SessionIface *siptr;
|
||||
HevTProxySessionIface *tiptr;
|
||||
void *ptr;
|
||||
|
@ -130,6 +159,9 @@ hev_socks5_session_tcp_class (void)
|
|||
okptr->finalizer = hev_socks5_session_tcp_destruct;
|
||||
okptr->iface = hev_socks5_session_tcp_iface;
|
||||
|
||||
skptr = HEV_SOCKS5_CLASS (kptr);
|
||||
skptr->binder = hev_socks5_session_tcp_bind;
|
||||
|
||||
siptr = &kptr->session;
|
||||
memcpy (siptr, HEV_SOCKS5_SESSION_TYPE, sizeof (HevSocks5SessionIface));
|
||||
siptr->splicer = hev_socks5_session_tcp_splice;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
============================================================================
|
||||
Name : hev-socks5-session-udp.c
|
||||
Author : Heiher <r@hev.cc>
|
||||
Copyright : Copyright (c) 2017 - 2021 hev
|
||||
Copyright : Copyright (c) 2017 - 2023 hev
|
||||
Description : Socks5 Session UDP
|
||||
============================================================================
|
||||
*/
|
||||
|
@ -200,6 +200,33 @@ exit:
|
|||
hev_task_wakeup (splice->task);
|
||||
}
|
||||
|
||||
static int
|
||||
hev_socks5_session_udp_bind (HevSocks5 *self, int fd,
|
||||
const struct sockaddr *dest)
|
||||
{
|
||||
HevConfigServer *srv;
|
||||
|
||||
LOG_D ("%p socks5 session udp bind", self);
|
||||
|
||||
srv = hev_config_get_socks5_server ();
|
||||
|
||||
if (srv->mark) {
|
||||
unsigned int mark;
|
||||
int res = 0;
|
||||
|
||||
mark = srv->mark;
|
||||
#if defined(__linux__)
|
||||
res = setsockopt (fd, SOL_SOCKET, SO_MARK, &mark, sizeof (mark));
|
||||
#elif defined(__FreeBSD__)
|
||||
res = setsockopt (fd, SOL_SOCKET, SO_USER_COOKIE, &mark, sizeof (mark));
|
||||
#endif
|
||||
if (res < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
hev_socks5_session_udp_splice (HevSocks5Session *base)
|
||||
{
|
||||
|
@ -324,6 +351,7 @@ hev_socks5_session_udp_class (void)
|
|||
HevObjectClass *okptr = HEV_OBJECT_CLASS (kptr);
|
||||
|
||||
if (!okptr->name) {
|
||||
HevSocks5Class *skptr;
|
||||
HevSocks5SessionIface *siptr;
|
||||
HevTProxySessionIface *tiptr;
|
||||
void *ptr;
|
||||
|
@ -335,6 +363,9 @@ hev_socks5_session_udp_class (void)
|
|||
okptr->finalizer = hev_socks5_session_udp_destruct;
|
||||
okptr->iface = hev_socks5_session_udp_iface;
|
||||
|
||||
skptr = HEV_SOCKS5_CLASS (kptr);
|
||||
skptr->binder = hev_socks5_session_udp_bind;
|
||||
|
||||
siptr = &kptr->session;
|
||||
memcpy (siptr, HEV_SOCKS5_SESSION_TYPE, sizeof (HevSocks5SessionIface));
|
||||
siptr->splicer = hev_socks5_session_udp_splice;
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
============================================================================
|
||||
Name : hev-tproxy-session-dns.c
|
||||
Author : Heiher <r@hev.cc>
|
||||
Copyright : Copyright (c) 2021 hev
|
||||
Copyright : Copyright (c) 2021 - 2023 hev
|
||||
Description : TProxy Session DNS
|
||||
============================================================================
|
||||
*/
|
||||
|
@ -134,6 +134,32 @@ hev_tproxy_session_dns_parse_ip (const char *addr, int port,
|
|||
return -1;
|
||||
}
|
||||
|
||||
static int
|
||||
hev_tproxy_session_dns_bind (HevTProxySessionDNS *self, int fd)
|
||||
{
|
||||
HevConfigServer *srv;
|
||||
|
||||
LOG_D ("%p tproxy session dns bind", self);
|
||||
|
||||
srv = hev_config_get_socks5_server ();
|
||||
|
||||
if (srv->mark) {
|
||||
unsigned int mark;
|
||||
int res = 0;
|
||||
|
||||
mark = srv->mark;
|
||||
#if defined(__linux__)
|
||||
res = setsockopt (fd, SOL_SOCKET, SO_MARK, &mark, sizeof (mark));
|
||||
#elif defined(__FreeBSD__)
|
||||
res = setsockopt (fd, SOL_SOCKET, SO_USER_COOKIE, &mark, sizeof (mark));
|
||||
#endif
|
||||
if (res < 0)
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void
|
||||
hev_tproxy_session_dns_run (HevTProxySession *base)
|
||||
{
|
||||
|
@ -160,6 +186,10 @@ hev_tproxy_session_dns_run (HevTProxySession *base)
|
|||
hev_tproxy_session_dns_parse_ip (upstream, 53, &addr);
|
||||
}
|
||||
|
||||
res = hev_tproxy_session_dns_bind (self, fd);
|
||||
if (res < 0)
|
||||
goto exit;
|
||||
|
||||
res = hev_task_io_socket_sendto (fd, self->buffer, self->size, 0,
|
||||
(struct sockaddr *)&addr, sizeof (addr),
|
||||
io_yielder, self);
|
||||
|
|
Loading…
Reference in New Issue