Skip to content

Commit 256451f

Browse files
committed
feat: implement client-side DoT
1 parent 170f974 commit 256451f

19 files changed

+718
-200
lines changed

Cargo.toml

+3
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,9 @@ deadpool = "0.10.0"
5454
socket2 = "0.5.5"
5555
mlua = { version = "0.9.9", features = ["luajit", "vendored", "serialize", "async", "macros", "send", "parking_lot"] }
5656
garde = { version = "0.20.0", features = ["serde", "derive", "pattern", "regex"] }
57+
rustls = "0.23.16"
58+
webpki-roots = "0.26.6"
59+
tokio-rustls = "0.26.0"
5760

5861
[dev-dependencies]
5962
hex = "0.4.3"

config.toml

+1-1
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ props.servers = ["tcp://208.67.222.222:443", "tcp://208.67.220.220:443"]
1212

1313
[filters.chinadns]
1414
kind = "chinadns"
15-
props.trusted = ["tcp://208.67.222.222:443", "tcp://208.67.220.220:443"]
15+
props.trusted = ["dot://dot.pub", "tcp://208.67.222.222:443", "8.8.8.8", "1.1.1.1"]
1616
props.mistrusted = ["223.5.5.5", "223.6.6.6"]
1717
props.geoip_database = "GeoLite2-Country.mmdb"
1818

src/bootstrap.rs

+56-46
Original file line numberDiff line numberDiff line change
@@ -11,17 +11,22 @@ use crate::handler::RuledHandler;
1111
use crate::server::{TcpServer, UdpServer};
1212

