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},匹配封装模式。