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