Add host address binding option

This commit is contained in:
Jackson Coxson 2022-06-22 23:06:16 -06:00
parent 73671a4d07
commit 5e94a0f31e
2 changed files with 22 additions and 5 deletions

View file

@ -19,6 +19,7 @@ pub struct Config {
pub(crate) private_key: Arc<X25519SecretKey>,
pub(crate) endpoint_public_key: Arc<X25519PublicKey>,
pub(crate) endpoint_addr: SocketAddr,
pub(crate) host_addr: Option<SocketAddr>,
pub(crate) source_peer_ip: IpAddr,
pub(crate) keepalive_seconds: Option<u16>,
pub(crate) max_transmission_unit: usize,
@ -76,6 +77,12 @@ impl Config {
.long("endpoint-addr")
.env("ONETUN_ENDPOINT_ADDR")
.help("The address (IP + port) of the WireGuard endpoint (remote). Example: 1.2.3.4:51820"),
Arg::with_name("host-addr")
.required(false)
.takes_value(true)
.long("host-addr")
.env("ONETUN_HOST_ADDR")
.help("The address (IP + port) for the tunnel to bind to. Example: 1.2.4:51820"),
Arg::with_name("source-peer-ip")
.required(true)
.takes_value(true)
@ -237,6 +244,12 @@ impl Config {
),
endpoint_addr: parse_addr(matches.value_of("endpoint-addr"))
.with_context(|| "Invalid endpoint address")?,
host_addr: match matches.value_of("host-addr") {
Some(host_addr) => {
Some(parse_addr(Some(host_addr)).with_context(|| "Invalid host address")?)
}
None => None,
},
source_peer_ip,
keepalive_seconds: parse_keep_alive(matches.value_of("keep-alive"))
.with_context(|| "Invalid keep-alive value")?,

View file

@ -36,11 +36,15 @@ impl WireGuardTunnel {
let source_peer_ip = config.source_peer_ip;
let peer = Self::create_tunnel(config)?;
let endpoint = config.endpoint_addr;
let udp = UdpSocket::bind(match endpoint {
SocketAddr::V4(_) => "0.0.0.0:0",
SocketAddr::V6(_) => "[::]:0",
})
.await
let udp = if let Some(host) = config.host_addr {
UdpSocket::bind(host).await
} else {
UdpSocket::bind(match endpoint {
SocketAddr::V4(_) => "0.0.0.0:0",
SocketAddr::V6(_) => "[::]:0",
})
.await
}
.with_context(|| "Failed to create UDP socket for WireGuard connection")?;
Ok(Self {