我正在为 Ubuntu Server VPS 配置 iptables。它运行 sshd 和各种 Dockerised Web 应用程序。它不是路由器,也不是复杂网络的一部分。
在研究了这个主题之后,我决定尊重 ICMP。
但是,我使用白名单,并且只使用ACCEPT
特定的流量:
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
# ...then ACCEPT specific incoming traffic
那么 ICMP 呢?我可以列出REJECT
几种类型,并将其余类型列入白名单:
-A INPUT -p icmp -m icmp --icmp-type redirect -j REJECT
-A INPUT -p icmp -j ACCEPT
但这会破坏白名单...所以我想反过来做。
大多数 ICMPv4 类型已被弃用。因此创建白名单很容易,我只需要指导。
主要类型包括iptables -p icmp -h
:
0 = echo-reply (pong) # indirectly accepted by ESTABLISHED,RELATED rule
3 = destination-unreachable # `ACCEPT`, especially code 4
4 = source-quench
5 = redirect
8 = echo-request (ping) # `ACCEPT`
9 = router-advertisement
10 = router-solicitation
11 = time-exceeded # indirectly accepted by ESTABLISHED,RELATED rule
12 = parameter-problem # `ACCEPT`
13 = timestamp
14 = timestamp reply
17 = address-mask-request
18 = address-mask-reply
... many more
我会做什么:
- 类型 3、8、12:必须
ACCEPT
- 类型 0, 11:
ACCEPT
根据单独ESTABLISHED,RELATED
规则自动 - 其他类型:默认策略将
REJECT
(而不是DROP
),并带有消息--reject-with icmp-proto-unreachable
我还应该选择哪些类型ACCEPT
?(我是否接受了不应该接受的类型或代码?)
更新 1
不,这不是重复的。它是关于将重要的传入 ICMP 流量列入白名单,并拒绝其余流量。
也许正如@poige 的评论所说,我的列表中的某些项目是不必要的,因为它们是响应(如 echo-reply)。这是我的问题的一部分,请告诉我应该将哪些内容放入白名单。如果已经包含在白名单中,ESTABLISHED,RELATED
请建议我将其从白名单中删除。
更新2
为了避免与@poige 发生更多不必要的冲突,问题简单如下:
“我使用白名单方法 - 因此默认情况下所有内容都会被丢弃。但我不想丢弃 icmp 流量。因此,我希望得到有关将哪些内容放入白名单的建议。”
答案1
我想知道哪些 ICMP 类型应该列入白名单,并列出了一些示例 -但白名单对于 icmp 来说并不理想。
此规则通常在开始时添加:
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
这涵盖了大多数(所有?)现代/非弃用的 ICMPv4 类型,因为它们是对本地服务器发起的连接做出的响应。这是我没有意识到的部分,所以我的问题不是要将什么添加到白名单,而是要删除什么(几乎所有东西)。
有一个例外,echo-request
它不是由本地服务器发起的。
因此我仍然使用白名单(默认丢弃,并接受特定流量),除了 ICMP 部分(拒绝某些类型,并接受其余类型):
*filter
# default drop (so can create a whitelist)
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
# this automatically accepts all icmpv4 types other than echo-request
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# accept specific traffic...
# icmp: reject redirects and accept the rest (basically a blacklist)
-A INPUT -p icmp -m icmp --icmp-type redirect -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p icmp -j ACCEPT
# accept specific traffic...
COMMIT