向 iptables 寻求帮助

向 iptables 寻求帮助

首先我想问为什么rules.v4使用后我的看起来这么复杂:iptables -F我以为刷新后它会是空的:

# Generated by iptables-save v1.6.0 on Tue Jan  9 21:25:13 2018
*filter
:INPUT ACCEPT [76:4024]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [1:40]
:ufw-after-forward - [0:0]
:ufw-after-input - [0:0]
:ufw-after-logging-forward - [0:0]
:ufw-after-logging-input - [0:0]
:ufw-after-logging-output - [0:0]
:ufw-after-output - [0:0]
:ufw-before-forward - [0:0]
:ufw-before-input - [0:0]
:ufw-before-logging-forward - [0:0]
:ufw-before-logging-input - [0:0]
:ufw-before-logging-output - [0:0]
:ufw-before-output - [0:0]
:ufw-logging-allow - [0:0]
:ufw-logging-deny - [0:0]
:ufw-not-local - [0:0]
:ufw-reject-forward - [0:0]
:ufw-reject-input - [0:0]
:ufw-reject-output - [0:0]
:ufw-skip-to-policy-forward - [0:0]
:ufw-skip-to-policy-input - [0:0]
:ufw-skip-to-policy-output - [0:0]
:ufw-track-forward - [0:0]
:ufw-track-input - [0:0]
:ufw-track-output - [0:0]
:ufw-user-forward - [0:0]
:ufw-user-input - [0:0]
:ufw-user-limit - [0:0]
:ufw-user-limit-accept - [0:0]
:ufw-user-logging-forward - [0:0]
:ufw-user-logging-input - [0:0]
:ufw-user-logging-output - [0:0]
:ufw-user-output - [0:0]
-A INPUT -i enp3s0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i enp3s0 -p tcp -m tcp --dport 67 -j ACCEPT
-A INPUT -i enp3s0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i enp3s0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i enp2s0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i enp2s0 -p tcp -m tcp --dport 67 -j ACCEPT
-A INPUT -i enp2s0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i enp2s0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -j ufw-before-logging-input
-A INPUT -j ufw-before-input
-A INPUT -j ufw-after-input
-A INPUT -j ufw-after-logging-input
-A INPUT -j ufw-reject-input
-A INPUT -j ufw-track-input
-A FORWARD -d 10.42.0.0/24 -o enp3s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.42.0.0/24 -i enp3s0 -j ACCEPT
-A FORWARD -i enp3s0 -o enp3s0 -j ACCEPT
-A FORWARD -o enp3s0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i enp3s0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -d 10.42.1.0/24 -o enp2s0 -m state --state RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 10.42.1.0/24 -i enp2s0 -j ACCEPT
-A FORWARD -i enp2s0 -o enp2s0 -j ACCEPT
-A FORWARD -o enp2s0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i enp2s0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j ufw-before-logging-forward
-A FORWARD -j ufw-before-forward
-A FORWARD -j ufw-after-forward
-A FORWARD -j ufw-after-logging-forward
-A FORWARD -j ufw-reject-forward
-A FORWARD -j ufw-track-forward
-A OUTPUT -j ufw-before-logging-output
-A OUTPUT -j ufw-before-output
-A OUTPUT -j ufw-after-output
-A OUTPUT -j ufw-after-logging-output
-A OUTPUT -j ufw-reject-output
-A OUTPUT -j ufw-track-output
-A ufw-after-input -p udp -m udp --dport 137 -j ufw-skip-to-policy-input
-A ufw-after-input -p udp -m udp --dport 138 -j ufw-skip-to-policy-input
-A ufw-after-input -p tcp -m tcp --dport 139 -j ufw-skip-to-policy-input
-A ufw-after-input -p tcp -m tcp --dport 445 -j ufw-skip-to-policy-input
-A ufw-after-input -p udp -m udp --dport 67 -j ufw-skip-to-policy-input
-A ufw-after-input -p udp -m udp --dport 68 -j ufw-skip-to-policy-input
-A ufw-after-input -m addrtype --dst-type BROADCAST -j ufw-skip-to-policy-input
-A ufw-after-logging-forward -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW BLOCK] "
-A ufw-after-logging-input -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW BLOCK] "
-A ufw-before-forward -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 4 -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 12 -j ACCEPT
-A ufw-before-forward -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A ufw-before-forward -j ufw-user-forward
-A ufw-before-input -i lo -j ACCEPT
-A ufw-before-input -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-input -m conntrack --ctstate INVALID -j ufw-logging-deny
-A ufw-before-input -m conntrack --ctstate INVALID -j DROP
-A ufw-before-input -p icmp -m icmp --icmp-type 3 -j ACCEPT
-A ufw-before-input -p icmp -m icmp --icmp-type 4 -j ACCEPT
-A ufw-before-input -p icmp -m icmp --icmp-type 11 -j ACCEPT
-A ufw-before-input -p icmp -m icmp --icmp-type 12 -j ACCEPT
-A ufw-before-input -p icmp -m icmp --icmp-type 8 -j ACCEPT
-A ufw-before-input -p udp -m udp --sport 67 --dport 68 -j ACCEPT
-A ufw-before-input -j ufw-not-local
-A ufw-before-input -d 224.0.0.251/32 -p udp -m udp --dport 5353 -j ACCEPT
-A ufw-before-input -d 239.255.255.250/32 -p udp -m udp --dport 1900 -j ACCEPT
-A ufw-before-input -j ufw-user-input
-A ufw-before-output -o lo -j ACCEPT
-A ufw-before-output -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A ufw-before-output -j ufw-user-output
-A ufw-logging-allow -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW ALLOW] "
-A ufw-logging-deny -m conntrack --ctstate INVALID -m limit --limit 3/min --limit-burst 10 -j RETURN
-A ufw-logging-deny -m limit --limit 3/min --limit-burst 10 -j LOG --log-prefix "[UFW BLOCK] "
-A ufw-not-local -m addrtype --dst-type LOCAL -j RETURN
-A ufw-not-local -m addrtype --dst-type MULTICAST -j RETURN
-A ufw-not-local -m addrtype --dst-type BROADCAST -j RETURN
-A ufw-not-local -m limit --limit 3/min --limit-burst 10 -j ufw-logging-deny
-A ufw-not-local -j DROP
-A ufw-skip-to-policy-forward -j DROP
-A ufw-skip-to-policy-input -j DROP
-A ufw-skip-to-policy-output -j ACCEPT
-A ufw-track-output -p tcp -m conntrack --ctstate NEW -j ACCEPT
-A ufw-track-output -p udp -m conntrack --ctstate NEW -j ACCEPT
-A ufw-user-limit -m limit --limit 3/min -j LOG --log-prefix "[UFW LIMIT BLOCK] "
-A ufw-user-limit -j REJECT --reject-with icmp-port-unreachable
-A ufw-user-limit-accept -j ACCEPT
COMMIT
# Completed on Tue Jan  9 21:25:13 2018
# Generated by iptables-save v1.6.0 on Tue Jan  9 21:25:13 2018
*nat
:PREROUTING ACCEPT [306:30491]
:INPUT ACCEPT [79:4750]
:OUTPUT ACCEPT [128:10004]
:POSTROUTING ACCEPT [122:8932]
-A POSTROUTING -s 10.42.0.0/24 ! -d 10.42.0.0/24 -j MASQUERADE
-A POSTROUTING -s 10.42.1.0/24 ! -d 10.42.1.0/24 -j MASQUERADE
COMMIT
# Completed on Tue Jan  9 21:25:13 2018

