Linux基础命令---iptables防火墙

iptables

创新互联是网站建设技术企业,为成都企业提供专业的成都做网站、成都网站建设,网站设计,网站制作,网站改版等技术服务。拥有10余年丰富建站经验和众多成功案例,为您定制适合企业的网站。10余年品质,值得信赖!

iptables 指令用来设置Linux内核的ip过滤规则以及管理nat功能。iptables用于在Linux内核中设置、维护和检查IPv4数据包过滤规则表。可以定义几个不同的表。每个表包含许多内置链,也可能包含用户定义的链。每个链都是一个规则列表,可以匹配一组数据包。每条规则都指定如何处理匹配的数据包。这被称为“目标”,它可能是跳转到同一表中的用户定义链。

此命令的适用范围:RedHat、RHEL、Ubuntu、CentOS、SUSE、openSUSE、Fedora。

 

1 、语法

iptables [-t table]  {-A|-D}  chain  rule-specification

iptables [-t table]  -I  chain [rulenum]  rule-specification

iptables [-t table]  -R  chain  rulenum rule-specification

iptables [-t table]  -D  chain rulenum

iptables [-t table]  -S  [chain [rulenum]]

iptables [-t table]  {-F|-L|-Z}  [chain [rulenum]]  [options...]

iptables [-t table]  -N  chain

iptables [-t table]  -X  [chain]

iptables [-t table]  -P  chain target

iptables [-t table]  -E  old-chain-name  new-chain-name rule-specification = [matches...] [target]

match = -m matchname [per-match-options]  target = -j targetname [per-target-options]

目前Linux内核支持3个相互独立的表:filter,过滤ip数据包;nat,配置nat功能;mangle,修改ip数据包。

filter 是默认表,包含INPUT(发送给本机) 、OUTPUT(本机向外发送)、FORWARD(被路由出去)三个链。

nat 表包含PREROUTING(修改刚收到的数据包) 、OUTPUT(在路由之前处理本机产生的数据包) 、POSTROUTING(修改将要发送的数据包)三个链。

mangle 表包含PREROUTING(路由之前,修改收到的包) 、OUTPUT(路由之前,修改本机产生的包) 、INPUT(修改发送到本机的包) 、FORWARD (修改路由之后的包) 、POSTROUTING(修改将被本机发送的包)五个链。

Linux 系统中的内置目标包括:ACCEPT(允许数据包通过)DROP(丢弃数据包) QUEUE(传递包到用户空间)RETURN(停止向后检测其他的规则,返回之前的条用规则处)

 

2 、选项列表

选项可以按组来区分

命令

说明

-t  table

指定要管理的表

-A | --append  chain rule-specification

追加记录

-D | --delete  chain rule-specification

删除记录

-I | --insert  chain [rulenum] rule-specification

插入记录

-R | --replace  chain [rulenum] rule-specification

替换记录

-L | --list  [chain]

列出记录

-S | --list-rules  [chain]

列出已选择链的所有规则。如果没有选择任何链,则所有链都打印

-F | --flush  [chain]

删除指定的记录

-Z | --zero  [chain [rulenum]]

将数据计数和字节计数清零

-N | --new-chain  chain

用户自定义新链

-X | --delete-chain  [chain]

删除用户自定义链

-P  |  --policy  chain target

为指定的链设置策略

-E  |  --rename-chain  old   new

重命名链

-h

显示帮助信息

参数

说明

[!] –p | --protocol  protocol

指定协议类型tcp、udp、icmp、all,协议前加!标识否定

