4.22/23实习总结:iptables

文章目录

iptables: 是Linux上常用的防火墙管理工具,是netfilter项目的一部分。实现包过滤、NAT功能。

1. iptables的四表五链

四表:
raw表是否状态跟踪处理,高级功能,如:网址过滤。内核模块:iptable_raw
mangle表修改ip头,或是打上只在内核有效的标记,数据包修改(QOS),用于实现服务质量。内核模块:iptable_mangle
nat 表修改源/目的地址/端口,网络地址转换功能;内核模块:iptable_nat、
filter表 ,默认的是 filter 表。负责过滤功能,防火墙;内核模块:iptables_filter
表的优先级:raw>mangle>nat>filter
五链:
INPUT链处理输入数据包。
OUTPUT链处理输出数据包。
FORWARD链处理转发数据包。
PREROUTING链 “路由前”用于目标地址转换(DNAT)。
POSTOUTING链 ”路由后”用于源地址转换(SNAT)。

在这里插入图片描述
所以,根据上图,我们能够想象出某些常用场景中,报文的流向:
到本机某进程的报文:PREROUTING –> INPUT
由本机转发的报文:PREROUTING –> FORWARD –> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT –> POSTROUTING

2. iptables语法:iptables (选项) (参数)

iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作

选项:

-t, --table table 对指定的表 table 进行操作, table 必须是 raw, nat,filter,mangle 中的一个。如果不指定此选项,默认的是 filter 表。

# 通用匹配:源地址目标地址的匹配
-p:指定要匹配的数据包协议类型;
-s, --source [!] address[/mask] :把指定的一个/一组地址作为源地址,按此规则进行过滤。当后面没有 mask 时,address 是一个地址,比如:192.168.1.1;当 mask 指定时,可以表示一组范围内的地址,比如:192.168.1.0/255.255.255.0-d, --destination [!] address[/mask] :地址格式同上,但这里是指定地址为目的地址,按此进行过滤。
-i, --in-interface [!] <网络接口name> :指定数据包的来自来自网络接口,比如最常见的 eth0 。注意:它只对 INPUT,FORWARD,PREROUTING 这三个链起作用。如果没有指定此选项, 说明可以来自任何一个网络接口。同前面类似,"!" 表示取反。
-o, --out-interface [!] <网络接口name> :指定数据包出去的网络接口。只对 OUTPUT,FORWARD,POSTROUTING 三个链起作用。

# 查看管理命令
-L, --list [chain] 列出链 chain 上面的所有规则,如果没有指定链,列出表上所有链的所有规则。

# 规则管理命令
-A, --append chain rule-specification 在指定链 chain 的末尾插入指定的规则,也就是说,这条规则会被放到最后,最后才会被执行。规则是由后面的匹配来指定。
-I, --insert chain [rulenum] rule-specification 在链 chain 中的指定位置插入一条或多条规则。如果指定的规则号是1,则在链的头部插入。这也是默认的情况,如果没有指定规则号。
-D, --delete chain rule-specification -D, --delete chain rulenum 在指定的链 chain 中删除一个或多个指定规则。
-R num:Replays替换/修改第几条规则

# 链管理命令(这都是立即生效的)
-P, --policy chain target :为指定的链 chain 设置策略 target。注意,只有内置的链才允许有策略,用户自定义的是不允许的。
-F, --flush [chain] 清空指定链 chain 上面的所有规则。如果没有指定链,清空该表上所有链的所有规则。
-N, --new-chain chain 用指定的名字创建一个新的链。
-X, --delete-chain [chain] :删除指定的链,这个链必须没有被其它任何规则引用,而且这条上必须没有任何规则。如果没有指定链名,则会删除该表中所有非内置的链。
-E, --rename-chain old-chain new-chain :用指定的新名字去重命名指定的链。这并不会对链内部造成任何影响。
-Z, --zero [chain] :把指定链,或者表中的所有链上的所有计数器清零。

-j, --jump target <指定目标> :即满足某条件时该执行什么样的动作。target 可以是内置的目标,比如 ACCEPT,也可以是用户自定义的链。
-h:显示帮助信息;

基本参数:

