一 整个以CURD的形式来展示
target能是一个"动作",target也能是一个"自定义链"
当target为一个动作时,表示'报文按照指定的动作'处理;当target为,自定义链,时,表示报文由自定义链中的'规则处理'
(1)查看
iptables [-t tables] [-L] [-nv]
-t :后面接'table',例如 nat 或 filter,若省略此项目,则使用'默认的 filter'
-L :列出-->'list''某个 table 的所有链'或某个'链的规则'
-n :不对'地址进行名称反解',直接'显示ip地址'
-v :列出'更多的信息-->verbose',包括通过该规则的'数据包总位数、相关的网络接口'等
--line-numbers :列出'规则的序号'
-S :命令可以查看'这些rules是如何建立的' -->'对应的命令'
'需求1' --> 列出: 'filter table' 'INPUT 链的规则'
注意: '表只有哪些链?'
iptables -t filter -L INPUT
'需求2' --> 列出 'nat表' table '三条链'的规则-->'域名以ip的形式展示'-->'某条链对应规则进行编号'
iptables -t nat -L -n --line-numbers

显示: '指定表'中对应'链'上的'规则'
(2)增加
'注意点':添加规则时,'规则的顺序非常重要'
-dport 就是'目标端口',当数据从'外部进入'以服务器为'目标端口'
数据'从服务器出去',则为'数据源端口' 使用 '--sport'
'模拟'应用场景 --> 禁止'172.25.2.100'的ip来访问 --> '对于此ip的数据包进行丢弃'
环境说明: 起一个虚拟机,保证'环境纯净',关闭selinux和firewalld服务
设置规则前
设置规则后
iptables -t filter -A INPUT -s 172.25.2.100 -j DROP
不指定'-p 和--dport',默认是所有'all'
区间: '--dport 700:800'
两个效果:
(1)'无法ping通'
(2)由于是通过ssh连接的,所以此时ssh远程'连接断开'
(1) '-A尾部添加'
在'指定表'的'指定链'的'尾部'添加一条'规则',-A选项表示在'对应链的末尾'添加规则
'示例':iptables -t filter -A IPUT -s 1712.25.2.100 -j DROP
'语法':iptables -t 表名 -A 链名 匹配条件 -j 动作
'说明':不指定'-p',默认是'所有的'
------ '观察' ------
'1':是否加入到'尾部'
'2':规则是否'生效'
(2) -I '头部'添加
在指定表的'指定链的首部'添加一条规则,-I选型表示在对应链的开头添加规则
'示例':iptables -t filter -I IPUT -s 172.25.2.100 -j DROP
'语法':iptables -t 表名 -I 链名 匹配条件 -j 动作
------------- '分割线' -------------
(3) 指定'位置'添加
示例:iptables -t filter -I IPUT '3' -s 172.25.2.100 -j DROP
语法:iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作
'查看规则的编号':iptables [-t 表] [链条] -L -n --line-number
------------- '分割线' -------------
(4) 设置指定表的'指定链的默认策略'(默认动作) --> '并非添加'规则,所以'没有规则序号'
示例: iptables -t filter -P FORWARD ACCEPT
语法:iptables -t 表名 -P 链名 动作
'自定义的链特点':自定义链并'不能直接使用',而是需要'被默认链引用-->也即二者需要进行关联'才能够使用
链引用计数'references' --> 被任何'默认链所引用的次数'
在一个关卡设定,指定当'有数据的时候专门'去找某个'特定的链'来处理,当'那个链处理完'之后,'再返回',接着在特定的链中继续检查
后续: '补充一个图'
(3)删除
---------------- 删除'指定规则' ----------------
(1) 按照'规则序号'删除规则
iptables -t filter -D INPUT 3
语法: iptables -t 表名 -D 链名 规则序号
(2) 按照具体的'匹配条件与动作'删除规则-->'不常用'
iptables -t filter -D INPUT -s 192.168.1.146 -j DROP
语法: iptables -t 表名 -D 链名 匹配条件 -j 动作
---------------- 删除'表中指定table指定chain的所有规则' ----------------
(3) 删除指定表的指定链中的所有规则,'-F'选项表示'清空对应链中的规则'
iptables -t filter -F INPUT
语法: iptables -t 表名 -F 链名
---------------- 删除'表中指定table的所有规则' ----------------
(4) 删除指定表中的所有规则,'执行时需三思'
iptables -t filter -F
语法: iptables -t 表名 -F
---------------- 删除'所有的防火墙规则' ----------------
iptables -F '了解即可'
(5) 使用"-X"选项可以删除'自定义链',但是删除自定义链时,需要'满足两个条件'
1、自定义链'有被任何默认链引用',即自定义链的'引用计数为0'
2、自定义链中'没有任何规则',即'自定义链为空'
(4)修改
'推荐方案':你想要'修改某条规则',还不如先'将这条规则删除',然后在'同样位置再插入一条新规则' -->'动作比较大'
'修改动作':那么使用-R选项时,不要忘了'指明'规则'原本对应的匹配条件'
-R, --'replace' chain rulenum rule-specification
说明:规则'被取代后'并'不会改变顺序'
-------------------------- '案例' --------------------------
iptables -R INPUT 1 -s 172.25.2.100 -j ACCEPT
-R INPUT 1表示修改INPUT链的第1条规则,使用-j REJECT表示将INPUT链中的'第一条规则的动作修改'为ACCEPT
注意:'-s选项以及对应的源地址'不可省略,因为'没有指定原本的源地址',当前规则的源地址'自动变为'0.0.0.0/0
(5)过滤无效的数据包
场景引入: 假设有人'进入了服务器',或者'有病毒木马程序',它可以通过22,80端口像服务器'外传送数据'
说明: 它的这种方式就和我们'正常访问22,80端口区别'-->它发向外发的数据'不是'我们通过'访问网页请求而回应'的数据包
下面我们要'禁止这些没有通过请求回应的数据包',统统把它们'堵住掉'
iptables 提供了一个参数 是'检查状态'的,下面我们来配置下' 22 和 80 '端口,防止'无效的数据包'
iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED,RELATED -j ACCEPT
是一种'显式扩展',用于'检测会话之间的连接关系'的,有了检测我们可以实现'会话间功能的扩展'
'什么是状态检测?'
对于整个TCP协议来讲,它是一个'有连接的协议'
三次握手中,'第一次握手',我们就叫NEW连接
而从第二次握手以后的,'ack都为1',这是'正常的数据传输'
和tcp的'第二次第三次握'手,叫做'已建立的连接'(ESTABLISHED)
还有一种状态,比较诡异的:比如:SYN=1 ACK=1 RST=1,对于这种我们'无法识别'的,我们都称之为'INVALID无法识别'的
还有第四种,'FTP这种古老的拥有的特征',每个端口都是'独立的',21号和20号端口都是一去一回,'他们之间是有关系的',这种关系我们称之为'RELATED'
所以我们的状态一共有'四种':NEW、ESTABLISHED、RELATED、INVALID
常见的'反弹式木马': '进来的只允许状态'为NEW和ESTABLISHED的进来,'出去只允许'ESTABLISHED的状态出去
'已经建立的连接得让它进来'
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
(6)规则顺序思考
iptables执行规则时,是从规则表中'从上至下顺序执行的',如果没遇到'匹配'的规则,就'一条一条'往下执行,如果遇到'匹配的规则后',那么就'执行本规则',执行后根据本规则的动作(accept, reject, log等),决定下一步执行的情况
后续执行一般有'三种情况'
1)一种是继续执行'当前规则队列内-->当前链条'的下一条规则,比如执行过Filter队列内的LOG后,还会执行Filter队列内的下一条规则。
2)一种是'中止当前规则队列的执行',转到'下一条规则队列-->下一条链',比如从执行过accept后就中断Filter队列内其它规则,跳到nat队列规则去执行
3)一种是'中止所有规则队列'的执行
'iptables优化'
'优化的思路'是:请求'最频繁的放在最上面',请求频率较小的放在最后面
网络层的防火墙 --> 常见的'有3、4层的防火墙',7层的防火墙,其实是'代理层的网关'
------ '七层为什么比三层慢' ------
TCP/IP的'七层模型'第三层是'网络层',三层的防火墙会在这层对'源地址和目标地址'进行'检测'。
七层的防火墙,不管你'源端口或者目标端口',源地址或者目标地址是什么,都将对你'所有的东西进行检查'
特点:七层防火墙'更加安全',但是这却带来了'效率更低'