[!] –s |  --source address [/mask][,…

源地址

[!] –d 

--destination address[/mask][,…

目标

-j | --jump

指定跳转的目标

-g | --goto  chain

这指定应在用户指定的链中继续处理。与“ --jump ”选项不同,返回将不再在此链中继续处理,而是在通过“ --jump ”调用我们的链中继续处理。

[!] –i | --in-interface  name

接收数据包的接口名称(仅用于输入、转发和PREROUTING链的数据包)。当“!”参数在接口名称之前使用,意义被倒置。如果接口名以“+”结尾,则以此名称开头的任何接口都将匹配。如果省略此选项,则任何接口名称都将匹配。

-o | --out-interface name

指定数据包离开的网络接口

[!] –f | --fragment

这意味着该规则仅指分段数据包的第二段和更多的片段。

-c | --set-counters  packets   bytes

这使管理员能够初始化规则的数据包和字节计数器(在插入、追加、替换操作期间)。

其他选项

说明

-v | --verbose

冗长的输出,该选项使List命令显示接口名称、规则选项(如果有的话)和TOS掩码。还列出了数据包计数器和字节计数器

-n | --numeric

数字输出IP地址和端口号将以数字格式打印。默认情况下,程序将尝试将它们显示为主机名、网络名称或服务(只要适用)。

-x | --exact

扩大数字。显示数据包和字节计数器的确切值,而不是只显示K‘s(1000倍)M’s(1000 K倍数)或G‘s(1000 m倍数)中的四舍五入数。此选项仅与-L命令相关。

--line-numbers

当列出规则时,将行号添加到每条规则的开头,对应于该规则在链中的位置。

--modprobe= command

在向链中添加或插入规则时,使用命令加载任何必要的模块(目标、匹配扩展等)

 

3 、匹配扩展

iptable 可以使用扩展的数据包匹配模块。它们以两种方式加载:隐式地,当指定“-p”或“—protocol”时,或者使用“-m”或“—match”选项,后面跟着匹配的模块名称;之后,根据特定模块的不同,可以使用各种额外的命令行选项。可以在一行中指定多个扩展匹配模块,并且可以在指定模块后使用“-h“或“--help“选项来接收特定于该模块的帮助。

1 )addrtype

此模块根据数据包的地址类型匹配数据包。地址类型在内核网络堆栈中使用,并将地址分类为不同的组。该组的确切定义取决于特定的第三层协议。地址类型可以是以下的几种:

UNSPEC ,未指明的地址,例如,0.0.0.0。

UNICAST ,单播地址。

LOCAL ,本地地址。

BROADCAST ,广播地址。

ANYCAST ,选播包。

MULTICAST ,多播地址。

BLACKHOLE ,黑洞地址。

UNREACHABLE ,不可达到的地址。

PROHIBIT ,被禁止的地址。

THROW ,FIXME。

NAT ,FIXME。

XRESOLVE

[!] --src-type type ,如果源地址为给定类型,则匹配。

[!] --dst-type type ,如果目标地址是给定类型的,则匹配。

--limit-iface-in ,地址类型检查可以限制在数据包即将进入的接口上。此选项仅在PREROUTING、INPUT和FORWARD链中有效。它不能用“--limit-iface-out “选项来指定。

--limit-iface-out ,地址类型检查可以限制在包将要输出的接口上。此选项仅在POSTROUTING、OUTPUT和FORWARD链中有效。它不能用“--limit-iface-in“选项指定。

2 ) ah

此模块与IPSec数据包的身份验证头中的Spis匹配。

[!] --ahspi spi[:spi]

3 ) cluster

允许您部署网关和后端负载共享集群,而不需要负载平衡器。此匹配要求所有节点都看到相同的数据包。因此,集群匹配决定该节点是否必须处理给定以下选项的数据包。

--cluster-total-nodes num ,设置集群中的总节点数。

[!] --cluster-local-node num ,设置本地节点编号ID。

[!] --cluster-local-nodemask mask ,设置本地节点编号ID掩码。您可以使用此选项而不是” --cluster-local-node “。

--cluster-hash-seed value ,设置Jenkins散列的种子值。

iptables  -A PREROUTING  -t mangle -i eth2 -m cluster --cluster-total-nodes 2 --cluster-local-node  1  --cluster-hash-seed  0xdeadbeef  -j  MARK  --set-mark 0xffff

iptables  -A PREROUTING  -t mangle -i eth3 -m cluster --cluster-total-nodes 2 --cluster-local-node  1  --cluster-hash-seed  0xdeadbeef  -j  MARK  --set-mark 0xffff

iptables -A PREROUTING -t mangle -i eth2 -m mark ! --mark 0xffff -j DROP

iptables -A PREROUTING -t mangle -i eth3 -m mark ! --mark 0xffff -j DROP

下面的命令使所有节点都看到相同的数据包

ip maddr add 01:00:5e:00:01:01 dev eth2

ip maddr add 01:00:5e:00:01:02 dev eth3

arptables   -A  OUTPUT   -o   eth2  --h-length  6  -j  mangle  --mangle-mac-s 01:00:5e:00:01:01

arptables -A INPUT -i eth2 --h-length 6 --destination-mac 01:00:5e:00:01:01 –j mangle --mangle-mac-d 00:zz:yy:xx:5a:27

arptables   -A  OUTPUT   -o   eth3  --h-length  6  -j  mangle  --mangle-mac-s 01:00:5e:00:01:02

arptables -A INPUT -i eth3 --h-length 6 --destination-mac 01:00:5e:00:01:02 –j mangle --mangle-mac-d 00:zz:yy:xx:5a:27

4 ) comment

允许向任何规则添加注释(最多256个字符)。

--comment comment

iptables -A INPUT -s 192.168.0.0/16 -m  comment  --comment  "A  privatized  IP block"

5 ) connbytes

