Skip to content

Commit

Permalink
truly randomize listening ports for bridges
Browse files Browse the repository at this point in the history
  • Loading branch information
nullchinchilla committed Jan 16, 2025
1 parent bcdebd6 commit 901058c
Showing 1 changed file with 15 additions and 3 deletions.
18 changes: 15 additions & 3 deletions binaries/geph5-bridge/src/listen_forward.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ use geph5_misc_rpc::bridge::{B2eMetadata, BridgeControlProtocol, BridgeControlSe
use moka::future::Cache;
use once_cell::sync::Lazy;
use picomux::{PicoMux, Stream};
use rand::Rng;
use sillad::{dialer::Dialer, listener::Listener, tcp::TcpListener, Pipe};
use smol::future::FutureExt as _;
use smol::io::AsyncWriteExt;
Expand Down Expand Up @@ -52,9 +53,7 @@ impl BridgeControlProtocol for State {

MAPPING
.get_with((b2e_dest, metadata.clone()), async {
let listener = TcpListener::bind("0.0.0.0:0".parse().unwrap())
.await
.unwrap();
let listener = random_tcp_listener().await;
let addr = listener
.local_addr()
.await
Expand All @@ -67,6 +66,19 @@ impl BridgeControlProtocol for State {
}
}

async fn random_tcp_listener() -> TcpListener {
let rando = rand::thread_rng().gen_range(2048u16..65535);
loop {
match TcpListener::bind(format!("0.0.0.0:{rando}").parse().unwrap()).await {
Ok(listener) => return listener,
Err(err) => {
smol::Timer::after(Duration::from_millis(100)).await;
tracing::warn!(rando, err = debug(err), "retrying a bind...")
}
}
}
}

async fn handle_one_listener(
mut listener: impl Listener,
b2e_dest: SocketAddr,
Expand Down

0 comments on commit 901058c

Please sign in to comment.