云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

域名注册_北京网站建设报价_怎么申请

小七 141 0

滥用Linux的防火墙:让我们建立频谱的黑客行为

今天,我们将介绍频谱:一个新的Cloudflare功能,它为任何基于TCP的协议带来DDoS保护、负载平衡和内容加速。CC BY-SA 2.0图像由Staffan Vilcans提供在我们开始构建Spectrum之后不久,我们遇到了一个主要的技术障碍:Spectrum要求我们在任何有效的TCP端口(从1到65535)上接受连接。在我们的Linux边缘服务器上,不可能"接受任何端口号上的入站连接"。这不是Linux特有的限制:这是bsdsocketsapi的一个特性,它是大多数操作系统上网络应用程序的基础。为了提供频谱,我们需要解决两个重叠的问题:如何接受从1到65535的所有端口号上的TCP连接如何配置一个Linux服务器来接受大量IP地址上的连接(我们在anycast范围内有数千个IP地址)为服务器分配数百万IPCloudflare的边缘服务器具有几乎相同的配置。在我们早期,我们习惯于为环回网络接口分配特定的/32(和/128)IP地址[1]。当我们有几十个IP地址时,这种方法很有效,但是随着我们的增长,它无法扩展。随之而来的是"AnyIP"把戏。AnyIP允许我们将整个IP前缀(子网)分配给环回接口,从特定的IP地址扩展。AnyIP已经被广泛使用:您的计算机已经为环回接口分配了127.0.0.0/8。从计算机的角度来看,从127.0.0.1到127.255.255.254的所有IP地址都属于本地计算机。此技巧适用于127.0.0.1/8以上的块。要将192.0.2.0/24的整个范围视为本地分配,请运行:ip路由添加本地192.0.2.0/24 dev lo接下来,您可以很好地绑定到这些IP地址之一上的端口8080:nc-l 192.0.2.1 8080让IPv6工作起来有点困难:ip路由添加本地2001:db8::/64 dev lo遗憾的是,您不能像v4示例那样只绑定到这些附加的v6ip地址。要使其正常工作,必须使用IP_FREEBIND socket选项,这需要提升特权。为了完整起见,还有一个sysctl网络ipv6.ip\u非本地绑定,但我们不建议触摸它。这个AnyIP技巧允许我们在本地为每台服务器分配数百万个IP地址:$ip地址显示1: lo:mtu 65536inet 1.1.1.0/24范围全局lo永远有效,永远优先inet 104.16.0.0/16范围全局lo永远有效,永远优先...绑定到所有端口第二个主要问题是为任何端口号打开TCP套接字的能力。在Linux中,通常在任何支持bsdsockets API的系统中,您只能通过一个bind系统调用绑定到特定的TCP端口号。不可能在一个操作中绑定到多个端口。一个简单的解决方案是绑定65535次,每个65535个可能的端口都绑定一次。事实上,这本可以是一种选择,但会带来可怕的后果:监听插座的复仇在内部,Linux内核将侦听套接字存储在一个按端口号LHTABLE索引的哈希表中,使用的正好是32个bucket:/*是的,真的,这就是你所需要的。*/#定义INET_LHTABLE_大小32如果我们打开了65k个端口,那么对这个表的查找将大大减慢:每个哈希表bucket将包含2000个条目。另一种解决问题的方法是使用iptables丰富的NAT特性:我们可以将入站数据包的目的地重写为某个特定的地址/端口,我们的应用程序将绑定到该地址/端口。但我们不想这样做,因为它需要启用iptables conntrack模块。过去,我们发现了一些性能边缘的情况,而conntrack无法应对我们遇到的一些大型DDoS攻击。此外,使用NAT方法,我们将丢失目标IP地址信息。为了解决这个问题,有一个鲜为人知的sou-ORIGINAL_-DST套接字选项,但是代码看起来并不令人鼓舞。幸运的是,有一种方法可以实现我们的目标,不需要绑定到所有65k端口,或者使用conntrack。救命防火墙在进一步讨论之前,让我们回顾一下操作系统中网络数据包的一般流程。通常,入站数据包路径中有两个不同的层:IP防火墙网络堆栈这些在概念上是不同的。IP防火墙通常是一个无状态的软件(让我们暂时忽略conntrack和IP片段重组)。防火墙分析IP包并决定是否接受或丢弃它们。请注意:在这一层,我们讨论的是数据包和端口号,而不是应用程序或套接字。然后是网络堆栈。这只野兽维持着充足的状态。它的主要任务是将入站IP包发送到套接字,然后由用户空间应用程序处理。网络堆栈管理与用户空间共享的抽象。它重组TCP流,处理路由,并知道哪些IP地址是本地的。魔法尘埃图片来源:仍然来自YouTube我们偶然发现了TPROXY iptables模块。官方文件很容易被忽视:氧化此目标仅在mangle表中有效预路由链和用户定义链从这个链条上呼叫。它将数据包重定向到本地套接字而不以任何方式更改包头。它可以同时更改可用于高级路由规则。另一篇文档可以在内核中找到:文档/网络/tproxy.txt文件我们越想越好奇。。。所以。。。TPROXY实际上是做什么的?揭秘魔术TPROXY代码非常简单:案例NFT_LOOKUP_侦听器:sk=inet_lookup_listener(网络和tcp哈希信息,skb,叶德伦(skb)+__tcp_hdrlen(tcph),萨德,体育,爸爸,港口,在->ifindex中,0);让我为您大声朗读:在iptables模块中,它是防火墙的一部分,我们称之为inet_lookup_listener。此函数接受src/dst port/ip4元组,并返回能够接受该连接的侦听套接字。这是网络堆栈的套接字分派的核心功能。再一次:防火墙代码调用套接字调度例程。稍后,TPROXY实际执行套接字调度:skb->sk=sk;这一行将一个socket struct sock分配给一个入站数据包-完成分派。把兔子从帽子里拽出来由Angela Boothroyd设计的CC BY-SA 2.0图像有了TPROXY,我们可以很容易地执行绑定到所有端口的技巧。配置如下:#将192.0.2.0/24设置为使用AnyIP在本地路由。#明确表示用于此网络的源IP#就地连接时应在127.0.0.0/8范围内。#这是必需的,否则TPROXY规则将匹配#向前和向后的交通。我们想让它抓住#仅限前进交通。sudo ip路由添加本地192.0.2.0/24 dev lo src 127.0.0.1#设置神奇的TPROXY路由sudo iptables-t mangle-I预路由\-d 192.0.2.0/24-p tcp\-j TPROXY--on port=1234--on ip=127.0.0.1除此之外,您还需要使用神奇的IP_TRANSPARENT socket选项启动TCP服务器。我们下面的例子需要听听tcp://127.0.0.1:1234。ipu TRANSPARENT的手册页显示:IP®透明(从Linux 2.6.24开始)设置此布尔选项将启用透明代理这个插座。此套接字选项允许调用应用程序绑定到一个非本地IP地址并作为客户机和一个以外部地址作为本地地址的服务器终点。注意:这要求在中设置路由发送到外部地址的数据包被路由的一种方式通过TProxy box(即,托管应用程序,该应用程序使用IP峎u TRANSPARENT socket选项)。启用此套接字选项需要超级用户权限(CAP_NET_管理功能)。使用iptables TProxy目标进行TProxy重定向要求在重定向的套接字上设置此选项。下面是一个简单的Python服务器:导入套接字IP帴透明=19s=插座.插座(插座, socket.SOCK_流)s、 固定支座(插座, socket.SO_重用ADDR,1)s、 固定支座(IP插座,IP透明,1)s、 绑定(('127.0.0.1',1234))s、 听(32)打印("[+]绑定到tcp://127.0.0.1:1234英寸)如果是真的:c、 (r\u ip,r\u端口)=s.accept()l_ip,l_port=c.getsockname()打印([]从tcp://%s:%d到tcp://%s:%d的连接(r\u ip,r_port,l_ip,l_port))c、 发送(b"hello world\n")c、 关闭()运行服务器后,您可以从任意IP地址连接到它:$nc-v 192.0.2.1 9999连接到192.0.2.1 9999端口[tcp/*]成功!你好,世界最重要的是,服务器将报告连接确实被定向到192.0.2.1端口9999,即使实际上没有人监听该IP地址和端口:$sudo python3透明2.py[+]绑定到tcp://127.0.0.1:1234个[]连接自tcp://127.0.0.1:60036至tcp://192.0.2.1:9999个泰达!这是如何在不使用conntrack的情况下绑定到Linux上的任何端口。所有的人都是这样在这篇文章中,我们描述了如何使用一个晦涩难懂的iptables模块,该模块最初是为了帮助透明代理而设计的,用于稍微不同的东西。在它的帮助下,我们可以使用标准的bsdsocketsapi执行我们认为不可能的事情,从而避免了任何定制内核补丁的需要。TPROXY模块非常不寻常——在Linux防火墙的上下文中,它执行通常由Linux网络堆栈完成的事情。官方文档相当缺乏,我不相信很多Linux用户理解这个模块的全部功能。公平地说,TPROXY允许我们的频谱产品在香草内核上平稳运行。这又一次提醒我们,理解iptables和网络堆栈是多么重要!做低级的插座工作听起来有趣吗?加入我们在伦敦、奥斯汀、旧金山、香槟的世界知名团队,以及我们在波兰华沙的精英办公室。将IP地址分配给环回接口,再加上适当的rp峎过滤器和BGP配置,我们可以