Transforms UDP stream into (fake) TCP streams that can go through Layer 3 & Layer 4 (NAPT) firewalls/NATs.

Overview

Phantun

A lightweight and fast UDP to TCP obfuscator.

Table of Contents

Latest release

v0.2.1

Overview

Phanton is a project that obfuscated UDP packets into TCP connections. It aims to achieve maximum performance with minimum processing and encapsulation overhead.

It is commonly used in environments where UDP is blocked/throttled but TCP is allowed through.

Phanton simply converts a stream of UDP packets into obfuscated TCP stream packets. The TCP stack used by Phantun is designed to pass through most L3/L4 stateful/stateless firewalls/NAT devices. It will not be able to pass through L7 proxies. However, the advantage of this approach is that none of the common UDP over TCP performance killer such as retransmissions and flow control will occur. The underlying UDP properties such as out-of-order delivery are fully preserved even if the connection ends up looking like a TCP connection from the perspective of firewalls/NAT devices.

Phantun means Phantom TUN, as it is an obfuscator for UDP traffic that does just enough work to make it pass through stateful firewall/NATs as TCP packets.

Traffic flow diagram

Usage

For the example below, it is assumed that Phantun Server listens for incoming Phantun Client connections at port 4567 (the --local option for server), and it forwards UDP packets to UDP server at 127.0.0.1:1234 (the --remote option for server).

It is also assumed that Phantun Client listens for incoming UDP packets at 127.0.0.1:1234 (the --local option for client) and connects to Phantun Server at 10.0.0.1:4567 (the --remote option for client).

Phantun creates TUN interface for both the Client and Server. For Client, Phantun assigns itself the IP address 192.168.200.2 by default and for Server, it assigns 192.168.201.2 by default. Therefore, your Kernel must have net.ipv4.ip_forward enabled and setup appropriate iptables rules for NAT between your physical NIC address and Phantun's TUN interface address.

You may customize the name of Tun interface created by Phantun and the assigned addresses. Please run the executable with -h options to see how to change them.

Another way to help understand this network topology:

Phantun Client is like a machine with private IP address (192.168.200.2) behind a router. In order for it to reach the Internet, you will need to SNAT the private IP address before it's traffic leaves the NIC.

Phantun Server is like a server with private IP address (192.168.201.2) behind a router. In order to access it from the Internet, you need to DNAT it's listening port on the router and change the destination IP address to where the server is listening for incoming connections.

In those cases, the machine/iptables running Phantun acts as the "router" that allows Phantun to communicate with outside using it's private IP addresses.

Back to TOC

1. Enable Kernel IP forwarding

Edit /etc/sysctl.conf, add net.ipv4.ip_forward=1 and run sudo sysctl -p /etc/sysctl.conf.

Back to TOC

2. Add required firewall rules

Client

Client simply need SNAT enabled on the physical interface to translate Phantun's address into one that can be used on the physical network. This can be done simply with masquerade.

Note: change eth0 to whatever actual physical interface name is

Back to TOC

Using nftables

table inet nat {
    chain postrouting {
        type nat hook postrouting priority srcnat; policy accept;
        iifname tun0 oif eth0 masquerade
    }
}

Back to TOC

Using iptables

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Back to TOC

Server

Server needs to DNAT the TCP listening port to Phantun's TUN interface address.

Note: change eth0 to whatever actual physical interface name is and 4567 to actual TCP port number used by Phanton server

Back to TOC

Using nftables

table ip nat {
    chain prerouting {
        type nat hook prerouting priority dstnat; policy accept;
        iif eth0 tcp dport 4567 dnat to 192.168.201.2
    }
}

Back to TOC

Using iptables

iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 4567 -j DNAT --to-destination 192.168.201.2

Back to TOC

3. Run Phantun binaries as non-root (Optional)

It is ill-advised to run network facing applications as root user. Phantun can be run fully as non-root user with the cap_net_admin capability.

sudo setcap cap_net_admin=+pe phantun_server
sudo setcap cap_net_admin=+pe phantun_client

Back to TOC

4. Start Phantun daemon

Note: Run Phantun executable with -h option to see full detailed options.

Server

Note: 4567 is the TCP port Phantun should listen on and must corresponds to the DNAT rule specified above. 127.0.0.1:1234 is the UDP Server to connect to for new connections.

RUST_LOG=info /usr/local/bin/phantun_server --local 4567 --remote 127.0.0.1:1234

Back to TOC

Client

Note: 127.0.0.1:1234 is the UDP address and port Phantun should listen on. 10.0.0.1:4567 is the Phantun Server to connect.

RUST_LOG=info /usr/local/bin/phantun_client --local 127.0.0.1:1234 --remote 10.0.0.1:4567

Back to TOC

MTU overhead

Phantun aims to keep tunneling overhead to the minimum. The overhead compared to a plain UDP packet is the following:

Standard UDP packet: 20 byte IP header + 8 byte UDP header = 28 bytes

Phantun obfuscated UDP packet: 20 byte IP header + 20 byte TCP header = 40 bytes

Note that Phantun does not add any additional header other than IP and TCP headers in order to pass through stateful packet inspection!

Phantun's additional overhead: 12 bytes. I other words, when using Phantun, the usable payload for UDP packet is reduced by 12 bytes. This is the minimum overhead possible when doing such kind of obfuscation.

