做一期iptables详解。
linux 一般都是作为服务器系统使用,对外提供一些基于网络的服务,通常我们都需要对服务器进行一些网络访问控制,类似防火墙的功能。
常见的访问控制包括:哪些IP可以访问服务器、可以使用哪些协议、哪些接口、是否需要对数据包进行修改等等。。
如服务器可能受到来自某IP的攻击,这时就需要禁止所有来自该IP的访问。
Linux内核集成了网络访问控制功能,通过netfilter模块实现。Linux内核通过netfilter模块实现网络访问控制功能,在用户层我们可以通过iptables程序对netfilter进行控制管理。
netfilter可以对数据进行允许、丢弃、修改操作。
netfilter 支持通过以下方式对数据包进行分类:
1.源IP地址
2.目标IP地址
3.使用接口
4.使用协议(TCP、UDP、ICMP等)
5.端口号
6.连接状态(new、established、related、invalid)
netfilter 定义了两个概念:
1.chain:过滤点用以对数据进行过滤,共定义了5个过滤点:input、forward、output、prerouting、postrouting
2.table:共有3种表分别为:
filter(chain):执行基本过滤,只能用在:
input :应用于目标地址是本机的那些数据包
forward:源IP地址和目标地址都不是本机的,要穿过防火墙的封包,进行转发处理
output :从本机发出去的封包处理,通常放行所有封包
nat:可以做目的地址转换DNAT和源地址转换SNAT,可以做一对一、一对多、多对一转换
只能用在:
output :对应本地产生的数据包
prerouting :进行目的IP地址的转换,对应DNAT操作
postrouting :进行源IP地址的转换,对应SNAT操作
mangle:允许的操作是:TOS、TTL、MARK等。TOS操作用来设置或改变数据包的服务类型域,常用来设置网络上的数据包如何被路由等策略;TTL操作用来改变数据包的生存时间域,单独的计算机是否使用不同的TTL,以此作为判断连接是否被共享的标志;MARK用来设置特殊的标记、决定不同的路由。用这些表姐可以做带宽和基于请求的分类。mangle表在实际中使用较少。
可以用在:
input :修改传输到本机的数据包
forward :修改经本机传输的网络数据包
output :对于本机产生的数据包,在传出之前进行修改
prerouting :在路由选择之前修改网络数据包
postrouting:在路由选择之后修改数据包
iptables的状态机制
在iptables上一共有4种连接状态和两种虚拟状态
连接状态分别为:
NEW :说明这个包是第一个包,也就是conntrack模块看到的某个连接的第一个包,它即将被分配。
ESTABLISHED:必须是两个方向上的数据传输,而且匹配这个连接的包。处于ESTABLISHED状态的连接是非常容易理解的,只要发送并接到应答包,连接状态就是ESTABLISHED.一个连接要从NEW变为ESTABLISHED,只要接到应答包即可,不管这个包是发往防火墙,还是由防火墙转发。列如ICMP的错误和重定向等信息包是作为用户所发出信息的应答,那么此状态就被识为ESTABLISHED。
RELATED :当一个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED。换句话说,一个连接要想是RELATED,首先要有一个ESTABLISHED的连接,这个ESTABLISHED 连接再产生一个主连接之外的连接,这个新的连接就是RELATED,当然前提是conntrack模块要能理解RELATED。
INVALID :说明数据包不能被识别属于哪个连接或没有任何状态。产生这种情况有几个原因,列如内存溢出,收到不知属于哪个连接的ICMP错误信息。一般情况下,INVALID状态的所有数据都会被drop掉,因为防火墙任务这种状态的信息是不安全的。
SNAT :虚拟状态,用来做源网络地址转换。
DNAT :虚拟状态,用来做目的网络地址转换。
iptables 规则
通过iptables命令创建一个规则,一条规则包含以下几个部分:
iptables -t filter -A INPUT -s 192.168.1.1 -J DROP
表 链 匹配属性 动作
-表:规定使用的表(filter、nat、mangle,不同表有不同功能)
-链: 规定过滤点
-匹配属性:规定匹配数据包的特征
-匹配后的动作:放行、丢弃、记录
语法:
iptables [-t table] command [match] [target/jump]
[table] :指定表名(mangle,filter,nat),不指定表名默认为filter表
[match] :指定包的来源IP地址、网络接口、端口和协议类型等。常见的match参数主要有以下几个:
1.-p or --protocol:用于指定规则所使用的协议(tcp,udp,udp_lite,icmp,esp …)可以使用all代表所有协议。在-p 前面可以使用取反符号 “!”来标示除了列出协议外的所有协议。
2.-s or --source:用于指定规则中的源地址,源地址的形式可以是网络名称、主机名称、网络地址或主机的IP地址。
3.-d or --destination:匹配数据包的目的地址,表示方法与源地址的表示方法一致,可以使用取反符号 "!“来标示除了列出的目的地址以外的所有地址。
4.-j or --jump:用于跳到指定的目标,如果-j参数被忽略,那么匹配的过程不会对包产生影响,但是规则的计数器会增加。注意如果规则不匹配,-j操作将不会被执行。
5.-g or --goto:用于跳到指定的链。
6.-i or --in-interface:用于指定接收数据包所使用的接口,注意这个匹配只适用于INPUT,FORWARD,PREROUTING链,用在其他地方都会出错。也可以使用取反符号”!"来标示除了列出接口以外的所有接口。
7.-o or --out-interface:用于指定发送数据包所使用的接口,使用方法与-i相同。
8.-f or --fragment:在碎片管理中,规则只询问第二及以后的碎片。
9.-c or --set-counters:此参数允许管理员在执行insert、append、replace操作对规则进行初始化。
[target/jump]:当数据包符合匹配条件时要执行的操作。eg:ACCEPT、DROP、Jump 跳至表内的其他链。
command:用于指定iptables对所提交的规则要做什么样的操作,如下:
1.-A or --append:用于在指定链的末尾添加一条新规则
2.-D or --delete:用于删除规则。
3.-R or --replace:用于替换相应位置的策略
4.-I or --insert:用于在指定位置插入策略
5.-L or --list :用于显示当前系统中正在运行的策略
6.-F or --flush:用于清楚所选链的配置规则。此参数只是将内存中的规则清除,在没有保存前并不影响硬盘上的配置文件。
7.-X or --delete-chain:用于删除指定的用户自定义的链。注意删除该链前,要求该链必须为空,否则删除链操作失败。
TCP匹配扩展
1.–source-port[!][port[:port]]:指定源端口或端口范围,可以是服务名或端口号。
2.–destionation[!][port[:port]]:指定目标端口或端口范围,这个选项范围可以使用–dport别名来代替
UDP匹配扩展
1.–source-port[!][port[:port]]:指定源端口或端口范围,可以是服务名或端口号。
2.–destionation[!][port[:port]]:指定目标端口或端口范围,这个选项范围可以使用–dport别名来代替
SNAT匹配扩展
只适用于nat表的postrouting链,它将会修改包的源地址(此连接以后所有的包都会被影响)
1.–to-source[-][:port-port]:可以指定一个单一的新IP地址或一个IP地址范围,也可以附加一个端口范围(只能在指定-p tcp 或者-p udp 的规则里),如果未指定端口范围,端口中512以下的端口会被映射成小于512的端口;512-1023之间的端口会被映射为小于1024的端口;其他端口会被映射为大于1024的端口。
2.–to-destiontion[-][:port-port]:可以指定一个单一的新的IP地址或者一个IP地址范围,也可以附加一个端口范围(只能在指定-p tcp 或者-p udp的规则里)。如果未指定端口范围,目标端口不会被修改。
区分dport 和 sport:
dport:目的端口
sport:来源端口
INPUT:
[root@MST ~]#iptables -A INPUT -p tcp --dport 80 -j ACCEPT
释义:行为:这是一条从外部进入内部本地服务器的数据,数据包的目的(dport)地址是80,即要访问我本地的80端口。
结果:允许外部数据访问我的本地服务器80端口。
[root@MST ~]#iptables -A INPUT -p tcp --sport 80 -j ACCEPT
释义:行为:这是一条从外部进入内部本地服务器的数据,数据包的来源端口(sport)是80,即对方的数据包是80端口发送过来的。
结果:允许外部的来自80端口的数据访问我的本地服务器
input方式总结:dport指本地,sport指来源端。
OUTPUT:
[root@MST ~]#iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
释义:行为:这是一条从内部出去的数据,出去的目的(dport)端口是80
output方式总结:dport指外部(目标端),sport指本地。
常用功能:
1.作为服务器使用:
过滤到本机的流量 - input链、filter表
过滤到本机发出的流量 - output链、filter表
作为路由器使用:
过滤转发的流量 - forward 链、filter 表
对转发数据的源、目标IP进行修改(nat功能) - prerouting(修改目标IP地址)、postrouting(修改源IP地址)
涉及动作:ACCEPT、DROP(直接丢弃掉)、REJECT(返回一个不可用的信息)
iptables的基本规则
iptables 通过规则对数据进行访问控制:
1.一个规则使用一行配置
2.规则按顺序排列,一定要注意规则的顺序。
3.当收到、发出、转发数据包时,使用规则对数据包进行匹配,按规则顺序进行逐条匹配
4.数据包按照第一个匹配上的规则执行相关动作:丢弃、放行、修改
5.没有匹配规则、则使用默认动作(每个chain拥有各自的默认动作)
iptables应用实例:
1.列出现有iptables规则:
iptables -L
2.插入一个规则:
iptables -I INPUT 3 -p tcp --dport 22 -j ACCEPT
3.删除一个iptables 规则:
iptables -D INPUT 3
iptables -D INPUT -s 192.168.1.2 -j|DROP
4.删除所有规则:
iptables -F
匹配参数
1.基于IP地址
-s 192.168.1.1 --源
-d 10.0.0.0/8 --目
2.基于接口
-I eth0 --指定接收
-o eth1 --指定发送
3.排除参数
-s ‘!’ 192.168.1.0/24 --取反
4.基于协议及端口:
-p tcp --dport 23
-p udp --sport 53
-p icmp
示例:
1.控制到本机的网络流量
iptables -A INPUT -s 192.168.1.100 -j DROP
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j DROP
iptables -A INPUT -I eth0 -j ACCEPT
2.当使用Linux作为路由(进行数据转发)设备使用的时候,可以通过定义forward规则来进行转发控制
iptables -A FORWARD -s 192.168.1.0/24 -d 10.1.1.0/24 -j DROP --禁止所有192.168.1.0/24 到10.1.1.0/24的流量
3.NAT(Network address translation)网络地址转换是用来对数据包的IP地址进行修改的机制,NAT分为两种:
–1.SNAT 源地址转换,通常用于伪装内部地址(一般意义上的NAT)
–2.DNAT 目标地址转换,通常用于跳转
iptables中实现NAT功能的是NAT表
–1.常用NAT进行跳转:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-dest 192.168.1.10
–2.通过NAT对出向数据进行跳转:
iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-dest 192.168.1.100:8080
–3.通过NAT对数据流进行伪装(一般意义上的NAT,将内部地址全部伪装为一个外部公网IP地址)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
–4.通过NAT隐藏源IP地址
iptables -t nat -A POSTROUTING -j SNAT --to-source 1.2.3.4
4.配置文件
–1.通过iptables添加的规则并不会永久保存,如果需要永久保存规则,则需要将规则保存在/etc/sysconfig/iptables 配置文件中
可以通过以下命令将iptables规则写入配置文件:
service iptables save
–2.centos/rhel 系统会带有默认iptables规则,默认保存在/etc/sysconfig/iptables中,保存自定义规则会覆盖这些默认规则
最后,注意:如果是远程管理一个linux主机并修改iptables规则,则必须先允许来自客户端主机的ssh流量确保这是第一条iptables规则,否则可能会由于配置失误将自己锁在外面!!