Iptables 使用

2022-01-12 10:23:18 浏览数 (1)

Iptables

iptables简介

iptables并不是防火墙,而是一个命令行工具;他实际上操作的是内核态的netfilter;

是有数据包是发往本机的才会过input链条,要是想让数据包全部过滤,需要操作prerouting 路由前这个链;

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

链的概念(Prerouting、Input、forward、output、postrouting)

现在,我们想象一下,这些”关卡”在iptables中为什么被称作”链”呢?我们知道,防火墙的作用就在于对经过的报文匹配”规则”,然后执行对应的”动作”,所以,当报文经过这些关卡的时候,则必须匹配这个关卡上的规则,但是,这个关卡上可能不止有一条规则,而是有很多条规则,当我们把这些规则串到一个链条上的时候,就形成了”链”,所以,我们把每一个”关卡”想象成如下图中的模样 ,这样来说,把他们称为”链”更为合适,每个经过这个”关卡”的报文,都要将这条”链”上的所有规则匹配一遍,如果有符合条件的规则,则执行规则对应的动作。

链与表之间的关系

filter表:负责过滤功能,防火墙;内核模块:iptables_filter nat表:network address translation,网络地址转换功能;内核模块:iptable_nat mangle表:拆解报文,做出修改,并重新封装 的功能;iptable_mangle raw表:关闭nat表上启用的连接追踪机制;iptable_raw

PREROUTING 的规则可以存在于:raw表,mangle表,nat表。

INPUT 的规则可以存在于:mangle表,filter表,(centos7中还有nat表,centos6中没有)。

FORWARD 的规则可以存在于:mangle表,filter表。

OUTPUT 的规则可以存在于:raw表mangle表,nat表,filter表。

POSTROUTING 的规则可以存在于:mangle表,nat表。

数据经过防火墙的流程

iptables的基本操作

iptables的基本规则组成分为:基本匹配条件,扩展匹配条件,处理动作

处理动作分为:

ACCEPT:允许数据包通过 DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。 REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。 SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。 MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。 DNAT:目标地址转换。 REDIRECT:在本机做端口映射。 LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。

查看表中的规则

代码语言:javascript复制
iptables -t filter -L (input/forward/output)
iptables -t nat -L    (PREROUTING/output/POSTROUTING)
iptables -t mangle -L (PREROUTING/input/forward/output/POSTROUTING)

查看链中的规则

代码语言:javascript复制
iptables -vL FORWARD | column -t

pkts:对应规则匹配到的报文的个数。 bytes:对应匹配到的报文包的大小总和。 target:规则对应的target,往往表示规则对应的”动作”,即规则匹配成功后需要采取的措施。 prot:表示规则对应的协议,是否只针对某些协议应用此规则。 opt:表示规则对应的选项。 in:表示数据包由哪个接口(网卡)流入,我们可以设置通过哪块网卡流入的报文需要匹配当前规则。 out:表示数据包由哪个接口(网卡)流出,我们可以设置通过哪块网卡流出的报文需要匹配当前规则。 source:表示规则对应的源头地址,可以是一个IP,也可以是一个网段。 destination:表示规则对应的目标地址。可以是一个IP,也可以是一个网段。

不进行域名转换

代码语言:javascript复制
iptables -vnL FORWARD | column -t

显示编号

代码语言:javascript复制
iptables --line-numbers -nvL  FORWARD | column -t

增加iptables规则

代码语言:javascript复制
命令语法:iptables -t 表名 -A 链名 匹配条件 -j 动作

1,插入数据

代码语言:javascript复制
iptables -t filter -I INPUT -s 172.16.2.2 -j DORP     #拒绝172.16.2.2机器到本机器的所有流量

插入数据到指定的位置

代码语言:javascript复制
iptables -t filter -nv --line -L INPUT    #带编号查看规则
iptables -t filter -I INPUT 3 -s 172.16.2.2 -j ACCEPT    #在第三条规则插入数据

2,追加规则

代码语言:javascript复制
iptables -t filter -A INPUT -s 172.16.2.2 -j ACCEPT

3,指定多个源IP地址

