Iptables 日常使用备忘录

参数介绍

  • -N 表示创建链,-F 表示清空链,-X 表示删除链。
  • -Z 表示清空计数器 (例如,-Z INPUT 表示清空 INPUT 链的计数器)
  • -P 表示设置默认策略 (例如,-P INPUT DROP 表示设置默认策略为丢弃所有输入包)
  • -I 表示插入规则到链的开头, -A 表示添加规则到链的末尾,-D 表示删除规则,-R 表示替换规则。
  • -L 表示列出规则,-v 表示列出详细信息,-n 表示列出数字格式,--line-numbers 表示列出规则的行号。
  • -s 表示源地址,-d 表示目标地址,-i 表示输入接口,-o 表示输出接口。

-p

  • -p 表示协议,-p tcp 表示匹配 tcp 协议,-p udp 表示匹配 udp 协议,-p icmp 表示匹配 icmp 协议。
  • -p tcp –dport 22 表示匹配 tcp 协议,目标端口为 22 的包。

-t

  • -t 表示表,-t filter 表示过滤表,-t nat 表示网络地址转换表,-t mangle 表示数据包修改表。不写时默认为 filter 表
  • -t filter -N fw_INPUT 表示创建过滤表的 fw_INPUT 链,-t filter -F fw_INPUT 表示清空过滤表的 fw_INPUT 链,-t filter -X fw_INPUT 表示删除过滤表的 fw_INPUT 链。
  • -t nat -N fw_PREROUTING 表示创建网络地址转换表的 fw_PREROUTING 链,-t nat -F fw_PREROUTING 表示清空网络地址转换表的 fw_PREROUTING 链,-t nat -X fw_PREROUTING 表示删除网络地址转换表的 fw_PREROUTING 链。
  • -t mangle -N fw_FORWARD 表示创建数据包修改表的 fw_FORWARD 链,-t mangle -F fw_FORWARD 表示清空数据包修改表的 fw_FORWARD 链,-t mangle -X fw_FORWARD 表示删除数据包修改表的 fw_FORWARD 链。

-m

-m 参数是 iptables 命令的一个选项,用于指定要使用的匹配模块(Match Module)。匹配模块允许你在防火墙规则中指定不同的匹配条件,以便过滤和处理网络数据包。-m 后面通常跟随特定的模块名称,如 -m tcp、-m udp、-m state 等,以根据不同的协议或条件对数据包进行匹配。

以下是一些常见的匹配模块及其作用的简单介绍:

  1. -m tcp:用于匹配TCP协议的数据包,允许你指定TCP的一些特定条件,如端口号、连接状态等。
  2. -m udp:用于匹配UDP协议的数据包,类似于 -m tcp,但用于UDP数据包。
  3. -m state:用于匹配数据包的连接状态,允许你检查数据包是否属于已建立连接、相关连接或无效连接。
  4. -m multiport:用于匹配多个端口号的数据包,可以指定一个或多个端口号。
  5. -m limit:用于限制数据包的匹配速率,以控制规则匹配的频率。
  6. -m mac:用于根据MAC地址匹配数据包,允许你控制特定MAC地址的数据流。
  7. -m owner:用于匹配属于特定用户或用户组的数据包,通常与用户ID或组ID一起使用。
  8. -m comment:用于添加注释信息到规则中,以提高规则的可读性和管理性。

例如 -m icmp 表示匹配 icmp 协议,-m state –state NEW 表示匹配新连接,-m state –state ESTABLISHED,RELATED 表示匹配已建立连接,-m owner –uid-owner 10154 表示匹配 uid 为 10154 的应用程序。-m multiport –dports 80,443 表示匹配目标端口为 80 或 443 的包。

-j

  • -j ACCEPT 表示匹配成功后的动作,ACCEPT 表示接受,DROP 表示丢弃,REJECT 表示拒绝。(此处仅列举了常用部分)
  • -j LOG 表示添加日志规则,日志规则必须放在 ACCEPT, DROP, REJECT 规则之前。