主要用途是检测长时间下载,并在流量控制中使用较低优先级的频带来标记它们。每个连接传输的字节也可以通过“conntrack -L”查看,并通过ctnetlink访问。

[!] --connbytes from [:to] ,将大于FROM,小于TO的连接中的数据包匹配,“!”用于匹配不在此范围内的数据包。

--connbytes-dir {original|reply|both} 要考虑哪些数据包

--connbytes-mode {packets|bytes|avgpkt} 是否检查数据包的数量、传输的字节数或到目前为止收到的所有数据包的平均大小(以字节为单位)。请注意,当“both”与“avgpkt”一起使用时,而且数据(主要是)只朝一个方向(例如HTTP)进行,平均数据包大小将约为实际数据包的一半。

iptables   ..  -m  connbytes  --connbytes 10000:100000  --connbytes-dir  both --connbytes-mode bytes

6 ) connlimit

允许您限制每个客户端IP地址(或客户地址块)到服务器的并行连接数。

[!] --connlimit-above n ,如果现有连接的数目大于n,则匹配

--connlimit-mask prefix_length ,使用前缀长度对主机进行分组。对于IPv 4,这必须是介于(包括)0和32之间的数字。对于IPv 6,在0到128之间。

# 每个客户端主机允许 2 telnet 连接

iptables -A INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2  -j REJECT

iptables  -A  INPUT -p tcp --syn --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT

# 将并行 HTTP 请求的数量限制在每 C 类网络 16 (24 位网络掩码 )

iptables  -p  tcp  --syn  --dport  80  -m   connlimit  --connlimit-above   16 --connlimit-mask 24 -j REJECT

# 将链路本地网络的并行 HTTP 请求限制为 16

(ipv6)   ip6tables  -p  tcp  --syn  --dport  80  -s fe80::/64  -m  connlimit --connlimit-above 16 --connlimit-mask 64 -j REJECT

7 ) connmark

此模块匹配与连接关联的netfilter标记字段(可以使用下面的CONNMARK目标进行设置)。

[!] --mark value [/ mask ] ,将连接中的数据包与给定的标记值相匹配(如果指定了掩码,则在比较之前用标记进行逻辑分析)

8 )conntrack

此模块与连接跟踪结合时,允许访问此数据包/连接的连接跟踪状态。

[!] --ctstate statelist ,Statelist是要匹配的连接状态的逗号分隔列表。下面列出了可能的状态。

[!] --ctproto l4proto ,第4层协议匹配(按号码或名称)

[!] --ctorigsrc address [/ mask ]

[!] --ctorigdst address [/ mask ]

[!] --ctreplsrc address [/ mask ]

[!] --ctrepldst address [/ mask ] ,与original/reply、source/destination地址匹配。

[!] --ctorigsrcport port

[!] --ctorigdstport port

[!] --ctreplsrcport port

[!] --ctrepldstport port ,匹配original/reply、source/destination端口(TCP/UDP/等)或GRE键

[ !] --ctstatus statelis ,Statuslist是要匹配的连接状态的逗号分隔列表。下面列出了可能的状态

[!] --ctexpire time [: time ] ,将剩余生存期(以秒为单位)与给定值或范围(包括)进行匹配。

--ctdir {ORIGINAL|REPLY} ,匹配按指定方向流动的数据包。如果根本没有指定此标志,则匹配两个方向的数据包。

ctstate 的有效值

INVALID ,意味着数据包与已知的连接没有关联。

NEW ,意味着该数据包已启动一个新连接,或与未在两个方向上看到数据包的连接相关联。

ESTABLISHED ,意味着该数据包与看到两个方向的数据包的连接相关联。

RELATED ,意味着数据包正在启动新连接,但与现有连接相关联,例如FTP数据传输或ICMP错误。

SNAT ,虚拟状态,如果原始源地址与回复目的地不同,则进行匹配。

DNAT ,虚拟状态,如果原始目的地与应答源不同,则进行匹配。

ctstatus 的有效值

NONE ,不是下列任何一项。

EXPECTED ,这是一个预期的连接。

SEEN_REPLY ,ConnTrack在两个方向都看到了数据包。

ASSURED ,连接项不应提前过期。

CONFIRMED ,确认连接:原始数据包已离开框。

9 ) dccp

[!] --source-port , --sport port [: port ]

[!] --destination-port,--dport port [: port ]

[!] --dccp-types mask ,当DCCP数据包类型为“掩码”之一时匹配。“掩码”是以逗号分隔的数据包类型列表。类型可以是: REQUEST、RESPONSE、DATA、ACK、DATAACK、CLOSEREQ、CLOSE、RESET、SYNC、SYNCACK、INVALID

[!] --dccp-option number ,匹配如果设置DCP选项 

10 ) dscp