1313
pub async fn run(c: Config, closer: Arc<Notify>) -> anyhow::Result<()> {
14-
let mut rb = RuledHandler::builder();
14+
let addr = c.server.listen.parse::<SocketAddr>()?;
1515

16-
for (k, v) in c.filters.iter() {
17-
rb = rb.filter(k, v)?;
18-
}
16+
// build rule handler
17+
let h = {
18+
let mut rb = RuledHandler::builder();
1919

20-
for next in c.rules.iter() {
21-
rb = rb.rule(next)?;
22-
}
20+
for (k, v) in c.filters.iter() {
21+
rb = rb.filter(k, v)?;
22+
}
2323

24-
let h = rb.build();
24+
for next in c.rules.iter() {
25+
rb = rb.rule(next)?;
26+
}
27+
28+
rb.build()
29+
};
2530

2631
let cs = match &c.server.cache_size {
2732
None => None,
@@ -35,39 +40,39 @@ pub async fn run(c: Config, closer: Arc<Notify>) -> anyhow::Result<()> {
3540
};
3641

3742
let udp_server = {
38-
let addr = socket2::SockAddr::from(c.server.listen.parse::<SocketAddr>()?);
39-
let socket = socket2::Socket::new(Domain::IPV4, Type::DGRAM, Some(Protocol::UDP))?;
43+
let socket = {
44+
let socket = socket2::Socket::new(Domain::IPV4, Type::DGRAM, Some(Protocol::UDP))?;
4045

41-
// SO_REUSEADDR+SO_REUSEPORT
42-
if let Err(e) = socket.set_reuse_address(true) {
43-
warn!("failed to set SO_REUSEADDR for {:?}: {:?}", &socket, e);
44-
}
45-
if let Err(e) = socket.set_reuse_port(true) {
46-
warn!("failed to set SO_REUSEPORT for {:?}: {:?}", &socket, e);
47-
}
46+
// SO_REUSEADDR+SO_REUSEPORT
47+
if let Err(e) = socket.set_reuse_address(true) {
48+
warn!("failed to set SO_REUSEADDR for {:?}: {:?}", &socket, e);
49+
}
50+
if let Err(e) = socket.set_reuse_port(true) {
51+
warn!("failed to set SO_REUSEPORT for {:?}: {:?}", &socket, e);
52+
}
4853

49-
// enable balance for freebsd
50-
cfg_if! {
51-
if #[cfg(target_os="freebsd")] {
52-
// SO_REUSEPORT_LB
53-
if let Err(e) = socket.set_reuse_port_lb(true) {
54-
warn!("failed to set SO_REUSEPORT for {:?}: {:?}", &socket, e);
54+
// enable balance for freebsd
55+
cfg_if! {
56+
if #[cfg(target_os="freebsd")] {
57+
// SO_REUSEPORT_LB
58+
if let Err(e) = socket.set_reuse_port_lb(true) {
59+
warn!("failed to set SO_REUSEPORT for {:?}: {:?}", &socket, e);
60+
}
5561
}
5662
}
57-
}
5863

59-
socket.set_recv_buffer_size(4096)?;
60-
socket.set_send_buffer_size(4096)?;
61-
socket.set_nonblocking(true)?;
64+
socket.set_recv_buffer_size(4096)?;
65+
socket.set_send_buffer_size(4096)?;
66+
socket.set_nonblocking(true)?;
6267

63-
socket.bind(&addr)?;
68+
let bind = socket2::SockAddr::from(addr);
69+
socket.bind(&bind)?;
6470

65-
let socket = {
6671
use std::os::fd::{FromRawFd, IntoRawFd, RawFd};
6772
let fd: RawFd = socket.into_raw_fd();
6873
let socket = unsafe { std::net::UdpSocket::from_raw_fd(fd) };
69-
UdpSocket::from_std(socket)
70-
}?;
74+
UdpSocket::from_std(socket)?
75+
};
7176

7277
UdpServer::new(
7378
socket,
@@ -78,27 +83,32 @@ pub async fn run(c: Config, closer: Arc<Notify>) -> anyhow::Result<()> {
7883
};
7984

8085
let tcp_server = {
81-
let addr = socket2::SockAddr::from(c.server.listen.parse::<SocketAddr>()?);
82-
let socket = socket2::Socket::new(Domain::IPV4, Type::STREAM, Some(Protocol::TCP))?;
86+
let socket = {
87+
let addr = socket2::SockAddr::from(addr);
88+
let socket = socket2::Socket::new(Domain::IPV4, Type::STREAM, Some(Protocol::TCP))?;
8389

84-
// SO_REUSEADDR+SO_REUSEPORT
85-
if let Err(e) = socket.set_reuse_address(true) {
86-
warn!("failed to set SO_REUSEADDR for {:?}: {:?}", &socket, e);
87-
}
88-
if let Err(e) = socket.set_reuse_port(true) {
89-
warn!("failed to set SO_REUSEPORT for {:?}: {:?}", &socket, e);
90-
}
90+
// SO_REUSEADDR+SO_REUSEPORT
91+
if let Err(e) = socket.set_reuse_address(true) {
92+
warn!("failed to set SO_REUSEADDR for {:?}: {:?}", &socket, e);
93+
}
94+
if let Err(e) = socket.set_reuse_port(true) {
95+
warn!("failed to set SO_REUSEPORT for {:?}: {:?}", &socket, e);
96+
}
97+
98+
socket.set_recv_buffer_size(4096)?;
99+
socket.set_send_buffer_size(4096)?;
100+
socket.set_nonblocking(true)?;
101+
socket.set_nodelay(true)?;
91102

92-
socket.set_recv_buffer_size(4096)?;
93-
socket.set_send_buffer_size(4096)?;
94-
socket.set_nonblocking(true)?;
95-
socket.set_nodelay(true)?;
103+
socket.bind(&addr)?;
96104

97-
socket.bind(&addr)?;
105+
socket.listen(65535)?;
98106

99-
socket.listen(65535)?;
107+
socket
108+
};
100109

101110
TcpServer::new(
111+
addr,
102112
TcpListener::from_std(socket.into())?,
103113
Clone::clone(&h),
104114
Clone::clone(&cs),

0 commit comments

Comments
 (0)