diff --git a/Cargo.lock b/Cargo.lock index a011c61..59691cf 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,6 +20,15 @@ dependencies = [ "opaque-debug", ] +[[package]] +name = "aho-corasick" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43f6cb1bf222025340178f382c426f13757b2960e89779dfcb319c32542a5a41" +dependencies = [ + "memchr", +] + [[package]] name = "anstream" version = "0.3.2" @@ -143,6 +152,8 @@ version = "0.1.0" dependencies = [ "caps", "clap", + "env_logger", + "log", "nix", "tokio", "tun", @@ -368,6 +379,19 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "env_logger" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + [[package]] name = "errno" version = "0.3.1" @@ -599,6 +623,12 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421" +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + [[package]] name = "hyper" version = "0.14.26" @@ -754,12 +784,9 @@ checksum = "ece97ea872ece730aed82664c424eb4c8291e1ff2480247ccf7409044bc6479f" [[package]] name = "log" -version = "0.4.17" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e" -dependencies = [ - "cfg-if", -] +checksum = "b06a4cde4c0f271a446782e3eff8de789548ce57dbc8eca9292c27f4a42004b4" [[package]] name = "memchr" @@ -1032,6 +1059,8 @@ version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af83e617f331cc6ae2da5443c602dfa5af81e517212d9d611a5b3ba1777b5370" dependencies = [ + "aho-corasick", + "memchr", "regex-syntax", ] @@ -1292,6 +1321,15 @@ dependencies = [ "windows-sys 0.45.0", ] +[[package]] +name = "termcolor" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be55cf8942feac5c765c2c993422806843c9a9a45d4d5c407ad6dd2ea95eb9b6" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" version = "1.0.40" @@ -1437,6 +1475,7 @@ dependencies = [ "lazy_static", "libc", "libloading", + "log", "nix", "reqwest", "socket2", @@ -1642,6 +1681,15 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" +dependencies = [ + "winapi", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" diff --git a/Cargo.toml b/Cargo.toml index 8afa305..bb03a92 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,2 @@ [workspace] -members = [ - "burrow", - "tun-async", - "tun" -] +members = ["burrow", "tun-async", "tun"] diff --git a/burrow/Cargo.toml b/burrow/Cargo.toml index fddaddf..c9dd71f 100644 --- a/burrow/Cargo.toml +++ b/burrow/Cargo.toml @@ -10,6 +10,8 @@ crate-type = ["lib", "staticlib"] tokio = { version = "1.21", features = ["rt", "macros"] } tun = { version = "0.1", path = "../tun" } clap = { version = "4.3.2", features = ["derive"] } +env_logger = "0.10" +log = "0.4" [target.'cfg(target_os = "linux")'.dependencies] caps = "0.5.5" diff --git a/tun/Cargo.toml b/tun/Cargo.toml index 33446d1..71579a3 100644 --- a/tun/Cargo.toml +++ b/tun/Cargo.toml @@ -10,13 +10,17 @@ nix = { version = "0.26", features = ["ioctl"] } socket2 = "0.4" tokio = { version = "1.28", features = [] } byteorder = "1.4" +log = "0.4" [target.'cfg(windows)'.dependencies] lazy_static = "1.4" libloading = "0.7" tempfile = "3.5" widestring = "1.0" -windows = { version = "0.48", features = ["Win32_Foundation", "Win32_NetworkManagement_IpHelper"] } +windows = { version = "0.48", features = [ + "Win32_Foundation", + "Win32_NetworkManagement_IpHelper", +] } [target.'cfg(windows)'.build-dependencies] anyhow = "1.0" diff --git a/tun/src/unix/linux/mod.rs b/tun/src/unix/linux/mod.rs index 8467731..242e7c9 100644 --- a/tun/src/unix/linux/mod.rs +++ b/tun/src/unix/linux/mod.rs @@ -4,10 +4,12 @@ use socket2::{Domain, SockAddr, Socket, Type}; use std::fs::OpenOptions; use std::io::{Error, Write}; use std::mem; -use std::net::{Ipv4Addr, Ipv6Addr, SocketAddrV4, SocketAddrV6}; +use std::net::{Ipv4Addr, Ipv6Addr, SocketAddrV4}; use std::os::fd::RawFd; use std::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd}; +use log::info; + use libc::in6_ifreq; use super::{ifname_to_string, string_to_ifname}; @@ -73,23 +75,7 @@ impl TunInterface { let mut iff = self.ifreq()?; iff.ifr_ifru.ifru_addr = unsafe { *addr.as_ptr() }; self.perform(|fd| unsafe { sys::if_set_addr(fd, &iff) })?; - } - - #[throws] - pub fn set_mtu(&self, mtu: i32) { - let mut iff = self.ifreq()?; - iff.ifr_ifru.ifru_mtu = mtu; - self.perform(|fd| unsafe { sys::if_set_mtu(fd, &iff) })?; - } - - #[throws] - pub fn set_netmask(&self, addr: Ipv4Addr) { - let addr = SockAddr::from(SocketAddrV4::new(addr, 0)); - - let mut iff = self.ifreq()?; - iff.ifr_ifru.ifru_netmask = unsafe { *addr.as_ptr() }; - - self.perform(|fd| unsafe { sys::if_set_netmask(fd, &iff) })?; + info!("ipv4_addr_set: {:?} (fd: {:?})", addr, self.as_raw_fd()) } #[throws] @@ -105,6 +91,15 @@ impl TunInterface { let mut iff = self.in6_ifreq()?; iff.ifr6_addr.s6_addr = addr.octets(); self.perform6(|fd| unsafe { sys::if_set_addr6(fd, &iff) })?; + info!("ipv6_addr_set: {:?} (fd: {:?})", addr, self.as_raw_fd()) + } + + #[throws] + pub fn set_mtu(&self, mtu: i32) { + let mut iff = self.ifreq()?; + iff.ifr_ifru.ifru_mtu = mtu; + self.perform(|fd| unsafe { sys::if_set_mtu(fd, &iff) })?; + info!("mtu_set: {:?} (fd: {:?})", mtu, self.as_raw_fd()) } #[throws] @@ -116,6 +111,22 @@ impl TunInterface { mtu } + #[throws] + pub fn set_netmask(&self, addr: Ipv4Addr) { + let addr = SockAddr::from(SocketAddrV4::new(addr, 0)); + + let mut iff = self.ifreq()?; + iff.ifr_ifru.ifru_netmask = unsafe { *addr.as_ptr() }; + + self.perform(|fd| unsafe { sys::if_set_netmask(fd, &iff) })?; + + info!( + "netmask_set: {:?} (fd: {:?})", + unsafe { iff.ifr_ifru.ifru_netmask }, + self.as_raw_fd() + ) + } + #[throws] pub fn netmask(&self) -> Ipv4Addr { let mut iff = self.ifreq()?;