async fn print_wireguard_config(
iface_name: &str,
) -> Result<(), Box<dyn std::error::Error>> {
let (conn, mut handle, _) = nl_wireguard::new_connection()?;
tokio::spawn(conn);
println!("{:?}", handle.get_by_name(iface_name).await?);
Ok(())
}You need to use rtnetlink crate to create a interface with wireguard
interface type before.
use std::net::{IpAddr, Ipv4Addr, Ipv6Addr, SocketAddr};
use nl_wireguard::{WireguardIpAddress, WireguardParsed, WireguardPeerParsed};
async fn set_wireguard_config(
iface_name: &str,
) -> Result<(), Box<dyn std::error::Error>> {
let mut peer_config = WireguardPeerParsed::default();
peer_config.endpoint = Some(SocketAddr::new(
IpAddr::V4(Ipv4Addr::new(10, 10, 10, 1)),
51820,
));
peer_config.public_key =
Some("8bdQrVLqiw3ZoHCucNh1YfH0iCWuyStniRr8t7H24Fk=".to_string());
peer_config.allowed_ips = Some(vec![
WireguardIpAddress {
ip_addr: IpAddr::V4(Ipv4Addr::UNSPECIFIED),
prefix_length: 0,
},
WireguardIpAddress {
ip_addr: IpAddr::V6(Ipv6Addr::UNSPECIFIED),
prefix_length: 0,
},
]);
let mut config = WireguardParsed::default();
config.iface_name = Some(iface_name.to_string());
config.public_key =
Some("JKossUAjywXuJ2YVcaeD6PaHs+afPmIthDuqEVlspwA=".to_string());
config.private_key =
Some("6LTHiAM4vgKEgi5vm30f/EBIEWFDmySkTc9EWCcIqEs=".to_string());
config.listen_port = Some(51820);
config.fwmark = Some(0);
config.peers = Some(vec![peer_config]);
let (conn, mut handle, _) = nl_wireguard::new_connection()?;
tokio::spawn(conn);
handle.set(config).await?;
Ok(())
}