Files
shadowsocks-rust/tests/dns.rs
T
ty 303f96c61f Upgrade to tokio 1.0 (#358)
* upgrade to tokio v1.0

- removed tokio::prelude
- upgrade hyper to v0.14, tokio-rustls to v0.22

still working on migrating trust-dns-* and tokio-native-tls

ref #354

* tokio v1.0 removed with_poll

fix #355, ref #354

* removed CTRL-BREAK signal handler

ref #354

* fixes compliation error, add missing return

fixes #355

* allow setting SO_SNDBUF and SO_RCVBUF for sockets

ref #352

* completely removed unix socket based DNS resolving

ref shadowsocks/shadowsocks-android#2622

* fix build issue on Windows

* fixed uds poll_write loop, fixed udp outbound loopback check

ref #355

* disable default trust-dns resolver for andorid, macos, ios

This commit also:

- Optimized resolve() logging with elapsed time
- updated tokio-native-tls

* local-dns removed from default features

* fix rustc version with rust-toolchain

* Bump bytes from 0.6.0 to 1.0.0

* add dependabot badge

* indirectly depend on trust_dns_proto via trust_dns_resolver

* auto reconnect if udp sendto failed

* recreate proxied socket if recv() returns failure

* increase score precision to 0.0001

* example of log4rs configuration

* PingBalancer instance shouldn't kill probing task when dropping

- Probing task should be controlled by the internal shared state

* switch to trust-dns main for latest tokio 1.0 support
2020-12-28 10:10:19 +08:00

91 lines
2.4 KiB
Rust

#![cfg(all(feature = "local-dns", feature = "server"))]
use std::time::Duration;
use byteorder::{BigEndian, ByteOrder};
use tokio::{
io::{AsyncReadExt, AsyncWriteExt},
net::{TcpStream, UdpSocket},
time,
};
use shadowsocks_service::{
config::{Config, ConfigType, ProtocolType},
run_local,
run_server,
};
#[tokio::test]
async fn dns_relay() {
let _ = env_logger::try_init();
let mut local_config = Config::load_from_str(
r#"{
"local_port": 6110,
"local_address": "127.0.0.1",
"server": "127.0.0.1",
"server_port": 6120,
"password": "password",
"method": "aes-256-gcm"
}"#,
ConfigType::Local,
)
.unwrap();
local_config.local_protocol = ProtocolType::Dns;
local_config.local_dns_addr = Some("114.114.114.114:53".parse().unwrap());
local_config.remote_dns_addr = Some("8.8.8.8:53".parse().unwrap());
let server_config = Config::load_from_str(
r#"{
"server": "127.0.0.1",
"server_port": 6120,
"password": "password",
"method": "aes-256-gcm",
"mode": "tcp_and_udp"
}"#,
ConfigType::Server,
)
.unwrap();
tokio::spawn(run_local(local_config));
tokio::spawn(run_server(server_config));
time::sleep(Duration::from_secs(1)).await;
// Query firefox.com, TransactionID: 0x1234
static DNS_QUERY: &[u8] = b"\x12\x34\x01\x00\x00\x01\x00\x00\x00\x00\x00\x00\x07firefox\x03com\x00\x00\x01\x00\x01";
// 1. DoT
{
let mut c = TcpStream::connect("127.0.0.1:6110").await.unwrap();
let mut len_buf = [0u8; 2];
BigEndian::write_u16(&mut len_buf, DNS_QUERY.len() as u16);
c.write_all(&len_buf).await.unwrap();
c.write_all(DNS_QUERY).await.unwrap();
c.flush().await.unwrap();
c.read_exact(&mut len_buf).await.unwrap();
let resp_len = BigEndian::read_u16(&len_buf);
let mut buf = vec![0u8; resp_len as usize];
c.read_exact(&mut buf).await.unwrap();
assert!(buf.starts_with(b"\x12\x34"));
}
// 2. DoU
{
let c = UdpSocket::bind("0.0.0.0:0").await.unwrap();
c.send_to(DNS_QUERY, "127.0.0.1:6110").await.unwrap();
let mut buf = [0u8; 65536];
let n = c.recv(&mut buf).await.unwrap();
assert!(n >= 12);
let pkt = &buf[..n];
assert_eq!(&pkt[..2], b"\x12\x34");
}
}