summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2020-05-20 11:03:15 +0200
committerDavid Lönnhager <david.l@mullvad.net>2020-06-03 13:33:40 +0200
commitddabbd93019c49d4de3a27a3f4536776ee0b1f42 (patch)
tree87040c26f5f1e70da88eef0bd59ea632db0e42c4
parent902ce9fec479abc39584c8ab411b89a3d9056053 (diff)
downloadmullvadvpn-ddabbd93019c49d4de3a27a3f4536776ee0b1f42.tar.xz
mullvadvpn-ddabbd93019c49d4de3a27a3f4536776ee0b1f42.zip
Reject select outgoing traffic instead of silently dropping it on Linux
-rw-r--r--talpid-core/src/firewall/linux.rs18
1 files changed, 15 insertions, 3 deletions
diff --git a/talpid-core/src/firewall/linux.rs b/talpid-core/src/firewall/linux.rs
index abe542d4b3..c1cc847d60 100644
--- a/talpid-core/src/firewall/linux.rs
+++ b/talpid-core/src/firewall/linux.rs
@@ -5,7 +5,7 @@ use lazy_static::lazy_static;
use libc;
use nftnl::{
self,
- expr::{self, Payload, Verdict},
+ expr::{self, IcmpCode, Payload, RejectionType, Verdict},
nft_expr, table, Batch, Chain, FinalizedBatch, ProtoFamily, Rule, Table,
};
use std::{
@@ -480,6 +480,15 @@ impl<'a> PolicyBatch<'a> {
if allow_lan {
self.add_allow_lan_rules();
}
+
+ // Reject any remaining outgoing traffic
+ let mut reject_rule = Rule::new(&self.out_chain);
+ add_verdict(
+ &mut reject_rule,
+ &Verdict::Reject(RejectionType::Icmp(IcmpCode::PortUnreach)),
+ );
+ self.batch.add(&reject_rule, nftnl::MsgType::Add);
+
Ok(())
}
@@ -567,12 +576,15 @@ impl<'a> PolicyBatch<'a> {
fn add_drop_dns_rule(&mut self) {
let mut block_udp_rule = Rule::new(&self.out_chain);
check_port(&mut block_udp_rule, TransportProtocol::Udp, End::Dst, 53);
- add_verdict(&mut block_udp_rule, &Verdict::Drop);
+ add_verdict(
+ &mut block_udp_rule,
+ &Verdict::Reject(RejectionType::Icmp(IcmpCode::PortUnreach)),
+ );
self.batch.add(&block_udp_rule, nftnl::MsgType::Add);
let mut block_tcp_rule = Rule::new(&self.out_chain);
check_port(&mut block_tcp_rule, TransportProtocol::Tcp, End::Dst, 53);
- add_verdict(&mut block_tcp_rule, &Verdict::Drop);
+ add_verdict(&mut block_tcp_rule, &Verdict::Reject(RejectionType::TcpRst));
self.batch.add(&block_tcp_rule, nftnl::MsgType::Add);
}