Restore network configuration on Drop

This commit is contained in:
B. Blechschmidt 2023-03-25 21:41:40 +01:00
parent e4d4e0965e
commit 4a48b297f3
3 changed files with 21 additions and 11 deletions

View file

@ -3,7 +3,7 @@ use crate::socks5::SocksVersion;
use crate::{http::HttpManager, socks5::SocksManager, tun2proxy::TunToProxy}; use crate::{http::HttpManager, socks5::SocksManager, tun2proxy::TunToProxy};
use std::net::{SocketAddr, ToSocketAddrs}; use std::net::{SocketAddr, ToSocketAddrs};
mod error; pub mod error;
mod http; mod http;
pub mod setup; pub mod setup;
mod socks5; mod socks5;

View file

@ -1,6 +1,6 @@
use clap::Parser; use clap::Parser;
use env_logger::Env; use env_logger::Env;
use std::process::exit; use std::process::ExitCode;
use tun2proxy::setup::{get_default_cidrs, Setup}; use tun2proxy::setup::{get_default_cidrs, Setup};
use tun2proxy::Options; use tun2proxy::Options;
@ -44,7 +44,7 @@ enum ArgSetup {
Auto, Auto,
} }
fn main() { fn main() -> ExitCode {
dotenvy::dotenv().ok(); dotenvy::dotenv().ok();
env_logger::Builder::from_env(Env::default().default_filter_or("info")).init(); env_logger::Builder::from_env(Env::default().default_filter_or("info")).init();
let args = Args::parse(); let args = Args::parse();
@ -63,12 +63,13 @@ fn main() {
setup = Setup::new(&args.tun, &args.proxy.addr.ip(), get_default_cidrs()); setup = Setup::new(&args.tun, &args.proxy.addr.ip(), get_default_cidrs());
if let Err(e) = setup.setup() { if let Err(e) = setup.setup() {
log::error!("{e}"); log::error!("{e}");
exit(1); return ExitCode::FAILURE;
} }
} }
if let Err(e) = main_entry(&args.tun, args.proxy, options) { if let Err(e) = main_entry(&args.tun, args.proxy, options) {
log::error!("{e}"); log::error!("{e}");
exit(1); return ExitCode::FAILURE;
} }
ExitCode::SUCCESS
} }

View file

@ -95,7 +95,7 @@ impl Setup {
let mut f = std::fs::File::from_raw_fd(fd); let mut f = std::fs::File::from_raw_fd(fd);
f.write_all("nameserver 198.18.0.1\n".as_bytes())?; f.write_all("nameserver 198.18.0.1\n".as_bytes())?;
mem::forget(f); mem::forget(f);
if libc::fchmod(fd, 0o644) == -1 { if libc::fchmod(fd, 0o444) == -1 {
return Err("Failed to change ownership of /etc/resolv.conf".into()); return Err("Failed to change ownership of /etc/resolv.conf".into());
} }
let fd_path = format!("/proc/self/fd/{}", fd); let fd_path = format!("/proc/self/fd/{}", fd);
@ -133,10 +133,13 @@ impl Setup {
Ok(()) Ok(())
} }
fn shutdown(tun_name: String) { fn shutdown(&self) {
let _ = Command::new("ip") Self::shutdown_with_args(&self.tun);
.args(["link", "del", tun_name.as_str()]) }
.output();
fn shutdown_with_args(tun_name: &str) {
log::info!("Restoring network configuration");
let _ = Command::new("ip").args(["link", "del", tun_name]).output();
unsafe { unsafe {
let umount_path = CString::new("/etc/resolv.conf").unwrap(); let umount_path = CString::new("/etc/resolv.conf").unwrap();
libc::umount(umount_path.as_ptr()); libc::umount(umount_path.as_ptr());
@ -155,7 +158,7 @@ impl Setup {
let tun_name = self.tun.clone(); let tun_name = self.tun.clone();
// TODO: This is not optimal. // TODO: This is not optimal.
ctrlc::set_handler(move || { ctrlc::set_handler(move || {
Self::shutdown(tun_name.clone()); Self::shutdown_with_args(&tun_name);
std::process::exit(0); std::process::exit(0);
})?; })?;
@ -178,3 +181,9 @@ impl Setup {
Ok(()) Ok(())
} }
} }
impl Drop for Setup {
fn drop(&mut self) {
self.shutdown();
}
}