前言:事情是这样的,最近部门在进行故障演练。攻方同学利用iptables制造了一个单机不能访问的故障,要求业务同学在不知情的情况下尽快恢复业务。演练最终肯定是取得了理想的效果,即业务同学在规定时间内定位了问题并恢复了业务。
对我个人来讲一直知道iptables的存在,但是说起来使用还真有些陌生,为此专门做个记录。
iptables是Linux防火墙系统的重要组成部分,其主要功能是实现对网络数据包进出设备及转发的控制。iptables是Linux中比较底层的网络服务,它控制了Linux系统中的网络操作.centos中的firewalld和ubuntu中的ufw都是在iptables之上构建的,当然他们简化了iptables的操作。因此学习了解iptables对我么了解firewalld和ufw的工作机制都很有帮助。ps:firewalld和ufw不仅仅是对iptables进行封装这么简单,还有ipv6等功能。
iptables是集成在Linux内核中的包过滤防火墙系统。使用iptables可以添加、删除具体的过滤规则,iptables默认维护着4个表(table)和5个链(chain),所有防火墙策略规则都被分别写入这些表与链中。如下图所示为数据包到达linux主机网卡后,内核处理数据包的大致流程。
如上图数据流向为:
规则就是管理员对数据包预定义的条件,简单来说就是当数据包满足某种条件就执行指定的动作。对于网络协议这里的条件显然就是"五元组"那些东西:例如数据包源地址、源端口、协议类型、目的地址、目的端口。动作:可以是放行(accept)、拒绝(reject)、丢弃(drop)等。ps:后面会详细介绍。
iptables基本语法格式如下:
iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION
各参数含义如下(各取值后面会有介绍):
下面提供一个iptables命令规则,便于直观理解。
iptables -t filter -A INPUT -i eth0 -p tcp -s 192.23.2.0/24 -m multiport --dports 443,80 -j ACCEPT
#-t:操作filter表
#-A:在表末追加规则;-I为表首插入规则、-D为删除规则
#INPUT:链名称;该规则在那条链上生效
#-j:数据包处理动作;比如接受、拒绝等
命令解释:允许经过本机网卡eth0,访问协议是TCP,源地址是192.23.2.0/24段的数据包访问本地端口80和443的服务。
表主要是用来存放具体的防火墙规则的。我们可以对规则进行分类,不同的功能存入不同的表。分类如下:
"链"是指内核中控制网络定义的几个规则链。链是数据包传播的路径,每一天链其实就是众多规则中的一个检查清单,每一天链中可以有一条或多条规则。其实就是一条链路链接在一起的规则。 由上图我们知道有如下五个数据链:
如下梳理几个典型场景数据链路情况:
(1)外部主机发送数据包给防火墙主机:数据会经过PREROUTING链与INPUT链。
(2)防火墙本机发送数据包到外部主机:数据会经过OUTPUT链与POSTROUTING链;
(3)防火墙备机作为路由负责转发数据:数据经过PREROUTING链、FORWARD链以及POSTROUTING链。
(1)语法格式
iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION
各参数含义如下:
(2)规则表(-t)
用于指定命令应用于哪个iptables内置表。注:不指定默认filter表。
(3)命令(COMMAND)
命令 | 介绍 |
---|---|
-A --append <链名> | 列表最后追加规则 |
-I --insert <链名> | 指定位置插入规则 |
-R --replace <链名> | 替换规则列表中的某条规则 |
-D --delete <链名> | 从规则列表中删除1条规则 |
-L --list <链名> | 查看iptables规则列表 |
-v --verbose <链名> | 与-L他命令一起使用显示更多更详细的信息 |
-F --flush <链名> | 删除表中所有规则 |
-Z --zero <链名> | 将表中数据包计数器和流量计数器归零 |
-X --delete-chain <链名> | 删除自定义链 |
-P --policy <链名> | 定义默认策略 |
(4)chain
参见上述链的介绍
(5)标准criteria(其实就是匹配条件)
参 数(!表示取反) 功 能
[!]-p 匹配协议(--proto)
[!]-s 匹配源地址(--source源地址或子网)
[!]-d 匹配目标地址
[!]-i 匹配入站网卡接口(--in-interface 网络接口名)
[!]-o 匹配出站网卡接口(--out-interface 网络接口名)
[!]--sport 匹配源端口(源端口号)
[!]--dport 匹配目标端口(目标端口号)
[!]--src-range 匹配源地址范围
[!]--dst-range 匹配目标地址范围
[!]--limit 四配数据表速率
[!]--mac-source 匹配源MAC地址
[!]--sports 匹配源端口
[!]--dports 匹配目标端口
[!]--stste 匹配状态(INVALID、ESTABLISHED、NEW、RELATED)
[!]--string 匹配应用层字串
(6)触发动作(其实就是行为)
触发动作 功 能
ACCEPT 允许数据包通过
DROP 丢弃数据包
REJECT 拒绝数据包通过
LOG 将数据包信息记录 syslog 曰志
DNAT 目标地址转换
SNAT 源地址转换
MASQUERADE 地址欺骗
REDIRECT 重定向
对常用的几个动作进行下说明:
(1)REJECT:拦阻该数据包,并返回数据包通知对方。可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply
(2)DROP:丢弃数据包不予处理,进行完此处理动作后将不在比对其他规则直接终端过滤程序。
(3)REDIRECT:将数据包重新导向另一个端口(PNAT)。进行完此处理动作以后,将会继续比对其他规则。ps:这个功能可以用于实现 透明代理 或用来保护web服务器。
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081
下面提供一个iptables命令规则,便于直观理解。
iptables -t filter -A INPUT -i eth0 -p tcp -s 192.23.2.0/24 -m multiport --dports 443,80 -j ACCEPT
#-t:操作filter表
#-A:在表末追加规则;-I为表首插入规则、-D为删除规则
#INPUT:链名称;该规则在那条链上生效
#-j:数据包处理动作;比如接受、拒绝等
命令解释:允许经过本机网卡eth0,访问协议是TCP,源地址是192.23.2.0/24段的数据包访问本地端口80和443的服务。
iptables -nvL #查看默认的filter表
iptables -nvL -t nat #指定查看nat表
iptables -nvL --line-number #显示规则行号(可用于指定行号删除规则)
各参数含义如下:
-L表示查看当前表的所有规则,默认查看的是filter表;如果要查看nat表需追加"-t nat"指定; -n表示不对IP进行反查,加上这个参数显式速度会更快; -v表示输出详细信息,包含通过改规则的数据包数据量、总字节数以及相应的网络接口;
iptables -nL --line-number
如下图所示圆框部分即为规则号、方框部分即为一条具体的规则。
注:可以看到这个规则作用filter表的INPUT链,对于来源是9.137.xx.xxx的数据包直接drop。
添加规则有两个命令,分别是-A添加到规则的末尾) 和 -I 插入指定位置(如果没有指定的话就默认插入到规则的首部)。
//丢弃来自特定IP的所有数据包。
//filter表的INPUT链插入一条规则。规则为:来源是9.137.22.127/192.168.1.5的请求全部丢弃。
iptables -A INPUT -s 9.137.22.127 -j DROP
iptables -A INPUT -s 192.168.1.5 -j DROP
//丢弃某个端口的所有tcp数据包
//filter表的INPUT链超如一条规则。规则为:来自22端口的任何TCP数据包都直接丢弃。
iptables -A INPUT -p tcp --dport 22 -j DROP
//屏蔽出站ip
iptables -A OUTPUT -d 192.168.1.0/24 -j DROP
iptables -A OUTPUT -o eth1 -d 192.168.1.0/24 -j DROP
//允许tcp协议目标端口22的数据包进入
iptables -A INPUT -p tcp --dport=22 -j ACCEPT
//允许tcp协议来源ip是1.2.3.4的数据包的进入
iptables -A INPUT -p tcp -s 1.2.3.4 -j ACCEPT
查看规则如下:
修改规则时候需要使用 -R 参数。
//修改上述规则号为1的规则,修改成"s 9.137.22.127 -j ACCEPT"
iptables -R INPUT 1 -s 9.137.22.127 -j ACCEPT
#修改上述规则好为6的规则,修改成"-s 1.3.4.2 -j DROP"
iptables -R INPUT 5 -p tcp -s 1.3.4.2 --dport=9380 -j DROP
执行两条指令后,查看iptables效果如下。
修改规则有两种方法,但都必须使用-D参数。
#指定规则号及规则删除(太麻烦)
#仅指定规则号删除
iptables -D INPUT 5
iptables -D INPUT 4
删除后再次查看规则,如下就只剩下三个规则了:
iptables -nvL --line-number
service iptables start
service iptables stop
service iptables restart
//保存防火墙规则
service iptables save
初始状态。工具机 9.137.22.127上执行脚本访问mongo_proxy服务所在的机器(30.169.0.179)。
如下图,显然可以正常访问到数据:
接下来在mongo_proxy所在机器上限制来自ip 9.137.22.127的访问,即添加如下规则:
iptables -A INPUT -s 9.137.22.127 -j DROP
然后就访问不通了。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。