Files
shadowsocks-rust/tests/dns.rs
T
ty 07583f3cc8 Refactored and separate library into crates (#345)
* Refactored and separate library into crates

- shadowsocks: the core feature of shadowsocks
- shadowsocks-service: library for building shadowsocks services
    - dns, http, redir, socks, tunnel
    - load balancer
- shadowsocks-rust: release binaries

fix #347

* unified DnsResolver implementation

* unified local service common parameters into ServiceContext

- ServiceContext is common parameters shared between all local
implementations
- Completely removed https local support

* add #292 reply attack protection

* migrated redir local server

* support customizing outbound socket bind address

* manager outbound socket should accepts connect_opts

* republic local implementations

* socks5 udp server should always listen to client address

* socks4 controlled by local-socks4 feature

* socks4 also obey mode configuration

* socks server tcp cannot be disable. add support of udp-bind-addr parameter

* add udp-bind-addr for customizing udp-relay bind-addr

* local-dns infra, support customizing resolver

* fully implements DNS relay server

* support binding to specific interface on Linux-like platform

* tcp cannot be disabled in socks

* enable local-flow-stat

* fixed windows build

* fixed android specific warnings and compile errors

* allow udp_only mode in socks5

* dns relay listens to both TCP and UDP, mode controls outbound upstreams

* dns relay retries twice if request failed

* doc

* fix DnsClient typo

* fix stream EncryptWriter bug

* allow disable logging output

updated dependencies

* add readme

* refine doc

* remove depending on trust-dns-client

* socks4/4a client

* allow socks5 udp_only mode, fixes compile warning

* create standalone socks5 UDP relay server

- socks5 UDP association full cone (NAT2)

* server udp relay supports full cone (NAT2)

* acl moved to crate root

* redir udp relay support full cone (NAT2)

* standard socks5 udp test must use tcp_and_udp mode

* set server context fields with pub APIs

* udp_max_associations and udp_timeout default value set in Config

* local dns resolver retry with fixed attempts

* max_udp_association keeps unlimited by default

* fixed logging binary name

* pops first exited future result for local and server

* update reverse target index cache

* fix ProxyClientStreamWriteHalf that allows sending empty buffers

ref #232

* remove unused import when socks4 is disabled

* make balancer become a globally shared object

* print plugin exit status

* control local, server, manager services in features
2020-12-20 19:06:21 +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::{
net::{TcpStream, UdpSocket},
prelude::*,
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");
}
}