-A

  • -A fw_INPUT -j DROP 表示添加丢弃规则,丢弃所有输入包。
  • -A fw_OUTPUT -j REJECT 表示添加拒绝规则,拒绝所有输出包。
  • -A fw_FORWARD -j REJECT 表示添加拒绝规则,拒绝所有转发包。

链表 (Chain Table)

  • filter 表

filter 表是 iptables 的默认表,它包含了三个预定义的链:INPUT、OUTPUT 和 FORWARD。这些链用于处理进入系统、从系统发出和通过系统的数据包。filter 表的默认策略是接受所有数据包。

  • nat 表

nat 表用于网络地址转换,它包含了三个预定义的链:PREROUTING、POSTROUTING 和 OUTPUT。这些链用于处理数据包的源地址和目标地址。nat 表的默认策略是接受所有数据包。

  • mangle 表

mangle 表用于修改数据包的头部信息,它包含了五个预定义的链:PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING。这些链用于处理数据包的头部信息。mangle 表的默认策略是接受所有数据包。

优先级 (顺序)

在 iptables 中,链的顺序非常重要,因为它们按照顺序依次处理数据包。如果数据包匹配了链中的规则,那么它将执行链中的动作,然后停止处理。如果数据包不匹配链中的任何规则,那么它将继续处理下一个链。

在 iptables 中,链的顺序是固定的,不能改变。在 filter 表中,链的顺序是:INPUT、FORWARD 和 OUTPUT。在 nat 表中,链的顺序是:PREROUTING、INPUT、OUTPUT 和 POSTROUTING。在 mangle 表中,链的顺序是:PREROUTING、INPUT、FORWARD、OUTPUT 和 POSTROUTING。

源地址 (Source Address)

iptables 中,INPUT 链和 OUTPUT 链的源地址通常不会完全一致,因为它们分别用于处理不同的数据包流向。

  • INPUT链用于处理进入系统的数据包,即从外部网络发送到本地系统的数据包。在这种情况下,源地址通常是来自外部网络的数据包的源地址
  • OUTPUT链用于处理从本地系统发送到外部网络的数据包。在这种情况下,源地址通常是本地系统的地址,即数据包的来源。

应用实例

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#!/bin/bash

# HTTP \ HTTPS
iptables -t filter -I INPUT -p tcp -m multiport --dports 2080,2443 -m state --state NEW -j ACCEPT
# mDNS
iptables -t filter -I INPUT -p udp -d 224.0.0.251 --dport 5353 -m state --state NEW -j ACCEPT
# UPnP
iptables -t filter -I INPUT -p udp -d 239.255.255.250 --dport 1900 -m state --state NEW -j ACCEPT
# WireGuard
iptables -t filter -I INPUT -p udp --dport 8000 -m state --state NEW -j ACCEPT
# Gitea / Shiori / GoToSocial
# iptables -t filter -I INPUT -p tcp -s 127.0.0.1 -d 127.0.0.1 --dport 3001 -m state --state NEW -j ACCEPT
iptables -t filter -I INPUT -p tcp -s 127.0.0.1 -d 127.0.0.1 -m multiport --dports 5001,5002,5003 -m state --state NEW -j ACCEPT
# SMB
iptables -t filter -I INPUT -p tcp --dport 445 -m state --state NEW -j ACCEPT

# 拦截 137、138 端口,它们产生了太多无用的防火墙日志。
iptables -t filter -I INPUT -p UDP -m multiport --dports 137,138 -m state --state NEW -j DROP

# 限制連線狀態為 ESTABLISHED 及 RELATED 可以輸入,可用於本機要呼叫遠端 Web API 時,
# 或有與遠端資料交換時,因會有回傳資料故並非只有輸出,仍有輸入。
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# INPUT 日志记录
iptables -A INPUT -j LOG --log-prefix "[iptables] [in] "

iptables -P INPUT DROP
Licensed under CC BY-NC-SA 4.0