mirror of
https://github.com/aramperes/onetun.git
synced 2025-09-09 16:58:31 -04:00
Compare commits
28 commits
Author | SHA1 | Date | |
---|---|---|---|
3ca5ae2181 | |||
ac83ddbd4d | |||
17f424140d | |||
![]() |
8030ca1a2d | ||
![]() |
7eddf3f17f | ||
![]() |
bcfa43702a | ||
d0fcab38c3 | |||
c83c9ec500 | |||
caadd415cd | |||
3a89f2877d | |||
341849762c | |||
![]() |
57e6ddc74c | ||
![]() |
08d99b9d22 | ||
![]() |
2661a2d29f | ||
![]() |
6722237902 | ||
83ef02c695 | |||
89c3b59610 | |||
c6544cfe05 | |||
f75909fd8f | |||
52d1d589ac | |||
eb9c0be437 | |||
d307a11819 | |||
c4c52babae | |||
6b2f6148c6 | |||
991eef0311 | |||
0e93a6435a | |||
ca3590a4c0 | |||
784ab97c8b |
11 changed files with 363 additions and 388 deletions
10
.github/dependabot.yml
vendored
Normal file
10
.github/dependabot.yml
vendored
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
# Please see the documentation for all configuration options:
|
||||||
|
# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||||
|
|
||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "cargo"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "weekly"
|
||||||
|
rebase-strategy: "disabled"
|
4
.github/workflows/build.yml
vendored
4
.github/workflows/build.yml
vendored
|
@ -10,7 +10,7 @@ jobs:
|
||||||
matrix:
|
matrix:
|
||||||
rust:
|
rust:
|
||||||
- stable
|
- stable
|
||||||
- 1.78.0
|
- 1.80.0
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
@ -39,7 +39,7 @@ jobs:
|
||||||
matrix:
|
matrix:
|
||||||
rust:
|
rust:
|
||||||
- stable
|
- stable
|
||||||
- 1.78.0
|
- 1.80.0
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout sources
|
- name: Checkout sources
|
||||||
uses: actions/checkout@v2
|
uses: actions/checkout@v2
|
||||||
|
|
27
.github/workflows/release.yml
vendored
27
.github/workflows/release.yml
vendored
|
@ -75,20 +75,28 @@ jobs:
|
||||||
RUST_BACKTRACE: 1
|
RUST_BACKTRACE: 1
|
||||||
strategy:
|
strategy:
|
||||||
matrix:
|
matrix:
|
||||||
build: [ linux-amd64, macos-intel, windows ]
|
build: [ linux-amd64, linux-aarch64, macos-aarch64, windows ]
|
||||||
include:
|
include:
|
||||||
- build: linux-amd64
|
- build: linux-amd64
|
||||||
os: ubuntu-latest
|
os: ubuntu-latest
|
||||||
rust: stable
|
rust: stable
|
||||||
target: x86_64-unknown-linux-musl
|
target: x86_64-unknown-linux-musl
|
||||||
- build: macos-intel
|
cross: true
|
||||||
|
- build: linux-aarch64
|
||||||
|
os: ubuntu-latest
|
||||||
|
rust: stable
|
||||||
|
target: aarch64-unknown-linux-musl
|
||||||
|
cross: true
|
||||||
|
- build: macos-aarch64
|
||||||
os: macos-latest
|
os: macos-latest
|
||||||
rust: stable
|
rust: stable
|
||||||
target: x86_64-apple-darwin
|
target: aarch64-apple-darwin
|
||||||
|
cross: false
|
||||||
- build: windows
|
- build: windows
|
||||||
os: windows-2019
|
os: windows-2019
|
||||||
rust: stable
|
rust: stable
|
||||||
target: x86_64-pc-windows-msvc
|
target: x86_64-pc-windows-msvc
|
||||||
|
cross: false
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
|
@ -126,17 +134,24 @@ jobs:
|
||||||
echo "release upload url: $release_upload_url"
|
echo "release upload url: $release_upload_url"
|
||||||
|
|
||||||
- name: Build onetun binary
|
- name: Build onetun binary
|
||||||
run: cargo build --release
|
shell: bash
|
||||||
|
run: |
|
||||||
|
if [ "${{ matrix.cross }}" = "true" ]; then
|
||||||
|
cargo install cross
|
||||||
|
cross build --release --target ${{ matrix.target }}
|
||||||
|
else
|
||||||
|
cargo build --release --target ${{ matrix.target }}
|
||||||
|
fi
|
||||||
|
|
||||||
- name: Prepare onetun binary
|
- name: Prepare onetun binary
|
||||||
shell: bash
|
shell: bash
|
||||||
run: |
|
run: |
|
||||||
mkdir -p ci/assets
|
mkdir -p ci/assets
|
||||||
if [ "${{ matrix.build }}" = "windows" ]; then
|
if [ "${{ matrix.build }}" = "windows" ]; then
|
||||||
cp "target/release/onetun.exe" "ci/assets/onetun.exe"
|
cp "target/${{ matrix.target }}/release/onetun.exe" "ci/assets/onetun.exe"
|
||||||
echo "ASSET=onetun.exe" >> $GITHUB_ENV
|
echo "ASSET=onetun.exe" >> $GITHUB_ENV
|
||||||
else
|
else
|
||||||
cp "target/release/onetun" "ci/assets/onetun-${{ matrix.build }}"
|
cp "target/${{ matrix.target }}/release/onetun" "ci/assets/onetun-${{ matrix.build }}"
|
||||||
echo "ASSET=onetun-${{ matrix.build }}" >> $GITHUB_ENV
|
echo "ASSET=onetun-${{ matrix.build }}" >> $GITHUB_ENV
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
674
Cargo.lock
generated
674
Cargo.lock
generated
File diff suppressed because it is too large
Load diff
|
@ -1,6 +1,6 @@
|
||||||
[package]
|
[package]
|
||||||
name = "onetun"
|
name = "onetun"
|
||||||
version = "0.3.8"
|
version = "0.3.10"
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
description = "A cross-platform, user-space WireGuard port-forwarder that requires no system network configurations."
|
description = "A cross-platform, user-space WireGuard port-forwarder that requires no system network configurations."
|
||||||
|
@ -19,8 +19,8 @@ futures = "0.3"
|
||||||
rand = "0.8"
|
rand = "0.8"
|
||||||
nom = "7"
|
nom = "7"
|
||||||
async-trait = "0.1"
|
async-trait = "0.1"
|
||||||
priority-queue = "1.3"
|
priority-queue = "2.1"
|
||||||
smoltcp = { version = "0.11", default-features = false, features = [
|
smoltcp = { version = "0.12", default-features = false, features = [
|
||||||
"std",
|
"std",
|
||||||
"log",
|
"log",
|
||||||
"medium-ip",
|
"medium-ip",
|
||||||
|
@ -37,7 +37,7 @@ tracing = { version = "0.1", default-features = false, features = ["log"] }
|
||||||
|
|
||||||
# bin-only dependencies
|
# bin-only dependencies
|
||||||
clap = { version = "4.4.11", default-features = false, features = ["suggestions", "std", "env", "help", "wrap_help"], optional = true }
|
clap = { version = "4.4.11", default-features = false, features = ["suggestions", "std", "env", "help", "wrap_help"], optional = true }
|
||||||
pretty_env_logger = { version = "0.4", optional = true }
|
pretty_env_logger = { version = "0.5", optional = true }
|
||||||
async-recursion = "1.0"
|
async-recursion = "1.0"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
|
|
2
LICENSE
2
LICENSE
|
@ -1,6 +1,6 @@
|
||||||
MIT License
|
MIT License
|
||||||
|
|
||||||
Copyright (c) 2023 Aram Peres
|
Copyright (c) 2025 Aram Peres
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
|
|
@ -21,13 +21,13 @@ For example,
|
||||||
|
|
||||||
## Download
|
## Download
|
||||||
|
|
||||||
onetun is available to install from [crates.io](https://crates.io/crates/onetun) with Rust ≥1.78.0:
|
onetun is available to install from [crates.io](https://crates.io/crates/onetun) with Rust ≥1.80.0:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
cargo install onetun
|
cargo install onetun
|
||||||
```
|
```
|
||||||
|
|
||||||
You can also download the binary for Windows, macOS (Intel), and Linux (amd64) from
|
You can also download the binary for Windows, macOS (Apple Silicon), and Linux (amd64, arm64) from
|
||||||
the [Releases](https://github.com/aramperes/onetun/releases) page.
|
the [Releases](https://github.com/aramperes/onetun/releases) page.
|
||||||
|
|
||||||
You can also run onetun using [Docker](https://hub.docker.com/r/aramperes/onetun):
|
You can also run onetun using [Docker](https://hub.docker.com/r/aramperes/onetun):
|
||||||
|
@ -37,7 +37,7 @@ docker run --rm --name onetun --user 1000 -p 8080:8080 aramperes/onetun \
|
||||||
0.0.0.0:8080:192.168.4.2:8080 [...options...]
|
0.0.0.0:8080:192.168.4.2:8080 [...options...]
|
||||||
```
|
```
|
||||||
|
|
||||||
You can also build onetun locally, using Rust ≥1.78.0:
|
You can also build onetun locally, using Rust ≥1.80.0:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
git clone https://github.com/aramperes/onetun && cd onetun
|
git clone https://github.com/aramperes/onetun && cd onetun
|
||||||
|
@ -319,4 +319,4 @@ Please consider opening a GitHub issue if you are unsure if your contribution is
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
MIT License. See `LICENSE` for details. Copyright © 2023 Aram Peres.
|
MIT License. See `LICENSE` for details. Copyright © 2025 Aram Peres.
|
||||||
|
|
|
@ -109,11 +109,11 @@ pub struct RxToken {
|
||||||
}
|
}
|
||||||
|
|
||||||
impl smoltcp::phy::RxToken for RxToken {
|
impl smoltcp::phy::RxToken for RxToken {
|
||||||
fn consume<R, F>(mut self, f: F) -> R
|
fn consume<R, F>(self, f: F) -> R
|
||||||
where
|
where
|
||||||
F: FnOnce(&mut [u8]) -> R,
|
F: FnOnce(&[u8]) -> R,
|
||||||
{
|
{
|
||||||
f(&mut self.buffer)
|
f(&self.buffer)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ use crate::Bus;
|
||||||
use anyhow::Context;
|
use anyhow::Context;
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
|
use smoltcp::iface::PollResult;
|
||||||
use smoltcp::{
|
use smoltcp::{
|
||||||
iface::{Config, Interface, SocketHandle, SocketSet},
|
iface::{Config, Interface, SocketHandle, SocketSet},
|
||||||
socket::tcp,
|
socket::tcp,
|
||||||
|
@ -141,7 +142,7 @@ impl VirtualInterfacePoll for TcpVirtualInterface {
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if iface.poll(loop_start, &mut device, &mut self.sockets) {
|
if iface.poll(loop_start, &mut device, &mut self.sockets) == PollResult::SocketStateChanged {
|
||||||
log::trace!("TCP virtual interface polled some packets to be processed");
|
log::trace!("TCP virtual interface polled some packets to be processed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@ use crate::{Bus, PortProtocol};
|
||||||
use anyhow::Context;
|
use anyhow::Context;
|
||||||
use async_trait::async_trait;
|
use async_trait::async_trait;
|
||||||
use bytes::Bytes;
|
use bytes::Bytes;
|
||||||
|
use smoltcp::iface::PollResult;
|
||||||
use smoltcp::{
|
use smoltcp::{
|
||||||
iface::{Config, Interface, SocketHandle, SocketSet},
|
iface::{Config, Interface, SocketHandle, SocketSet},
|
||||||
socket::udp::{self, UdpMetadata},
|
socket::udp::{self, UdpMetadata},
|
||||||
|
@ -140,7 +141,7 @@ impl VirtualInterfacePoll for UdpVirtualInterface {
|
||||||
} => {
|
} => {
|
||||||
let loop_start = smoltcp::time::Instant::now();
|
let loop_start = smoltcp::time::Instant::now();
|
||||||
|
|
||||||
if iface.poll(loop_start, &mut device, &mut self.sockets) {
|
if iface.poll(loop_start, &mut device, &mut self.sockets) == PollResult::SocketStateChanged {
|
||||||
log::trace!("UDP virtual interface polled some packets to be processed");
|
log::trace!("UDP virtual interface polled some packets to be processed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
|
use std::net::{IpAddr, SocketAddr};
|
||||||
use std::time::Duration;
|
use std::time::Duration;
|
||||||
|
|
||||||
use crate::Bus;
|
use crate::Bus;
|
||||||
|
@ -253,7 +253,7 @@ impl WireGuardTunnel {
|
||||||
Ok(IpVersion::Ipv4) => Ipv4Packet::new_checked(&packet)
|
Ok(IpVersion::Ipv4) => Ipv4Packet::new_checked(&packet)
|
||||||
.ok()
|
.ok()
|
||||||
// Only care if the packet is destined for this tunnel
|
// Only care if the packet is destined for this tunnel
|
||||||
.filter(|packet| Ipv4Addr::from(packet.dst_addr()) == self.source_peer_ip)
|
.filter(|packet| packet.dst_addr() == self.source_peer_ip)
|
||||||
.and_then(|packet| match packet.next_header() {
|
.and_then(|packet| match packet.next_header() {
|
||||||
IpProtocol::Tcp => Some(PortProtocol::Tcp),
|
IpProtocol::Tcp => Some(PortProtocol::Tcp),
|
||||||
IpProtocol::Udp => Some(PortProtocol::Udp),
|
IpProtocol::Udp => Some(PortProtocol::Udp),
|
||||||
|
@ -263,7 +263,7 @@ impl WireGuardTunnel {
|
||||||
Ok(IpVersion::Ipv6) => Ipv6Packet::new_checked(&packet)
|
Ok(IpVersion::Ipv6) => Ipv6Packet::new_checked(&packet)
|
||||||
.ok()
|
.ok()
|
||||||
// Only care if the packet is destined for this tunnel
|
// Only care if the packet is destined for this tunnel
|
||||||
.filter(|packet| Ipv6Addr::from(packet.dst_addr()) == self.source_peer_ip)
|
.filter(|packet| packet.dst_addr() == self.source_peer_ip)
|
||||||
.and_then(|packet| match packet.next_header() {
|
.and_then(|packet| match packet.next_header() {
|
||||||
IpProtocol::Tcp => Some(PortProtocol::Tcp),
|
IpProtocol::Tcp => Some(PortProtocol::Tcp),
|
||||||
IpProtocol::Udp => Some(PortProtocol::Udp),
|
IpProtocol::Udp => Some(PortProtocol::Udp),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue