iptables可以使用扩展数据包匹配模块。 它们有两种加载方式:

第一种: 指定 -p 或 --protocol 指定匹配的协议。
第二种: 使用 -m 或 --match 选项,后跟匹配的模块名称;然后根据特定的模块,可以使用各种额外的命令行选项。
您可以在一行中多次使用-m指定多个扩展匹配模块,例如:
iptables -I INPUT -m state --state NEW,RELATED -p tcp -m tcp --dport 4505 -j ACCEPT
并且在指定模块后可以使用-h或--help选项来查看该特定模块的帮助。
例如: iptables -m state -h

常用模板state、tcp说明:

state模块

--state state --state state_value1[,state_value2...] 
此模块与连接跟踪结合使用,可以访问此数据包的连接跟踪状态。
其中状态值是要匹配的连接状态,多个状态列表以逗号分隔。
可选的状态值有:INVALID,ESTABLISHED ,NEW ,RELATED
1. INVALID 意味着由于某种原因无法识别数据包,包括内存不足和与任何已知连接不对应的ICMP错误;
2. ESTABLISHED 意味着数据包与已在两个数据包中看到数据包的连接相关联指示;
3. NEW 表示数据包已启动新连接,或以其他方式与未在两个方向上看到数据包的连接相关联;
4. RELATED 表示数据包正在启动新连接,但与现有连接相关联,例如FTP数据传输或ICMP错误。

tcp模块
如果指定了“--protocol tcp”或者“-p tcp",再使用 -m tcp则会加载此扩展。它提供以下选项:
1. --source-port [!] port[:port]
源端口或端口范围规范。这可以是服务名称或端口号。也可以使用格式port:port指定包含范围。如果省略第一个端口,则假定为“0”;如果省略最后一个,则假定为“65535”。如果第二个端口大于第一个端口,它们将被交换。--sport是此选项的方便别名。
2. --destination-port [!] port[:port]
目标端口或端口范围规范。--dport是此选项的方便别名。
3. --tcp-flags [!] mask comp
TCP标志符合指定时匹配。
第一个参数是我们应该检查的标志,写为逗号分隔列表,
第二个参数是逗号分隔的标志列表,必须设置。标志是:SYN ACK FIN RST URG PSH ALL NONE。因此命令
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN
将仅匹配设置了SYN标志的数据包,并且未设置ACK,FIN和RST标志。
4. [!] --syn
仅匹配SYN位设置的TCP数据包,并清除ACK,RST和FIN位。这些数据包用于请求TCP连接启动;阻止来自接口的此类数据包将阻止传入的TCP连接,但传出的TCP连接将不受影响。它相当于--tcp-flags SYN,RST,ACK,FIN SYN。如果“!”标志位于“--syn”之前,选项的意义是反转。
5. --tcp-option [!] number
如果设置TCP选项,则匹配。
6. --mss value[:value]
将TCP SYN或SYN / ACK数据包与指定的MSS值(或范围)匹配,后者控制该连接的最大数据包大小。