diff options
author | Himbeer <himbeer@disroot.org> | 2024-09-04 11:25:18 +0200 |
---|---|---|
committer | Himbeer <himbeer@disroot.org> | 2024-09-04 11:25:18 +0200 |
commit | 97d0676301f4b447bf57cbb12a8e9316731e9588 (patch) | |
tree | 9d2d2b4104cebab1c6f41744015f2651cc3fa7c0 /src | |
parent | 52cb25332dbba0bc283de3bcdc06959005e06ce0 (diff) |
Enable NPT for internal VPN-to-GUA traffic
Previously it was impossible to access local services using their GUAs
through the VPNs. This commit enables NPT for any outbound packets with
a destination address in the 2000::/3 (GUA) range as well as for any
inbound packets to VPN prefixes.
Diffstat (limited to 'src')
-rw-r--r-- | src/main.rs | 15 |
1 files changed, 7 insertions, 8 deletions
diff --git a/src/main.rs b/src/main.rs index 5d660f9..22c6f81 100644 --- a/src/main.rs +++ b/src/main.rs @@ -14,6 +14,7 @@ use rustables::{ }; use signal_hook::{consts::SIGUSR1, iterator::Signals}; +const GUA: Ipv6Addr = Ipv6Addr::new(0x2000, 0, 0, 0, 0, 0, 0, 0); const ULA: Ipv6Addr = Ipv6Addr::new(0xfd0b, 0x9272, 0x534e, 0, 0, 0, 0, 0); const VPN_ULA: Ipv6Addr = Ipv6Addr::new(0xfd0b, 0x9272, 0x534e, 6, 0, 0, 0, 0); const EXPOSED_VPN_ULA: Ipv6Addr = Ipv6Addr::new(0xfd0b, 0x9272, 0x534e, 7, 0, 0, 0, 0); @@ -414,6 +415,7 @@ fn filter() -> Result<()> { } fn enable_npt(prefix: Ipv6Addr) -> Result<Npt> { + let gua_net = IpNetwork::V6(Ipv6Network::new(GUA, 3).unwrap()); let vpn_net = IpNetwork::V6(Ipv6Network::new(VPN_ULA, 64).unwrap()); let exposed_vpn_net: IpNetwork = IpNetwork::V6(Ipv6Network::new(EXPOSED_VPN_ULA, 64).unwrap()); @@ -450,8 +452,8 @@ fn enable_npt(prefix: Ipv6Addr) -> Result<Npt> { batch.add(&postrouting, MsgType::Add); let map_vpn_to_gua = Rule::new(&postrouting)? - .oface("ppp0")? .snetwork(vpn_net)? + .dnetwork(gua_net)? .with_expr( HighLevelPayload::Network(NetworkHeaderField::IPv6(IPv6HeaderField::Saddr)).build(), ) @@ -466,8 +468,8 @@ fn enable_npt(prefix: Ipv6Addr) -> Result<Npt> { batch.add(&map_vpn_to_gua, MsgType::Add); let map_exposed_vpn_to_gua = Rule::new(&postrouting)? - .oface("ppp0")? .snetwork(exposed_vpn_net)? + .dnetwork(gua_net)? .with_expr( HighLevelPayload::Network(NetworkHeaderField::IPv6(IPv6HeaderField::Saddr)).build(), ) @@ -497,7 +499,6 @@ fn enable_npt(prefix: Ipv6Addr) -> Result<Npt> { batch.add(&prerouting, MsgType::Add); let map_gua_to_vpn = Rule::new(&prerouting)? - .iface("ppp0")? .dnetwork(vpn_subnet)? .with_expr( HighLevelPayload::Network(NetworkHeaderField::IPv6(IPv6HeaderField::Daddr)).build(), @@ -513,7 +514,6 @@ fn enable_npt(prefix: Ipv6Addr) -> Result<Npt> { batch.add(&map_gua_to_vpn, MsgType::Add); let map_gua_to_exposed_vpn = Rule::new(&prerouting)? - .iface("ppp0")? .dnetwork(exposed_vpn_subnet)? .with_expr( HighLevelPayload::Network(NetworkHeaderField::IPv6(IPv6HeaderField::Daddr)).build(), @@ -540,6 +540,7 @@ fn enable_npt(prefix: Ipv6Addr) -> Result<Npt> { } fn update_npt(npt: &mut Npt, prefix: Ipv6Addr) -> Result<()> { + let gua_net = IpNetwork::V6(Ipv6Network::new(GUA, 3).unwrap()); let vpn_net = IpNetwork::V6(Ipv6Network::new(VPN_ULA, 64).unwrap()); let exposed_vpn_net: IpNetwork = IpNetwork::V6(Ipv6Network::new(EXPOSED_VPN_ULA, 64).unwrap()); @@ -570,8 +571,8 @@ fn update_npt(npt: &mut Npt, prefix: Ipv6Addr) -> Result<()> { // +-------------------+ npt.map_vpn_to_gua = Rule::new(&npt.postrouting)? - .oface("ppp0")? .snetwork(vpn_net)? + .dnetwork(gua_net)? .with_expr( HighLevelPayload::Network(NetworkHeaderField::IPv6(IPv6HeaderField::Saddr)).build(), ) @@ -586,8 +587,8 @@ fn update_npt(npt: &mut Npt, prefix: Ipv6Addr) -> Result<()> { batch.add(&npt.map_vpn_to_gua, MsgType::Add); npt.map_exposed_vpn_to_gua = Rule::new(&npt.postrouting)? - .oface("ppp0")? .snetwork(exposed_vpn_net)? + .dnetwork(gua_net)? .with_expr( HighLevelPayload::Network(NetworkHeaderField::IPv6(IPv6HeaderField::Saddr)).build(), ) @@ -609,7 +610,6 @@ fn update_npt(npt: &mut Npt, prefix: Ipv6Addr) -> Result<()> { // +------------------+ npt.map_gua_to_vpn = Rule::new(&npt.prerouting)? - .iface("ppp0")? .dnetwork(vpn_subnet)? .with_expr( HighLevelPayload::Network(NetworkHeaderField::IPv6(IPv6HeaderField::Daddr)).build(), @@ -625,7 +625,6 @@ fn update_npt(npt: &mut Npt, prefix: Ipv6Addr) -> Result<()> { batch.add(&npt.map_gua_to_vpn, MsgType::Add); npt.map_gua_to_exposed_vpn = Rule::new(&npt.prerouting)? - .iface("ppp0")? .dnetwork(exposed_vpn_subnet)? .with_expr( HighLevelPayload::Network(NetworkHeaderField::IPv6(IPv6HeaderField::Daddr)).build(), |