add config option
This commit is contained in:
parent
f2a9bdfafc
commit
af6c2027d1
17
conf/example.yaml
Normal file
17
conf/example.yaml
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
- public_key: pkey1
|
||||||
|
private_key: pkey2
|
||||||
|
endpoint:
|
||||||
|
ip: 1.1.1.1
|
||||||
|
port: 51820
|
||||||
|
ip: 10.1.0.1/24
|
||||||
|
interface_name: test
|
||||||
|
namespace_name: test-netns2
|
||||||
|
|
||||||
|
- public_key: pkey3
|
||||||
|
private_key: pkey4
|
||||||
|
endpoint:
|
||||||
|
ip: 8.8.8.8
|
||||||
|
port: 51820
|
||||||
|
ip: 10.1.0.2/24
|
||||||
|
interface_name: test
|
||||||
|
namespace_name: test-netns3
|
86
src/config/mod.rs
Normal file
86
src/config/mod.rs
Normal file
@ -0,0 +1,86 @@
|
|||||||
|
use serde::{Serialize, Deserialize};
|
||||||
|
use std::fs::File;
|
||||||
|
use std::io::Read;
|
||||||
|
use base64::prelude::*;
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
|
||||||
|
pub struct VPNConfig {
|
||||||
|
public_key: String,
|
||||||
|
private_key: String,
|
||||||
|
endpoint: PeerEndpoint,
|
||||||
|
ip: String,
|
||||||
|
interface_name: String,
|
||||||
|
namespace_name: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ConsumableVPNConfig {
|
||||||
|
pub public_key: [u8; 32],
|
||||||
|
pub private_key: [u8; 32],
|
||||||
|
pub endpoint: ConsumablePeerEndpoint,
|
||||||
|
pub ip: String,
|
||||||
|
pub prefix: u8,
|
||||||
|
pub interface_name: String,
|
||||||
|
pub namespace_name: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Debug, PartialEq, Serialize, Deserialize, Clone)]
|
||||||
|
pub struct PeerEndpoint {
|
||||||
|
ip: String,
|
||||||
|
port: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct ConsumablePeerEndpoint {
|
||||||
|
pub ip: String,
|
||||||
|
//pub prefix: u8,
|
||||||
|
pub port: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl VPNConfig {
|
||||||
|
pub fn get_consumable(self) -> ConsumableVPNConfig {
|
||||||
|
let c_ip: Vec<&str> = self.ip.split("/").collect();
|
||||||
|
if c_ip.len() != 2 {
|
||||||
|
panic!("malformed ip, len:{}", c_ip.len());
|
||||||
|
}
|
||||||
|
let priv_key_dirty = BASE64_STANDARD.decode(self.private_key.into_bytes()).unwrap();
|
||||||
|
let pub_key_dirty = BASE64_STANDARD.decode(self.public_key.into_bytes()).unwrap();
|
||||||
|
let mut priv_key: [u8; 32] = Default::default();
|
||||||
|
let mut pub_key: [u8; 32] = Default::default();
|
||||||
|
priv_key.copy_from_slice(&priv_key_dirty[0..32]);
|
||||||
|
pub_key.copy_from_slice(&pub_key_dirty[0..32]);
|
||||||
|
ConsumableVPNConfig {
|
||||||
|
public_key: pub_key,
|
||||||
|
private_key: priv_key,
|
||||||
|
endpoint: ConsumablePeerEndpoint {
|
||||||
|
ip: self.endpoint.ip,
|
||||||
|
port: self.endpoint.port,
|
||||||
|
},
|
||||||
|
ip: c_ip[0].to_string(),
|
||||||
|
prefix: c_ip[1].parse::<u8>().unwrap(),
|
||||||
|
interface_name: self.interface_name,
|
||||||
|
namespace_name: self.namespace_name,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn get_vpn_conf(file: String) -> Vec<VPNConfig> {
|
||||||
|
let mut file = check_file(file);
|
||||||
|
let mut s = String::new();
|
||||||
|
file.read_to_string(&mut s).unwrap();
|
||||||
|
match serde_yaml::from_str(&s) {
|
||||||
|
Ok(result) => result,
|
||||||
|
Err(e) => {
|
||||||
|
log::error!("malformed: {}",e);
|
||||||
|
Vec::new()
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn check_file(file: String) -> File {
|
||||||
|
match File::open(file) {
|
||||||
|
Ok(f) => f,
|
||||||
|
Err(e) => {
|
||||||
|
log::error!("Cannot file conf file: {}", e);
|
||||||
|
panic!("{}", e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
55
src/main.rs
55
src/main.rs
@ -1,19 +1,61 @@
|
|||||||
mod namespace;
|
mod namespace;
|
||||||
mod manage_interfaces;
|
mod manage_interfaces;
|
||||||
mod wireguard_manager;
|
mod wireguard_manager;
|
||||||
|
mod config;
|
||||||
use std::io::Result;
|
use std::io::Result;
|
||||||
use rtnetlink::NetworkNamespace;
|
use rtnetlink::NetworkNamespace;
|
||||||
use futures::executor::block_on;
|
use futures::executor::block_on;
|
||||||
use base64::prelude::*;
|
use base64::prelude::*;
|
||||||
|
|
||||||
fn main() {
|
fn main(){
|
||||||
|
env_logger::Builder::from_default_env()
|
||||||
|
.format_timestamp_secs()
|
||||||
|
.filter(None, log::LevelFilter::Debug)
|
||||||
|
.init();
|
||||||
|
let args: Vec<String> = std::env::args().collect();
|
||||||
|
match args.len() {
|
||||||
|
3 => {
|
||||||
|
let cmd = &args[1];
|
||||||
|
let param = &args[2];
|
||||||
|
match &cmd[..] {
|
||||||
|
"-conf" => {
|
||||||
|
for vpn in config::get_vpn_conf(param.to_string()) {
|
||||||
|
create_namespace(vpn.get_consumable());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
_ => {},
|
||||||
|
}
|
||||||
|
},
|
||||||
|
_ => {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn create_namespace(vpn: config::ConsumableVPNConfig) {
|
||||||
|
let ns_name = vpn.namespace_name.clone();
|
||||||
|
block_on(NetworkNamespace::add(ns_name.clone())).unwrap();
|
||||||
|
namespace::bind_interface::run_in_namespace(|| {
|
||||||
|
manage_interfaces::set_interface_lo_up().unwrap();
|
||||||
|
},
|
||||||
|
&ns_name).unwrap();
|
||||||
|
namespace::bind_interface::run_in_namespace(|| {
|
||||||
|
manage_interfaces::create_wireguard_interface(vpn.interface_name.clone(),
|
||||||
|
vpn.ip.clone(),
|
||||||
|
vpn.endpoint.ip.clone(),
|
||||||
|
vpn.prefix as u8,
|
||||||
|
vpn.public_key,
|
||||||
|
vpn.private_key).unwrap();
|
||||||
|
},
|
||||||
|
&ns_name).unwrap();
|
||||||
|
}
|
||||||
|
|
||||||
|
/*fn main2() {
|
||||||
env_logger::Builder::from_default_env()
|
env_logger::Builder::from_default_env()
|
||||||
.format_timestamp_secs()
|
.format_timestamp_secs()
|
||||||
.filter(None, log::LevelFilter::Debug)
|
.filter(None, log::LevelFilter::Debug)
|
||||||
.init();
|
.init();
|
||||||
|
|
||||||
let priv_key_dirty = BASE64_STANDARD.decode(b"key1").unwrap();
|
let priv_key_dirty = BASE64_STANDARD.decode(b"k1").unwrap();
|
||||||
let pub_key_dirty = BASE64_STANDARD.decode(b"key2").unwrap();
|
let pub_key_dirty = BASE64_STANDARD.decode(b"k2").unwrap();
|
||||||
let mut priv_key: [u8; 32] = Default::default();
|
let mut priv_key: [u8; 32] = Default::default();
|
||||||
let mut pub_key: [u8; 32] = Default::default();
|
let mut pub_key: [u8; 32] = Default::default();
|
||||||
priv_key.copy_from_slice(&priv_key_dirty[0..32]);
|
priv_key.copy_from_slice(&priv_key_dirty[0..32]);
|
||||||
@ -27,9 +69,9 @@ fn main() {
|
|||||||
},
|
},
|
||||||
&ns_name).unwrap();
|
&ns_name).unwrap();
|
||||||
namespace::bind_interface::run_in_namespace(|| {
|
namespace::bind_interface::run_in_namespace(|| {
|
||||||
manage_interfaces::create_wireguard_interface(String::from("wgiface"),
|
manage_interfaces::create_wireguard_interface(String::from("wgzurich"),
|
||||||
String::from("local_ip"),
|
String::from("ip1"),
|
||||||
String::from("remote_ip"),
|
String::from("ip2"),
|
||||||
24,
|
24,
|
||||||
pub_key,
|
pub_key,
|
||||||
priv_key).unwrap();
|
priv_key).unwrap();
|
||||||
@ -37,3 +79,4 @@ fn main() {
|
|||||||
&ns_name).unwrap();
|
&ns_name).unwrap();
|
||||||
//println!("{}",wireguard_manager::add_properties::set_params(pub_key, priv_key))
|
//println!("{}",wireguard_manager::add_properties::set_params(pub_key, priv_key))
|
||||||
}
|
}
|
||||||
|
*/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user