untested server
This commit is contained in:
parent
bf70341ad7
commit
d273b32eee
@ -14,10 +14,10 @@ On server:
|
|||||||
```bash
|
```bash
|
||||||
git clone https://git.meex.lol/MeexReay/unrknize
|
git clone https://git.meex.lol/MeexReay/unrknize
|
||||||
cd unrknize/unrknize-server
|
cd unrknize/unrknize-server
|
||||||
cargo run -- somepassword.example.com 127.0.0.1:443
|
cargo run -- somepassword.example.com 127.0.0.1:9090 127.0.0.1:443
|
||||||
# certificates can be self-signed, or i would even say that they SHOULD be self-signed
|
# 127.0.0.1:9090 is the server where you want client to connect, but RKN detects it by protocol handshake
|
||||||
# use nginx or smth if you already have https port used
|
# use nginx or smth if you already have https port (443) used or use any other port (less believable)
|
||||||
# somepassword.example.com can be changed on anything else, for example just your ip address
|
# somepassword.example.com can be changed on anything else, for example just your ip address, its used for SNI
|
||||||
```
|
```
|
||||||
|
|
||||||
On client:
|
On client:
|
||||||
|
@ -1,33 +1,71 @@
|
|||||||
use std::env;
|
use std::io::{Read, Write};
|
||||||
|
use std::{env, thread};
|
||||||
use std::error::Error;
|
use std::error::Error;
|
||||||
use std::net::{TcpListener, TcpStream};
|
use std::net::{Shutdown, TcpListener, TcpStream};
|
||||||
use std::sync::Arc;
|
use std::sync::{Arc, Mutex};
|
||||||
|
|
||||||
use rcgen::generate_simple_self_signed;
|
use rcgen::generate_simple_self_signed;
|
||||||
use rustls::crypto::aws_lc_rs::sign::any_supported_type;
|
use rustls::crypto::aws_lc_rs::sign::any_supported_type;
|
||||||
use rustls::pki_types::pem::PemObject;
|
use rustls::pki_types::pem::PemObject;
|
||||||
use rustls::pki_types::{CertificateDer, PrivateKeyDer};
|
use rustls::pki_types::PrivateKeyDer;
|
||||||
use rustls::server::ResolvesServerCertUsingSni;
|
use rustls::server::ResolvesServerCertUsingSni;
|
||||||
use rustls::sign::CertifiedKey;
|
use rustls::sign::CertifiedKey;
|
||||||
use rustls::{ServerConfig, ServerConnection, StreamOwned};
|
use rustls::{ServerConfig, ServerConnection, Stream};
|
||||||
use threadpool::ThreadPool;
|
use threadpool::ThreadPool;
|
||||||
|
|
||||||
fn accept_client(stream: TcpStream, config: Arc<ServerConfig>, sni_domain: String) -> Result<(), Box<dyn Error>> {
|
fn accept_client(stream: &mut TcpStream, config: Arc<ServerConfig>, sni_domain: String, host: String) -> Result<(), Box<dyn Error>> {
|
||||||
|
let remote_stream = Arc::new(TcpStream::connect(host)?);
|
||||||
|
|
||||||
let connection = ServerConnection::new(config)?;
|
let connection = ServerConnection::new(config)?;
|
||||||
|
let connection = Arc::new(Mutex::new(connection));
|
||||||
let mut stream = StreamOwned::new(connection, stream);
|
|
||||||
|
|
||||||
while stream.conn.is_handshaking() {
|
|
||||||
stream.conn.complete_io(&mut stream.sock)?;
|
|
||||||
}
|
|
||||||
|
|
||||||
if stream.conn.server_name() != Some(&sni_domain) {
|
|
||||||
return Err("unexpected sni domain".into());
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
{
|
||||||
|
let mut conn = connection.lock().unwrap();
|
||||||
|
let mut tls_stream = Stream::new(&mut *conn, stream);
|
||||||
|
while tls_stream.conn.is_handshaking() {
|
||||||
|
tls_stream.conn.complete_io(&mut tls_stream.sock)?;
|
||||||
|
}
|
||||||
|
|
||||||
Ok(())
|
if tls_stream.conn.server_name() != Some(&sni_domain) {
|
||||||
|
return Err("unexpected sni domain".into());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
thread::spawn({
|
||||||
|
let mut stream = stream.try_clone()?;
|
||||||
|
let connection = connection.clone();
|
||||||
|
let remote_stream = remote_stream.clone();
|
||||||
|
|
||||||
|
move || {
|
||||||
|
loop {
|
||||||
|
let mut buffer = vec![0; 4096];
|
||||||
|
let n = (&*remote_stream).read(&mut buffer).unwrap();
|
||||||
|
if n != 0 {
|
||||||
|
buffer.truncate(n);
|
||||||
|
|
||||||
|
let mut conn = connection.lock().unwrap();
|
||||||
|
let mut tls_stream = Stream::new(&mut *conn, &mut stream);
|
||||||
|
tls_stream.write_all(&buffer[..n]).unwrap();
|
||||||
|
tls_stream.flush().unwrap();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
let mut stream = stream.try_clone()?;
|
||||||
|
let connection = connection.clone();
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let mut conn = connection.lock().unwrap();
|
||||||
|
let mut tls_stream = Stream::new(&mut *conn, &mut stream);
|
||||||
|
|
||||||
|
let mut buffer = vec![0; 4096];
|
||||||
|
let n = tls_stream.read(&mut buffer)?;
|
||||||
|
if n != 0 {
|
||||||
|
buffer.truncate(n);
|
||||||
|
(&*remote_stream).write(&buffer)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn main() -> Result<(), Box<dyn Error>> {
|
fn main() -> Result<(), Box<dyn Error>> {
|
||||||
@ -41,6 +79,9 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
let host = args
|
let host = args
|
||||||
.next()
|
.next()
|
||||||
.expect("missing host argument");
|
.expect("missing host argument");
|
||||||
|
let local_host = args
|
||||||
|
.next()
|
||||||
|
.expect("missing local host argument");
|
||||||
|
|
||||||
let certified_key = generate_simple_self_signed(vec![sni_domain.to_string()]).unwrap();
|
let certified_key = generate_simple_self_signed(vec![sni_domain.to_string()]).unwrap();
|
||||||
let certified_key = CertifiedKey::new(
|
let certified_key = CertifiedKey::new(
|
||||||
@ -59,19 +100,22 @@ fn main() -> Result<(), Box<dyn Error>> {
|
|||||||
|
|
||||||
let threadpool = ThreadPool::new(10);
|
let threadpool = ThreadPool::new(10);
|
||||||
|
|
||||||
let listener = TcpListener::bind(host).unwrap();
|
let listener = TcpListener::bind(local_host).unwrap();
|
||||||
|
|
||||||
for stream in listener.incoming() {
|
for stream in listener.incoming() {
|
||||||
let stream = stream.expect("listener got broken");
|
let mut stream = stream.expect("listener got broken");
|
||||||
|
|
||||||
threadpool.execute({
|
threadpool.execute({
|
||||||
let config = config.clone();
|
let config = config.clone();
|
||||||
let sni_domain = sni_domain.clone();
|
let sni_domain = sni_domain.clone();
|
||||||
|
let host = host.clone();
|
||||||
|
|
||||||
move || {
|
move || {
|
||||||
if let Err(e) = accept_client(stream, config, sni_domain) {
|
if let Err(e) = accept_client(&mut stream, config, sni_domain, host) {
|
||||||
println!("error connection: {e:?}");
|
println!("error connection: {e:?}");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let _ = stream.shutdown(Shutdown::Both);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user