Linux Iptables 允许或阻止 ICMP ping 请求
那么,在使用 Linux 云或裸机服务器时,如何在 iptables 中允许或阻止 ping?互联网控制消息协议 (ICMP) 有许多由“类型”字段标识的消息。因此,您需要对 ICMP ping 请求使用 0 和 8 ICMP 代码类型,如下所示:
- Zero(0)代表回显回复(pong)
- Eight(8)用于回显请求(ping)
本页解释如何使用iptables 命令允许或阻止 ICMP ping 请求。
Linux iptables 规则 ICMP ping 请求语法
要启用 ICMP ping 传入客户端请求,请使用以下 iptables 规则(您需要将以下规则添加到脚本中)。我的默认防火墙策略是阻止所有内容。语法是:
iptables -A {INPUT|OUTPUT} -p icmp -j {ACCEPT|REJECT|DROP} iptables -A {INPUT|OUTPUT} -p icmp --icmp-type {0|8} -j {ACCEPT|REJECT|DROP} iptables -A {INPUT|OUTPUT} -p icmp --icmp-type {echo-reply|echo-request} -j {ACCEPT|REJECT|DROP} iptables -A {INPUT|OUTPUT} -p icmp --icmp-type {echo-reply|echo-request} -m state --state NEW,ESTABLISHED,RELATED -j {ACCEPT|REJECT|DROP}
在哪里,
- -A {INPUT|OUTPUT}:将防火墙规则附加到 INPUT 或 OUTPUT 链。
- -p icmp:使用icmp协议。
- -p icmp --icmp-type {0|8}或者--icmp-type {echo-reply|echo-request}:icmp 匹配选项通过数字(例如“0”)或名称(例如“echo-reply”)。
- -j {ACCEPT|REJECT|DROP}:告诉 Linux 如果数据包匹配该数据包该做什么。ACCEPT 表示让数据包通过。DROP 或 REJECT 表示将数据包丢弃。当您希望另一端(客户端或主机或机器人)知道端口不可访问时使用 REJECT,而对于您不希望人们/机器人/客户端看到的主机连接,请使用 DROP。
- -m state --state NEW,ESTABLISHED,RELATED:使用--ctstate或-m state选项进行扩展 icmp 数据包匹配。值为:
- INVALID:该数据包与没有已知连接相关。
- NEW:数据包已启动新连接或与未在两个方向上看到数据包的连接相关联。
- ESTABLISHED:该数据包与已在两个方向上看到数据包的连接相关联。
- RELATED:数据包正在启动新连接,但与现有连接相关联,例如 FTP 数据传输或 ICMP 错误。
让我们看一些例子。
允许所有 ICMP 流量进入防火墙
Iptables 接受 ICMP:
iptables -A INPUT -p icmp -j ACCEPT
现在用户可以使用ping 命令ping 你的服务器或防火墙。例如:
$ ping -c 4 192.168.2.17
$ ping -c 4 www.example.com
丢弃所有发往防火墙的 ICMP 流量
Iptables DROP 或拒绝 ICMP:
iptables -A INPUT -p icmp -j DROP ## OR let client politely know ping request ## ## was dropped and rejected ## iptables -A INPUT -p icmp -j REJECT
列出 iptables INPUT 链中的所有规则(包括 icmp 规则)
-L通过传递或选项运行命令--list:
您可以在 Linux 上显示或列出带有行号的所有 iptables 规则,运行:
$ sudo iptables -t filter -L INPUT -v
$ sudo iptables --table filter --list INPUT --verbose
$ sudo iptables -t filter -L INPUT -v --line-numbers
$ sudo iptables --table filter --list INPUT --verbose --line-numbers
删除 icmp 规则
您可以使用以下语法(-D或--delete选项)从链中删除匹配规则:
$ sudo iptables -D {chain}
# delete by line number #
$ sudo iptables -D {chain} {rule-number}
# Remove by matching rule #
$ sudo iptables -D INPUT -p icmp -j ACCEPT
$ sudo iptables -D INPUT -p icmp -j DROP -v
$ sudo iptables -D INPUT -p icmp -j REJECT -v
任务:启用或允许 ICMP ping 传入客户端请求
启用 ICMP ping 传入客户端请求的规则(假设默认 iptables 策略是丢弃所有 INPUT 和 OUTPUT 数据包):
## Server SERVER IP HERE ## SERVER_IP="202.54.10.20" ## Now allow ping request ## iptables -A INPUT -p icmp --icmp-type 8 -s 0/0 -d "$SERVER_IP" -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -p icmp --icmp-type 0 -s "$SERVER_IP" -d 0/0 -m state --state ESTABLISHED,RELATED -j ACCEPT
任务:允许或启用传出 ping 请求
要启用 ICMP ping 传出请求,请使用以下 iptables 规则:
SERVER_IP="202.54.10.20" iptables -A OUTPUT -p icmp --icmp-type 8 -s $SERVER_IP -d 0/0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p icmp --icmp-type 0 -s 0/0 -d $SERVER_IP -m state --state ESTABLISHED,RELATED -j ACCEPT
如何禁用传出的 ICMP 请求?
使用以下规则:
iptables -A OUTPUT -p icmp --icmp-type echo-request -j DROP ## OR ## iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP
ICMP 回显请求类型将被上述规则阻止。
请参阅此处的 ICMP 类型编号(类型字段)。您还可以获取 ICMP 类型列表,只需在 shell 提示符下键入以下命令:
$ iptables -p icmp -h
值为:
Valid ICMP Types: any echo-reply (pong) destination-unreachable network-unreachable host-unreachable protocol-unreachable port-unreachable fragmentation-needed source-route-failed network-unknown host-unknown network-prohibited host-prohibited TOS-network-unreachable TOS-host-unreachable communication-prohibited host-precedence-violation precedence-cutoff source-quench redirect network-redirect host-redirect TOS-network-redirect TOS-host-redirect echo-request (ping) router-advertisement router-solicitation time-exceeded (ttl-exceeded) ttl-zero-during-transit ttl-zero-during-reassembly parameter-problem ip-header-bad required-option-missing timestamp-request timestamp-reply address-mask-request address-mask-reply
总结
在现代网络中,阻止 ping/pong(ICMP 请求)可能带来的好处微乎其微。默认情况下,iptables 应该允许 ping 请求以进行故障排除。我建议您限制 ICMP ping 请求的速率,而不是完全阻止它们。语法是:
# Syntax rate limit icmp ping # iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit {NUMBER}/sec --limit-burst {NUMBER} -j ACCEPT # Examples rate limiting ICMP ping # iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 30/minute --limit-burst 120 -j ACCEPT # Log icmp floor iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 1/minute --limit-burst 2 -j LOG --log-prefix " PING-PONG-FLOOD " # DROP it iptables -A INPUT -p icmp --icmp-type 8 -j DROP # Verify after some time both LOG and DROP iptables -L -n -v
在哪里
- --limit rate[/second|/minute|/hour|/day]:最大平均匹配率:指定为数字,带有可选的“/秒”、“/分钟”、“/小时”或“/天”后缀;默认值为 3/小时。
- --limit-burst number:匹配的数据包的最大初始数量:每当未达到上面指定的限制时,此数量就会重新增加一,直到达到此数量;默认值为 5。
当达到限制时,您将在日志中收到以下消息。使用grep 命令的组合:
$ dmesg | grep PING-PONG-FLOOD
示例日志:
[41719.439607] PING-PONG-FLOOD IN=enp0s31f6 OUT= MAC=48:2a:e3:5c:16:bc:f0:1f:af:1f:2c:60:08:00 SRC=192.168.2.17 DST=192.168.2.25 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=3761 PROTO=ICMP TYPE=8 CODE=0 ID=27413 SEQ=120 [41719.450269] PING-PONG-FLOOD IN=enp0s31f6 OUT= MAC=48:2a:e3:5c:16:bc:f0:1f:af:1f:2c:60:08:00 SRC=192.168.2.17 DST=192.168.2.25 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=3762 PROTO=ICMP TYPE=8 CODE=0 ID=27413 SEQ=121 [41779.449955] PING-PONG-FLOOD IN=enp0s31f6 OUT= MAC=48:2a:e3:5c:16:bc:f0:1f:af:1f:2c:60:08:00 SRC=192.168.2.17 DST=192.168.2.25 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=4494 PROTO=ICMP TYPE=8 CODE=0 ID=27413 SEQ=5793
计数器的外观如下,运行:
$ sudo iptables -L INPUT -n -v
输出:
Chain INPUT (policy ACCEPT 12973 packets, 1292K bytes) pkts bytes target prot opt in out source destination 182 15288 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 limit: avg 30/min burst 120 4 336 LOG icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8 limit: avg 1/min burst 2 LOG flags 0 level 4 prefix " PING-PONG-FLOOD " 11834 994K DROP icmp -- * * 0.0.0.0/0 0.0.0.0/0 icmptype 8
获取帮助
使用 man 命令或 help 命令阅读以下手册页
$ man iptables
$ iptables --help
$ iptables --help | more
相关另外,请查看我们针对Alpine Linux Awall、CentOS 8、OpenSUSE、RHEL 8、Debian 12/11、Ubuntu Linux 版本16.04 LTS / 18.04 LTS / 20.04 LTS和22.04 LTS 的
所有完整防火墙教程。