mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 19:21:31 -04:00
ipv4: introduce hardened ip_no_pmtu_disc mode
This new ip_no_pmtu_disc mode only allowes fragmentation-needed errors to be honored by protocols which do more stringent validation on the ICMP's packet payload. This knob is useful for people who e.g. want to run an unmodified DNS server in a namespace where they need to use pmtu for TCP connections (as they are used for zone transfers or fallback for requests) but don't want to use possibly spoofed UDP pmtu information. Currently the whitelisted protocols are TCP, SCTP and DCCP as they check if the returned packet is in the window or if the association is valid. Cc: Eric Dumazet <[email protected]> Cc: David Miller <[email protected]> Cc: John Heffner <[email protected]> Suggested-by: Florian Weimer <[email protected]> Signed-off-by: Hannes Frederic Sowa <[email protected]> Signed-off-by: David S. Miller <[email protected]>
This commit is contained in:
parent
0954cf9c61
commit
8ed1dc44d3
6 changed files with 45 additions and 6 deletions
|
|
@ -1545,6 +1545,7 @@ static const struct net_protocol tcp_protocol = {
|
|||
.err_handler = tcp_v4_err,
|
||||
.no_policy = 1,
|
||||
.netns_ok = 1,
|
||||
.icmp_strict_tag_validation = 1,
|
||||
};
|
||||
|
||||
static const struct net_protocol udp_protocol = {
|
||||
|
|
|
|||
|
|
@ -668,6 +668,16 @@ static void icmp_socket_deliver(struct sk_buff *skb, u32 info)
|
|||
rcu_read_unlock();
|
||||
}
|
||||
|
||||
static bool icmp_tag_validation(int proto)
|
||||
{
|
||||
bool ok;
|
||||
|
||||
rcu_read_lock();
|
||||
ok = rcu_dereference(inet_protos[proto])->icmp_strict_tag_validation;
|
||||
rcu_read_unlock();
|
||||
return ok;
|
||||
}
|
||||
|
||||
/*
|
||||
* Handle ICMP_DEST_UNREACH, ICMP_TIME_EXCEED, ICMP_QUENCH, and
|
||||
* ICMP_PARAMETERPROB.
|
||||
|
|
@ -705,12 +715,22 @@ static void icmp_unreach(struct sk_buff *skb)
|
|||
case ICMP_PORT_UNREACH:
|
||||
break;
|
||||
case ICMP_FRAG_NEEDED:
|
||||
if (net->ipv4.sysctl_ip_no_pmtu_disc == 2) {
|
||||
goto out;
|
||||
} else if (net->ipv4.sysctl_ip_no_pmtu_disc) {
|
||||
/* for documentation of the ip_no_pmtu_disc
|
||||
* values please see
|
||||
* Documentation/networking/ip-sysctl.txt
|
||||
*/
|
||||
switch (net->ipv4.sysctl_ip_no_pmtu_disc) {
|
||||
default:
|
||||
LIMIT_NETDEBUG(KERN_INFO pr_fmt("%pI4: fragmentation needed and DF set\n"),
|
||||
&iph->daddr);
|
||||
} else {
|
||||
break;
|
||||
case 2:
|
||||
goto out;
|
||||
case 3:
|
||||
if (!icmp_tag_validation(iph->protocol))
|
||||
goto out;
|
||||
/* fall through */
|
||||
case 0:
|
||||
info = ntohs(icmph->un.frag.mtu);
|
||||
if (!info)
|
||||
goto out;
|
||||
|
|
|
|||
Loading…
Reference in a new issue