背景描述
最新在公司中接到了一个需求,需要我在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.清除之前的所有的权限(删除Filter表中所有的数据)
iptables -F
3.创建规则,设置related,established的规则,记住状态,对先前登录的不用过滤
iptables -A INPUT -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
这里需要讲述,防火墙有两种,一种是每次访问都进行拦截,第二种是根据防火墙的状态进行拦截,上述的两个命令就是对于和之前建立的链接,以及相关的链接会直接放过;
4.配置指定ip的ssh的INPUT权限
iptables -A INPUT -s xxx.xxx.xxx.xxx -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s xxx.xxx.xxx.xxx -p tcp --dport 22 -j ACCEPT
5.禁止INPUT其他所有ip为drop
iptables -P INPUT DROP
6.配置OUTPUT只能访问指定的ip
iptables -A OUTPUT -d xxx.xxx.xxx.xxx -p tcp --dport 22 -j ACCEPT
iptables -A OUTPUT -d xxx.xxx.xxx.xxx -p tcp --dport 22 -j ACCEPT
7.禁止OUTPUT其他所有的ip
iptables -P OUTPUT DROP
8.重新确认,没有问题将配置结果进行保存
iptables save
9.其他
针对iptables,还有一些常用的命令,具体如下:
查询当前配置的情况
iptables -vnL --line-number
在指定的位置插入:
iptables -I INPUT XXXX
iptables -I OUTPUT XXX