像大多数服务器(我认为),我们有人试图暴力强制我们的服务24/7。 我有cpHulk把他们的IP列入黑名单,但是如果他们没有得到那么多的话,似乎会更好。 我和我的主机是唯一的连接到服务器上的80以外的端口,所以我想阻止从美国以外的所有国家的连接,除了端口80.我联系我的主机设置,但他们犹豫不决,因为他们说这会造成一个非常高的服务器负载。 这是一个专用的Xeon 1230服务器,运行CentOS 6.6和iptables的32GB内存。
首先,有什么理由不这样做? 其次,我的主人告诉我的是正确的? 第三,是否有任何方法可以在没有高性能影响的情况下实现?
设置特定的规则来阻止每个IP范围(通过列出每个范围)是错误的方法。
在iptables中设置默认规则,将所有stream量丢弃到pipe理端口。 然后添加规则,只允许从您信任的IP(您和您的主机)访问。
在默认情况下阻止一切,只允许通过的stream量通常被称为“明确拒绝所有”,并被认为是最佳做法。 在这种情况下,也有助于避免主机所关心的性能影响。
为了做到这一点,你将不得不添加成千上万的防火墙规则,每个networking块一个,一个国家可能有一个从一个到几千个networking块相关的任何地方。
当一个请求进入时,必须对每一条规则进行检查,这几条规则只需要很less的时间,甚至几百条规则,但只要你需要使用多less条规则,(1)每条规则请求会显着减慢,(2)会使用大量的CPU。
要做到这一点,没有显着的性能影响,就是通过做你已经做的事情:只阻塞那些有问题的特定地址。
你需要的是一个叫ipsets的工具
IP集是Linux内核中的一个框架,可以通过ipset实用程序进行pipe理。 根据不同的types,当前IP地址集可能会以某种方式存储IP地址,(TCP / UDP)端口号或带有MAC地址的IP地址,从而在匹配条目时确保闪电般的速度。
这里要注意的重要一点是,它是闪电般的! 这是因为大量的IPnetworking可以用一个散列表示,而不是数百或数千行iptables规则。
对于阻止国家看到这个例子 :
忽略这样做是否是一个好主意,你可以用iptables的GeoIP模块来做什么。
在build立和安装模块 (并保持你的IP列表每月更新)后,你可以做这样的事情来阻止个别国家:
iptables -I INPUT -m geoip --src-cc CN -j DROP
或者使用--src-cc US -j ACCEPT等,如果你喜欢指定那些你想保留的国家。
如果您希望保留从任何地点进行连接而无需维护地理位置黑名单/白名单的function,则可以实施端口敲打 。 它会阻止大多数自动尝试,同时允许您仍然从任何地址连接。
注意:不要将端口敲打到要打开的端口附近,否则顺序端口扫描将激活您的规则。
如果你有一台支持BGP协议的路由器,或者你有两台路由器,并且有一些想法,那么你到底在做什么,或者和一个知道自己在做什么的人一起工作。也许在一个DDoS预防提供商背后有足够的冷静来协助实施这个,有一个比较新的方法来限制stream量到被称为select性黑洞的地理区域,我认为这是值得一看的。
https://ripe68.ripe.net/presentations/176-RIPE68_JSnijders_DDoS_Damage_Control.pdf
http://mailman.nanog.org/pipermail/nanog/2014-February/064381.html
http://www.internetsociety.org/deploy360/blog/2014/07/video-selective-blackholing-at-ripe-68/
由于此方法在路由操作上起作用,因此绕过了任何服务器负载问题。