参数作用
-P设置默认策略:iptables -P INPUT (DROP
-F清空规则链
-L查看规则链
-A在规则链的末尾加入新规则
-Inum 在规则链的头部加入新规则
-Dnum 删除某一条规则
-s匹配来源地址IP/MASK,加叹号"!"表示除这个IP外。
-d匹配目标地址
-i网卡名称 匹配从这块网卡流入的数据
-o网卡名称 匹配从这块网卡流出的数据
-p匹配协议,如tcp,udp,icmp
–dportnum 匹配目标端口号
–sportnum 匹配来源端口号
-m显示匹配

3. iptables的策略:允许或者不允许

我们现在用的比较多个功能有3个:
1.filter 定义允许或者不允许的,只能做在3个链上:INPUT ,FORWARD ,OUTPUT
2.nat 定义地址转换的,也只能做在3个链上:PREROUTING ,OUTPUT ,POSTROUTING
3.mangle功能:修改报文原数据,是5个链都可以做:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。我们修改报文原数据就是来修改TTL的。能够实现将数据包的元数据拆开,在里面做标记/修改内容的。而防火墙标记,其实就是靠mangle来实现的。
4.raw 表中的规则可以被哪些链使用:PREROUTING,OUTPUT

PREROUTING:nat , mangle
INPUT:filter , mangle , centos7中nat中也有INPUT
FARWARD:filter , mangle
OUTPUT:filter , nat , mangle ,raw
POSTROUTING:nat , mangle

在这里插入图片描述
规则由匹配条件和处理动作组成:
匹配条件:分为基本匹配条件与扩展匹配条件
基本匹配条件:源地址Source IP,目标地址 Destination IP
扩展匹配条件:源端口Source Port, 目标端口Destination Port

动作包括:
ACCEPT接收数据包。
DROP丢弃数据包。
REJECT拒绝数据包。
REDIRECT重定向、映射、透明代理。
SNAT源地址转换。解决内网用户用同一个公网地址上网的问题。
DNAT目标地址转换。
MASQUERADEIP伪装(NAT),用于ADSL。是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
LOG日志记录。在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
SEMARK添加SEMARK标记以供网域内强制访问控制(MAC)

注:DROP和REJECT有什么区别?
当执行ping操作时,JEJECT直接就提示”目标不可达”,并没有像DROP那样卡在那里,看来,REJECT比DROP更加”干脆”。

4. iptables简单命令操作

4.1 查看规则命令:

1)列出默认表的规则:iptables (-t filter) -L

2)列出某个链的规则:iptables -L INPUT

注:加-v表示显示更多更详细的信息;加-n表示不对IP地址进行名称反解,直接显示IP地址

[root@dev-k8s-master1 ~]# iptables -nvL INPUT
Chain INPUT (policy ACCEPT 14247 packets, 2702K bytes)
 pkts bytes target     prot opt in     out     source               destination
  88M   19G KUBE-FIREWALL  all  --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
    0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
    0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:67
    0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:67

注1:policy为链的默认策略即可。
注2:packets与bytes称作”计数器”,上图中的计数器记录了默认策略匹配到的报文数量与总大小,”计数器”只会在使用-v选项时,才会显示出来。
如果你想要查看精确的计数值,而不是经过可读性优化过的计数值,那么你可以使用-x选项,表示显示精确的计数值。

[root@dev-k8s-master1 ~]# iptables -nvxL INPUT
Chain INPUT (policy ACCEPT 5145 packets, 923751 bytes)
    pkts      bytes target     prot opt in     out     source               destination
88841997 19050772133 KUBE-FIREWALL  all  --  *      *       0.0.0.0/0            0.0.0.0/0
       0        0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:53
       0        0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53
       0        0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:67
       0        0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:67

3)以序号的方式显示某规则:iptables -nL INPUT --line-numbers

[root@dev-k8s-master1 ~]# iptables -nL INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    KUBE-FIREWALL  all  --  0.0.0.0/0            0.0.0.0/0
2    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:53
3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:53
4    ACCEPT     udp  --  0.0.0.0/0            0.0.0.0/0            udp dpt:67
5    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:67
比如:要删除INPUT里序号为2的规则,执行:
iptables -D INPUT 2

4.2 增删改规则命令:

1)增加规则:-I 表示在头部加入新规则;-A 表示追加规则;也可以指定规则的编号可以进行任意插入

iptables -t filter -I INPUT -s x.x.x.x -j DROP
iptables -t filter -A INPUT -s x.x.x.x -j ACCEPT
iptables -t filter -I INPUT 2 -s x.x.x.x -j DROP   #表示在规则序号2的前面插入一条规则,此时这条规则自己的序号就是2

