|
1 | 1 | use std::io::IoSliceMut;
|
2 |
| -use std::net::{IpAddr, UdpSocket}; |
| 2 | +use std::net::IpAddr; |
3 | 3 | use std::os::unix::prelude::AsRawFd;
|
4 | 4 | use std::sync::Arc;
|
5 | 5 | use std::time::Duration;
|
6 | 6 | use std::{error::Error, fmt::Display, net::SocketAddr};
|
7 | 7 |
|
8 | 8 | use fast_socks5::client::Socks5Stream;
|
9 | 9 |
|
10 |
| -use nix::sys::socket::{recvmsg, MsgFlags, RecvMsg}; |
11 |
| -use tokio::io::copy_bidirectional; |
12 |
| -use tokio::net::{TcpListener, TcpStream}; |
| 10 | +use nix::cmsg_space; |
| 11 | +use nix::errno::Errno; |
| 12 | +use nix::sys::socket::sockopt::IpTransparent; |
| 13 | +use nix::sys::socket::{ |
| 14 | + bind, recvmsg, setsockopt, socket, AddressFamily, ControlMessageOwned, MsgFlags, RecvMsg, |
| 15 | + SockFlag, SockType, SockaddrIn, |
| 16 | +}; |
| 17 | +use tokio::io::{copy_bidirectional, Interest}; |
| 18 | +use tokio::net::{TcpListener, TcpStream, UdpSocket}; |
13 | 19 | use tokio::select;
|
14 | 20 | use tokio::sync::mpsc;
|
15 | 21 | use tokio::task::JoinError;
|
@@ -350,29 +356,120 @@ async fn listen_udp(
|
350 | 356 | l_addr: ListenerAddr,
|
351 | 357 | _socks_addr: SocketAddr,
|
352 | 358 | ) -> Result<(), ClientError> {
|
| 359 | + let _firewall = Arc::clone(firewall); |
353 | 360 | let firewall = Arc::clone(firewall);
|
354 |
| - tokio::task::spawn_blocking(move || { |
355 |
| - // let firewall = Arc::clone(firewall); |
356 |
| - let local = UdpSocket::bind(l_addr.addr)?; |
357 |
| - local.set_nonblocking(false)?; |
358 |
| - firewall.setup_udp_socket(&local)?; |
359 |
| - std::thread::spawn(move || loop { |
| 361 | + let local = UdpSocket::bind(l_addr.addr).await?; |
| 362 | + // local.set_nonblocking(false)?; |
| 363 | + firewall.setup_udp_socket(&local)?; |
| 364 | + |
| 365 | + let _handle = tokio::spawn(async move { |
| 366 | + loop { |
| 367 | + // let firewall = Arc::clone(&firewall); |
| 368 | + // let mut buf = [0u8; 65535]; |
| 369 | + |
| 370 | + // let (len, addr) = local.recv_from(&mut buf).await.unwrap(); |
| 371 | + // let l_addr = l_addr.clone(); |
| 372 | + |
360 | 373 | let mut buf = vec![0u8; 1024];
|
361 |
| - let ioslice = IoSliceMut::new(&mut buf); |
362 |
| - let mut cmsg_buffer = vec![0u8; 24]; |
363 |
| - println!("{l_addr} UDP waiting"); |
364 |
| - let cmsg: RecvMsg<nix::sys::socket::SockAddr> = recvmsg( |
| 374 | + let mut iov = [IoSliceMut::new(&mut buf)]; |
| 375 | + |
| 376 | + let mut cmsg = cmsg_space!(libc::in6_addr); |
| 377 | + |
| 378 | + log::debug!("udp readable?"); |
| 379 | + local.readable().await.unwrap(); |
| 380 | + |
| 381 | + log::debug!("recvmesg"); |
| 382 | + let msg: Result<RecvMsg<()>, _> = recvmsg( |
365 | 383 | local.as_raw_fd(),
|
366 |
| - &mut [ioslice], |
367 |
| - Some(&mut cmsg_buffer), |
| 384 | + &mut iov, |
| 385 | + Some(&mut cmsg), |
368 | 386 | MsgFlags::empty(),
|
369 |
| - ) |
370 |
| - .unwrap(); |
371 |
| - println!("{l_addr} UDP {cmsg:?}"); |
372 |
| - }); |
373 |
| - Ok(()) |
374 |
| - }) |
375 |
| - .await? |
| 387 | + ); |
| 388 | + log::debug!("recvmsg: {msg:?}", msg = msg); |
| 389 | + |
| 390 | + let msg = match msg { |
| 391 | + Ok(msg) => msg, |
| 392 | + Err(Errno::EAGAIN) => { |
| 393 | + continue; |
| 394 | + } |
| 395 | + Err(err) => { |
| 396 | + log::error!("recvmsg failed: {err}"); |
| 397 | + continue; |
| 398 | + } |
| 399 | + }; |
| 400 | + |
| 401 | + for cmsg in msg.cmsgs() { |
| 402 | + match cmsg { |
| 403 | + ControlMessageOwned::Ipv4RecvOrigDstAddr(addr) => { |
| 404 | + println!("IPv4 {addr:?}"); |
| 405 | + } |
| 406 | + ControlMessageOwned::Ipv6RecvOrigDstAddr(addr) => { |
| 407 | + println!("IPv6 {addr:?}"); |
| 408 | + } |
| 409 | + _ => panic!("unexpected additional control msg"), |
| 410 | + } |
| 411 | + } |
| 412 | + } |
| 413 | + }); |
| 414 | + Ok(()) |
| 415 | + |
| 416 | + // use nix::sys::socket::sockopt::Ipv4RecvOrigDstAddr; |
| 417 | + // let s: SockaddrIn = "127.0.0.1:12300".parse().unwrap(); |
| 418 | + // let receive = socket( |
| 419 | + // AddressFamily::Inet, |
| 420 | + // SockType::Datagram, |
| 421 | + // SockFlag::empty(), |
| 422 | + // None, |
| 423 | + // ) |
| 424 | + // .expect("receive socket failed"); |
| 425 | + // setsockopt(receive, IpTransparent, &true).unwrap(); |
| 426 | + // bind(receive, &s).expect("bind failed"); |
| 427 | + // // let sa: SockaddrIn = getsockname(receive).expect("getsockname failed"); |
| 428 | + // setsockopt(receive, Ipv4RecvOrigDstAddr, &true).expect("setsockopt IP_RECVDSTADDR failed"); |
| 429 | + // // let value = 1u8; |
| 430 | + // // let value_ptr: *const libc::c_void = &value as *const u8 as *const libc::c_void; |
| 431 | + // // unsafe { |
| 432 | + // // libc::setsockopt( |
| 433 | + // // receive, |
| 434 | + // // libc::IPPROTO_IP, |
| 435 | + // // libc::IP_RECVORIGDSTADDR, |
| 436 | + // // value_ptr, |
| 437 | + // // std::mem::size_of::<u8>() as u32, |
| 438 | + // // ) |
| 439 | + // // }; |
| 440 | + |
| 441 | + // tokio::spawn(async move { |
| 442 | + // loop { |
| 443 | + // // let iov = IoSliceMut::new(&mut buf); |
| 444 | + // // let mut cmsg = vec![0u8; 48]; |
| 445 | + // let l_addr = l_addr.clone(); |
| 446 | + // println!("{l_addr} UDP waiting"); |
| 447 | + // let _: Result<_, ClientError> = tokio::task::spawn_blocking(move || { |
| 448 | + // let mut buf = vec![0u8; 1024]; |
| 449 | + // let mut iov = [IoSliceMut::new(&mut buf)]; |
| 450 | + |
| 451 | + // let mut cmsg = cmsg_space!(libc::in_addr); |
| 452 | + // let msg: RecvMsg<()> = |
| 453 | + // recvmsg(receive, &mut iov, Some(&mut cmsg), MsgFlags::empty()).unwrap(); |
| 454 | + // for cmsg in msg.cmsgs() { |
| 455 | + // match cmsg { |
| 456 | + // ControlMessageOwned::Ipv4RecvOrigDstAddr(addr) => { |
| 457 | + // println!("{addr:?}"); |
| 458 | + // } |
| 459 | + // _ => panic!("unexpected additional control msg"), |
| 460 | + // } |
| 461 | + // } |
| 462 | + // println!("{l_addr} UDP {msg:?}"); |
| 463 | + // Ok(()) |
| 464 | + // }) |
| 465 | + // .await |
| 466 | + // .unwrap(); |
| 467 | + // } |
| 468 | + // }); |
| 469 | + // // }) |
| 470 | + // // .await |
| 471 | + // // .unwrap(); |
| 472 | + // Ok(()) |
376 | 473 | }
|
377 | 474 |
|
378 | 475 | async fn handle_tcp_client(
|
|
0 commit comments