Back to TOC

MTU calculation for WireGuard

For people who use Phantun to tunnel WireGuard® UDP packets, here are some guidelines on figuring out the correct MTU to use for your WireGuard interface.

WireGuard MTU = MAX_OF_16(Interface MTU - IP header (20 bytes) - TCP header (20 bytes) - WireGuard overhead (32 bytes))

Where:

MAX_OF_16 takes an input integer and calculates the maximum multiple of 16 not exceeding the input. This is needed because WireGuard will always pad it's payloads to multiple of 16 bytes.

For example, for a Ethernet interface with 1500 bytes MTU, the WireGuard interface MTU should be set as:

MAX_OF_16(1500 - 20 - 20 - 32) = 1424 bytes

The resulted Phantun TCP data packet will be 1424 + 20 + 20 + 32 = 1496 bytes which does not exceed the interface MTU of 1500.

Back to TOC

Version compatibility

While the TCP stack is fairly stable, the general expectation is that you should run same minor versions of Server/Client of Phantun on both ends to ensure maximum compatibility.

Back to TOC

Performance

Performance was tested on AWS t3.xlarge instance with 4 vCPUs and 5 Gb/s NIC. WireGuard was used for tunneling TCP/UDP traffic between two test instances and MTU has been tuned to avoid fragmentation.

WireGuard WireGuard + Phantun WireGuard + udp2raw (cipher-mode=none auth-mode=none disable-anti-replay)
iperf3 -c IP -R 1.56 Gbit/s 540 Mbit/s 369 Mbit/s
iperf3 -c IP 1.71 Gbit/s 519 Mbit/s 312 Mbit/s

Back to TOC

Future plans

  • IPv6 support
  • Load balancing a single UDP stream into multiple TCP streams
  • Integration tests
  • Auto insertion/removal of required firewall rules

Back to TOC

Compariation to udp2raw

udp2raw is another popular project by @wangyu- that is very similar to what Phantun can do. In fact I took inspirations of Phantun from udp2raw. The biggest reason for developing Phanton is because of lack of performance when running udp2raw (especially on multi-core systems such as Raspberry Pi). However, the goal is never to be as feature complete as udp2raw and only support the most common use cases. Most notably, UDP over ICMP and UDP over UDP mode are not supported and there is no anti-replay nor encryption support. The benefit of this is much better performance overall and less MTU overhead because lack of additional headers inside the TCP payload.

Here is a quick overview of comparison between those two to help you choose:

Phantun udp2raw
UDP over FakeTCP obfuscation
UDP over ICMP obfuscation
UDP over UDP obfuscation
Multi-threaded
Throughput Better Good
Raw IP mode TUN interface Raw sockets + BPF
Tunneling MTU overhead 12 bytes 44 bytes
Seprate TCP connections for each UDP connection Client/Server Server only
Anti-replay, encryption
IPv6 Planned

Back to TOC

License

Copyright 2021 Datong Sun [email protected]

Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or https://www.apache.org/licenses/LICENSE-2.0> or the MIT license <LICENSE-MIT or https://opensource.org/licenses/MIT>, at your option. Files in the project may not be copied, modified, or distributed except according to those terms.

Back to TOC

