blacklist for mobiles

This commit is contained in:
2026-03-18 19:59:27 +07:00
parent 530568d27a
commit c4c45564d3
12 changed files with 336 additions and 249 deletions
+80 -38
View File
@@ -165,63 +165,105 @@ impl ClientHandler {
Ok(muxer)
}
async fn handle_udp_associate(&mut self) -> Result<(), String> {
let reply = SocksReply::ConnectResult {
reply_code: 0x00,
atyp: 0x01,
addr: [0, 0, 0, 0],
port: 0,
};
self.conn.send_socks_reply(reply).await?;
let mut buf = [0u8; 1024];
loop {
// Просто ждем, пока клиент не разорвет TCP-соединение
if self
.conn
.inbound
.read(&mut buf)
.await
.map_err(|e| e.to_string())?
== 0
{
break;
}
}
Ok(())
}
}
#[async_trait::async_trait]
impl TunnelHandler for ClientHandler {
async fn run(mut self) -> Result<(), String> {
info!("Starting SOCKS multiplexed handling");
// 1. Приветствие (Handshake)
self.conn.read_socks_request().await?;
self.conn
.send_socks_reply(SocksReply::HandshakeSelect { method: 0x00 })
.await?;
// 2. Получаем основной запрос (Connect или UDP Associate)
let req = self.conn.read_socks_request().await?;
let target = if let SocksRequest::Connect { target, .. } = req {
target
} else {
return Err("Expected Connect".into());
};
let stream_id = self.muxer.next_id();
let (v_tx, mut v_rx) = mpsc::channel::<bytes::Bytes>(1024);
self.muxer.register_stream(stream_id, v_tx).await;
match req {
// Ветка TCP CONNECT
SocksRequest::Connect {
command: 0x01,
target,
} => {
let stream_id = self.muxer.next_id();
let (v_tx, mut v_rx) = mpsc::channel::<bytes::Bytes>(1024);
self.muxer.register_stream(stream_id, v_tx).await;
self.muxer
.send_to_netwrok(MuxMessage {
stream_id,
frame_type: FrameType::Connect,
data: bytes::Bytes::from(target.to_string()),
})
.await
.map_err(|e| e.to_string())?;
self.muxer
.send_to_netwrok(MuxMessage {
stream_id,
frame_type: FrameType::Connect,
data: bytes::Bytes::from(target.to_string()),
})
.await
.map_err(|e| e.to_string())?;
let first_payload = tokio::time::timeout(std::time::Duration::from_secs(10), v_rx.recv())
.await
.map_err(|_| "Timeout")?
.ok_or("No data")?;
let first_payload =
tokio::time::timeout(std::time::Duration::from_secs(10), v_rx.recv())
.await
.map_err(|_| "Timeout waiting for proxy response")?
.ok_or("No data from proxy")?;
if first_payload.len() >= 2 && first_payload[1] == 0x00 {
self.conn
.outbound
.write_all(&first_payload)
.await
.map_err(|e| e.to_string())?;
} else {
self.conn.outbound.write_all(&first_payload).await.ok();
return Err("Rejected".into());
if first_payload.len() >= 2 && first_payload[1] == 0x00 {
self.conn
.outbound
.write_all(&first_payload)
.await
.map_err(|e| e.to_string())?;
} else {
self.conn.outbound.write_all(&first_payload).await.ok();
return Err("Proxy rejected connection".into());
}
let browser_in = self.conn.inbound;
let browser_out = self.conn.outbound;
let muxer = self.muxer;
tokio::spawn(async move {
run_proxy_bridge(stream_id, browser_in, browser_out, muxer, v_rx).await;
});
Ok(())
}
// Ветка UDP ASSOCIATE
SocksRequest::Connect { command: 0x03, .. } => {
info!("Handling UDP Associate request");
self.handle_udp_associate().await
}
// Всё остальное (BIND и т.д.)
_ => Err("Unsupported SOCKS command".into()),
}
let browser_in = self.conn.inbound;
let browser_out = self.conn.outbound;
let muxer = self.muxer;
tokio::spawn(async move {
run_proxy_bridge(stream_id, browser_in, browser_out, muxer, v_rx).await;
});
Ok(())
}
}
pub struct ServerHandler {
pub conn: Connection,
pub token: CancellationToken,