第二个问题 - 我需要对iptables特定端口上的新连接进行速率限制(不是每个 IP 的限制,而是如果新尝试太多则限制所有新尝试),同时不阻止任何未到达该特定端口的流量。我在网上看到的所有示例都使用 DROP 作为默认 INPUT 策略,但这不适合我。

更新:我在端口 45000 上运行游戏服务器(它使用 tcp 和 upd 协议),最近我遇到了机器人垃圾邮件问题。机器人试图使用数百个代理从世界各地连接到我的服务器。游戏服务器插件成功阻止了它们,但这种攻击最近变得更加强大,现在导致延迟。理想情况下,我想根据地理位置阻止对此端口的访问,并仅允许 5-10 个国家/地区,但这很复杂。另一种选择是限制到该端口的新连接的速率,同时保留已经存在的连接。当然,它肯定会在攻击期间阻止试图加入的普通玩家,但至少那些已经在玩的玩家可以做到这一点而不会出现极端延迟。我的服务器不大(最多 30 名玩家),所以我假设每 30 秒限制到端口 45000 的 30 个新连接的速率就可以了。

答案1

您发布的所有项目都是因为在某个时候您激活了 ufw(iptables 的前端)并制作了所有这些自定义表。

-F 选项会删除部分规则,但不会删除所有表中的所有规则,也不会删除您看到的空链。