此模块与IP报头中TOS字段中的6位DSCP字段匹配。Dscp已经取代了IETF中的TOS。

[!] --dscp value ,匹配数值(十进制或十六进制)值[0-63]

[!] --dscp-class class ,匹配DiffServ类。此值可能是BE、EF、AFxx或CSX类中的任何一个。然后,它将被转换为其相应的数值。

11 ) ecn

这允许您匹配IPv 4和TCP报头的ECN位。ECN是RFC3168中指定的显式拥塞通知机制。

[!] --ecn-tcp-cwr ,如果设置了TCP ECN CWR(拥塞窗口接收)位,则匹配。

[ !] --ecn-tcp-ece ,如果设置了TCP ECN ECE(ECN Echo)位,则匹配。

[!] --ecn-ip-ect num ,这与特定的IPv 4 ECT(ECN能力传输)相匹配。你必须在‘0’和‘3’之间指定一个数字。

12 ) esp

此模块与ipsec数据包的esp报头中的spis匹配。

[!] --espspi spi [: spi ]

13 ) hashlimit

哈希限制使用散列桶来表示一组连接的速率限制匹配(如极限匹配),使用单个iptables规则。分组可以完成perhostgroup(源和/或目标地址)和/或每个端口。它使您能够表达“每组每个时间量子N个数据包”:

源主机上的匹配:192.168.0.0/16期间每台主机每秒1000个数据包。

源Prot匹配:每项服务每秒100包(192.168.1.1)。

子网的匹配:10.0.0.0/8中每个/28子网每分钟10000包。

--hashlimit-upto amount [/second|/minute|/hour|/day] ,如果速率低于或等于amount/quantum,则匹配。它被指定为一个数字,带有可选的时间量子后缀;默认值是3/小时。

--hashlimit-above amount [/second|/minute|/hour|/day] ,如果速率大于amount/quantum,则匹配

--hashlimit-burst amount ,要匹配的数据包的最大初始数量:当未达到上述指定的限制时,该数目将被重新充电一次,最多可达到此数目;默认值为5。

--hashlimit-mode {srcip|srcport|dstip|dstport},... ,要考虑的以逗号分隔的对象列表。如果给出了“- -hash-limit-mode “选项, hashlimit 就像 limit 一样,但是在进行哈希内务管理时会花费很大的代价。

--hashlimit-srcmask prefix ,当使用“ --hashlimit-mode “时,所遇到的所有源地址都将根据给定的前缀长度进行分组,因此创建的子网将受到哈希限制。前缀必须介于(包括)0和32之间。

--hashlimit-dstmask prefix ,类似“ --hashlimit-srcmask “,但是对于目标地址。

--hashlimit-name foo ,“/proc/net/ipt_hashlimit/foo“条目的名称。

--hashlimit-htable-size buckets ,哈希表的桶数。

--hashlimit-htable-max entries ,散列中的最大项。

--hashlimit-htable-expire msec ,在散列条目过期多少毫秒之后。

--hashlimit-htable-gcinterval msec ,垃圾收集间隔之间有多少毫秒。

14 ) helper

此模块匹配与特定连接辅助程序相关的数据包。

[!] --helper string ,匹配与指定的连接辅助程序相关的数据包。对于默认端口上与ftp会话相关的数据包,字符串可以是“ftp”。对于其他端口,将-portnr附加到值,即。“ftp-2121”

15 ) icmp

如果指定了“ --protocol icmp ”,则可以使用此扩展。它提供了以下选项

[!] --icmp-type {type[/code]|typename} ,这允许指定icmp类型,它可以是数值icmp类型、类型/代码对,也可以是命令显示的icmp类型名称之一。

16 ) iprange

这与给定的任意范围的ip地址匹配。

[!] --src-range from [-to] ,匹配指定范围内的源IP。

[!] --dst-range from [-to] ,匹配指定范围内的目标IP。

17 ) length

此模块将数据包的第3层有效载荷(例如第4层包)的长度与特定值或范围相匹配。

[!] --length length [: length ]

18 ) limit

此模块使用令牌桶过滤器以有限的速度匹配。使用此扩展的规则将匹配,直到达到此限制(除非“!”使用标志)。它可以与日志目标结合使用,提供有限的日志记录。

--limit rate [/second|/minute|/hour|/day] ,最大平均匹配率:指定为数字,带有可选的‘/秒’、‘/分钟’、‘/小时’或‘/日’后缀;默认值为3/小时

--limit-burst number ,要匹配的数据包的最大初始数量:当未达到上述指定的限制时,此数字将被重新充电一次,最多可达到此数目;默认值为5。

19 ) mac