端口映射:本机的 2222 端口映射到内网 虚拟机的22 端口

iptables -t nat -A PREROUTING -d 210.14.67.127 -p tcp --dport 2222  -j DNAT --to-dest 192.168.188.115:22

2)删除规则:根据规则的编号去删除、或者是根据匹配条件与动作删除。-D 表示删除;-F 清除所有规则

#根据规则的编号去删除
iptables -t filter -D INPUT 2 
#根据匹配条件与动作删除
iiptables -D INPUT -s x.x.x.x -j ACCEPT
#清除指定表指定链上的所有规则
iptables -t 表名 -F (链名)

3)修改规则:-R 表示修改规则对应的动作,要注意的是使用-R选项修改某个规则时,必须指定规则对应的原本的匹配条件(如果有多个匹配条件,都需要指定);-P 表示修改某个链的默认动作(策略)

iptables -t filter -R INPUT 1 -s x.x.x.x -j REJECT
iptables -t filter -P FORWARD DROP

注:如果你想要修改某条规则,还不如先将这条规则删除,然后在同样位置再插入一条新规则

4.3 保存规则命令

在默认的情况下,我们对”防火墙”所做出的修改都是”临时的”,换句话说就是,当重启iptables服务或者重启服务器以后,我们平常添加的规则或者对规则所做出的修改都将消失,为了防止这种情况的发生,我们需要将规则”保存”。
注1:iptables配置文件:/etc/sysconfig/iptables
注2:保存规则到默认的配置文件:iptables-save > /etc/sysconfig/iptables

注3:我们也可以重载规则:iptables-restore < /etc/sysconfig/iptables
再次提醒:重载规则时,现有规则将会被覆盖。

4.4 匹配条件更多用法

1)匹配条件是源地址或者是目标地址:-s 或者是-d

源地址表示报文从哪里来,目标地址表示报文要到哪里去。

iptables -A INPUT -s x.x.x.x -d y.y.y.y -j DROP

a.要是地址有多个则以,隔开。源地址也可以是网段

iptables -t filter -I INPUT -s x.x.x.x,y.y.y.y -j DROP
iptables -t filter -I INPUT -s x.x.0.0/16 -j REJECT

b.匹配条件取反 !

iptables -A INPUT -s ! x.x.x.x -j ACCEPT
表示源地址只要不是x.x.x.x就接受。而只要源地址是x.x.x.x就拒绝这种理解是错误的。
因为规则中并没有说明遇到x.x.x.x就拒绝或丢弃。
所以x.x.x.x还是可以ping通的。

注:不管是-s选项还是-d选项,取反操作与同时指定多个IP的操作不能同时使用

2)匹配条件是协议:-p

协议:tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
当不使用-p指定协议类型时,默认表示所有类型的协议都会被匹配到,与使用-p all的效果相同。

3)匹配条件是网卡接口:-i 表示从哪个网卡流入 ;-o表示从哪个网卡流出

#拒绝由网卡eth4流入的ping请求报文
iptables -t filter -I INPUT -i eth4 -p icmp -j REJECT

注:-i选项是用于判断报文是从哪个网卡流入的,那么,-i选项只能用于PREROUTING链、INPUT链、FORWARD链。-o选项只能用于FORWARD链、OUTPUT链、POSTROUTING链

4)扩展匹配:匹配条件是端口:–dport 表示目标端口 --sport 表示源端口。想要使用扩展匹配条件,则需要依赖一些扩展模块

iptables -t fliter -I INPUT -p tcp -m tcp --dport 22 -j REJECT
# -m tcp表示使用tcp扩展模块
#注:-p tcp与 -m tcp并不冲突,-p用于匹配报文的协议,-m 用于指定扩展模块的名称,正好,这个扩展模块也叫tcp。
#但是-m选项可以省略:iptables默认会调用与-p选项对应的协议名称相同的模块。
iptables -t fliter -I INPUT -p tcp --dport 22 -j REJECT

注:如果这个扩展匹配条件所依赖的扩展模块名正好与-p对应的协议名称相同,那么则可省略-m选项,否则则不能省略-m选项,必须使用-m选项指定对应的扩展模块名称
也可以指定端口的范围使用:冒号

#22~25
iptables -t filter -I INPUT -p tcp --dport 22:25 -j REJECT
#0~22
--dport :20     
#85~65535
--dport 85:

