HevSocks5TProxy: Add support for set socket mark.

This commit is contained in:
hev 2023-10-08 18:58:41 -06:00
parent 4c38aa8d32
commit 120ec94713
No known key found for this signature in database
GPG Key ID: DE8BBEBCEBBBDB92
7 changed files with 109 additions and 5 deletions

View File

@ -71,6 +71,8 @@ socks5:
username: 'username'
# Socks5 server password
password: 'password'
# Socket mark
mark: 0
tcp:
port: 1088

View File

@ -11,6 +11,8 @@ socks5:
username: 'username'
# Socks5 server password
password: 'password'
# Socket mark
mark: 0
tcp:
# TCP port

View File

@ -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;
}

View File

@ -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];

View File

@ -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;

View File

@ -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;

View File

@ -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);