summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2020-02-28 14:26:50 +0100
committerDavid Lönnhager <david.l@mullvad.net>2020-06-02 10:05:01 +0200
commitfded606538075006e744db27bcf8cc5709988a0b (patch)
tree632066138ad73e0f34851ce47b4cd0c564d74aec
parent65a64170a40cfff3fb4720ab23d2ce3bae4e363c (diff)
downloadmullvadvpn-fded606538075006e744db27bcf8cc5709988a0b.tar.xz
mullvadvpn-fded606538075006e744db27bcf8cc5709988a0b.zip
Set routing table for marked packets
-rw-r--r--talpid-core/src/firewall/linux.rs7
-rw-r--r--talpid-core/src/split.rs23
2 files changed, 24 insertions, 6 deletions
diff --git a/talpid-core/src/firewall/linux.rs b/talpid-core/src/firewall/linux.rs
index 52327091ec..1005bac337 100644
--- a/talpid-core/src/firewall/linux.rs
+++ b/talpid-core/src/firewall/linux.rs
@@ -18,7 +18,6 @@ use talpid_types::net::{Endpoint, TransportProtocol};
/// Priority for rules that tag split tunneling packets. Equals NF_IP_PRI_MANGLE.
const MANGLE_CHAIN_PRIORITY: i32 = libc::NF_IP_PRI_MANGLE;
-const SPLIT_TUNNEL_MARK: i32 = 0xf41;
pub type Result<T> = std::result::Result<T, Error>;
@@ -243,20 +242,20 @@ impl<'a> PolicyBatch<'a> {
let mut rule = Rule::new(&self.mangle_chain);
rule.add_expr(&nft_expr!(meta cgroup));
rule.add_expr(&nft_expr!(cmp == split::NETCLS_CLASSID));
- rule.add_expr(&nft_expr!(immediate data SPLIT_TUNNEL_MARK));
+ rule.add_expr(&nft_expr!(immediate data split::MARK));
rule.add_expr(&nft_expr!(ct mark set));
rule.add_expr(&nft_expr!(meta mark set));
self.batch.add(&rule, nftnl::MsgType::Add);
let mut rule = Rule::new(&self.in_chain);
rule.add_expr(&nft_expr!(ct mark));
- rule.add_expr(&nft_expr!(cmp == SPLIT_TUNNEL_MARK));
+ rule.add_expr(&nft_expr!(cmp == split::MARK));
add_verdict(&mut rule, &Verdict::Accept);
self.batch.add(&rule, nftnl::MsgType::Add);
let mut rule = Rule::new(&self.out_chain);
rule.add_expr(&nft_expr!(meta mark));
- rule.add_expr(&nft_expr!(cmp == SPLIT_TUNNEL_MARK));
+ rule.add_expr(&nft_expr!(cmp == split::MARK));
add_verdict(&mut rule, &Verdict::Accept);
self.batch.add(&rule, nftnl::MsgType::Add);
}
diff --git a/talpid-core/src/split.rs b/talpid-core/src/split.rs
index 28d916c11a..18b43a15b2 100644
--- a/talpid-core/src/split.rs
+++ b/talpid-core/src/split.rs
@@ -3,11 +3,16 @@ use std::{
fs,
io::{self, BufRead, BufReader, Write},
path::Path,
+ process::Command,
};
const NETCLS_DIR: &str = "/sys/fs/cgroup/net_cls/";
+
/// Identifies packets coming from the cgroup.
pub const NETCLS_CLASSID: u32 = 0x4d9f41;
+/// Value used to mark packets and associated connections.
+pub const MARK: i32 = 0xf41;
+
const CGROUP_NAME: &str = "mullvad-exclusions";
static mut ROUTING_TABLE_ID: i32 = 19;
const ROUTING_TABLE_NAME: &str = "mullvad_exclusions";
@@ -43,8 +48,22 @@ pub enum Error {
}
fn route_marked_packets() -> Result<(), Error> {
- // TODO: route fwmark'd packets using this table (if they aren't already)
- Ok(())
+ // TODO: IPv6
+ let mut cmd = Command::new("ip");
+ cmd.args(&[
+ "-4",
+ "rule",
+ "add",
+ "from",
+ "all",
+ "fwmark",
+ &MARK.to_string(),
+ "lookup",
+ ROUTING_TABLE_NAME,
+ ]);
+
+ log::trace!("running cmd - {:?}", &cmd);
+ cmd.output().map(|_| ()).map_err(Error::RoutingTableSetup)
}
/// Set up policy-based routing for marked packets.