mirror of
https://github.com/wangyu-/udp2raw.git
synced 2025-01-19 06:19:31 +08:00
Merge 864e8090ba1b473479966a1419630109ffd64210 into e42f0e573221c5e0146c02fd5d71f32aa93c7221
This commit is contained in:
commit
f171c8336e
17
common.cpp
17
common.cpp
@ -11,6 +11,7 @@
|
|||||||
|
|
||||||
#include <random>
|
#include <random>
|
||||||
#include <cmath>
|
#include <cmath>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
// static int random_number_fd=-1;
|
// static int random_number_fd=-1;
|
||||||
int force_socket_buf = 0;
|
int force_socket_buf = 0;
|
||||||
@ -190,6 +191,8 @@ int address_t::from_sockaddr(sockaddr *addr, socklen_t slen) {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int g_randomize_local_addr = 0;
|
||||||
|
static uint32_t g_lo_ip = 0x7f010001u;
|
||||||
int address_t::new_connected_udp_fd() {
|
int address_t::new_connected_udp_fd() {
|
||||||
int new_udp_fd;
|
int new_udp_fd;
|
||||||
new_udp_fd = socket(get_type(), SOCK_DGRAM, IPPROTO_UDP);
|
new_udp_fd = socket(get_type(), SOCK_DGRAM, IPPROTO_UDP);
|
||||||
@ -200,6 +203,20 @@ int address_t::new_connected_udp_fd() {
|
|||||||
setnonblocking(new_udp_fd);
|
setnonblocking(new_udp_fd);
|
||||||
set_buf_size(new_udp_fd, socket_buf_size);
|
set_buf_size(new_udp_fd, socket_buf_size);
|
||||||
|
|
||||||
|
struct sockaddr_in *paddr_inet = (struct sockaddr_in *)&inner;
|
||||||
|
if (paddr_inet->sin_family == AF_INET && g_randomize_local_addr &&
|
||||||
|
(ntohl(paddr_inet->sin_addr.s_addr) & 0xff000000u) == 0x7f000000u) {
|
||||||
|
// wireguard allows only one port number per address, so change source address on reconnection
|
||||||
|
struct sockaddr_in addr_bound;
|
||||||
|
memset(&addr_bound, 0, sizeof(addr_bound));
|
||||||
|
addr_bound.sin_family = AF_INET;
|
||||||
|
addr_bound.sin_addr.s_addr = htonl(g_lo_ip);
|
||||||
|
g_lo_ip += 0x2u;
|
||||||
|
mylog(log_debug, "randomizing local address when connecting to localhost, binding local ip %s\n", my_ntoa(g_lo_ip));
|
||||||
|
if (bind(new_udp_fd, (struct sockaddr *)&addr_bound, sizeof(addr_bound)) != 0) {
|
||||||
|
mylog(log_warn, "lo addr: bind failed\n");
|
||||||
|
}
|
||||||
|
}
|
||||||
mylog(log_debug, "created new udp_fd %d\n", new_udp_fd);
|
mylog(log_debug, "created new udp_fd %d\n", new_udp_fd);
|
||||||
int ret = connect(new_udp_fd, (struct sockaddr *)&inner, get_len());
|
int ret = connect(new_udp_fd, (struct sockaddr *)&inner, get_len());
|
||||||
if (ret != 0) {
|
if (ret != 0) {
|
||||||
|
2
common.h
2
common.h
@ -163,6 +163,8 @@ extern int force_socket_buf;
|
|||||||
|
|
||||||
extern int g_fix_gro;
|
extern int g_fix_gro;
|
||||||
|
|
||||||
|
extern int g_randomize_local_addr;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
struct ip_port_t
|
struct ip_port_t
|
||||||
{
|
{
|
||||||
|
13
misc.cpp
13
misc.cpp
@ -296,6 +296,9 @@ void process_arg(int argc, char *argv[]) // process all options
|
|||||||
{"no-pcap-mutex", no_argument, 0, 1},
|
{"no-pcap-mutex", no_argument, 0, 1},
|
||||||
#endif
|
#endif
|
||||||
{"fix-gro", no_argument, 0, 1},
|
{"fix-gro", no_argument, 0, 1},
|
||||||
|
{"do-fragment", no_argument, 0, 1},
|
||||||
|
{"rand-addr", no_argument, 0, 1},
|
||||||
|
{"wireguard", no_argument, 0, 1},
|
||||||
{NULL, 0, 0, 0}};
|
{NULL, 0, 0, 0}};
|
||||||
|
|
||||||
process_log_level(argc, argv);
|
process_log_level(argc, argv);
|
||||||
@ -677,6 +680,16 @@ void process_arg(int argc, char *argv[]) // process all options
|
|||||||
} else if (strcmp(long_options[option_index].name, "fix-gro") == 0) {
|
} else if (strcmp(long_options[option_index].name, "fix-gro") == 0) {
|
||||||
mylog(log_info, "--fix-gro enabled\n");
|
mylog(log_info, "--fix-gro enabled\n");
|
||||||
g_fix_gro = 1;
|
g_fix_gro = 1;
|
||||||
|
} else if (strcmp(long_options[option_index].name, "do-fragment") == 0) {
|
||||||
|
mylog(log_info, "--do-fragment enabled\n");
|
||||||
|
g_should_fragment = 1;
|
||||||
|
} else if (strcmp(long_options[option_index].name, "rand-addr") == 0) {
|
||||||
|
mylog(log_info, "--rand-addr enabled\n");
|
||||||
|
g_randomize_local_addr = 1;
|
||||||
|
} else if (strcmp(long_options[option_index].name, "wireguard") == 0) {
|
||||||
|
mylog(log_info, "--wireguard mode enabled, turning on --do-fragment and --rand-addr\n");
|
||||||
|
g_should_fragment = 1;
|
||||||
|
g_randomize_local_addr = 1;
|
||||||
} else {
|
} else {
|
||||||
mylog(log_warn, "ignored unknown long option ,option_index:%d code:<%x>\n", option_index, optopt);
|
mylog(log_warn, "ignored unknown long option ,option_index:%d code:<%x>\n", option_index, optopt);
|
||||||
}
|
}
|
||||||
|
@ -1159,6 +1159,7 @@ printf("pcap send!\n");*/
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int g_should_fragment = 0;
|
||||||
int send_raw_ip(raw_info_t &raw_info, const char *payload, int payloadlen) {
|
int send_raw_ip(raw_info_t &raw_info, const char *payload, int payloadlen) {
|
||||||
const packet_info_t &send_info = raw_info.send_info;
|
const packet_info_t &send_info = raw_info.send_info;
|
||||||
const packet_info_t &recv_info = raw_info.recv_info;
|
const packet_info_t &recv_info = raw_info.recv_info;
|
||||||
@ -1188,8 +1189,11 @@ int send_raw_ip(raw_info_t &raw_info, const char *payload, int payloadlen) {
|
|||||||
// iph->id = 0; //Id of this packet ,kernel will auto fill this if id is zero ,or really?????// todo //seems like there is a problem
|
// iph->id = 0; //Id of this packet ,kernel will auto fill this if id is zero ,or really?????// todo //seems like there is a problem
|
||||||
}
|
}
|
||||||
|
|
||||||
iph->frag_off = htons(0x4000); // DF set,others are zero
|
if (g_should_fragment) {
|
||||||
// iph->frag_off = htons(0x0000); //DF set,others are zero
|
iph->frag_off = htons(0x0000); //DF cleared,others are zero
|
||||||
|
} else {
|
||||||
|
iph->frag_off = htons(0x4000); // DF set,others are zero
|
||||||
|
}
|
||||||
iph->ttl = (unsigned char)ttl_value;
|
iph->ttl = (unsigned char)ttl_value;
|
||||||
iph->protocol = send_info.protocol;
|
iph->protocol = send_info.protocol;
|
||||||
iph->check = 0; // Set to 0 before calculating checksum
|
iph->check = 0; // Set to 0 before calculating checksum
|
||||||
|
Loading…
x
Reference in New Issue
Block a user