Commit 3af88eb4 authored by nanamicat's avatar nanamicat

it works

parent c04b3737
...@@ -328,12 +328,6 @@ version = "1.0.14" ...@@ -328,12 +328,6 @@ version = "1.0.14"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674" checksum = "d75a2a4b1b190afb6f5425f10f6a8f959d2ea0b9c2b1d79553551850539e4674"
[[package]]
name = "lazy_static"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.167" version = "0.2.167"
...@@ -671,9 +665,7 @@ dependencies = [ ...@@ -671,9 +665,7 @@ dependencies = [
"crossbeam", "crossbeam",
"crossbeam-utils", "crossbeam-utils",
"grouping_by", "grouping_by",
"lazy_static",
"pnet", "pnet",
"pnet_macros",
"serde", "serde",
"serde_json", "serde_json",
"socket2", "socket2",
......
...@@ -7,11 +7,9 @@ edition = "2021" ...@@ -7,11 +7,9 @@ edition = "2021"
tun = "0.7" tun = "0.7"
socket2 = { version = "0.5.8", features = ["all"] } socket2 = { version = "0.5.8", features = ["all"] }
pnet = "0.35.0" pnet = "0.35.0"
pnet_macros = "0.35.0"
serde = { version = "1.0.217", features = ["derive"] } serde = { version = "1.0.217", features = ["derive"] }
serde_json = "1.0" serde_json = "1.0"
base64 = "0.22.1" base64 = "0.22.1"
lazy_static = "1.5.0"
crossbeam = "0.8.4" crossbeam = "0.8.4"
crossbeam-utils = "0.8.20" crossbeam-utils = "0.8.20"
grouping_by = "0.2.2" grouping_by = "0.2.2"
...@@ -2,19 +2,19 @@ FROM rust:alpine as builder ...@@ -2,19 +2,19 @@ FROM rust:alpine as builder
RUN apk add --no-cache musl-dev RUN apk add --no-cache musl-dev
WORKDIR /usr/src/app WORKDIR /usr/src/app
COPY Cargo.* . COPY Cargo.toml Cargo.lock ./
RUN mkdir src && \ RUN mkdir src && \
echo 'fn main() {}' > src/main.rs && \ echo 'fn main() {}' > src/main.rs && \
cargo build && \ cargo build --release && \
cargo clean --package $(awk '/name/ {gsub(/"/,""); print $3}' Cargo.toml | sed ':a;N;$!ba;s/\n//g' | tr -d '\r') && \ cargo clean --package $(awk '/name/ {gsub(/"/,""); print $3}' Cargo.toml | sed ':a;N;$!ba;s/\n//g' | tr -d '\r') && \
rm -rf src rm -rf src
COPY . . COPY src src
RUN cargo install --path . RUN cargo build --release
FROM alpine FROM alpine
RUN apk --no-cache add libgcc libstdc++ bash iproute2 iptables iptables-legacy ipset netcat-openbsd jq RUN apk --no-cache add libgcc libstdc++ bash iproute2 iptables iptables-legacy ipset netcat-openbsd jq
COPY --from=builder /usr/local/cargo/bin/tun1 /usr/local/bin/tun COPY --from=builder /usr/src/app/target/release/tun1 /usr/local/bin/tun
COPY ./entrypoint.sh /entrypoint.sh COPY ./entrypoint.sh /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"] ENTRYPOINT ["/entrypoint.sh"]
......
...@@ -16,9 +16,9 @@ pub struct Meta { ...@@ -16,9 +16,9 @@ pub struct Meta {
pub reversed: u16, pub reversed: u16,
} }
use serde::{Deserialize, Serialize}; use serde::Deserialize;
#[derive(Debug, Serialize, Deserialize)] #[derive(Deserialize)]
pub struct ConfigRouter { pub struct ConfigRouter {
pub remote_id: u8, pub remote_id: u8,
pub proto: i32, pub proto: i32,
...@@ -30,7 +30,7 @@ pub struct ConfigRouter { ...@@ -30,7 +30,7 @@ pub struct ConfigRouter {
pub up: String, pub up: String,
} }
#[derive(Debug, Serialize, Deserialize)] #[derive(Deserialize)]
pub struct Config { pub struct Config {
pub local_id: u8, pub local_id: u8,
pub local_secret: String, pub local_secret: String,
...@@ -42,7 +42,7 @@ use pnet::packet::ipv4::Ipv4Packet; ...@@ -42,7 +42,7 @@ use pnet::packet::ipv4::Ipv4Packet;
use socket2::Socket; use socket2::Socket;
fn main() -> Result<(), Box<dyn Error>> { fn main() -> Result<(), Box<dyn Error>> {
let config: Config = serde_json::from_str(env::args().nth(0).ok_or("need param")?.as_str())?; let config: Config = serde_json::from_str(env::args().nth(1).ok_or("need param")?.as_str())?;
let local_secret: [u8; SECRET_LENGTH] = Router::create_secret(config.local_secret.as_str())?; let local_secret: [u8; SECRET_LENGTH] = Router::create_secret(config.local_secret.as_str())?;
let mut sockets: HashMap<u16, Arc<Socket>> = HashMap::new(); let mut sockets: HashMap<u16, Arc<Socket>> = HashMap::new();
...@@ -97,7 +97,7 @@ fn main() -> Result<(), Box<dyn Error>> { ...@@ -97,7 +97,7 @@ fn main() -> Result<(), Box<dyn Error>> {
if let Some(ref addr) = *router.endpoint.read().unwrap() { if let Some(ref addr) = *router.endpoint.read().unwrap() {
router.encrypt(&mut buffer[meta_size..meta_size + n]); router.encrypt(&mut buffer[meta_size..meta_size + n]);
#[cfg(target_os = "linux")] #[cfg(target_os = "linux")]
router.socket.set_mark(router.config.mark); let _ = router.socket.set_mark(router.config.mark)?;
let _ = router.socket.send_to(&buffer[..meta_size + n], addr); let _ = router.socket.send_to(&buffer[..meta_size + n], addr);
} }
} }
...@@ -114,11 +114,17 @@ fn main() -> Result<(), Box<dyn Error>> { ...@@ -114,11 +114,17 @@ fn main() -> Result<(), Box<dyn Error>> {
let packet = Ipv4Packet::new(data).ok_or("malformed packet")?; let packet = Ipv4Packet::new(data).ok_or("malformed packet")?;
let header_len = packet.get_header_length() as usize * 4; let header_len = packet.get_header_length() as usize * 4;
let (_ip_header, rest) = data.split_at_mut_checked(header_len).ok_or("malformed packet")?; let (_ip_header, rest) = data
let (meta_bytes, payload) = rest.split_at_mut_checked(size_of::<Meta>()).ok_or("malformed packet")?; .split_at_mut_checked(header_len)
.ok_or("malformed packet")?;
let (meta_bytes, payload) = rest
.split_at_mut_checked(size_of::<Meta>())
.ok_or("malformed packet")?;
let meta: &Meta = unsafe { transmute(meta_bytes.as_ptr()) }; let meta: &Meta = unsafe { transmute(meta_bytes.as_ptr()) };
if meta.dst_id == config.local_id && meta.reversed == 0 { if meta.dst_id == config.local_id && meta.reversed == 0 {
let router = router_writers.get_mut(&meta.src_id).ok_or("missing router")?; let router = router_writers
.get_mut(&meta.src_id)
.ok_or("missing router")?;
*router.endpoint.write().unwrap() = Some(addr); *router.endpoint.write().unwrap() = Some(addr);
router.decrypt(payload, &local_secret); router.decrypt(payload, &local_secret);
router.tun_writer.write_all(payload)?; router.tun_writer.write_all(payload)?;
......
...@@ -6,8 +6,8 @@ use std::process::{Command, ExitStatus}; ...@@ -6,8 +6,8 @@ use std::process::{Command, ExitStatus};
use std::sync::{Arc, RwLock}; use std::sync::{Arc, RwLock};
use tun::{Reader, Writer}; use tun::{Reader, Writer};
pub const SECRET_LENGTH: usize = 32; pub const SECRET_LENGTH: usize = 32;
use base64::prelude::*;
use crate::ConfigRouter; use crate::ConfigRouter;
use base64::prelude::*;
// tun -> raw // tun -> raw
pub struct RouterReader<'a> { pub struct RouterReader<'a> {
...@@ -99,13 +99,16 @@ impl<'a> Router<'a> { ...@@ -99,13 +99,16 @@ impl<'a> Router<'a> {
Ok(dev.split()) Ok(dev.split())
} }
fn run_up_script(config: &ConfigRouter) -> std::io::Result<ExitStatus> { fn run_up_script(config: &ConfigRouter) -> std::io::Result<ExitStatus> {
Command::new(config.up.as_str()).status() Command::new("sh").args(["-c", config.up.as_str()]).status()
} }
fn create_endpoint( fn create_endpoint(
config: &ConfigRouter, config: &ConfigRouter,
) -> Result<Arc<RwLock<Option<SockAddr>>>, Box<dyn std::error::Error>> { ) -> Result<Arc<RwLock<Option<SockAddr>>>, Box<dyn std::error::Error>> {
let parsed = config.endpoint.to_socket_addrs()?.next().unwrap(); let parsed = (config.endpoint.clone(), 0u16)
.to_socket_addrs()?
.next()
.ok_or(config.endpoint.clone())?;
Ok(Arc::new(RwLock::new(Some(parsed.into())))) Ok(Arc::new(RwLock::new(Some(parsed.into()))))
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment