26 #define KMSG_COMPONENT "IPVS"
27 #define pr_fmt(fmt) KMSG_COMPONENT ": " fmt
29 #include <linux/kernel.h>
30 #include <linux/slab.h>
31 #include <linux/tcp.h>
40 #include <linux/icmpv6.h>
41 #include <linux/netfilter.h>
42 #include <linux/netfilter_ipv4.h>
92 if (
IP6CB(skb)->frag_max_size) {
96 if (
IP6CB(skb)->frag_max_size > mtu)
99 else if (skb->
len > mtu && !skb_is_gso(skb)) {
113 memset(&fl4, 0,
sizeof(fl4));
116 fl4.flowi4_tos = rtos;
121 rt = ip_route_output_key(net, &fl4);
124 if (PTR_ERR(rt) == -
EINVAL && *saddr &&
127 flowi4_update_output(&fl4, 0, rtos, daddr, 0);
130 IP_VS_DBG_RL(
"ip_route_output error, dest: %pI4\n", &daddr);
135 flowi4_update_output(&fl4, 0, rtos, daddr, fl4.saddr);
148 struct net *net = dev_net(skb_dst(skb)->
dev);
155 if (!(rt = (
struct rtable *)
156 __ip_vs_dst_check(dest, rtos))) {
157 rt = do_output_route4(net, dest->
addr.
ip, rtos,
163 __ip_vs_dst_set(dest, rtos, dst_clone(&rt->
dst), 0);
164 IP_VS_DBG(10,
"new dst %pI4, src %pI4, refcnt=%d, "
180 rt = do_output_route4(net, daddr, rtos, rt_mode, &saddr);
190 IP_VS_DBG_RL(
"Stopping traffic to %s address, dest: %pI4\n",
192 "local":
"non-local", &daddr);
198 IP_VS_DBG_RL(
"Redirect from non-local address %pI4 to local "
199 "requires NAT method, dest: %pI4\n",
200 &ip_hdr(skb)->daddr, &daddr);
204 if (
unlikely(!local && ipv4_is_loopback(ip_hdr(skb)->saddr))) {
205 IP_VS_DBG_RL(
"Stopping traffic from loopback address %pI4 "
206 "to non-local address, dest: %pI4\n",
207 &ip_hdr(skb)->saddr, &daddr);
217 __ip_vs_reroute_locally(
struct sk_buff *skb)
219 struct rtable *rt = skb_rtable(skb);
221 struct net *net = dev_net(dev);
222 struct iphdr *iph = ip_hdr(skb);
224 if (rt_is_input_route(rt)) {
227 if (ip_route_input(skb, iph->
daddr, iph->
saddr,
230 refdst_drop(orefdst);
236 .flowi4_mark = skb->
mark,
239 rt = ip_route_output_key(net, &fl4);
248 skb_dst_set(skb, &rt->
dst);
253 #ifdef CONFIG_IP_VS_IPV6
255 static inline int __ip_vs_is_local_route6(
struct rt6_info *rt)
261 __ip_vs_route_output_v6(
struct net *net,
struct in6_addr *daddr,
262 struct in6_addr *ret_saddr,
int do_xfrm)
274 if (ipv6_addr_any(&fl6.
saddr) &&
285 *ret_saddr = fl6.
saddr;
290 IP_VS_DBG_RL(
"ip6_route_output error, dest: %pI6\n", daddr);
300 int do_xfrm,
int rt_mode)
302 struct net *net = dev_net(skb_dst(skb)->dev);
310 rt = (
struct rt6_info *)__ip_vs_dst_check(dest, 0);
314 dst = __ip_vs_route_output_v6(net, &dest->
addr.
in6,
323 __ip_vs_dst_set(dest, 0, dst_clone(&rt->
dst), cookie);
324 IP_VS_DBG(10,
"new dst %pI6, src %pI6, refcnt=%d\n",
332 dst = __ip_vs_route_output_v6(net, daddr, ret_saddr, do_xfrm);
338 local = __ip_vs_is_local_route6(rt);
341 IP_VS_DBG_RL(
"Stopping traffic to %s address, dest: %pI6\n",
342 local ?
"local":
"non-local", daddr);
346 if (local && !(rt_mode & IP_VS_RT_MODE_RDR) &&
347 !((ort = (
struct rt6_info *) skb_dst(skb)) &&
348 __ip_vs_is_local_route6(ort))) {
349 IP_VS_DBG_RL(
"Redirect from non-local address %pI6 to local "
350 "requires NAT method, dest: %pI6\n",
351 &ipv6_hdr(skb)->daddr, daddr);
356 ipv6_addr_type(&ipv6_hdr(skb)->saddr) &
358 IP_VS_DBG_RL(
"Stopping traffic from loopback address %pI6 "
359 "to non-local address, dest: %pI6\n",
360 &ipv6_hdr(skb)->saddr, daddr);
384 #define IP_VS_XMIT_TUNNEL(skb, cp) \
386 int __ret = NF_ACCEPT; \
388 (skb)->ipvs_property = 1; \
389 if (unlikely((cp)->flags & IP_VS_CONN_F_NFCT)) \
390 __ret = ip_vs_confirm_conntrack(skb); \
391 if (__ret == NF_ACCEPT) { \
393 skb_forward_csum(skb); \
398 #define IP_VS_XMIT_NAT(pf, skb, cp, local) \
400 (skb)->ipvs_property = 1; \
401 if (likely(!((cp)->flags & IP_VS_CONN_F_NFCT))) \
402 ip_vs_notrack(skb); \
404 ip_vs_update_conntrack(skb, cp, 1); \
407 skb_forward_csum(skb); \
408 NF_HOOK(pf, NF_INET_LOCAL_OUT, (skb), NULL, \
409 skb_dst(skb)->dev, dst_output); \
412 #define IP_VS_XMIT(pf, skb, cp, local) \
414 (skb)->ipvs_property = 1; \
415 if (likely(!((cp)->flags & IP_VS_CONN_F_NFCT))) \
416 ip_vs_notrack(skb); \
419 skb_forward_csum(skb); \
420 NF_HOOK(pf, NF_INET_LOCAL_OUT, (skb), NULL, \
421 skb_dst(skb)->dev, dst_output); \
447 struct iphdr *iph = ip_hdr(skb);
453 IP_VS_RT_MODE_NON_LOCAL,
NULL)))
457 mtu = dst_mtu(&rt->
dst);
478 skb_dst_set(skb, &rt->
dst);
489 dst_link_failure(skb);
496 #ifdef CONFIG_IP_VS_IPV6
502 struct ipv6hdr *iph = ipv6_hdr(skb);
507 if (!(rt = __ip_vs_get_out_rt_v6(skb,
NULL, &iph->
daddr,
NULL, 0,
508 IP_VS_RT_MODE_NON_LOCAL)))
512 mtu = dst_mtu(&rt->
dst);
513 if (__mtu_check_toobig_v6(skb, mtu)) {
515 struct net *net = dev_net(skb_dst(skb)->dev);
537 skb_dst_set(skb, &rt->
dst);
548 dst_link_failure(skb);
566 struct iphdr *iph = ip_hdr(skb);
574 p = skb_header_pointer(skb, iph->ihl*4,
sizeof(_pt), &_pt);
581 if (!(rt = __ip_vs_get_out_rt(skb, cp->
dest, cp->
daddr.
ip,
584 IP_VS_RT_MODE_NON_LOCAL |
585 IP_VS_RT_MODE_RDR,
NULL)))
592 #if IS_ENABLED(CONFIG_NF_CONNTRACK)
595 struct nf_conn *
ct = ct = nf_ct_get(skb, &ctinfo);
597 if (ct && !nf_ct_is_untracked(ct)) {
600 "stopping DNAT to local address");
607 if (local && ipv4_is_loopback(cp->
daddr.
ip) &&
608 rt_is_input_route(skb_rtable(skb))) {
610 "stopping DNAT to loopback address");
615 mtu = dst_mtu(&rt->
dst);
620 "ip_vs_nat_xmit(): frag needed for");
628 if (skb_cow(skb, rt->
dst.dev->hard_header_len))
634 ip_hdr(skb)->daddr = cp->
daddr.
ip;
640 skb_dst_set(skb, &rt->
dst);
648 if (!__ip_vs_reroute_locally(skb))
667 dst_link_failure(skb);
677 #ifdef CONFIG_IP_VS_IPV6
691 p = skb_header_pointer(skb,
sizeof(
struct ipv6hdr),
701 IP_VS_RT_MODE_NON_LOCAL |
702 IP_VS_RT_MODE_RDR))))
704 local = __ip_vs_is_local_route6(rt);
709 #if IS_ENABLED(CONFIG_NF_CONNTRACK)
712 struct nf_conn *
ct = ct = nf_ct_get(skb, &ctinfo);
714 if (ct && !nf_ct_is_untracked(ct)) {
716 "ip_vs_nat_xmit_v6(): "
717 "stopping DNAT to local address");
725 ipv6_addr_type(&rt->rt6i_dst.addr) & IPV6_ADDR_LOOPBACK) {
727 "ip_vs_nat_xmit_v6(): "
728 "stopping DNAT to loopback address");
733 mtu = dst_mtu(&rt->
dst);
734 if (__mtu_check_toobig_v6(skb, mtu)) {
736 struct net *net = dev_net(skb_dst(skb)->dev);
742 "ip_vs_nat_xmit_v6(): frag needed for");
750 if (skb_cow(skb, rt->
dst.dev->hard_header_len))
756 ipv6_hdr(skb)->daddr = cp->
daddr.
in6;
758 if (!local || !skb->
dev) {
761 skb_dst_set(skb, &rt->
dst);
782 dst_link_failure(skb);
817 struct netns_ipvs *ipvs = net_ipvs(skb_net(skb));
821 struct iphdr *old_iph = ip_hdr(skb);
825 unsigned int max_headroom;
831 if (!(rt = __ip_vs_get_out_rt(skb, cp->
dest, cp->
daddr.
ip,
833 IP_VS_RT_MODE_NON_LOCAL |
844 mtu = dst_mtu(&rt->
dst) -
sizeof(
struct iphdr);
849 if (rt_is_output_route(skb_rtable(skb)))
850 skb_dst(skb)->ops->update_pmtu(skb_dst(skb),
NULL, skb, mtu);
855 if (df && mtu <
ntohs(old_iph->
tot_len) && !skb_is_gso(skb)) {
866 if (skb_headroom(skb) < max_headroom
867 || skb_cloned(skb) || skb_shared(skb)) {
878 old_iph = ip_hdr(skb);
887 skb_reset_network_header(skb);
892 skb_dst_set(skb, &rt->
dst);
899 iph->ihl =
sizeof(
struct iphdr)>>2;
906 ip_select_ident(iph, &rt->
dst,
NULL);
922 dst_link_failure(skb);
932 #ifdef CONFIG_IP_VS_IPV6
940 struct ipv6hdr *old_iph = ipv6_hdr(skb);
942 unsigned int max_headroom;
948 if (!(rt = __ip_vs_get_out_rt_v6(skb, cp->
dest, &cp->
daddr.
in6,
950 IP_VS_RT_MODE_NON_LOCAL))))
952 if (__ip_vs_is_local_route6(rt)) {
959 mtu = dst_mtu(&rt->
dst) -
sizeof(
struct ipv6hdr);
966 skb_dst(skb)->ops->update_pmtu(skb_dst(skb),
NULL, skb, mtu);
969 if (__mtu_check_toobig_v6(skb, mtu)) {
971 struct net *net = dev_net(skb_dst(skb)->dev);
985 if (skb_headroom(skb) < max_headroom
986 || skb_cloned(skb) || skb_shared(skb)) {
997 old_iph = ipv6_hdr(skb);
1003 skb_reset_network_header(skb);
1008 skb_dst_set(skb, &rt->
dst);
1013 iph = ipv6_hdr(skb);
1017 be16_add_cpu(&iph->
payload_len,
sizeof(*old_iph));
1018 iph->priority = old_iph->priority;
1038 dst_link_failure(skb);
1059 struct iphdr *iph = ip_hdr(skb);
1064 if (!(rt = __ip_vs_get_out_rt(skb, cp->
dest, cp->
daddr.
ip,
1067 IP_VS_RT_MODE_NON_LOCAL |
1076 mtu = dst_mtu(&rt->
dst);
1097 skb_dst_set(skb, &rt->
dst);
1108 dst_link_failure(skb);
1115 #ifdef CONFIG_IP_VS_IPV6
1127 IP_VS_RT_MODE_NON_LOCAL))))
1129 if (__ip_vs_is_local_route6(rt)) {
1135 mtu = dst_mtu(&rt->
dst);
1136 if (__mtu_check_toobig_v6(skb, mtu)) {
1138 struct net *net = dev_net(skb_dst(skb)->dev);
1160 skb_dst_set(skb, &rt->
dst);
1171 dst_link_failure(skb);
1216 IP_VS_RT_MODE_RDR : IP_VS_RT_MODE_NON_LOCAL;
1217 if (!(rt = __ip_vs_get_out_rt(skb, cp->
dest, cp->
daddr.
ip,
1218 RT_TOS(ip_hdr(skb)->tos),
1227 #if IS_ENABLED(CONFIG_NF_CONNTRACK)
1230 struct nf_conn *ct = ct = nf_ct_get(skb, &ctinfo);
1232 if (ct && !nf_ct_is_untracked(ct)) {
1234 "stopping DNAT to local address %pI4\n",
1242 if (local && ipv4_is_loopback(cp->
daddr.
ip) &&
1243 rt_is_input_route(skb_rtable(skb))) {
1245 "stopping DNAT to loopback %pI4\n",
1251 mtu = dst_mtu(&rt->
dst);
1252 if ((skb->
len > mtu) && (ip_hdr(skb)->frag_off &
htons(
IP_DF)) &&
1263 if (skb_cow(skb, rt->
dst.dev->hard_header_len))
1271 skb_dst_set(skb, &rt->
dst);
1279 if (!__ip_vs_reroute_locally(skb))
1292 dst_link_failure(skb);
1304 #ifdef CONFIG_IP_VS_IPV6
1337 IP_VS_RT_MODE_RDR : IP_VS_RT_MODE_NON_LOCAL;
1342 local = __ip_vs_is_local_route6(rt);
1347 #if IS_ENABLED(CONFIG_NF_CONNTRACK)
1350 struct nf_conn *ct = ct = nf_ct_get(skb, &ctinfo);
1352 if (ct && !nf_ct_is_untracked(ct)) {
1354 "stopping DNAT to local address %pI6\n",
1363 ipv6_addr_type(&rt->rt6i_dst.addr) & IPV6_ADDR_LOOPBACK) {
1365 "stopping DNAT to loopback %pI6\n",
1371 mtu = dst_mtu(&rt->
dst);
1372 if (__mtu_check_toobig_v6(skb, mtu)) {
1374 struct net *net = dev_net(skb_dst(skb)->dev);
1387 if (skb_cow(skb, rt->
dst.dev->hard_header_len))
1390 ip_vs_nat_icmp_v6(skb, pp, cp, 0);
1392 if (!local || !skb->
dev) {
1395 skb_dst_set(skb, &rt->
dst);
1410 dst_link_failure(skb);