linux中iptables在哪 linux iptable
一、简述
netfilter/iptables(以下简称iptables) 是一款功能强大的工具(封包过滤、封包重构和网络地址转换等)。它由netfilter和iptables两个组件组成,netfilter组件是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集;iptables组件是一个管理工具,运行在用户空间,它使插入、修改和移除信息包过滤表中的规则变得容易。
二、工作原理
iptables工作的原理主要是对数据包的控制,它对请求的数据包的包头进行分析、并根据我们预先设定的规则进行匹配决定是否可以进入、流出、流经主机,如图所示:
第一种情况:入站数据流向
从外界到达网卡的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包的目标主机是本机,那么内核将其传给INPUT链进行处理(决定是否允许通过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应。
第二冲情况:转发数据流向
来自外界的数据包到达网卡后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址,且内核允许转发,则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
第三种情况:出站数据流向
本机向外部地址发送的数据包,首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理。
三、iptables规则、表和链
iptables的结构由iptables ->Tables ->Chains -> Rules组成,即tables是由chains组成,而chains又是由rules组成,如图所示:
1. 规则(rules)
规则(rules)其实就是网络管理员预定义的条件,是设置数据过滤或处理数据包的策略。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的动作来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
规则包括匹配条件和目标(target),iptables执行规则时,是从规则表中从上至下顺序执行的,如果没遇到匹配的规则,就一条条往下执行,如果遇到匹配的规则后,那么就执行本规则,执行后根据本规则的动作(accept,reject,log,drop等),决定下一步执行的情况。
2. 链(chains)
链(chains)是数据包流经的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件,如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。iptables中共有5条内置链,如下:
PREROUTING链 – 处理刚到达本机并在路由转发前的数据包。它可以转换数据包中的目标IP地址(destination ip address),通常用于DNAT(destination NAT)。
INPUT链 – 处理入栈数据包,负责过滤所有目标地址是主机地址的数据包、通俗的讲就是过滤进入主机的数据包。
OUTPUT链 – 处理出栈数据包,处理所有原地址是本机地址的数据包、通俗的讲就是处理从主机发出去的数据包。
FORWARD链 – 处理转发数据包,负责转发流经主机但不进入本机的数据包、起转发作用、和NAT表关系很大。
POSTROUTING链 – 处理即将离开本机的数据包。它可以转换数据包中的源IP地址(source ip address),通常用于SNAT(source NAT)。
【注】数据包流经规则链的先后顺序:
入站顺序:PREROUTING链→INPUT链
出站顺序:OUTPUT链→POSTROUTING链
转发顺序:PREROUTING链→FORWARD链→POSTROUTING链
3. 表(tables)
表(tables)是提供特定功能的集合,由数个规则链组成。 iptables共内置了5张表,即filter表、nat表、mangle表、raw表和security表,其中较常用的有filter、nat和mangle,每个表均各自包含不同的操作链(chains),如图所示:
1)Filter表
Filter表负责防火墙(过滤本机流入、流出数据包)功能,主要用于过滤数据包。拥有 INPUT、FORWARD和OUTPUT三条规则链。
2)NAT表
网络地址转换功能,负责修改数据包中的源、目标IP地址或端口。一般用于局域网多人共享上网或者内网IP映射外网IP及不同端口转换服务等功能。此表拥有PREROUTING、OUTPUT、POSTROUTING三条规则链。
3)Mangle表
mangle表主要用于对匹配的数据包进行更改(为数据包设置标记),经常用来修改数据包的一些标志位(如路由标记:TTL、TOS、MARK等),以便其它规则或程序可以利用这些标志对数据包进行过滤或策略路由。该表包含的内置链有:INPUT链、FORWARD链、OUTPUT链、POSTROUTING链、PREROUTING链。
【注】数据包流经规则表的先后顺序: raw表->mangle表->nat表->filter表
四、iptables 命令
iptables的命令格式较为复杂,一般的格式为:iptables [-t 表名] -命令选项 [链名] [匹配条件] [其它选项] [处理动作]
不指定表名时,默认指filter表;
不指定链名时,默认指该表内的所有链;
在规则链中匹配规则时会依次检查,匹配即停止(LOG规则例外),若没匹配项或遇到RETURN时则按链的默认动作处理。
-t, --table table
该选项用于指定命令要操作匹配包的表,如果省略,默认指filter表
命令选项
命令选项用于指定iptables的执行方式,包括插入规则,删除规则和添加规则等,常用如下:
-A, --append chain rule-specification
在选定链的尾部追加一个或多个规则
-D, --delete chain rule-specification
-D, --delete chain rulenum
在选定链中删除一个或多个规则
-I, --insert chain [rulenum] rule-specification
在选定链的指定位置(规则编号)插入一个或多个规则,规则编号(rulenum)默认为1,即规则默认插入到链首
-R, --replace chain rulenum rule-specification
替换选定链特定位置(规则编号rulenum)的规则
-L, --list [chain]
列出选定链中的所有规则,如果未指定链,则列出表中的所有链规则
-F, --flush [chain]
删除选定链的所有规则,如果未指定链,则视为表中的所有链
-Z, --zero [chain [rulenum]]
将指定链中的数据包和字节计数器归零,常用于统计同个数据包出现的次数
-N, --new-chain chain
创建自定义链
-X, --delete-chain [chain]
删除指定的自定义链
-P, --policy chain target
修改指定链(内置链,非自定义)的默认策略为target,策略必须为ACCEPT 或DROP。
匹配条件
匹配条件用于指定数据包与规则匹配所具有的一些特征,包括源地址,目的地址,传输协议和端口号等。匹配条件分为基本匹配条件(man iptables查看详情)和扩展匹配条件(man iptables-extensions查看详情):
1)基本匹配条件
[!] -p, --protocol protocol
指定数据包匹配的协议。指定协议可以是tcp、udp、icmp中的一个或者全部,也可以是数值,代表这些协议中的某一个。当然也可以使用在/etc/protocols中定义的协议名。在协议名前加上"!"表示相反的规则。数字0相当于all,all会匹配所有协议,这也是默认选项
[!] -s, --source address[/mask]
指定数据包匹配的源地址,源地址可以是主机名、网络名、地址段或特定IP地址。在指定的地址前加上"!"表示指定相反的地址段,--src是该选项的别名
[!] -d, --destination address[/mask]
指定数据包匹配的目标地址,--dst是该选项的别名
-m, --match matchname[per-match-options]
指定扩展的匹配模块(可使用man iptables-extensions查看)。如果命令中指定了-p或--protocol,并且当且仅当遇到未知选项时,iptables将尝试加载与协议同名的匹配模块,以尝试使该选项可用。各模块的帮助可以使用iptables -m 模块名 -h查看
-j, --jump target
指定匹配规则的目标。目标可以是用户自定义链、内置目标或扩展目标(EXTENSIONS)。如果规则的这个选项被忽略,那么匹配的过程不会对包产生影响,不过规则的计数器会增加
[!] -i, --in-interface [name]
指定匹配从特定接口接收的数据包。当使用"!",表示除该接口外的其它接口。如果接口名后面加上"+",则所有以此接口名开头的接口都会被匹配。如果这个选项被忽略,会假设为"+",那么将匹配任意接口
[!] -o, --out-interface [name]
指定匹配从特定接口发送的数据包
2)常用扩展匹配条件
[!] --dscp value
该匹配条件在dscp模块,主要用于匹配IP报头中TOS字段中的6位DSCP字段(DSCP已取代IETF中的TOS),值范围为[0-63]
[!] --mac-source address
该匹配条件在mac模块,主要用于匹配源MAC地址,MAC地址格式为XX:XX:XX:XX:XX:XX,这个只对来自以太网设备并进入预路由、转发或输入链的数据包才有意义
[!] --source-ports,--sports port[,port|,port:port]...
[!] --destination-ports,--dports port[,port|,port:port]...
[!] --ports port[,port|,port:port]...
该三个匹配条件在multiport模块,主要用于匹配一组源端口、目的端口或同时匹配源端口和目的端口,最多可指定15个端口,多个端口或端口范围用逗号分隔,端口范围用冒号指定,它只能与tcp、udp、udplite、dccp或sctp协议之一结合使用
[!] --state state
该匹配条件在state模块,主要用于匹配连接状态,连接状态有:INVALID, ESTABLISHED, NEW, RELATED or UNTRACKED
[!] --source-port,--sport port[:port]
该匹配条件在tcp和udp模块,主要用于匹配源端口或端口范围。它既可以是特定的一个端口,也可以是一个端口范围,格式为:first:last,如果省略first则假定为0,如果省略last则假定为65535
[!] --destination-port,--dport port[:port]
该匹配条件在tcp和udp模块,主要用于匹配目标端口或端口范围
【注】网上的资料大部分!都在选项后面,但使用iptables v1.6.0测试,!需要放在选项前面
其它选项
-v, --verbose
输出详细信息,这个选项让list命令显示接口地址、规则选项和TOS(Type of Service)掩码。包和字节计数器也将被显示,分别用K、M、G(前缀)表示1000、1,000,000和1,000,000,000倍(不过请参看-x标志改变它),对于添加,插入,删除和替换命令,这会使一个或多个规则的相关详细信息被打印
-n, --numeric
指定IP地址和端口号以数字的形式输出,用于加快显示速度。默认情况下是以主机名、网络名或者服务(只要可用)显示。
--line-numbers
当列表显示规则时,在每个规则的前面加上行号,与该规则在链中的位置相对应。
处理动作
在iptables中处理动作被称为target,由 -j targetname [per-target-options] 组成。处理动作也分为基本和扩展,基本的处理动作包括ACCEPT、DROP和RETURN,使用man iptables命令可查看,其它的定义为扩展,使用man iptables-extensions命令可查看,本文只介绍以下几种常用的动作:
1)基本处理动作
ACCEPT:允许数据包通过
示例:允许192.168.7.0/24网段的数据包通过
iptables -I INPUT -s 192.168.7.0/24 -j ACCEPTDROP:直接丢弃数据包不处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序
示例:禁止192.168.7.2外的主机访问设备
iptables -A INPUT ! -s 192.168.7.2 -j DROPRETURN:停止当前链的规则匹配,并返回到调用链的下一个规则继续处理
2)扩展处理动作(TARGET EXTENSIONS)
DNAT:修改封包的目的IP地址为某特定 IP 或 IP地址段,可以指定 port 对应的范围(目标地址转换),进行完此处理动作后,将会直接跳往下一个规则链。此动作仅在nat表的PREROUTING和OUTPUT链有效,常用选项如下:
--to-destination [ipaddr[-ipaddr]][:port[-port]]
修改封包的目的IP地址为指定IP或IP地址段。如果规则协议是tcp、udp、dccp或sctp之一时,端口范围是可选的
--random
使用随机端口映射
示例:在路由之前将所有从ens33接口接收的目的端口为80的数据包,都发送到192.168.7.1解析
iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 80 -j DNAT --to-destination 192.168.7.1:80DSCP:修改IPv4数据包TOS报头中DSCP位的值,由于它是修改数据包的,该动作只能工作在mangle表,常用选项如下:
--set-dscp value
设置报头中DSCP域为指定值
示例:将本设备6000到7000端口发出去的数据包的DSCP域设为40
iptables -t mangle -A OUTPUT -p udp --source-port 6000:7000 -j DSCP --set-dscp 40LOG:在内核日志(dmesg或syslog)中打印匹配数据包信息,然后将数据包传递给下一条规则,也就是说除了记录以外不会对数据包做任何其它操作,仍然让下一条规则去匹配,常用选项如下:
--log-level
日志记录级别,可以是(系统特定的)数字或助记符:emerg, alert, crit, error, warning, notice, info或debug。默认为warning
--log-prefix
为日志添加指定前缀,最长29个字符
示例:记录发往应用的tcp数据包
iptables -A INPUT -p tcp -j LOG --log-level info --log-prefix "input packet"MARK:设置与数据包关联的Netfilter标记值,以便提供作为后续过滤的条件判断依据,该动作需要在mangle表的PREROUTING链中设置标记以影响路由。进行完此处理动作后,将会继续比对其它规则,常用选项如下:
--set-mark value[/mask]
修改数据包中mark域(32位)值,mask默认为0xFFFFFFFF
示例:标记发往22端口的数据包
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 22MASQUERADE:伪装封包来源IP为动态分配的IP,可以指定port对应的范围,适用于动态的、临时会变IP的网络环境。这个功能与 SNAT 略有不同,当进行IP伪装时,不需指定要伪装成哪个IP,IP会从网卡直接获取(当使用拨接连线时,IP通常是由 ISP 公司的 DHCP服务器分配的)。该动作只在nat表的POSTROUTING链有效,常用选项如下:
--to-ports port[-port]
指定要伪装成的端口或端口范围,只在tcp、 udp、 dccp 和sctp协议有效。
--random
随机端口映射
示例:将从ppp0接口发送的数据包的源IP地址伪装成其IP
iptables -t nat -A POSTROUTING -s 192.168.7.0/24 -o ppp0 -j MASQUERADEREDIRECT:通过将目的IP地址改为输入接口的自身IP地址,将数据包重定向到设备本身。进行完此处理动作后,将会继续比对其它规则。这个功能可以用来作透明代理或用来保护内部设备,该动作仅在nat表的PREROUTING和OUTPUT链有效,常用选项如下:
--to-ports port[-port]
修改目的端口为特定端口或端口段。只在tcp、 udp、 dccp 和sctp协议有效。
--random
随机端口映射
示例:将请求本地80端口的tcp数据转发到8080端口
iptables -t nat -A PREROUTING -i ens33 -p tcp --dport 80 -j REDIRECT --to-port 8080REJECT:拦截数据包,并返回数据包通知对方,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。该动作仅在INPUT、FORWARD和OUTPUT链有效,常用选项如下:
示例:禁止访问80端口
iptables -A INPUT -p tcp --dport 80 -j REJECTSNAT:修改封包的源IP地址为某特定IP或IP地址段,可以指定 port 对应的范围(源地址转换),进行完此处理动作后,将直接跳往下一个规则链。该动作仅在nat表的PREROUTING和INPUT链有效,常用选项如下:
--to-source [ipaddr[-ipaddr]][:port[-port]]
修改封包的源IP地址为指定IP或IP地址段。如果规则协议是tcp、udp、dccp或sctp之一时,端口范围是可选的
--random
随机端口映射
示例:将192.168.7.0/24发出去的数据包的源地址改成8.8.8.8
iptables -t nat -A POSTROUTING -s 192.168.7.0/24 -o ens33 -j SNAT --to 8.8.8.8五、应用实例
创建iptables规则的思路:
1) 选择一张表(此表决定了数据报文处理的方式)
2) 选择一条链(此链决定了数据报文的流经哪些位置)
3) 选择合适的条件(此条件决定了对数据报文做何种条件匹配)
4) 选择处理数据报文的动作,制定相应的防火墙规则
1. 查看nat表的所有规则,并显示规则编号
iptables -t nat -L --line-number2. 在filter表的INPUT链添加规则
方法一:在链尾添加规则
iptables -A INPUT -p tcp --dport 80 -j ACCEPT方法二:在链首添加规则
iptables -I INPUT -p tcp --dport 80 -j ACCEPT方法三:在指定位置添加规则(指定规则编号)
iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT3. 删除nat表所有规则
iptables -t nat -F4. 删除nat表中特定的规则
方法一:根据具体的匹配条件与动作删除规则
iptables -t nat -I INPUT -p tcp --dport 80 -j ACCEPT iptables -t nat -D INPUT -p tcp --dport 80 -j ACCEPT方法二:根据规则编号删除规则
iptables -t nat -L --line-number iptables -t nat -D INPUT 25. 修改指定位置的规则
iptables -R INPUT 2 -s 192.168.7.2 -j DROP6. 禁止访问设备80、8080及10000到20000的多个端口
iptables -A INPUT -p tcp -m multiport --dports 80,8080,10000:20000 -j DROP7. 配置filter表FORWARD链默认策略
iptables -P FORWARD DROP8. 修改设备源IP地址为指定IP地址范围及端口
iptables -t nat -A POSTROUTING -p tcp -o ens33 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200