| Allow forwarding IPv4 packets from/to 127.0.0.0/8 except 127.0.0.1. |
| |
| diff -ru --exclude-from freebsd-src-diff-exclude-names --new-file /var/archive3/public/freebsd-releng-10.4-src/sys/net/flowtable.c freebsd-10.4/sys/net/flowtable.c |
| --- /var/archive3/public/freebsd-releng-10.4-src/sys/net/flowtable.c 2017-09-29 08:20:07.000000000 +0800 |
| +++ freebsd-10.4/sys/net/flowtable.c 2022-11-27 00:18:01.170901000 +0800 |
| @@ -199,9 +199,10 @@ |
| ip = mtod(m, struct ip *); |
| |
| if (ip->ip_src.s_addr == ip->ip_dst.s_addr || |
| - (ntohl(ip->ip_dst.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET || |
| - (ntohl(ip->ip_src.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET) |
| + ntohl(ip->ip_dst.s_addr) == INADDR_LOOPBACK || |
| + ntohl(ip->ip_src.s_addr) == INADDR_LOOPBACK) { |
| return (NULL); |
| + } |
| |
| fibnum = M_GETFIB(m); |
| |
| diff -ru --exclude-from freebsd-src-diff-exclude-names --new-file /var/archive3/public/freebsd-releng-10.4-src/sys/netinet/in.c freebsd-10.4/sys/netinet/in.c |
| --- /var/archive3/public/freebsd-releng-10.4-src/sys/netinet/in.c 2017-09-29 08:20:06.000000000 +0800 |
| +++ freebsd-10.4/sys/netinet/in.c 2022-11-26 20:53:07.717981000 +0800 |
| @@ -139,11 +139,7 @@ |
| |
| if (IN_EXPERIMENTAL(i) || IN_MULTICAST(i) || IN_LINKLOCAL(i)) |
| return (0); |
| - if (IN_CLASSA(i)) { |
| - net = i & IN_CLASSA_NET; |
| - if (net == 0 || net == (IN_LOOPBACKNET << IN_CLASSA_NSHIFT)) |
| - return (0); |
| - } |
| + if (!(i & 0xff000000)) return 0; |
| return (1); |
| } |
| |
| diff -ru --exclude-from freebsd-src-diff-exclude-names --new-file /var/archive3/public/freebsd-releng-10.4-src/sys/netinet/ip_fastfwd.c freebsd-10.4/sys/netinet/ip_fastfwd.c |
| --- /var/archive3/public/freebsd-releng-10.4-src/sys/netinet/ip_fastfwd.c 2017-09-29 08:20:06.000000000 +0800 |
| +++ freebsd-10.4/sys/netinet/ip_fastfwd.c 2022-11-27 00:23:34.897572000 +0800 |
| @@ -273,10 +273,10 @@ |
| } |
| |
| /* |
| - * Is packet from or to 127/8? |
| + * Is packet from or to 127.0.0.1? |
| */ |
| - if ((ntohl(ip->ip_dst.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET || |
| - (ntohl(ip->ip_src.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET) { |
| + if (ntohl(ip->ip_dst.s_addr) == INADDR_LOOPBACK || |
| + ntohl(ip->ip_src.s_addr) == INADDR_LOOPBACK) { |
| IPSTAT_INC(ips_badaddr); |
| goto drop; |
| } |
| diff -ru --exclude-from freebsd-src-diff-exclude-names --new-file /var/archive3/public/freebsd-releng-10.4-src/sys/netinet/ip_input.c freebsd-10.4/sys/netinet/ip_input.c |
| --- /var/archive3/public/freebsd-releng-10.4-src/sys/netinet/ip_input.c 2017-09-29 08:20:06.000000000 +0800 |
| +++ freebsd-10.4/sys/netinet/ip_input.c 2022-11-27 00:21:46.854283000 +0800 |
| @@ -411,9 +411,10 @@ |
| IP_PROBE(receive, NULL, NULL, ip, m->m_pkthdr.rcvif, ip, NULL); |
| |
| /* 127/8 must not appear on wire - RFC1122 */ |
| + /* Modified to filter 127.0.0.1 only */ |
| ifp = m->m_pkthdr.rcvif; |
| - if ((ntohl(ip->ip_dst.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET || |
| - (ntohl(ip->ip_src.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET) { |
| + if (ntohl(ip->ip_dst.s_addr) == INADDR_LOOPBACK || |
| + ntohl(ip->ip_src.s_addr) == INADDR_LOOPBACK) { |
| if ((ifp->if_flags & IFF_LOOPBACK) == 0) { |
| IPSTAT_INC(ips_badaddr); |
| goto bad; |
| diff -ru --exclude-from freebsd-src-diff-exclude-names --new-file /var/archive3/public/freebsd-releng-10.4-src/sys/netinet/ip_output.c freebsd-10.4/sys/netinet/ip_output.c |
| --- /var/archive3/public/freebsd-releng-10.4-src/sys/netinet/ip_output.c 2017-09-29 08:20:06.000000000 +0800 |
| +++ freebsd-10.4/sys/netinet/ip_output.c 2022-11-27 00:22:12.011746000 +0800 |
| @@ -577,8 +577,9 @@ |
| |
| passout: |
| /* 127/8 must not appear on wire - RFC1122. */ |
| - if ((ntohl(ip->ip_dst.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET || |
| - (ntohl(ip->ip_src.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET) { |
| + /* Modified to filter 127.0.0.1 only */ |
| + if (ntohl(ip->ip_dst.s_addr) == INADDR_LOOPBACK || |
| + ntohl(ip->ip_src.s_addr) == INADDR_LOOPBACK) { |
| if ((ifp->if_flags & IFF_LOOPBACK) == 0) { |
| IPSTAT_INC(ips_badaddr); |
| error = EADDRNOTAVAIL; |