Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5800432
  • 博文数量: 409
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 8273
  • 用 户 组: 普通用户
  • 注册时间: 2013-10-23 19:15
个人简介

qq:78080458 学习交流群:150633458

文章分类

全部博文(409)

文章存档

2019年(127)

2018年(130)

2016年(20)

2015年(60)

2014年(41)

2013年(31)

分类: LINUX

2019-03-06 10:29:56

iptables

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

此命令的适用范围:RedHatRHELUbuntuCentOSSUSEopenSUSEFedora

 

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

指定协议类型tcpudpicmpall,协议前加!标识否定

[!] –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“选项来接收特定于该模块的帮助。

1addrtype

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

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

UNICAST,单播地址。

LOCAL,本地地址。

BROADCAST,广播地址。

ANYCAST,选播包。

MULTICAST,多播地址。

BLACKHOLE,黑洞地址。

UNREACHABLE,不可达到的地址。

PROHIBIT,被禁止的地址。

THROWFIXME

NATFIXME

XRESOLVE

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

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

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

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

2ah

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

[!] --ahspi spi[:spi]

3cluster

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

--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

4comment

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

--commentcomment

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

5connbytes

主要用途是检测长时间下载,并在流量控制中使用较低优先级的频带来标记它们。每个连接传输的字节也可以通过“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

6connlimit

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

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

--connlimit-maskprefix_length,使用前缀长度对主机进行分组。对于IPv 4,这必须是介于(包括)032之间的数字。对于IPv 6,在0128之间。

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

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

7connmark

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

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

8conntrack

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

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

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

[!] --ctorigsrcaddress[/mask]

[!] --ctorigdstaddress[/mask]

[!] --ctreplsrcaddress[/mask]

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

[!] --ctorigsrcportport

[!] --ctorigdstportport

[!] --ctreplsrcportport

[!] --ctrepldstportport,匹配original/replysource/destination端口(TCP/UDP/)GRE

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

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

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

ctstate的有效值

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

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

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

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

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

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

ctstatus的有效值

NONE,不是下列任何一项。

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

SEEN_REPLYConnTrack在两个方向都看到了数据包。

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

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

9dccp

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

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

[!] --dccp-typesmask,当DCCP数据包类型为掩码之一时匹配。掩码是以逗号分隔的数据包类型列表。类型可以是:REQUESTRESPONSEDATAACKDATAACKCLOSEREQCLOSERESETSYNCSYNCACKINVALID

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

10dscp

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

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

[!] --dscp-classclass,匹配DiffServ类。此值可能是BEEFAFxxCSX类中的任何一个。然后,它将被转换为其相应的数值。

11ecn

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

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

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

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

12esp

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

[!] --espspispi[:spi]

13hashlimit

哈希限制使用散列桶来表示一组连接的速率限制匹配(如极限匹配),使用单个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“时,所遇到的所有源地址都将根据给定的前缀长度进行分组,因此创建的子网将受到哈希限制。前缀必须介于(包括)032之间。

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

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

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

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

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

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

14helper

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

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

15icmp

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

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

16iprange

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

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

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

17length

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

[!] --lengthlength[:length]

18limit

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

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

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

19mac

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

20mark

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

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

21multiport

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

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

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

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

22owner

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

[!] --uid-ownerusername

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

[!] --gid-ownergroupname

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

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

23physdev

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

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

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

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

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

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

24pkttype

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

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

25policy

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

--dir{in|out},用于选择是否匹配用于解除封装的策略或将用于封装的策略。inPREROUTINGINPUTFORWARD链中有效,outPOSTROUTINGOUTPUTFORWARD链中有效。

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

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

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

[!] --spi spi,匹配SASPI

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

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

[!]

阅读(8820) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~