Hello,
On Mon, 14 Sep 2015, Alex Gartrell wrote:
> This is a way to avoid nasty routing loops when multiple ipvs instances can
> forward to eachother.
>
> Signed-off-by: Alex Gartrell <agartrell@xxxxxx>
Looks good to me
Acked-by: Julian Anastasov <ja@xxxxxx>
> ---
> Documentation/networking/ipvs-sysctl.txt | 10 ++++++++++
> include/net/ip_vs.h | 11 +++++++++++
> net/netfilter/ipvs/ip_vs_core.c | 10 +++++++++-
> net/netfilter/ipvs/ip_vs_ctl.c | 7 +++++++
> 4 files changed, 37 insertions(+), 1 deletion(-)
>
> diff --git a/Documentation/networking/ipvs-sysctl.txt
> b/Documentation/networking/ipvs-sysctl.txt
> index 3ba7095..e6b1c02 100644
> --- a/Documentation/networking/ipvs-sysctl.txt
> +++ b/Documentation/networking/ipvs-sysctl.txt
> @@ -157,6 +157,16 @@ expire_quiescent_template - BOOLEAN
> persistence template if it is to be used to schedule a new
> connection and the destination server is quiescent.
>
> +ignore_tunneled - BOOLEAN
> + 0 - disabled (default)
> + not 0 - enabled
> +
> + If set, ipvs will set the ipvs_property on all packets which are of
> + unrecognized protocols. This prevents us from routing tunneled
> + protocols like ipip, which is useful to prevent rescheduling
> + packets that have been tunneled to the ipvs host (i.e. to prevent
> + ipvs routing loops when ipvs is also acting as a real server).
> +
> nat_icmp_send - BOOLEAN
> 0 - disabled (default)
> not 0 - enabled
> diff --git a/include/net/ip_vs.h b/include/net/ip_vs.h
> index 47677f0..1096a71 100644
> --- a/include/net/ip_vs.h
> +++ b/include/net/ip_vs.h
> @@ -998,6 +998,7 @@ struct netns_ipvs {
> int sysctl_backup_only;
> int sysctl_conn_reuse_mode;
> int sysctl_schedule_icmp;
> + int sysctl_ignore_tunneled;
>
> /* ip_vs_lblc */
> int sysctl_lblc_expiration;
> @@ -1121,6 +1122,11 @@ static inline int sysctl_schedule_icmp(struct
> netns_ipvs *ipvs)
> return ipvs->sysctl_schedule_icmp;
> }
>
> +static inline int sysctl_ignore_tunneled(struct netns_ipvs *ipvs)
> +{
> + return ipvs->sysctl_ignore_tunneled;
> +}
> +
> #else
>
> static inline int sysctl_sync_threshold(struct netns_ipvs *ipvs)
> @@ -1198,6 +1204,11 @@ static inline int sysctl_schedule_icmp(struct
> netns_ipvs *ipvs)
> return 0;
> }
>
> +static inline int sysctl_ignore_tunneled(struct netns_ipvs *ipvs)
> +{
> + return 0;
> +}
> +
> #endif
>
> /* IPVS core functions
> diff --git a/net/netfilter/ipvs/ip_vs_core.c b/net/netfilter/ipvs/ip_vs_core.c
> index 99be680..453972c 100644
> --- a/net/netfilter/ipvs/ip_vs_core.c
> +++ b/net/netfilter/ipvs/ip_vs_core.c
> @@ -1760,8 +1760,16 @@ ip_vs_in(unsigned int hooknum, struct sk_buff *skb,
> int af)
>
> /* Protocol supported? */
> pd = ip_vs_proto_data_get(net, iph.protocol);
> - if (unlikely(!pd))
> + if (unlikely(!pd)) {
> + /* The only way we'll see this packet again is if it's
> + * encapsulated, so mark it with ipvs_property=1 so we
> + * skip it if we're ignoring tunneled packets
> + */
> + if (sysctl_ignore_tunneled(ipvs))
> + skb->ipvs_property = 1;
> +
> return NF_ACCEPT;
> + }
> pp = pd->pp;
> /*
> * Check if the packet belongs to an existing connection entry
> diff --git a/net/netfilter/ipvs/ip_vs_ctl.c b/net/netfilter/ipvs/ip_vs_ctl.c
> index 31d80e2..7338827 100644
> --- a/net/netfilter/ipvs/ip_vs_ctl.c
> +++ b/net/netfilter/ipvs/ip_vs_ctl.c
> @@ -1850,6 +1850,12 @@ static struct ctl_table vs_vars[] = {
> .mode = 0644,
> .proc_handler = proc_dointvec,
> },
> + {
> + .procname = "ignore_tunneled",
> + .maxlen = sizeof(int),
> + .mode = 0644,
> + .proc_handler = proc_dointvec,
> + },
> #ifdef CONFIG_IP_VS_DEBUG
> {
> .procname = "debug_level",
> @@ -3902,6 +3908,7 @@ static int __net_init
> ip_vs_control_net_init_sysctl(struct net *net)
> ipvs->sysctl_conn_reuse_mode = 1;
> tbl[idx++].data = &ipvs->sysctl_conn_reuse_mode;
> tbl[idx++].data = &ipvs->sysctl_schedule_icmp;
> + tbl[idx++].data = &ipvs->sysctl_ignore_tunneled;
>
> ipvs->sysctl_hdr = register_net_sysctl(net, "net/ipv4/vs", tbl);
> if (ipvs->sysctl_hdr == NULL) {
> --
> Alex Gartrell <agartrell@xxxxxx>
Regards
--
Julian Anastasov <ja@xxxxxx>
--
To unsubscribe from this list: send the line "unsubscribe lvs-devel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
|