12.firewalld & netfilter
Linux的防火墙,在之前做秘钥认证的时候防火墙要关闭,不然无法登陆
1)关闭防火墙
临时关闭
# setenforce 0
若想永久关闭编辑 vi /etc/selinux/config, 把SELINUX=enforcing改成disabled,再重启系统就可以了
用# getenforce,可以看到目前防火墙的状态,有enforcing和permissive两个状态
注:selinux 是 Redhat/CentOS 系统特有的安全机制。不过因为这个东西限制太多,配置也特别繁琐所以几乎没有人去真正应用它。所以装完系统,我们一般都要把selinux关闭,以免引起不必要的麻烦。
2)netfilter (CentOS6的防火墙机制)
与firewalld (CentOS7的防火墙机制)不同
但是两者都可以使用iptables工具来设定端口的开放关闭规则,先介绍netfilter
因为实验的操作系统为CentOS7,所以先关闭firewalld
# systemctl disable firewalld, 先禁止firewalld的启动
# systemctl stop firewalld, 再关闭firewalld
开启netfilter
安装 yum install -y iptables-services
# systemctl enable iptables
# systemctl start iptables
注:iptables并不是防火墙,只是防火墙的一种工具
13.netfilter5表5链介绍-参考http://www.zsythink.net/archives/1199/
iptables的简介
iptables并不是防火墙框架,netfilter才是真正的framework处于内核中,而iptables作为命令行工具来对framework进行操作
netfilter主要有三个作用:网络地址转换,数据包内容修改和数据包过滤的防火墙功能
1)理解链的概念
如果客户端想访问服务器,客户端的信息会通过TCP/IP协议栈到达web服务器上,此时客户端报文的目的为web服务器,当服务器相应了客户端的请求,这时服务器监听的端口则成为了报文发出的原点,而netfilter作为防火墙,需要在内核中设置关卡,所有进出的数据包需要通过这些关卡,符合条件的才会放行,不符合条件的就被拒绝,这些关卡被称作为链
链的概念源自于,每个检查的关卡都有自己的检查规则,报文经过关卡的时候需要匹配关卡中的所有规则,这些规则被串到了一个链条上就被称作为链
下面是报文的流向
到本机的报文并由本机发出报文- PREROUTING -INPUT; OUTPUT - POSTROUTING
由本机转发的报文- PRROUTING -FORWARD-POSTROUTING
上图来自http://www.zsythink.net/archives/1199/
PREROUTING:数据包进入路由表之前(所有的数据包都要先进入这个链)
INPUT:通过路由表后目的地为本机
FORWARD:通过路由表后,目的地不为本机,转发
OUTPUT:由本机产生,向外转发
POSTROUTIONG:发送到网卡接口之前
2)表的概念
如上文所说,每个链上边有很多规则,那么对这些规则的作用进行归类,放在不同的表中
CentOS7有五张表,名称及作用如下图
filter:负责过滤功能,内核模块 iptables_filter (比如那些IP可以访问,哪些ip须要禁止,哪些端口可以方位,哪些端口需要禁止)
nat:负责进行网络地址转换,内核模块 iptable_nat
mangle:拆解报文,进行修改,重新封装,内核模块 iptable_mangle
raw:关闭 nat 表上启用的连接追踪机制,内核模块 iptable_raw-?
security:安全相关?CentOS 7 里新增的表,暂且不介绍
---------------------
作者:chocolee911
来源:CSDN
原文:https://blog.csdn.net/chocolee911/article/details/80688200
版权声明:本文为博主原创文章,转载请附上博文链接!
3)链和表的连接
每个链上的规则都属于不同的表,然而表也有优先级,如下
表的处理优先级:raw>mangle>nat>filter。
PREROUTING- raw/mangle/nat
INPUT-mangle/filter
FORWARD-mangle/filter
OUTPUT-war/mangle/nat/filter
POSTROUTING-raw/mangle/nat
总结的很好的文章:
blog.51cto.com/191226139/2088108
https://blog.csdn.net/longbei9029/article/details/53056744
14.iptables语法
1)# iptables -nvL
可以查看iptables默认的规则
如下图
这些规则保存在了/etc/sysconfig/iptables, 我们用cat可以进行查看
2)# iptables -F
可以用来清空规则
注:对规则进行了任何改变之后,如果想要保存改变需要保存和重启iptables的规则(# service iptables save; #sevice iptables restart)
3)查看iptables规则的选项
-t,后面加表
用来查看制定的表,如果不加-t,那么默认查看filter表
-L
可以用来列出规则,L后面加链(如PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING)可以制定列出哪个链的规则
-v
可以用来列出更多详细信息,会显示计数器( pakets& bytes-匹配规则的报文的数量和大小);-x选项,可以精准显示出计数器的大小
注:我们可以用# iptables -Z来把计数器清零;实际应用的例子,监控脚本用来封ip,在脚本中设置规则如果半小时之内的数据包量不超过一定数字就可以解封ip, 没半小时就统计一次所以需要每半小时使用# iptables -Z来清零计数器
-n
可以用来不对地址名称进行反解,直接显示ip地址
--line-number
用来是显示的结果标注行数,可以简写为--line,不可以和其他短选项合并
如下图我们想要查看filter表里INPUT链中的规则就可以写成# iptables -t filter -nvxL INPUT
我们先来解释绿色框里的内容
Ⅰ. num-加了--line-number选项之后,显示出了行数
Ⅱ. pkts-表示对应规则匹配到报文的个数
Ⅲ. bytes-表示对应规则匹配到报文的大小总和
Ⅳ. target-表示规则对应的动作,如ACCEPT,REJECT,DROP
Ⅴ.prot-表示规则对应的协议
Ⅵ. opt-表示规则对应的选项
Ⅶ. in-表示数据包由哪个接口(网卡)流入
Ⅷ. out-表示数据包有哪个接口(网卡)流出
Ⅸ.source-规则对应的源头地址,可以是一个ip地址,也可以是一个网段
Ⅹ. destination-规则对应的目标地址,可以是一个ip地址,也可以是一个网段
下面来解释红色框里的内容
policy表示当前链的默认策略,如图所示filter表里INPUT的默认策略就为ACCEPT(默认接受通过关卡的任何请求),所以我们在配置规则时就要制定哪些请求需要被拒绝
# iptables -P 链 INPUT/OUTPUT/..., 这样就可以改变链的默认策略
但是我们一般不建议改变policy的默认策略,因为有时会造成通信中断等问题
4)对iptables增删改
-A (append), 在指定链的尾部增加一条规则
-I (Insert), 在指定链的首部增加一条规则
可以在指定链的指定位置增加一条规则
# iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作
-s (source) 指定来源ip
-p (policy)指定协议
--sport (source port) 来源端口
-d (destination) 目标ip
--dport (destination port) 目标端口
-i,指定网卡 例如-i ens33
-j,匹配后的对应动作,有DROP, ACCEPT,REJECT
DROP和REJECT的区别,DROP的情况对数据包不做任何分析直接丢掉,REJECT会分析数据包并向来源ip发送拒绝消息
我们可以举个例子来使用上述参数,主机的ip为192.168.224.128,想要禁止从192.168.224.1的1234端口来的数据包就可以写成
# iptables -t filter -A INPUT -p tcp -s 192.168.224.1 --sport 1234 -d 192.168.224.128 --dsport 80 -j DROP
我们在使用# iptables -t filter -nvL INPUT,就可以看见新规则被追加到了INPUT规则之后
注:规则的排列顺序表明规则匹配的优先级,也就是说在filter表中,数据包进来会先匹配第一条规则,如果匹配成功则就不会继续匹配下面的规则了, 一旦匹配直接执行
-D (delete),删除规则
语法可以写成 # iptables -D 链 规则序号,所以经常和# iptables -nvL 链 --line-number一起使用
如下图
15.iptables filter表的小案例
1)只针对filter表,预设策略INPUT链DROP,其他两个链ACCEPT,然后针对192.168.137.0/24开通22端口,对所有网段开放80端口,对所有网段开放21端口。这个需求不算复杂,但是因为有多条规则,所以最好写成脚本的形式。脚本内容如下:
[root@localhost ~]# vim /usr/local/sbin/iptables.sh
#! /bin/bash
ipt="/sbin/iptables"
$ipt -F
$ipt -P INPUT DROP
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT, 这一行很重要,详见http://www.zsythink.net/archives/1597
$ipt -A INPUT -s 192.168.137.0/24 -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT
完成脚本的编写后,直接运行 /bin/sh /usr/local/sbin/iptables.sh 即可。如果想开机启动时初始化防火墙规则,则需要在 /etc/rc.d/rc.local 中添加一行 “/bin/sh /usr/local/sbin/iptables.sh”
2)icmp
首先介绍icmp
ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。
协议分析 - ICMP协议解码详解
下面解释来自http://www.elecfans.com/news/wangluo/20171102574305.html;https://www.cnblogs.com/jingmoxukong/p/3811262.html
ICMP全称Internet Control Message Protocol,中文名为因特网控制报文协议。它工作在OSI的网络层,向数据通讯中的源主机报告错误。ICMP可以实现故障隔离和故障恢复。
网络本身是不可靠的,在网络传输过程中,可能会发生许多突发事件并导致数据传输失败。网络层的IP协议是一个无连接的协议,它不会处理网络层传输中的故障,而位于网络层的ICMP协议却恰好弥补了IP的缺限,它使用IP协议进行信息传递,向数据包中的源端节点提供发生在网络层的错误信息反馈。
ICMP提供多种类型的消息为源端节点提供网络层的故障信息反馈,它的报文类型可以归纳为以下5个大类:
@诊断报文(类型8,代码0;类型0,代码0);
Type(8)是请求回显报文(Echo);Type(0)是回显应答报文(Echo Reply)。
请求回显或回显应答报文属于查询报文。Ping就是用这种报文进行查询和回应。
@目的不可达报文(类型3,代码0-15);
日常生活中,邮寄包裹会经过多个传递环节,任意一环如果无法传下去,都会返回寄件人,并附上无法邮寄的原因。同理,当路由器收到一个无法传递下去的IP报文时,会发送ICMP目的不可达报文(Type为3)给IP报文的源发送方。报文中的Code就表示发送失败的原因。
@重定向报文(类型5,代码0-4);
想像一下,在公司中,有人来你的项目组问你某某某在哪儿。你一想,我们组没有这人啊。你肯定就会说,我们组没有这号人,你去其他组看看。当路由收到IP数据报,发现数据报的目的地址在路由表上没有,它就会发ICMP重定向报文(Type为5)给源发送方,提醒它想要发送的地址不在,去其他地方找找吧。
@超时报文(类型11,代码0-1);
网络传输IP数据报的过程中,如果IP数据包的TTL值逐渐递减为0时,需要丢弃数据报。这时,路由器需要向源发送方发送ICMP超时报文(Type为11),Code为0,表示传输过程中超时了。
一个IP数据报可能会因为过大而被分片,然后在目的主机侧把所有的分片重组。如果主机迟迟没有等到所有的分片报文,就会向源发送方发送一个ICMP超时报文,Code为1,表示分片重组超时了。
@信息报文(类型12-18)。
这种报文是用来找出一个主机所在的网络个数(一个主机可能会在多个网络中)。报文的IP消息头的目的地址会填为全0,表示this,源地址会填为源IP所在的网络IP。
通过上面的了解我们可以针对icmp协议中的type 8/0来设置iptables规则(type 8是ping request,type 0是ping reply)
# iptables -I INPUT -p icmp --imcp-type 8 -j DROP
这条命令就可以使主机ping外网,但是别人ping不了主机
如下图,我们设置了# iptables -I INPUT -p icmp --imcp-type 8 -j DROP规则,可以在主机192.168.224.128来ping百度网,但是在Windows的cmd中无法ping这个主机
16.nat表应用
1)
准备步骤
需要两台虚拟机,可以通过创建克隆机完成
需要给机器添加网卡
选择网络适配器,点击下一步
可以选择NAT模式
选择LAN区段,自定义一个名字,例如自定义名字,相当于把网卡连到了内网的交换机上
如上面的步骤再在第二台机器上添加一块网卡
然后启动两台机器
现在A机器有两个网卡可以连接外网,B机器只能连接内网
我们在A机器上ifconfig之后可以看见如下信息
现在给ens37来设置IP地址,有两种方法
@第一种是去cp ens33的网卡配置到ifcfg-ens37,然后vi /etc/sysconfig/network-scripts/ifcfg-ens37中修改配置文件,增加ip地址和netmask
@第二种方法是用命令ifconfg 网卡 ip地址
例如我们把A机器上的ens37的ip设置为ifconfg ens37 192.168.100.1/24,B机器上的ens37设置为ifconfg ens37 192.168.100.100/24
然后我们尝试这两台机器是否可以互相ping通,如果可以ping通就没有问题
具体操作步骤
在A机器上打开端口转发
一般情况下/proc/sys/net/ipv4/ip_foward 为0,表明转发端口没有打开
我们可以echo "1" > /proc/sys/net/ipv4/ip_foward, 再cat就发现结果为1,端口打开
在A机器上添加规则
# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
在B机器上设置网关为192.168.100.1
# route -n 网卡名,可以查看网关
# route add default gw 网关数,例如我们就可以# route add default gw 192.168.100.1
再用route -n查看就发现B机器的网关设置成功了
最后我们可以试着在B机器上ping外网的ip地址,然后可以修改DNS的配置文件/etc/resolv.conf, 添加server name=119.29.29.29(公共DNS)
实际上这个实例就是是A机器成为B机器的路由器
2)
实际上就是要做一个端口映射
第一步还是要打开端口转发
echo "1" > /proc/sys/net/ipv4/ip_foward
第二步在A机器上执行
# iptables -t nat -A PREROUTING -d 192.168.133.130 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22
第三部在A机器上执行
# iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.133.130
第四部在B机器上设置网关192.168.100.1