[!] --mac-source address ,匹配源MAC地址。它必须是XX:XX:XX:XX:XX:XX格式。请注意,这只对来自以太网设备并进入PREROUTING、FORWARD或INPUT链的数据包有意义。

20 ) mark

此模块匹配与数据包关联的netfilter标记字段(可以使用下面的标记目标设置该标记)。

[!] --mark value [/ mask ] ,将数据包与给定的无符号标记值匹配(如果指定了掩码,则在进行比较之前,该掩码将与掩码进行逻辑连接)

21 )multiport

此模块匹配一组源端口或目标端口。最多可指定15个端口。端口范围(端口:端口)算作两个端口。它只能与“ -p tcp “或” -p udp “一起使用。

[!] --source-ports , --sports port [, port |, port : port ]... ,如果源端口是给定端口之一,则匹配。旗杆运动是这个选项的方便别名。多个端口或端口范围使用逗号分隔,端口范围使用冒号指定。因此,53,1024:65535将匹配端口53,所有端口都是从1024到65535。

[ !] --destination-ports , --dports port [, port |, port : port ].. ,如果目标端口是给定端口之一,则匹配。标志--dports是此选项的方便别名。

[!] --ports port [, port |, port : port ]... ,如果源端口或目标端口等于给定端口之一,则匹配。

22 ) owner

对于本地生成的数据包,此模块试图匹配数据包创建者的各种特征。此匹配仅在OUTPUT链和POSTROUTING链中有效。转发的数据包没有任何与其相关联的套接字。来自内核线程的数据包确实有一个套接字,但通常没有所有者。

[!] --uid-owner username

[!] --uid-owner userid [- userid ] ,如果数据包套接字的文件结构(如果有)是给定用户拥有的,则匹配。您还可以指定数字UID或UID范围。

[!] --gid-owner groupname

[!] --gid-owner groupid [- groupid ] ,如果数据包套接字的文件结构属于给定组,则匹配。您还可以指定数字GID或GID范围。

[!] --socket-exists ,如果数据包与套接字相关联,则匹配。

23 ) physdev

该模块在桥端口输入和输出设备上匹配,这些输入和输出设备被奴役到桥接设备上。此模块是支持透明桥接IP防火墙的基础结构的一部分,仅适用于2.5.44版本以上的内核版本。

[!] --physdev-in name ,接收数据包的桥端口的名称(仅用于INPUT、FORWARD和PREROUTING链的数据包)。如果接口名以“+“结尾,则以此名称开头的任何接口都将匹配。如果数据包没有通过桥接设备到达,则此数据包将与此选项不匹配,除非“!”被利用了。

[!] --physdev-out name ,要发送数据包的桥接端口的名称(用于FORWARD、OUTPUT和POSTROUTING链的数据包)。如果接口名以“+“结尾,则以此名称开头的任何接口都将匹配。注意,在NAT和Magle输出链中,不能在桥输出端口上匹配,但是在过滤器输出链中可以匹配。如果数据包不会由网桥设备离开,或者如果它还不知道输出设备将是什么,那么该数据包将与此选项不匹配,除非‘!’使用。

[!] --physdev-is-in ,如果数据包已通过网桥接口输入,则匹配。

[!] --physdev-is-out ,如果数据包将通过网桥接口离开,则匹配。。

[!] --physdev-is-bridged ,如果数据包正在桥接,因此不被路由,则匹配。这仅在FORWARD链和POSTROUTING链中有用。

24 ) pkttype

此模块与链路层数据包类型匹配。

[!] --pkt-type {unicast|broadcast|multicast}

25 ) policy

此模块与IPsec用于处理数据包的策略相匹配。

--dir {in|out} ,用于选择是否匹配用于解除封装的策略或将用于封装的策略。in在PREROUTING、INPUT、FORWARD链中有效,out在POSTROUTING、OUTPUT、FORWARD链中有效。

--pol {none|ipsec} ,如果数据包要接受ipsec处理,则匹配。

--strict ,选择是否匹配确切的策略,或者如果策略的任何规则与给定的策略匹配,则选择匹配。

[!] --reqid id ,匹配策略规则的reqid。可以使用setkey(8)指定REQID,使用unique:id作为级别。

[!] --spi  spi ,匹配SA的SPI。

[!] --proto {ah|esp|ipcomp} ,匹配封装协议。

[!] --mode {tunnel|transport} ,匹配封装模式。

[!] --tunnel-src addr [/ mask ] ,匹配隧道模式sa的源端点地址。只有和“ --mode tunnel “一起使用有效。

[!] --tunnel-dst addr [/ mask ] ,匹配隧道模式sa的目标端点地址。只有和“ --mode tunnel “一起使用有效。

--next ,启动策略规范中的下一个元素,只有和“ --strict. “一起使用有效。

26 )quota