代码语言:javascript复制
iptables -t filter -I INPUT -s 172.16.2.2,172.16.2.3 -j DORP    #会同时添加两条规则
iptables -t filter -I INPUT -s 172.16.2.0/24 -j DORP            #指定一个网段
iptables -t filter -I INPUT ! -s 172.16.2.2 -j DORP             #取反,除了172.16.2.2以外的都拒绝,不能和多个IP地址规则一同书写

4,匹配目的地址

匹配源地址为-s,匹配目的地址为-d

代码语言:javascript复制
iptables -t filter -I INPUT -s 172.16.2.2 -d 127.0.0.1 -j DORP

5,匹配协议

匹配协议使用 -p,支持的协议有:

tcp udp icmp udplite esp ah sctp mh

  • 如果-p 不指定协议就是匹配所有协议,和 -p all 是同一个效果

6,匹配网卡

匹配网卡使用-i选项

7,扩展规则,匹配目的端口

--dport来指定目的端口,他一定要个 -p 配合使用 ,

代码语言:javascript复制
iptables -t filter -I INPUT -S 192.168.1.2 -p tcp --dport 22 -j DROP        #拒绝192.168.1.2访问本机的22端口
iptables -t filter -I INPUT -S 192.168.1.2 -p tcp --dport 22:25 -j DROP     #指定端口范围
iptables -t filter -I INPUT -S 192.168.1.2 -p tcp -m multiport --dports 22,26,80:88 -j DROP    #指定多个端口

8,扩展规则,匹配源端口

-sport来指定源端口

9,匹配连续的地址段

代码语言:javascript复制
iptables -t filter -I INPUT -m iprange --src-range 192.168.1.1-192.168.1.200 -j DROP
iptables -t filter -I INPUT -m iprange --dst-range 192.168.1.1-192.168.1.200 -j DROP
扩展模块
1)匹配字符串,返回的报文中包含某个字符串
代码语言:javascript复制
iptables -t filter -I INPUT -m string --algo bm --string "OOXX" -j REJECT

–algo:用于指定匹配算法,可选的算法有bm与kmp,此选项为必须选项,我们不用纠结于选择哪个算法,但是我们必须指定一个。 –string:用于指定需要匹配的字符串。

2) time 时间模块

我想要自我约束,每天早上9点到下午6点不能看网页未测试通过

代码语言:javascript复制
iptables -t filter -I OUTPUT -p tcp -m multiport --dports 80,443 -m time --timestart 09:00:00 --timestop 18:00:00 -j REJECT
3)限制客户端链接数量connlimit

允许你限制每个客户端IP地址(或地址块)与服务器的并行TCP连接的数量。 [!] --connlimit-above n 如果现有的TCP连接数高于(不高于)n,则匹配。 --connlimit-mask bits 使用掩码对主机进行分组

允许每个客户主机有2个telnet连接

代码语言:javascript复制
iptables -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT

你也可以反过来匹配。

代码语言:javascript复制
iptables -p tcp --syn --dport 23 -m connlimit ! --connlimit-above 2 -j ACCEPT

限制每个C类网络(24位网络掩码)中并行http请求的数量为16个

代码语言:javascript复制
iptables -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REECT

删除iptables规则

1,根据编号删除

代码语言:javascript复制
iptables -t filter -nv --line -L INPUT    #查看规则编号
iptables -t filter -D INPUT 2             #删除编号为2 的规则

2,直接根据规则删除

代码语言:javascript复制
iptables -t filter -D INPUT  -s 172.16.2.2 -j DORP 

3,删除单个链中单个表的所有数据

代码语言:javascript复制
iptables -t filter -F INPUT   #删除INPUT链中filter表中的所有数据
iptables -t filter -F         #删除所有链中filter表中的数据

修改iptables规则

1,修改链表默认的规则

代码语言:javascript复制
iptables -t filter -P INPUT DROP     #INPUT链中filter表设置为默认拒绝,可以使用iptables -t filter -nvL INPUT查看

不建议使用上述命令,因为iptables -F之后会所有的包都进不来

2,修改之前的规则

代码语言:javascript复制
iptables -t filter --line -nvL INPUT    #带编号查看规则
iptables -t filter -R INPUT 3 -s 72.16.2.2 -j REJECT   #一定要带上原规则,否则会变成所有

保存iptables规则

代码语言:javascript复制
iptables-save > /etc/sysconfig/iptables

恢复iptables规则

代码语言:javascript复制
iptables-restore < /etc/sysconfig/iptables

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 人点赞