Comments
  • How to use?

    How to use?

    I have read ur program instructions but I can't understand is this a tunnel or a vpn?The server why has subnet?If just a tunnel,I just need 2 ports not a subnet address.If I need a VPN,I will create by myself.

    opened by Handsome1080P 14
  • 关于 ARM5版本的问题

    关于 ARM5版本的问题

    因为需要用在 ARM5的机器上 所以自己尝试透过Docker 版本的 RUST编译了 ARM5 的版本 不过执行时却出现问题了

    ./phantun_client_arm5 -help Phantun Client 0.2.2 Datong Sun (github.com/dndx)

    USAGE: phantun_client_arm5 [OPTIONS] --local IP:PORT --remote IP:PORT

    FLAGS: -h, --help Prints help information -V, --version Prints version information

    OPTIONS: -l, --local IP:PORT Sets the IP and port where Phantun Client listens for incoming UDP datagrams, IPv6 address need to be specified as: "[IPv6]:PORT" -r, --remote IP:PORT Sets the address and port where Phantun Client connects to Phantun Server --tun Sets the Tun interface name, if absent, pick the next available name [default: ] --tun-local Sets the Tun interface local address (O/S's end) [default: 192.168.200.1] --tun-peer Sets the Tun interface destination (peer) address (Phantun Client's end). You will need to setup SNAT/MASQUERADE rules on your Internet facing interface in order for Phantun Client to connect to Phantun Server [default: 192.168.200.2]

    这样看起来似乎正常 不过加上设置后就会出现如下问题

    RUST_BACKTRACE=1 ./phantun_client_arm5 --local 127.0.0.1:8444 --remote 127.0.0.1:8443

    thread 'main' panicked at 'called Result::unwrap() on an Err value: EBADF', phantun/src/bin/client.rs:124:10 stack backtrace: 0: rust_begin_unwind at /rustc/09c42c45858d5f3aedfa670698275303a3d19afa/library/std/src/panicking.rs:517:5 1: core::panicking::panic_fmt at /rustc/09c42c45858d5f3aedfa670698275303a3d19afa/library/core/src/panicking.rs:101:14 2: core::result::unwrap_failed at /rustc/09c42c45858d5f3aedfa670698275303a3d19afa/library/core/src/result.rs:1617:5 3: <core::future::from_generator::GenFuture as core::future::future::Future>::poll 4: tokio::park::thread::CachedParkThread::block_on 5: tokio::runtime::thread_pool::ThreadPool::block_on 6: tokio::runtime::Runtime::block_on 7: client::main note: Some details are omitted, run with RUST_BACKTRACE=full for a verbose backtrace.

    RUST_BACKTRACE=1 ./phantun_server_arm5 --local 8444 --remote 127.0.0.1:8443

    thread 'main' panicked at 'called Result::unwrap() on an Err value: EBADF', phantun/src/bin/server.rs:98:10 stack backtrace: 0: rust_begin_unwind at /rustc/09c42c45858d5f3aedfa670698275303a3d19afa/library/std/src/panicking.rs:517:5 1: core::panicking::panic_fmt at /rustc/09c42c45858d5f3aedfa670698275303a3d19afa/library/core/src/panicking.rs:101:14 2: core::result::unwrap_failed at /rustc/09c42c45858d5f3aedfa670698275303a3d19afa/library/core/src/result.rs:1617:5 3: <core::future::from_generator::GenFuture as core::future::future::Future>::poll 4: tokio::park::thread::CachedParkThread::block_on 5: tokio::runtime::thread_pool::ThreadPool::block_on 6: tokio::runtime::Runtime::block_on 7: server::main note: Some details are omitted, run with RUST_BACKTRACE=full for a verbose backtrace.

    请问是编译时 有特殊设置吗 ??? 同时还编译了 arm64 跟 amd64版本似乎没有这样的问题

    谢谢

    opened by jojo147 12
  • TCP SYN 之后只返回RST

    TCP SYN 之后只返回RST

    相同配置在本地两台虚拟机测试成功,在vps上失败了 抓包看到每个SYN包后面都是返回RST RUST_LOG=debug 服务端无任何报错 客户端报 fake_tcp > Sent SYN to server fake_tcp > Fake TCP connection to (Fake TCP connection from xxx to xxx) closed ERROR client > Unable to connect to remote xxx

    附上服务端抓包 WeChatf581fee41b99f302318ab48dcaad803c

    麻烦作者看看

    opened by Drmengduo 11
  • 作者,你好

    作者,你好

    作者,您好,我不懂软件开发,英语也不好,所以在这里中文提问了: 环境 服务端 phantun_server:tcp 5678 ,wireguard 8.6.8.x,UDP1234 rockylinux 客户端 NAT后面 debian11 软件版本 2.2.2 目标:打算替换udp2raw,做个亲自对比并运用。

    问题:请问是否是不支持NAT ? 或者还有什么注意事项? phantun_server -l 5678 -r 8.6.8.X:1234 --tun-local 192.168.201.1 --tun-peer 192.168.201.2 ​& phantun_client -l 127.0.0.1:1234 -r 8.6.8.X:5678 --tun-local 192.168.201.2 --tun-peer 192.168.201.1 & ping不通对方,这个TCP隧道没有起来啊。 还有如果不设置的话,客户端默认地址是 192.168.200.1,不知是否影响?但理论上点对点线路是不会影响的。

    客户端到服务端路由:

    1. 172.16.0.1 (家庭网关 NAT 1 )
    2. 10.75.0.1 (移动加宽 NAT 1)
    3. 183.224.89.133
    4. 省略 若干 8.6.8.x
    opened by xiaoun001 10
  • Client log:Unknown TCP packages

    Client log:Unknown TCP packages

    Client got a lot of this logs,I don't know it's normal or not.

    INFO fake_tcp > Unknown TCP packet from 10.221.0.1:30289, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:29569, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:52463, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:35476, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:60392, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:63529, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:34216, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:58855, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:26415, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:51151, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:36858, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:19034, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST INFO fake_tcp > Unknown TCP packet from 10.221.0.1:37892, sending RST

    opened by Handsome1080P 9
  • Can't access network with Wireguard

    Can't access network with Wireguard

    Client Log below:

    INFO fake_tcp > Unknown TCP packet from 10.230.0.1:772, sending RST

    Commands below:

    Phantun Server: phantun_server -l 18104 -r 127.0.0.1:100 --tun phan0 --tun-local 10.210.0.1 --tun-peer 10.210.0.2 -A PREROUTING -i enp1s0 -p tcp -m tcp --dport 18104 -j DNAT --to-destination 10.210.0.2 Phantun Client: phantun_client -l 127.0.0.1:60000 -r Server_ip:18104 --tun phan0 --tun-local 10.230.0.1 --tun-peer 10.230.0.2 Wireguard mtu : 1428

    remove Phantun or use Tinyfecvpn instead Wireguard can direct connect the network.

    opened by Handsome1080P 8
  • 关于难连接问题

    关于难连接问题

    网络状态不太好 所以好像连接挺难的 总是无尽的以下错误

    有时候连接上了测试时又挺稳的不会断线 不过只要我故意重起程序 再重连时就又开始无尽的错误 很难连接上

    我用的是这个 HyNetwork/hysteria 有时候用GOST的 QUIC 似乎又稍微容易连接上一些 不知道关于连接的能力是否还有改进的空间 ???

    ERROR client > Unable to connect to remote 149.XX.XX.XX:444 INFO client > New UDP client from 127.0.0.1:40909 INFO fake_tcp > Sent SYN to server INFO fake_tcp > Connection to 149.XX.XX.XX:8444 established DEBUG client > inserted fake TCP socket into connection table INFO client > New UDP client from 127.0.0.1:49867 INFO fake_tcp > Sent SYN to server ERROR client > Unable to send UDP packet to Connection refused (os error 111): 127.0.0.1:40909, closing connection INFO fake_tcp > Fake TCP connection to (Fake TCP connection from 192.168.200.2:3524 to 149.28.20.37:8444) closed INFO fake_tcp > Connection to 149.XX.XX.XX:444 established DEBUG client > inserted fake TCP socket into connection table INFO client > New UDP client from 127.0.0.1:16516 INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Fake TCP connection to (Fake TCP connection from 192.168.200.2:11017 to 149.28.20.37:8444) closed ERROR client > Unable to connect to remote 149.XX.XX.XX:444 INFO client > New UDP client from 127.0.0.1:16516 INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Fake TCP connection to (Fake TCP connection from 192.168.200.2:33706 to 149.28.20.37:8444) closed ERROR client > Unable to connect to remote 149.XX.XX.XX:444 INFO client > New UDP client from 127.0.0.1:16516 INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Fake TCP connection to (Fake TCP connection from 192.168.200.2:5296 to 149.28.20.37:8444) closed ERROR client > Unable to connect to remote 149.XX.XX.XX:444 INFO client > New UDP client from 127.0.0.1:16516 INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Fake TCP connection to (Fake TCP connection from 192.168.200.2:63355 to 149.28.20.37:8444) closed ERROR client > Unable to connect to remote 149.XX.XX.XX:444 INFO client > New UDP client from 127.0.0.1:16516 INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Fake TCP connection to (Fake TCP connection from 192.168.200.2:36133 to 149.28.20.37:8444) closed ERROR client > Unable to connect to remote 149.XX.XX.XX:444 INFO client > New UDP client from 127.0.0.1:16516 INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Sent SYN to server INFO fake_tcp > Waiting for SYN + ACK timed out INFO fake_tcp > Fake TCP connection to (Fake TCP connection from 192.168.200.2:20901 to 149.28.20.37:8444) closed

    另外提一点 LOG 能显示时间吗 ??? 看 LOG 没时间 有时候有点蒙 谢谢作者

    opened by jojo147 8
  • Client local_IPV6 and Peer_IPV6 Address wont be set

    Client local_IPV6 and Peer_IPV6 Address wont be set

    I already set the static ipv6 addresses for Phantun_Client to aviod the conflictions.But seems the addresses not set in the tunnel nic,check the pics below. 2.png 1.png

    opened by Handsome1080P 6
  • phantun_aarch64-unknown-linux-musl-v0.6.0 Run an error on OpenWRT

    phantun_aarch64-unknown-linux-musl-v0.6.0 Run an error on OpenWRT

    Run this code 1: RUST_LOG=info ./phantun_client -4 -l 127.0.0.1:10086 -r 13.250.8.233:80 INFO client > Remote address is: 13.250.8.233:80 INFO client > 2 cores available thread 'main' panicked at 'called Result::unwrap() on an Err value: EBADF', phantun/src/bin/client.rs:162:10 note: run with RUST_BACKTRACE=1 environment variable to display a backtrace

    Run this code 2: RUST_BACKTRACE=1 ./phantun_client -4 -l 127.0.0.1:10086 -r 13.250.8.233:80 thread 'main' panicked at 'called Result::unwrap() on an Err value: EBADF', phantun/src/bin/client.rs:162:10 stack backtrace: 0: rust_begin_unwind at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:584:5 1: core::panicking::panic_fmt at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panicking.rs:142:14 2: core::result::unwrap_failed at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/result.rs:1814:5 3: client::main::{{closure}} 4: std::thread::local::LocalKey::with 5: tokio::park::thread::CachedParkThread::block_on 6: tokio::runtime::scheduler::multi_thread::MultiThread::block_on 7: tokio::runtime::Runtime::block_on 8: client::main note: Some details are omitted, run with RUST_BACKTRACE=full for a verbose backtrace.

    Run this code 3: RUST_BACKTRACE=full ./phantun_client -4 -l 127.0.0.1:10086 -r 13.250.8.233:80 thread 'main' panicked at 'called Result::unwrap() on an Err value: EBADF', phantun/src/bin/client.rs:162:10 stack backtrace: 0: 0x5431c0 - std::backtrace_rs::backtrace::libunwind::trace::hc7f0777a5f98ea61 at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5 1: 0x5431c0 - std::backtrace_rs::backtrace::trace_unsynchronized::h16d5d28ebad2ef9c at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5 2: 0x5431c0 - std::sys_common::backtrace::_print_fmt::he5d66cd5b0c387ae at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/sys_common/backtrace.rs:66:5 3: 0x5431c0 - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h2986bd11e6976a92 at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/sys_common/backtrace.rs:45:22 4: 0x5756e8 - core::fmt::write::h4001b417f200fba8 at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/fmt/mod.rs:1198:17 5: 0x53e598 - std::io::Write::write_fmt::h9c94ed5e50af2aea at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/io/mod.rs:1672:15 6: 0x5448a8 - std::sys_common::backtrace::_print::hecdf21887b334bab at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/sys_common/backtrace.rs:48:5 7: 0x5448a8 - std::sys_common::backtrace::print::hc1db74787194746c at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/sys_common/backtrace.rs:35:9 8: 0x5448a8 - std::panicking::default_hook::{{closure}}::h16cd2a13dc4430bc at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:295:22 9: 0x544518 - std::panicking::default_hook::h760d3cc45a923e5c at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:314:9 10: 0x544f18 - std::panicking::rust_panic_with_hook::h7f7e8e586ddcd9ff at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:698:17 11: 0x544cf4 - std::panicking::begin_panic_handler::{{closure}}::h044659f762aeb6c9 at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:588:13 12: 0x5436a4 - std::sys_common::backtrace::__rust_end_short_backtrace::h37aac26d6fb4cc8d at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/sys_common/backtrace.rs:138:18 13: 0x544a40 - rust_begin_unwind at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:584:5 14: 0x4094f8 - core::panicking::panic_fmt::ha2e05dc1b43eec3c at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/panicking.rs:142:14 15: 0x40959c - core::result::unwrap_failed::hd730db48eca41c86 at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/result.rs:1814:5 16: 0x43024c - client::main::{{closure}}::h12005f424d8eb8ba 17: 0x41e164 - std::thread::local::LocalKey::with::h3e788c5fef3896e2 18: 0x410c9c - tokio::park::thread::CachedParkThread::block_on::hd1cc49d6437ef028 19: 0x425f04 - tokio::runtime::scheduler::multi_thread::MultiThread::block_on::h623e058925af9056 20: 0x41d048 - tokio::runtime::Runtime::block_on::h2089b0b88b7274e9 21: 0x4172fc - client::main::hb35e5799adbaa71f 22: 0x410f5c - std::sys_common::backtrace::__rust_begin_short_backtrace::ha521dbc240a65474 23: 0x4124d4 - std::rt::lang_start::{{closure}}::h3a8d0e501e1c6868 24: 0x5397d8 - core::ops::function::impls::<impl core::ops::function::FnOnce for &F>::call_once::he7927d6f7463b77d at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/core/src/ops/function.rs:280:13 25: 0x5397d8 - std::panicking::try::do_call::hea7f200984950f46 at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:492:40 26: 0x5397d8 - std::panicking::try::h51f13112c87eb59c at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:456:19 27: 0x5397d8 - std::panic::catch_unwind::h40c6239a2b758910 at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panic.rs:137:14 28: 0x5397d8 - std::rt::lang_start_internal::{{closure}}::h4f86d114f42648ea at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/rt.rs:128:48 29: 0x5397d8 - std::panicking::try::do_call::h24ce8fc293e75eba at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:492:40 30: 0x5397d8 - std::panicking::try::h2e226ea1f7c1452e at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panicking.rs:456:19 31: 0x5397d8 - std::panic::catch_unwind::hbef768fbff75704a at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/panic.rs:137:14 32: 0x5397d8 - std::rt::lang_start_internal::h42774ad8c239ed70 at /rustc/a55dd71d5fb0ec5a6a3a9e8c27b2127ba491ce52/library/std/src/rt.rs:128:20 33: 0x4173e0 - main

    Hostname | OpenWrt -- | -- Model | Xiaomi Redmi Router AX6S Architecture | ARMv8 Processor rev 4 Target Platform | mediatek/mt7622 Firmware Version | OpenWrt 22.03.2 r19803-9a599fee93 / LuCI openwrt-22.03 branch git-22.288.45147-96ec0cd Kernel Version | 5.10.146

    opened by CTCD 5
  • Use as a standalone layer 3 tunnel

    Use as a standalone layer 3 tunnel

    This is a very specific request but assuming I don't care about encryption I wish to avoid the overhead of using a VPN tool such as WireGuard. I need to cross a firewall that only allows TCP 443 but has no other monitoring.

    I do have a working solution written in go that seems to be pretty fast but could probably use more optimization as it was my first attempt at writing Go code. If this feature request is something not on priority then could you provide some documentation for the fake-tcp library? It seems very interesting to me and should help get more performance

    opened by archit120 4
  • [Question] Is it possible to work with a P2P VPN tool(e.g. ZeroTier)?

    [Question] Is it possible to work with a P2P VPN tool(e.g. ZeroTier)?

    P2P VPN tools usually use UDP for transporting data, so I wonder if it's possible to use phantun to improve the connection quality.

    Similar issue on udp2raw: https://github.com/wangyu-/udp2raw/issues/332

    opened by hronro 4
  • Wireguard through Phantun,peers see each orther,but no internet sharing.

    Wireguard through Phantun,peers see each orther,but no internet sharing.

    Hello ,Dear all experts. I try to use Phantun in my case, I read the instructions carefully. yep,I can create two-way peer-to-peer links. But the client cannot share the server's internet service. I tried for days, but still couldn't find the root of the problem.I am so stupid.I would like to get some guidance from everyone.

    The circumstances are as follows:

    Step 1. Server (@ubuntu 22.04.1 LTS )& Client(@ubuntu 18.04.6 LTS) : net.ipv4.ip_forward=1 ---check

    Step 2. firewall rules ---check

    Server:

    server@instance:~# iptables -L -t nat -v Chain PREROUTING (policy ACCEPT 20187 packets, 806K bytes) pkts bytes target prot opt in out source destination
    102 5624 DNAT tcp -- ens3 any anywhere anywhere tcp dpt:https to:192.168.201.2

    Chain INPUT (policy ACCEPT 20187 packets, 806K bytes) pkts bytes target prot opt in out source destination

    Chain OUTPUT (policy ACCEPT 24011 packets, 2051K bytes) pkts bytes target prot opt in out source destination

    Chain POSTROUTING (policy ACCEPT 24574 packets, 2090K bytes) pkts bytes target prot opt in out source destination


    Client:

    client@instance:~# iptables -L -t nat -v Chain PREROUTING (policy ACCEPT 362 packets, 61371 bytes) pkts bytes target prot opt in out source destination

    Chain INPUT (policy ACCEPT 20187 packets, 806K bytes) pkts bytes target prot opt in out source destination

    Chain OUTPUT (policy ACCEPT 24011 packets, 2051K bytes) pkts bytes target prot opt in out source destination

    Chain POSTROUTING (policy ACCEPT 24574 packets, 2090K bytes) pkts bytes target prot opt in out source destination
    34 1496 MASQUERADE all -- any eth0 192.168.200.2 anywhere

    Step 3. Wireguard Configuration

    Server:

    [Interface] PrivateKey = Address = 10.1.1.2/32 ListenPort = 51822 MTU = 1300 PreUp = RUST_LOG=info phantun_server --local 443 --remote 127.0.0.1:51822 &> /var/log/phantun_server.log & PostDown = killall phantun_server || true

    [Peer] PublicKey = AllowedIPs = 10.1.1.1/32


    Client:

    [Interface] PrivateKey = Address = 10.1.1.1/32 MTU = 1300 PreUp = RUST_LOG=info phantun_client --local 127.0.0.1:4567 --remote :443 &> /var/log/phantun_client.log & PostDown = killall phantun_client || true

    [Peer] PublicKey = Endpoint = 127.0.0.1:4567 AllowedIPs = 10.1.1.2/32 PersistentKeepalive = 25


    Connections: peers can see each orther, ping both way is fine. But only for 10.1.1.1 or 10.1.1.2,Neither side can access the other's intranet. Server at 10.0.0.x intranet ; client at 192.168.1.x intranet.They can't get to each other's LANs. Including Internet.

    Am I missing the most basic things? Please Help me.

    opened by Kjwj 0
  • feat(fake-tcp) add TCP keep-alive support to client

    feat(fake-tcp) add TCP keep-alive support to client

    This adds TCP KeepAlive support to client. Close #30, also related to #87. Three arguments are added: keepalive-time, keepalive-interval, keepalive-retries.

    Let's say keepalive-time=300s, keepalive-interval=10s, keepalive-retries=3. This feature works like this: when the client detects that no TCP packet has arrived within 300 seconds, it will send a TCP Keep-alive packet to server. If server doesn't respond in time, the client will retry in 10 seconds. After 3 retries, the client will give up this connection. When server received the Keep-alive packet, it will immediately respond with an ACK.

    While the user application may have its own keep-alive mechanism, this feature can detect broken connections, so it is still useful to turn it on. For example, if the NAT mapping table on the router is somehow reset, packets are no longer be able to go through. Without keep alive detection, the client will not mark the connection as expired because the UDP client keeps sending packets, so the UDP client may never be able to communicate. With keep alive detection, after the client detected that the connection is not receiving data, it will actively send keep-alive packets. It knows that the connection is broken when maximum retries are reached, and it will remove the connection from its memory, so a new connection can be established. This feature will not add any extra overhead on working connections, because keep-alive packets from the user application will keep the keepalive-time timer from being triggered.

    opened by andreadaoud 0
  • Add docker support

    Add docker support

    • [x] Build with GitHub actions.
    • [x] Automatically add and remove iptables rules.
    • [x] Graceful stop.
    • [x] Add IPv6 support.

    Resolve: https://github.com/dndx/phantun/issues/71

    opened by pexcn 1
  • phantun always panicked when used in a few days

    phantun always panicked when used in a few days

    INFO client > New UDP client from 127.0.0.1:15497 INFO fake_tcp > Sent SYN to server INFO fake_tcp > Connection to xxx.xxx.xxx.xxx:xxx established INFO client > New UDP client from 127.0.0.1:63470 thread 'tokio-runtime-worker' panicked at 'assertion failed: tuples.insert(tuple, incoming.clone()).is_none()', /project/fake-tcp/src/lib.rs:425:13 note: run with RUST_BACKTRACE=1 environment variable to display a backtrace thread 'tokio-runtime-worker' panicked at 'called Result::unwrap() on an Err value: PoisonError { .. }', fake-tcp/src/lib.rs:325:44 stack backtrace: 0: 0x56c79d - std::backtrace_rs::backtrace::libunwind::trace::h081201764674ef17 at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/std/src/../../backtrace/src/backtrace/libunwind.rs:93:5 1: 0x56c79d - std::backtrace_rs::backtrace::trace_unsynchronized::hebab37398c391bd7 at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/std/src/../../backtrace/src/backtrace/mod.rs:66:5 2: 0x56c79d - std::sys_common::backtrace::_print_fmt::h301516df68ed24f9 at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/std/src/sys_common/backtrace.rs:66:5 3: 0x56c79d - <std::sys_common::backtrace::_print::DisplayBacktrace as core::fmt::Display>::fmt::h8f5170f4f03a12c0 at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/std/src/sys_common/backtrace.rs:45:22 4: 0x5a4cdc - core::fmt::write::h5dc5601e8d9f6367 at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/core/src/fmt/mod.rs:1190:17 5: 0x565e88 - std::io::Write::write_fmt::h5b19302eb99d9acf at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/std/src/io/mod.rs:1657:15 6: 0x56ebe7 - std::sys_common::backtrace::_print::hd81cf53a75c8ae6a at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/std/src/sys_common/backtrace.rs:48:5 7: 0x56ebe7 - std::sys_common::backtrace::print::hb5aa882e87c2a0dc at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/std/src/sys_common/backtrace.rs:35:9 8: 0x56ebe7 - std::panicking::default_hook::{{closure}}::had913369af61b326 at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/std/src/panicking.rs:295:22 9: 0x56e8b0 - std::panicking::default_hook::h37b06af9ee965447 at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/std/src/panicking.rs:314:9 10: 0x56f339 - std::panicking::rust_panic_with_hook::hf2019958d21362cc at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/std/src/panicking.rs:698:17 11: 0x56f027 - std::panicking::begin_panic_handler::{{closure}}::he9c06fdd592f8785 at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/std/src/panicking.rs:588:13 12: 0x56cc64 - std::sys_common::backtrace::__rust_end_short_backtrace::ha521b96560789310 at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/std/src/sys_common/backtrace.rs:138:18 13: 0x56ed39 - rust_begin_unwind at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/std/src/panicking.rs:584:5 14: 0x40c363 - core::panicking::panic_fmt::h28f1697d4e9394b4 at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/core/src/panicking.rs:143:14 15: 0x40c3f3 - core::result::unwrap_failed::hea43ef43a7a8c801 at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/core/src/result.rs:1749:5 16: 0x4c36b6 - <fake_tcp::Socket as core::ops::drop::Drop>::drop::h1a82aa2a762e6663 17: 0x42769d - core::ptr::drop_in_place<fake_tcp::Socket>::h9642bb5034846e49 18: 0x42d1d6 - client::main::{{closure}}::{{closure}}::hedb1c4db73446abe 19: 0x4108dd - tokio::runtime::task::harness::poll_future::h71e4629bb72ebffa 20: 0x40ec41 - tokio::runtime::task::harness::Harness<T,S>::poll::hd78d455ce817a0c4 21: 0x4fc9f0 - std::thread::local::LocalKey::with::h25d46ec2bd26319e 22: 0x4f3c0d - tokio::runtime::thread_pool::worker::Context::run_task::h89a72a6001d042f4 23: 0x4f2d8f - tokio::runtime::thread_pool::worker::Context::run::h902a2ffa1a9bd051 24: 0x4dea1b - tokio::macros::scoped_tls::ScopedKey::set::h60ccb18cf4ba637e 25: 0x4f280c - tokio::runtime::thread_pool::worker::run::hdaf5742befe30ba0 26: 0x4d80e1 - <tokio::runtime::blocking::task::BlockingTask as core::future::future::Future>::poll::h100ed8d5c3bf1cbf 27: 0x4d9b41 - tokio::runtime::task::harness::Harness<T,S>::poll::hbd3606d2e34d7e90 28: 0x4e2e83 - tokio::runtime::blocking::pool::Inner::run::ha389bc77b977d94f 29: 0x4e096c - std::sys_common::backtrace::__rust_begin_short_backtrace::he288b5cbf780ffc1 30: 0x4e987f - core::ops::function::FnOnce::call_once{{vtable.shim}}::he75549d8b045b827 31: 0x573043 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce>::call_once::hcf019fa04facec20 at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/alloc/src/boxed.rs:1853:9 32: 0x573043 - <alloc::boxed::Box<F,A> as core::ops::function::FnOnce>::call_once::h5cc542c486f8c3f4 at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/alloc/src/boxed.rs:1853:9 33: 0x573043 - std::sys::unix::thread::Thread::new::thread_start::h5d35ae99cebafa12 at /rustc/7737e0b5c4103216d6fd8cf941b7ab9bdbaace7c/library/std/src/sys/unix/thread.rs:108:17 thread panicked while panicking. aborting.

    opened by lzfmars 6
  • undesirable packet reordering

    undesirable packet reordering

    when running iperf3 -u (-b100m) over wireguard tunnel over phantun, I am seeing significant amounts of out-of-order packets which is problematic as it can significantly degrade performance of certain protocols notably TCP and even UDP-based applications.

    any parallel processing/queuing of packets should be done so as to avoid reordering within flows.

    https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/35247.pdf https://www.linuxzen.com/notes/notes/20220416073757-multi_queue_nics/

    opened by marcbou 3