通过减少每个数据包的字节计数器来实现网络配额。

--quota bytes ,配额(以字节为单位)。

27 ) rateest

该速率估计器可以与RATEEST目标收集的估计费率相匹配。它支持绝对bps/pps值匹配,比较两种速率估计量,并匹配两种速率估计量之间的差异。

--rateest1 name ,第一比率估计器的名称。

--rateest2 name ,第二比率估计器的名称。

--rateest-delta ,将差异与给定的比率进行比较

--rateest1-bps value ,

--rateest2-bps value ,每秒比较字节

--rateest1-pps value ,

--rateest2-pps value ,每秒比较包

[!] --rateest-lt ,如果速率小于给定的速率/估计量,则匹配

[!] --rateest-gt ,如果速率大于给定的速率/估计量,则匹配

[!] --rateest-eq ,如果速率等于给定的速率/估计量,则匹配

# 示例:在启动数据连接时,可以根据可用带宽从 FTP 服务器通过两行路由传出数据连接:

# 估计出率

iptables   -t   mangle   -A  POSTROUTING -o  eth0  -j  RATEEST  --rateest-name  eth0 --rateest-interval 250ms --rateest-ewma 0.5s

iptables  -t  mangle  -A  POSTROUTING -o  ppp0  -j  RATEEST   --rateest-name   ppp0 --rateest-interval 250ms --rateest-ewma 0.5s

# 基于可用带宽的标记

iptables  -t  mangle  -A balance -m conntrack --ctstate NEW -m helper --helper ftp –m rateest  --rateest-delta  --rateest1  eth0   --rateest-bps1   2.5mbit   --rateest-gt --rateest2 ppp0 --rateest-bps2 2mbit -j CONNMARK --set-mark 1

iptables  -t  mangle  -A balance -m conntrack --ctstate NEW -m helper --helper ftp –m rateest --rateest-delta --rateest1 ppp0 --rateest-bps1 2mbit --rateest-gt --rateest2 eth0 --rateest-bps2 2.5mbit -j CONNMARK --set-mark 2

iptables -t mangle -A balance -j CONNMARK --restore-mark

28 ) realm

这与路由领域匹配。路由域用于复杂的路由设置,涉及到诸如BGP这样的动态路由协议。

[!] --realm value [/ mask ] ,匹配给定的领域号(可选掩码)。如果不是一个数字,则值可以是“ /etc/iproute2/rt_realms ”中的命名域(在这种情况下不能使用掩码)。

29 ) recent

允许您动态创建IP地址列表,然后以几种不同的方式与该列表进行匹配。例如,您可以创建一个“坏蛋”列表,列出试图连接到防火墙上的端口139的人,然后在不考虑这些包的情况下丢弃它们的所有未来数据包。 --set、--rcheck、--update、--remove 是相互排斥的。

--name name ,指定要用于命令的列表。如果没有指定名称,则将使用默认名称。

[!] --set ,他将把数据包的源地址添加到列表中。如果源地址已经在列表中,这将更新现有条目。这将永远返回成功(或失败,如果传入!)。

--rsource ,匹配/保存最近列表中每个数据包的源地址。这是默认的

--rdest ,匹配/保存最近列表中每个数据包的目标地址

[!] --rcheck ,检查数据包的源地址是否当前在列表中。

[!] --update ,类似“ --rcheck ”,但如果匹配,它将更新“最后一次看到”时间戳。

[!] --remove ,检查数据包的源地址是否当前在列表中,如果是,该地址将从列表中删除,规则将返回true。如果找不到地址,则返回false。

--seconds seconds ,此选项必须与“ --rcheck ”或“ --update ”之一结合使用.使用时,这将缩小匹配范围,仅当地址在列表中并在最后给定的秒内被看到时才发生。

--hitcount hits ,此选项必须与“ --rcheck ”或“ --update ”之一结合使用。使用时,这将缩小匹配范围,仅当地址在列表中且数据包已接收到大于或等于给定值时才发生。此选项可与“ --seconds ”一起使用,以创建一个更窄的匹配,需要在特定的时间范围内执行一定数量的命中。HitCount参数的最大值由xt_recent内核模块的“ip_pkt_list_tot”参数给出。在命令行中超过此值将导致拒绝该规则。

--rttl ,此选项只能与“ --rcheck ”或“ --update ”中的一个一起使用。当使用时,这将缩小匹配范围,只有当地址在列表中,并且当前数据包的ttl与符合“ --set ”规则的数据包匹配时才会发生匹配。这可能是有用的,如果你有问题的人伪造他们的源地址,以便通过这个模块拒绝其他人访问你的网站通过发送虚假的数据包给你。

iptables -A FORWARD -m recent --name badguy --rcheck --seconds 60 -j DROP

