背景描述
最新在公司中接到了一个需求,需要我在linux上配置权限,需求如下: (1)限制指定的ip访问我的机器; (2)限制本机访问外部的ip信息(防止出现数据泄露); 主要是机器是我们组申请的,让其他人使用,禁止数据上传和下载的情况;
拿到这个需求,第一个想到的就是linux的防火墙;目前linux的防火墙主要是使用iptables和firewall;区别在于firewall是在redhat 7.0之后开始使用的;在拿到需求之后,首先试着使用firewall的方式,但是firewall无法满足需求(可能是自己没有研究透),firewall能够很好的阻止外部数据访问,但是对于由内向外的访问,无法做到很轻松容易,因此本篇文章主要是讲述iptables;
iptables介绍
本次文章主要是参考了以下的飞书文章: https://firststory.feishu.cn/docs/doccnr9KMt9Ynbmv4oJIRWrh4vh
以下是对上述文章的一些理解: (1)我们用iptables进行拦截,主要是拦截入站流量,出站流量和转发流量三种; (2)iptables有5条规则链,分别是PREROUTING,INPUT,OUTPUT,FORWARD和POSTROUTING;
PREROUTING:路由选择前,路由选择前处理数据包;入站包及转发包都可以使用。 INPUT:路由选择后,目的地为本机,入站包才可以使用。 OUTPUT:本机产生的数据包对外转发,出站包才可以使用。 FORWARD:路由选择后,目的不为本机,转发包才可以使用。 POSTROUTING:离开本机网卡前,路由选择后处理数据包。所有数据包都可以使用,最后一步的处理,如SNAT,地址伪装。 当数据进来之后,会先经过prerouting,之后经过路由决策,判断是进行转发还是其他操作,如果是进行转发,跳入到forward进程,如果不是forward进程,此时会进入INPUT操作,INPUT操作会进行过滤操作;然后进入到自己的程序中,最后经过OUTPUT操作拦截过滤;再发往外部; (3)对于INPUT和OUTPUT等拦截是采用链式结构的,即会进行一条一条的匹配,知道匹配完成位置;以INPUT为例,假设INPUT有5条规则,按照顺序一次是A,B,C,D,E;E为默认规则,流量进入INPUT,会依次匹配A,B,C,D,E规则,直至匹配完成位置; (4)一般会设置一个默认规则,即所有规则都不匹配,则采用默认规则,在我们的案例中,对于INPUT,默认规则设置成屏蔽所有的INPUT流量;
iptables -P INPUT DROP
以下只是给了上述背景的解决办法; #解决方案: 1.安装iptables和iptables-service; 2.配置ssh的进出权限
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
3.禁止其他的所有的出入
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
4.配置进出的状态监控
iptables -A INPUT -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
这里需要讲述,防火墙有两种,一种是每次访问都进行拦截,第二种是根据防火墙的状态进行拦截,上述的两个命令就是对于和之前建立的链接,以及相关的链接会直接放过;
5.查看规则,并显示拦截的顺序 iptables -vnL --line-number
6.iptable删除过滤
iptable -D INPUT 2
iptables -D OUTPUT 2
7.iptables在指定位置添加规则
iptables -I INPUT 1 -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -I OUTPUT 1 -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
|