Releases(v0.6.0)
Owner
Datong Sun
A pilot that happens to know how to code.
Datong Sun
A modern, simple TCP tunnel in Rust that exposes local ports to a remote server, bypassing standard NAT connection firewalls

bore A modern, simple TCP tunnel in Rust that exposes local ports to a remote server, bypassing standard NAT connection firewalls. That's all it does:

Eric Zhang 6.2k Dec 31, 2022
Fast User-Space TCP/UDP Stack

Catnip Catnip is a TCP/IP stack that focuses on being an embeddable, low-latency solution for user-space networking. Building and Running 1. Clone Thi

Demikernel 79 Sep 9, 2022
Rust implementation of TCP + UDP Proxy Protocol (aka. MMProxy)

mmproxy-rs A Rust implementation of MMProxy! ?? Rationale Many previous implementations only support PROXY Protocol for either TCP or UDP, whereas thi

Saikō Technology 3 Dec 29, 2022
Stream API for tokio-udp.

UDPflow Stream API for tokio-udp. TCP-like UDP stream use tokio::net::UdpSocket; use tokio::io::{AsyncReadExt, AsyncWriteExt}; use udpflow::{UdpListen

zephyr 5 Dec 2, 2022
Aggressively reliable delivery layer. Above UDP. Nothing else.

Aggressively reliable delivery layer. Above UDP. Nothing else.

IchHabeKeineNamen 2 Jun 5, 2022
Rust client for NATS, the cloud native messaging system.

A Rust client for the NATS messaging system. Status Motivation Rust may be the most interesting new language the NATS ecosystem has seen. We believe t

NATS - The Cloud Native Messaging System 651 Jan 3, 2023
chain nats.io servers with transformation & processing pipelines

NATS proxy service Simple tool to forward specific topics from one nats.io cluster to the same server or another. Provides support to process messages

Marquitos 8 Sep 19, 2022
Tunnel TCP traffic through SOCKS5 or HTTP using a TUN interface.

tun2proxy Tunnel TCP traffic through SOCKS5 or HTTP on Linux. Authentication not yet supported. Error handling incomplete and too restrictive. Build C

B. Blechschmidt 34 Nov 29, 2022
A minimalistic encryption protocol for rust async streams/packets, based on noise protocol and snow.

Snowstorm A minimalistic encryption protocol for rust async streams / packets, based on noise protocol and snow. Quickstart Snowstorm allows you to se

Black Binary 19 Nov 22, 2022
A small holepunching implementation written in Rust (UDP)

rust-udp-holepunch A small holepunching implementation written in Rust (UDP) Prerequisites Your rendezvous server must lay in a network which doesn't

Amit Katz 8 Dec 26, 2022
Test the interception/filter of UDP 53 of your local networks or hotspots.

udp53_lookup Test the interception/filter of UDP 53 of your local networks or hotspots. Inspired by BennyThink/UDP53-Filter-Type . What's the purpose?

null 1 Dec 6, 2021
Tachyon is a performant and highly parallel reliable udp library that uses a nack based model

Tachyon Tachyon is a performant and highly parallel reliable udp library that uses a nack based model. Strongly reliable Reliable fragmentation Ordere

Chris Ochs 47 Oct 15, 2022
UDP proxy with Proxy Protocol and mmproxy support

udppp UDP proxy with Proxy Protocol and mmproxy support. Features Async Support Proxy Protocol V2 SOCKET preserve client IP addresses in L7 proxies(mm

b23r0 10 Dec 18, 2022
A transparent QUIC to SOCKSv5 proxy on Linux, UDP/QUIC verison of moproxy.

quproxy A transparent QUIC to SOCKSv5 proxy on Linux, UDP/QUIC verison of moproxy. ?? WORKING IN PROGRESS ?? Features: Transparent forward QUIC to ups

Shell Chen 4 Dec 15, 2022
Quick Peer-To-Peer UDP file transfer

qft QFT is a small application for Quick (and really reliable) Peer-To-Peer UDP file transfer. If a friend sent you here... ...look at the "Releases"

Daniel H. 99 Jan 7, 2023
🦀 A bit more reliable UDP written in Rust

AckUDP [EXPERIMENTAL] A bit more reliable version of UDP written in Rust. How to use? use std::{io, thread, time::Duration}; use ack_udp::AckUdp; #[

Ivan Davydov 3 May 9, 2023
SOCKS5 implement library, with some useful utilities such as dns-query, socks5-server, dns2socks, udp-client, etc.

socks5-impl Fundamental abstractions and async read / write functions for SOCKS5 protocol and Relatively low-level asynchronized SOCKS5 server impleme

null 5 Aug 3, 2023
a smol tcp/ip stack

smoltcp smoltcp is a standalone, event-driven TCP/IP stack that is designed for bare-metal, real-time systems. Its design goals are simplicity and rob

smoltcp 2.8k Jan 4, 2023
A high performance TCP SYN port scanner.

Armada A High-Performance TCP SYN scanner What is Armada? Armada is a high performance TCP SYN scanner. This is equivalent to the type of scanning tha

resync 259 Dec 19, 2022