另一个扩展模块,”multiport”模块:可以指定多个不连续的端口 -m multiport。multiport扩展只能用于tcp协议与udp协议,即配合-p tcp或者-p udp使用。

iptables -t filter -I INPUT -p tcp -m multiport --dport 22,25,86 -j REJECT

5)常用扩展模块:

a.multiport扩展模块:可以指定多个不连续的端口

b.iprange扩展模块:指定一段连续的IP地址范围 --src-range ,–dst-range

iptables -t fliter -I INPUT -m iprange --src-range 192.168.1.1-192.168.1.156 -j DROP

c.string扩展模块:指定要匹配的字符串

如果报文中包含”hello”字符,我们就拒绝报文进入本机

iptables -t fliter -I INPUT -m string --algo bm --string "hello"  -j REJECT
#–algo:用于指定匹配算法,可选的算法有bm与kmp

d.time扩展模块:根据时间段区匹配报文

5. iptables黑白名单机制

报文在经过iptables的链时,会匹配链中的规则,遇到匹配的规则时,就执行对应的动作,如果链中的规则都无法匹配到当前报文,则使用链的默认策略(默认动作),链的默认策略通常设置为ACCEPT或者DROP。
当链的默认策略设置为ACCEPT时,按照道理来说,我们在链中配置规则时,对应的动作应该设置为DROP或者REJECT,为什么呢?

因为默认策略已经为ACCEPT了,如果我们在设置规则时,对应动作仍然为ACCEPT,那么所有报文都会被放行了,因为不管报文是否被规则匹配到都会被ACCEPT,所以就失去了访问控制的意义。

所以,当链的默认策略为ACCEPT时,链中的规则对应的动作应该为DROP或者REJECT,表示只有匹配到规则的报文才会被拒绝,没有被规则匹配到的报文都会被默认接受,这就是”黑名单”机制。
同理,当链的默认策略为DROP时,链中的规则对应的动作应该为ACCEPT,表示只有匹配到规则的报文才会被放行,没有被规则匹配到的报文都会被默认拒绝,这就是”白名单”机制。

注:
在这里插入图片描述
在这里插入图片描述
注:白名单机制有一个漏洞:就是当默认策略为DROP,当清空所有的规则会导致管理员自己也登不上去,所以在设置白名单策略时还是要把默认策略设置为ACCEPT,然后把“拒绝所有的请求”放在最后面,将要放行的放在这条规则前面。
在这里插入图片描述
在这里插入图片描述

6. iptables常用总结

1、规则的顺序非常重要。

如果报文已经被前面的规则匹配到,IPTABLES则会对报文执行对应的动作,通常是ACCEPT或者REJECT,报文被放行或拒绝以后,即使后面的规则也能匹配到刚才放行或拒绝的报文,也没有机会再对报文执行相应的动作了(前面规则的动作为LOG时除外),所以,针对相同服务的规则,更严格的规则应该放在前面。

2、当规则中有多个匹配条件时,条件之间默认存在”与”的关系。

如果一条规则中包含了多个匹配条件,那么报文必须同时满足这个规则中的所有匹配条件,报文才能被这条规则匹配到。

3、在不考虑1的情况下,应该将更容易被匹配到的规则放置在前面。

比如,你写了两条规则,一条针对sshd服务,一条针对web服务。

假设,一天之内,有20000个请求访问web服务,有200个请求访问sshd服务,

那么,应该将针对web服务的规则放在前面,针对sshd的规则放在后面,因为访问web服务的请求频率更高。

如果将sshd的规则放在前面,当报文是访问web服务时,sshd的规则也要白白的验证一遍,由于访问web服务的频率更高,白白耗费的资源就更多。

如果web服务的规则放在前面,由于访问web服务的频率更高,所以无用功会比较少。

换句话说就是,在没有顺序要求的情况下,不同类别的规则,被匹配次数多的、匹配频率高的规则应该放在前面。

4、当IPTABLES所在主机作为网络防火 墙时,在配置规则时,应着重考虑方向性,双向都要考虑,从外到内,从内到外。

5、在配置IPTABLES白名单时,往往会将链的默认策略设置为ACCEPT,通过在链的最后设置REJECT规则实现白名单机制,而不是将链的默认策略设置为DROP,如果将链的默认策略设置为DROP,当链中的规则被清空时,管理员的请求也将会被DROP掉。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

骑着蜗牛追汤圆

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值