您需要一些额外的选择:

https://serverfault.com/questions/200635/linux-iptables-best-way-to-clear-all-rules-leaving-anything-open重置 iptables 的完整命令集是:

iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
iptables -t nat -F
iptables -t mangle -F
iptables -F
iptables -X
  • -P 选项重置表的默认策略。
  • -t nat -F 刷新nat表。
  • -t mangle -F 刷新 mangle,该选项几乎从未使用过。
  • -X 删除空链。

有关更多详细信息,请参阅 IPv6 链接和 man iptables。

“问题”是 -F 选项,没有指定链,不会刷新所有链,在您的情况下,您有几个由 UFW 创建的剩余链。

要删除这些链,您需要先刷新它们(除非它们是空的,否则 -X 不会删除它们)

因此,对于每个链,您首先必须删除对该链的所有引用,刷新该链,然后删除它

从“ufw-before-logging-forward”开始

sudo iptables -D FORWARD -j ufw-before-logging-forward
sudo iptables -F ufw-before-logging-forward
sudo iptables -X ufw-before-logging-forward

并继续执行 ufw 添加的所有自定义链。

当然,由于您使用的是 ufw,因此有一种更简单的方法:

sudo ufw disable

一些一般性评论

  1. 我建议你保留默认策略 ACCEPT,而不是 REJECT 或 DROP。如果你将默认策略设置为 REJECT/DROP,那么如果你运行iptables -F

  2. 如果您手动编写 iptables 规则,请不要使用 ufw 或其他工具来更改您的规则。

  3. 我强烈建议使用 REJECT 而不是 DROP。简而言之,DROP 对合法流量的干扰更大,尽管听起来不错,但 DROP 不会减慢或欺骗任何现代破解工具。由于您的系统对数据包做出反应,破解者会知道您在您的 IP 地址上正常运行,而 DROP 不会隐藏任何东西。

http://www.chiark.greenend.org.uk/~peterb/network/drop-vs-reject了解详情。

  1. 使用 iptables-persistent

最佳答案如何保存iptables的规则?回顾基本用法,包括保存和恢复规则集。有关更多详细信息,请参阅手册页。


为了帮助编写规则,我需要更多详细信息,您要限制哪个端口和哪些流量以及如何限制。限制 ping 是不同的。限制 Web 服务器与限制 ssh 连接不同。允许大多数但限制少数可能是使用黑名单。限制所有并允许少数是使用白名单,等等。

例子:

网络流量-如果网络服务器非常繁忙,我可能会使用以下通用语法:

iptables -I INPUT -p tcp -m state --state NEW -m limit --limit 30/minute --limit-burst 5 -j ACCEPT

您当然可以将该选项添加--dport 80到上面的命令中。

这限制了每分钟 30 个连接,这对于 Apache 来说非常慢。如果 Web 服务器不是那么繁忙,您可以放宽到每分钟数千个连接。

SSH - 这些规则非常适合阻止暴力破解

# This rule tracks incoming connections to port 22
iptables -A INPUT -p tcp -m tcp --dport 22 -m tcp -m state --state NEW -m recent --set --name SSH --rsource

# This command rejects any attempt to connect to ssh more than
# 8 times in 10 minutes
# After 10 minutes you can attempt again so not permanent ban
iptables -A INPUT -p tcp -m tcp --dport 22 -m recent --update --seconds 600 --hitcount 8 --rttl --name SSH --rsource -j REJECT --reject-with icmp-host-prohibited

# Finally this will accept the connections 
iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT

如果您需要更具体的帮助,请更新您的问题=)

相关内容