Linux必选掌握的命令iptables

iptables

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 chaintarget

为指定的链设置策略

-E | --rename-chain old new

重命名链

-h

显示帮助信息

参数

说明

[!] –p | --protocol protocol

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

[!] –s | --sourceaddress[/mask][,…

源地址

[!] –d

–destinationaddress[/mask][,…

目标

-j | --jump

指定跳转的目标

-g | --goto chain

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

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

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

-o | --out-interfacename

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

[!] –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-nodesnum,设置集群中的总节点数。

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

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

–cluster-hash-seedvalue,设置Jenkins散列的种子值。

iptables -A PREROUTING -t mangle -i eth1 -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 cluster --cluster-total-nodes 2 --cluster-local-node 1 --cluster-hash-seed 0xdeadbeef -j MARK --set-mark 0xffff

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

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

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

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

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

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

arptables -A INPUT -i eth1 --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 eth2 --h-length 6 -j mangle --mangle-mac-s 01:00:5e:00:01:02

arptables -A INPUT -i eth2 --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个字符)。

–commentcomment

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

5)connbytes

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

[!] --connbytesfrom[: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-aboven,如果现有连接的数目大于n,则匹配

–connlimit-maskprefix_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目标进行设置)。

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

8)conntrack

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

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

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

[!] --ctorigsrcaddress[/mask]

[!] --ctorigdstaddress[/mask]

[!] --ctreplsrcaddress[/mask]

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

[!] --ctorigsrcportport

[!] --ctorigdstportport

[!] --ctreplsrcportport

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

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

[!] --ctexpiretime[: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,–sportport[:port]

[!] --destination-port,–dportport[:port]

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

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

10)dscp

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

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

[!] --dscp-classclass,匹配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匹配。

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

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

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

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

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

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

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

–hashlimit-htable-sizebuckets,哈希表的桶数。

–hashlimit-htable-maxentries,散列中的最大项。

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

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

14)helper

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

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

15)icmp

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

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

16)iprange

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

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

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

17)length

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

[!] --lengthlength[:length]

18)limit

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

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

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

19)mac

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

20)mark

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

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

21)multiport

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

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

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

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

22)owner

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

[!] --uid-ownerusername

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

[!] --gid-ownergroupname

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

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

23)physdev

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

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

[!] --physdev-outname,要发送数据包的桥接端口的名称(用于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,选择是否匹配确切的策略,或者如果策略的任何规则与给定的策略匹配,则选择匹配。

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

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

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

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

你可能感兴趣的:(linux)