一、环境的准备
1.关于防火墙问题
但是令我好奇的是这一段为什么要关闭防火墙呢。
关闭和禁用防火墙(centos7不同于以前的版本) (1)、直接关闭防火墙 # systemctl stop firewalld (2)、禁止firewall开机启动 # systemctl disable firewalld (3)、查看状态: systemctl status firewalld
原因:虽然Centos 7 中已经有firewalld,但是现在公司或生活中大部分还是使用的是iptables。
2.关于SELinux
还有一个好奇点如下:
关闭selinux
# vim /etc/selinux/config
将SELINUX=enforcing改为SELINUX=disabled;最后要重启一下
原因:SELinux 的结构及配置非常复杂,而且有大量概念性的东西,要学精难度较大。很多 Linux 系统管理员嫌麻烦都把 SELinux 关闭了。
😄竟然是这样
可是我们再继续思考,为什么都要把这些关了呢? 明明能起到安全保护的作用?那这与我们的网络安全全背道而驰吗?
猜测:我觉得这是因为外部是配有专门的防火墙设备的,这样防火墙统一管理,而且还是专业的防火墙设配,所以那不是更加的方便高效吗。
致此,关于环境的介绍应该就配置完毕,接下来开始iptables愉快的学习吧。
iptables
第一步、纸上得来终学浅,绝知此事要躬行
刚开始查阅了一大堆得资料,一堆什么表啊,链啊···阿巴阿巴阿巴····我这么蠢,的概念根本看不懂的好吧。看了就是令人头大。然后直到我看到了B站的这个阿婆主。还得多看几遍,才知道这有什么有,是个什么东西,多说无益,看了实践操作才知道。
又过了一天,我发现回忆起来视频印象还是不深刻,自己上手依旧不太会用,那决定自己再动手跟着操作一遍吧。所以为了方便操作,需要搭建两台不同ip地址的CentOS7环境,也算是复习了一遍上面的环境搭建吧,然后其中一台需要搭建一个阿帕奇服务,如下:
1.安装Apache服务。 yum install -y httpd 2.启动Apache服务。 systemctl start httpd 3.设置Apache服务开机自启动· systemctl enable httpd 4.查询Apache服务是否处于运行中状态。 systemctl status httpd 返回active(running)则表示已开始运行Apache服务。 5.在当前浏览器页面,新开启一个网页,在地址栏输入实例的公网P地址,并回车。
1、环境说明
CentOS7 —ip:192.168.18.220 —已关firewalld和selinux-----开启apache和ssh
CentOS7(2)—ip:192.168.18.197 —已firewalld和selinux-----只有ssh
Windows10—ip:192.168.18.195 本地操作机(关闭防火墙)
ip tables顾名思义----就是对网络中的数据包,通过表的形式进行一些限定还有规则的修改。
因此:iptables简介
iptables 是集成在 Linux 内核中的包过滤防火墙系统。使用 iptables 可以添加、删除具体的过滤规则,iptables 默认维护着 4 个表(在CentOS7中)和 5 个链,所有的防火墙策略规则都被分别写入这些表与链中。
“四表”是指 iptables 的功能,默认的 iptable s规则表有 filter 表(过滤规则表)、nat 表(地址转换规则表)、mangle(修改数据标记位规则表)、raw(跟踪数据表规则表):
filter 表:控制数据包是否允许进出及转发,可以控制的链路有 INPUT、FORWARD 和 OUTPUT。
nat 表:控制数据包中地址转换,可以控制的链路有 PREROUTING、INPUT、OUTPUT 和 POSTROUTING。
mangle:修改数据包中的原数据,可以控制的链路有 PREROUTING、INPUT、OUTPUT、FORWARD 和 POSTROUTING。
raw:控制 nat 表中连接追踪机制的启用状况,可以控制的链路有 PREROUTING、OUTPUT。
2、实践是检验真理的唯一标准
1、filter表
iptables -t filter -L -n
列出filter表所有的规则。-t filter
可以不写,这是默认的表。-n
表示不对 IP 地址进行反查,加上这个参数显示速度将会加快
来的数据包过滤——>input
————————output
——>出去的数据包过滤
Forward
链和路由转发有关,也就是和NAT表有关。
1.1 INPUT链
接下来–举个例子:
本地windows可以访问CentOS7对外发布的一个80端口的网页服务,如下图:
此时我们如果在CentOS7内配置————-A INPUT指定对INPUT链添加一条规则,-j DROP指定规则类型是DROP丢弃,--dport 80指定如果目的地址是80,-p tcp指定tcp协议
iptables -t filter -A INPUT -j DROP -p tcp --dport 80
执行上面的命令之后,就会发现网页不能访问了,应为iptables已经把所有接收到了目的地址为80端口的数据包丢弃了。如下图:
查看规则:
我们再来删除规则,-D INPUT 5
我们需要删除的规则在从上往下数第五条
iptables -t filter -D INPUT 5
执行完上面这条命令就可以继续成功访问了。
1.2 OUTPUT链
刚才是配置的INPUT导致接收的到DROP掉了,接下来还可以配置OUTPUT导致即将发出的包给扔掉
-A OUTPUT指定对OUTPUT链添加一条规则,-j DROP指定规则类型是DROP丢掉,-p tcp指定tcp协议,-d 192.168.18.195指定目的地址(综上,如果目的地址是这个的包即将被丢弃)
iptables -t filter -A OUTPUT -j DROP -p tcp -d 192.168.18.195
但是注意up主这里非常搞笑的一点,如果我门使用的是ssh远程操作的CentOS7,执行完上面的操作后,那么也就会断开😄
然后说一下规则插入的优先级:-A
是在最后添加一条,-I
是在最前插入一条,-I
还可以在指定位置插入一条比如-I INPUT 5
就是在第五条插入。
2、nat表
在前面我们知道filter表有INPUT链和OUTPUT链
路由之前(改目的地址)——>【PREROUTING】——>(INPUT改源)——>(FORWARD)——>(OUTPUT改目的)——【POSTROUTING】——>路由之后(改源地址)
进入INPUT和FORWARD与否是看路由决策是到外部还是外部,和NAT没有关系,大部分是进入NAT后会进入FORWARD。
然后()括号里的NAT表里面的INPUT和OUTPUT链用的不多,但是比如内部有个APP要直接发包,不用经过PREROUTONG,那么就可通过NAT表的OUTPUT链改目的地址。
然后接下来的实验就是有点类似于实现了反向代理:
首先我们用CentOS7:
下载容器yum -y install docker
运行一个nginx容器内部80端口映射到外部7799docker run -p 7799:80 nginx
直接访问7799端口就能访问到容器的Nginx映射出来的页面。
目标:
把发到CentOS7(2)7788端口的数据包转发到 18.220:7799
把CentOS7(2)发到 18.220:7799的数据包源地址改成CentOS7(2)的地址。
这样就能反向代理CentOS7,让CentOS7(2)替我们访问CentOS7。
实现:
iptablses -t ant -A PREROUTING -p tcp --dport 7788 -j DNAT --to 192.168.18.220:7799
-t nat
指定修改的表是nat,-A PREROUTING
指定追加的链,-p tcp
指定协议,--dport 7788
指定访问到的目的端口,-j DNAT
指定规则是DNAT对目的地址/端口转换,--to 192.168.18.220:7799
指定要转换到的位置。
前面这一条的我们只是改了目的地址,但是数据却没有返回给我们的CentOS7(2)主机,所以还是不能访问。所以接下来我们还要改源地址。
iptables -t nat -A POSTROUTING -p tcp -d 192.168.18.220 --dport 7799 -j SNAT --to
192.168.18.197
-d 192.168.18.220
指定目的地址,--dport 7799
指定目的端口,-j SNAT --to 192.168.18.197
指定规则是SNAT对源地址的转换等价于-j MASQUERADE
默认转成本机出口网卡的ip地址。
可以看到,直接成功实现反向代理。
最后,由于作者的docker环境有些问题,导致视频里出现了一些小插曲,但是下方的评论区讨论非常有意思,更能搞懂原理,理清楚思路,所以那我们就一起看看吧:
进阶学习
那么接下来我们就可以看的懂下面的这篇文章了