以下情况:我们是一群学生管理当地宿舍的互联网连接,共有大约2000名最终用户。
我们有一个流量积分系统,每 MB 下载或上传都会花费积分,新积分按小时添加。目前,我们会在用户用完所有积分后阻止其访问互联网(通过将他置于 Debian 网关路由器上 iptables 中的 REJECT 策略中)。
我们只想限制用户的带宽。做这个的最好方式是什么?
简单的答案是对用户的交换机端口(主要是 Cisco Catalyst 3550)设置速率限制。然而,这是不可取的,因为我们自己的网络内部和到大学网络的流量应该保持无限。有没有办法限制 Cisco IOS 中具有特定目标或源 IP 范围(即出口和入口)的数据包的带宽?我找不到任何东西。
另一种方法是控制我们网关路由器上的流量。我想到了几种解决方案:
tc 或 tcng - 似乎两者都具有相当神秘的语法,并且都没有提供用于执行每个 IP 流量控制的良好功能。为这么多人准备的专用 QDisc 可能会大大降低路由器的速度。此外,关于两者的文档已经过时了。
shorewall - 似乎有一个相当简洁的配置语法,但是,我不确定它是否可以处理这么多的流量和用户,以及它是否适用于 per-IP 流量限制
pfSense - 看起来像一个用于像我们这样的目的的操作系统。但是,这需要我们完全重新安装我们的网关路由器。我们没有其他 BSD 系统,pfSense 也需要有非常好的流量统计功能(我们目前在那里使用 fprobe-ulog 和 ulog-acctd)。
你的经验是什么?哪种解决方案适合我们的需求并且最容易维护?你有其他想法吗?
如果您需要有关我们系统的任何其他信息,请随时询问。
提前致谢。
编辑:我已经用iptables和实现了系统tc。
每个用户都有一个 /28 子网、一个 VPN IP(都来自 10.0.0.0/8)和一个外部 IP,所有这些都通过一个 iptables 链进行控制。这条链只有一个规则,一个简单的RETURN.
每五分钟,一个 Python 脚本读出这些规则的字节计数器。它会重置计数器并更新我们 PostgreSQL 数据库中用户的流量点帐户。
如果用户的点数余额低于某个阈值,则会为该用户创建两个 tc 类(一个用于传入,一个用于我们网关路由器上的传出接口),IP 将输入到属于这些类的 tc 过滤器中。这些课程受 HTB 限速。
与以前的系统相比fprobe-ulog, …
我经常在日志中看到以下内容:
内核:ip_conntrack:表已满,正在丢弃数据包。
目前,我将 ip_conntrack_max 设置为 65536(默认为 RHEL5)。
记住内存使用情况,我可以安全地增加多少这个值?我在这个盒子上有 4GB 内存。这台机器的功能之一是作为静态内容服务器,这可能解释了高连接数,也意味着我希望尽可能多地保留用于缓存的操作系统内存。
另外,以下两者有什么区别?/proc/sys/net/ipv4/netfilter/ip_conntrack_max /proc/sys/net/ipv4/ip_conntrack_max
我应该编辑哪个?
谢谢!
我想知道是否有人可以帮助我制定以下 iptables 规则:
我们希望允许任何和所有本地来源(如在运行 iptables 的服务器上)流量。
DNS、HTTP 等……所有这些。应该允许由运行 iptables 的服务器发起的任何连接。
目前我们基本上使用的是 OUTPUT 默认策略,ACCEPT。这样对吗?输入被阻止,所以我假设这意味着连接(除了我们允许的那些)无法启动,因为它们会在我们这边达到 OUTPUT 策略之前被丢弃?
抱歉,我的 iptables 技能很弱 ;)
非常感谢你。
我在提供 MySQL 服务的服务器上有一个相当简单的 iptables 防火墙,但 iptables 似乎给了我非常不一致的结果。
脚本的默认策略如下:
iptables -P INPUT DROP
Run Code Online (Sandbox Code Playgroud)
然后我可以使用以下规则公开 MySQL:
iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
有了这条规则,我可以从任何源 IP 连接到服务器上的任何目标 IP,而不会出现问题。但是,当我尝试通过将上面的行替换为以下内容来限制对三个 IP 的访问时,我遇到了麻烦(xxx=masked octect):
iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.XXX.XXX.184 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.XXX.XXX.196 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -m state --state NEW -s 208.XXX.XXX.251 -j ACCEPT
Run Code Online (Sandbox Code Playgroud)
一旦上述规则到位,就会发生以下情况:
我可以从 .184、.196 …
我已经配置了 fail2ban 来监控我收到的某种恶意流量模式并禁止关联的 IP 地址。
一切似乎都运行良好——正则表达式正在适当地匹配模式,并且问题 IP 地址正在添加到 iptables。
但是,当我检查 Apache 日志时,我仍然收到来自被禁止的 IP 地址的点击。就好像 iptables 根本没有运行一样。
所以让我分享一些细节只是为了确认一切都配置正确。
首先,我将清除并重新加载 iptables 规则:
$ sudo iptables -F
$ cat /etc/iptables.firewall.rules
*filter
# Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT
# Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow all outbound traffic - you can …Run Code Online (Sandbox Code Playgroud) 我有两台主机试图相互建立 IPSec 连接。为此,它们必须在 UDP 端口 500 和 4500 上进行通信,因此我在两端的防火墙中打开了它们(如相关部分所示):
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -m udp -p udp --dport 500 -j ACCEPT
-A INPUT -m udp -p udp --dport 4500 -j ACCEPT
#.....
-A INPUT -j REJECT --reject-with icmp6-port-unreachable
Run Code Online (Sandbox Code Playgroud)
但是,密钥交换永远不会成功。每一方都不断尝试一遍又一遍地重新传输 UDP 数据包,从不听到响应,直到他们最终放弃。
我从tcpdump一端开始,观察到 UDP 数据包被分片,并且在第二个分片进入后返回了一个 ICMP 端口不可达。
此类失败交换的示例(为保护您而进行了消毒):
04:00:43.311572 IP6 (hlim 51, next-header Fragment (44) payload length: 1240) 2001:db8::be6b:d879 > 2001:db8:f:608::2: frag (0x5efa507c:0|1232) ipsec-nat-t > ipsec-nat-t: NONESP-encap: isakmp 2.0 msgid 00000001 cookie 55fa7f39522011ef->f8259707aad5f995: …Run Code Online (Sandbox Code Playgroud) 我重新启动了我的服务器,然后出现了一个奇怪的问题。我在 ArchLinux 上运行,客户端是 Ubuntu、Android 和 Mac。
问题是通过客户端访问互联网很慢,大约 2ko/s 并且慢慢停止。
但是直接从服务器下载一些东西到客户端是全速进行的。而且,显然,来自服务器的互联网全速(40 个月/秒)。
我不知道重启后发生了什么,但是这个问题在所有客户端上都存在,并且只与 openvpn 转发到互联网的流量有关。
编辑:用tcp试过,没有解决。编辑:测试了各种片段/mtu 设置,没有变化。
这是我所有的confs:
??<root@Alduin>-</etc/openvpn>-<1:45:07>-?
??? cat Alduin.conf ccd/Thunderaan
local 212.83.129.104
port 1194
proto udp
dev tun
ca keys/ca.crt
cert keys/Alduin.crt
key keys/Alduin.key
dh keys/dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 10.8.0.1"
client-to-client
keepalive 5 60
ping-timer-rem
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
client-config-dir ccd
topology subnet
ccd from here +++++++++++++++
ifconfig-push 10.8.0.2 255.255.255.0
push "redirect-gateway def1"
Run Code Online (Sandbox Code Playgroud)
客户端配置:
client
dev tun
proto udp
remote …Run Code Online (Sandbox Code Playgroud) 我把这个脚本从不同的地方放在一起。我希望它一旦运行就会执行以下操作:
这是它将如何运行?我错过了什么吗?我们有数千条基于 ip 的 acl 规则,存储在 haproxy 引用的文件中,我们需要每分钟重新加载几次。
#!/bin/sh
# hold/pause new requests
iptables -I INPUT -p tcp --dport 80 --syn -j DROP
iptables -I INPUT -p tcp --dport 443 --syn -j DROP
sleep 1
# gracefully restart haproxy
/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -p /var/run/haproxy.pid -sf $(cat /var/run/haproxy.pid)
# allow new requests to come in again
iptables -D INPUT -p tcp --dport 80 --syn -j DROP
iptables -D …Run Code Online (Sandbox Code Playgroud) 我正在尝试在 CentOS 环境中部署 Tomcat 服务器,但它没有接收请求。
执行startup.sh正常,日志显示tomcat正在运行
16-Dec-2016 13:36:58.440 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler [http-nio-8080]
16-Dec-2016 13:36:58.444 INFO [main] org.apache.coyote.AbstractProtocol.start Starting ProtocolHandler [ajp-nio-8009]
16-Dec-2016 13:36:58.445 INFO [main] org.apache.catalina.startup.Catalina.start Server startup in 14803 ms
Run Code Online (Sandbox Code Playgroud)
运行netstat查看监听端口时,显示为listening
$netstat -atnp|grep LISTEN
tcp 0 0 0.0.0.0:8080 0.0.0.0:* LISTEN 3321/java
Run Code Online (Sandbox Code Playgroud)
为了跳过防火墙,我在 iptables 中添加了一个自定义规则。
$iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:50060
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:50030
ACCEPT tcp …Run Code Online (Sandbox Code Playgroud) 我想挑选社区关于 linux 服务器安全性的大脑,特别是关于蛮力攻击和使用fail2ban与自定义iptables。
那里有一些类似的问题,但没有一个能解决我满意的主题。简而言之,我正在尝试确定最佳解决方案来保护暴露在互联网上的 linux 服务器(运行通常的服务、ssh、web、邮件),免受暴力攻击。
我对服务器安全有很好的处理,即通过不允许 root 或密码登录来锁定 ssh,更改默认端口,确保软件是最新的,检查日志文件,只允许某些主机访问服务器并利用安全性审计工具,如Lynis ( https://cisofy.com/lynis/ ),用于一般安全合规性,因此这个问题不一定与此有关,尽管始终欢迎输入和建议。
我的问题是我应该使用哪种解决方案(fail2ban 或 iptables),我应该如何配置它,或者我应该使用两者的组合来防止暴力攻击?
关于该主题有一个有趣的回应(Denyhosts vs fail2ban vs iptables-防止暴力登录的最佳方法?)。对我来说,最有趣的答案是个人(https://serverfault.com/a/128964),而且iptables的路由发生在内核,而不是的fail2ban这使得用户的使用模式工具来分析日志文件。Fail2ban 当然使用 iptables,但它仍然必须解析日志文件并匹配模式,直到它执行操作。
那么使用 iptables 并使用速率限制(https://www.rackaid.com/blog/how-to-block-ssh-brute-force-attacks/)在一段时间内删除来自 IP 的请求是否有意义在特定时间段内进行过多连接尝试的时间,而不管它尝试连接到什么协议?如果是这样,那么这里有一些关于对这些数据包使用丢弃与拒绝的有趣想法(http://www.chiark.greenend.org.uk/~peterb/network/drop-vs-reject),对此有什么想法吗?
Fail2ban 允许以能够为默认配置中可能无法解决的服务编写自定义“规则”的形式进行自定义配置。它易于安装和设置并且功能强大,但是如果我试图实现的只是“阻止”来自服务器的 IP,如果他们对任何服务/协议进行 2 次失败的访问尝试超过x数量,这会不会是一种矫枉过正时间?
此处的目标是打开每日日志监视报告,而不必滚动浏览尝试连接到服务器的失败页面。
感谢您抽出宝贵的时间。