iptables -A FORWARD -p tcp -i eth0 --dport 139 -m recent --name  badguy --set -j DROP

“/proc/net/xt_new/*”是关于每个列表中每个条目的地址和信息的当前列表。可以读取“/proc/net/xt_new/”中的每个文件来查看当前列表,或者使用以下命令编写两个文件来修改列表:

echo +addr >/proc/net/xt_recent/DEFAULT

增加 addr 到默认的列表

echo -addr >/proc/net/xt_recent/DEFAULT

addr 从默认列表删除

echo / >/proc/net/xt_recent/DEFAULT

舒心默认列表

模块本身接受参数,默认显示如下:

ip_list_tot = 100 ,每个表记住的地址数

ip_pkt_list_tot = 20 ,记住的每个地址的数据包数

ip_list_hash_size = ,散列表大小。0意味着根据ip_list_tot(默认值:512)计算它。

ip_list_perms = 0644 ,“/proc/net/xt_recent/*”的全新啊

ip_list_uid = ,“/proc/net/xt_recent/*”的拥有者ID。

ip_list_gid = ,“/proc/net/xt_recent/*”的拥有者组ID。

30 ) sctp

[!] --source-port,--sport port [: port ]

[!] --destination-port,--dport  port [: port ]

[!] --chunk-types {all|any|only}  chunktype [: flags ] [...] ,

大写中的标志字母表示如果设置将匹配标志,小写表示匹配(如果未设置)。

Chunk types:  DATA INIT INIT_ACK SACK HEARTBEAT HEARTBEAT_ACK ABORT SHUTDOWN SHUTDOWN_ACK ERROR COOKIE_ECHO COOKIE_ACK ECN_ECNE ECN_CWR  SHUTDOWN_COMPLETE ASCONF ASCONF_ACK

chunk type :available flags

DATA :U B E u b e

ABORT :T t

SHUTDOWN_COMPLETE :T t

例子

iptables -A INPUT -p sctp --dport 80 -j DROP

iptables -A INPUT -p sctp --chunk-types any DATA,INIT -j DROP

iptables -A INPUT -p sctp --chunk-types any DATA:Be -j ACCEPT

31 ) set

该模块匹配可由ipset(8)定义的IP集。

[!] --match-set setname flag [, flag ].. ,其中flag是用逗号分隔的src或dst规范的列表,其中最多只能有6个。

iptables -A FORWARD -m set --match-set test src,dst

将匹配数据包,对于这些数据包(如果SET类型为ipportmap),源地址和目标端口对可以在指定的集合中找到。如果指定集的集合类型为单维(例如ipmap),则该命令将匹配在指定集中可以找到源地址的数据包。

如果选项与其他扩展的选项不冲突,则可以将选项“ --match-set ”替换为“ --set ”。

32 ) socket

如果可以通过在数据包上执行套接字查找找到打开的套接字,则他的匹配项。

--transparent ,忽略非transparent的包。

33 ) state

当与连接跟踪相结合时,此模块允许访问此数据包的连接跟踪状态。

[!] --state state ,其中状态是要匹配的连接状态的逗号分隔列表。可能的状态是无效的,这意味着由于某些原因无法识别数据包,其中包括内存不足和ICMP错误,这些错误与任何已知的连接不相对应,这意味着该数据包与一个已经在两个方向上看到数据包的连接相关联,新的意思是该数据包已经启动了一个新连接,或以其他方式与没有在两个方向上看到数据包的连接相关联,以及相关的意思是,该数据包正在启动一个新连接,但与现有连接相关联,例如FTP数据传输或ICMP错误。

34 ) statistic

该模块基于一定的统计条件对数据包进行匹配。它支持使用“--mode”选项设置的两种不同的模式。

--mode mode ,设置匹配规则的匹配模式,所支持的模式为随机模式和nth模式。

--probability p ,将随机匹配数据包的概率从0设置为1。它只适用于随机模式。

--every n ,每第n包匹配一包。它只适用于nth模式。

--packet p ,为nth模式设置初始计数器值(0<=p<=n-1,默认值0)

35 ) string

该模块通过使用某种模式匹配策略来匹配给定的字符串。它需要一个Linux内核>=2.6.14。

--algo {bm|kmp} ,选择模式匹配策略(bm=Boyer-Moore,  kmp=Knuth-Pratt- Morris)

--from offset ,设置它开始寻找匹配的偏移量。如果未通过,默认为0。

--to offset ,设置它开始寻找匹配的偏移量。如果未通过,则默认为数据包大小。

[!] --string pattern ,匹配给定的模式。

[!] --hex-string  pattern ,匹配以十六进制表示的给定模式。

36 ) tcp

如果指定了“ --protocol TCP ”,则可以使用这些扩展。它提供了以下选项:

[!] --source-port , --sport port [: port ] ,源端口或端口范围规范。这可以是服务名称,也可以是端口号。如果省略第一个端口,则假定为“0”;如果省略最后一个端口,则假定为“65535”。如果第一个端口大于第二个端口,它们将被交换

[!] --destination-port , --dport port [: port ] ,目的端口或端口范围规范。“--dport”的方便别名。

[!] --tcp-flags mask comp ,匹配指定的TCP标志。第一个参数掩码是我们应该检查的标志,写成逗号分隔列表,第二个参数comp是必须设置的以逗号分隔的标志列表。flag可以是 SYN ACK FIN RST URG PSH ALL NONE

iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST SYN

这个命令只匹配了 SYN 标志

[!] --syn ,只匹配设置了SYN位,并且清除了ACK,RST,FIN为的包。等价于“ --tcp-flags SYN,RST,ACK,FIN SYN

[!] --tcp-option number ,如果设置了tcp选项就匹配。

37 ) tcpmss

这与TCP标头的TCPMSS(最大段大小)字段匹配。您只能在TCP SYN或SYN/ACK数据包上使用这一点,因为MSS只在连接启动时的TCP握手期间协商。

[!] --mss value [: value ] ,匹配给定的tcp mss值或范围。

38 ) time

如果数据包到达时间/日期在给定范围内,则匹配。所有选项都是可选的,但在指定的时候都是可选的。

--datestart YYYY [- MM [- DD [ Thh [: mm [: ss ]]]]]

--datestop YYYY [- MM [- DD [ Thh [: mm [: ss ]]]]] ,仅在给定时间内匹配,必须采用ISO 8601“T”表示法。可能的时间范围是1970-01-01T00:00:00到2038-01-19T04:17:07。如果没有指定“--datestart”或“--datestop”,则将分别默认为1970-01-01和2038-01-19。

--timestart hh : mm [: ss ]

--timestop hh : mm [: ss ] ,只有在指定的白天匹配。可能的时间范围是00:00到23:59:59。允许前导零(例如“06:03”),并正确解释为基数-10。

[!] --monthdays day [, day ...] ,只在一个月的指定日期匹配。可能值为1到31。请注意,在没有第31天的月份中,指定31当然不匹配;28天或29天的2月也是如此。

[!] --weekdays day [, day ...] ,只有在给定的工作日匹配。可能的值分别是Mon、Tue、Wed、Thu、Fri、sat、Sun或1到7之间的值。您也可以使用两个字符的变体(Mo,Tu等)。

--utc ,把给 --datestart、--datestop、--timestart、--timestop 的时间解释为UTC。

--localtz ,把给 --datestart、--datestop、--timestart、--timestop 的时间解释为本地时间(默认)。

匹配星期天

-m time --weekdays Sa,Su

匹配国家假日

-m time --datestart 2007-12-24 --datestop 2007-12-27

由于停止时间实际上包括在内,因此需要下列停止时间才能与新一天的第一秒钟不匹配:

-m time --datestart 2007-01-01T17:00 --datestop 2007-01-01T23:59:59

午餐时间

-m time --timestart 12:30 --timestop 13:30

这个月的第四个星期五:

-m time --weekdays Fr --monthdays 22,23,24,25,26,27,28

39 ) tos

此模块匹配IPv 4报头中的8位服务类型字段(即包括IPv 6报头中的“优先级”比特)或(也包括8位)优先级字段。

[!] --tos  value [/ mask ] ,匹配具有给定TOS标记值的数据包。如果指定了mask,则在比较之前使用TOS标记进行逻辑分析。

[!] --tos  symbol ,在为IPv4使用tos匹配时,您可以指定一个符号名。可以通过使用“ -m tos-h ”调用iptables来获得已识别的TOS名称的列表。请注意,这意味着掩码为0x3F,即除ECN位外的所有掩码。

40 ) ttl

此模块匹配ip报头中活动字段的时间。

--ttl-eq ttl ,如果和给定的ttl值相等,那么就匹配。

--ttl-gt ttl ,如果大于给定的ttl值,那么就匹配。

--ttl-lt ttl ,如果小于给定的ttl值,那么就匹配。

41 ) u32

U32 测试从数据包中提取的多达4个字节的数量是否具有指定的值。要提取哪些内容的规范足够通用,可以在给定的偏移量下从tcp报头或有效负载中找到数据。

[!] --u32 tests ,该参数相当于下面描述的一种小型语言中的程序。

tests := location "=" value | tests "&&" location "=" value

value := range | value "," range


文章题目:Linux基础命令---iptables防火墙
路径分享:http://bzwzjz.com/article/psdoos.html