1.防火墙Firewalld和netfilter
SElinux
安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。 SELinux 主要由美国国家安全局开发。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。 SELinux 的结构及配置非常复杂,而且有大量概念性的东西,要学精难度较大。
SElinux临时关闭防火墙 : setenforce 0
SElinux临时打开防火墙 : getenforce
SElinux永久关闭防火墙:vi /etc/selinux/config----把SELINUX=disabled
在使用netfilter之前我们先把selinux先关掉
- systemctl disable firewalld #不让开机启动
- systemctl stop firewalld #停掉服务
netfilter
netfilter是由Rusty Russell提出的Linux 2.4内核防火墙框架,该框架既简洁又灵活,可实现安全策略应用中的许多功能,如数据包过滤、数据包处理、地址伪装、透明代理、动态网络地址转换(Network Address Translation,NAT),以及基于用户及媒体访问控制(Media Access Control,MAC)地址的过滤和基于状态的过滤、包速率限制等。
netfilter是之前CentOS 7之前的防火墙,CentOS 7的防火墙是firewalld。目前大多企业还是用CentOS6,防火墙还是用的是netfilter。iptables是设置防火墙的一种工具,因为有必要学习netfilter相关知识。
因为centos7没有netfilter我们先安装一个包 yum install -y iptables-services
systemctl enables iptables #先让iptables可用
systemctl start iptables #再开启iptables
查看CentOS上默认的iptables规则: iptables -nvL
netfilter五表(一般常用filter和nat表)
-
filter表主要用于过滤包,是系统预设的表,该表有3个链
- INPUT:进入本机的包
- OUTPUT:本机送出的包
- FORWARD:那些跟本机无关的包
-
nat表主要用于网络地址转换,他也有3个链
- PREROUTING:包刚刚到达防火墙时该表他的目的地址
- OUTPUT:改变本地产生的包的目的地址
- POSTROUTING:包即将离开防火墙时该表其源地址
-
mangle表主要用于给数据包做标记
-
raw表可以实现不追踪某些数据包,默认系统的数据包都会被追踪
-
security表用于强制访问MAC的网络规则; (在centos6中并没有)
netfiler的5个链
链名 | 释义 |
---|---|
PREROUTING | 数据包进入路由之前 |
INPUT | 通过路由表后,目的地为本机 |
FORWARDING | 通过路由表后,目的地不为本机 |
OUTPUT | 由本机产生,向外转变 |
POSTROUTING | 发送到网卡接口之前 |
表链的关系和作用可以理解为三个机器A\B\C之间,A和B有公网实现通讯传输,B和C通过私网进行传输,为了能让A和C之间通信,把B作为网络映射的过程.
iptables传输数据包的过程
- 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
- 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出
- 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出
iptables语法
netfilter默认规则表 /etc/sysconfig/iptables
把默认规则删除之后重启 netfliter命令这个是在不改变/etc/sysconfig/iptables文件的情况下把默认规则加载回来
service iptables restart
如果想要把规则重启之后也生效可以使用命令 service iptables save
查看规则:iptables -t 表名 -nvL ; 清除规则是:iptables -t 表名 -F(或z)
选项释义:
- -nvL 表示查看该表的规则;
- -n 表示不针对IP反解析主机名;
- -L 表示列出;
- -v 表示列出的信息更加详细;
- -t 后面跟表名;没有此选项,默认为filter;
- -F 表示把所有规则删除;
- -Z 把包以及流量计数器重置为零
iptables -nvL iptables -t filter -nvL #表示查看netfilter的表
-F 清空所有规则
-Z 把包以及流量计数器重置为零
增加一条规则把192.168.71.100数据包丢掉iptables -A
插入一条规则把192.168.71.100数据包丢掉 iptables -I
删除增加的规则 iptables -D INPUT
iptables -nvL --line-numbers #规则显示序列号为删除增加的规则更方便
指定网卡接受数据包 iptables -I INPUT -s 192.168.21.125/端口 66 -i etho -i ACCEPT
-P选项,它表示预设策略(这个规则最好保持默认)
-P后面跟链名,策略内容或为DROP,或为ACCEPT,默认后者。需要注意的是:如果在连接远程服务器的时候,千万不要随便执行这个命令,执行后,远程连接会断开; 假如要恢复:需要执行命令:iptables -P OUTPUT ACCEPT
2.iptables filter表小案例
案列1
针对filter表,预设策略INPUT链DROP,其他2个链ACCEPT,然后针对192.168.112.0/24开通22端口,对所有网段开放80端口,对所有网段开放21端口
针对这个需求,我们需要些一个脚本
- #!/bin/bash //定义解释器
- IPT="/usr/sbin/iptables" //定义变量名
- $IPT -F //清空所有规则
- $IPT -P INPUT DROP //把INPUT链收到的数据包扔掉
- $IPT -P FORWARD ACCEPT //接受FORWARD的数据包
- $IPT -P OUTPUT ACCEPT //接受发送出去的所有数据包
- $IPT -A INPUT -p tcp -s 192.168.112.0/24 --dport 22 -j ACCEPT //针对192.168.112.0/24开通22端口,
- $IPT -A INPUT -p tcp --dport 80 -j ACCEPT //开放80端口
- $IPT -A INPUT -p tcp --dport 21 -j ACCEPT //开放21端口
打开 vim /usr/local/sbin/iptables.sh 把上面的脚本写入这个shell
之后执行一下脚本
案例2
iptables -I INPUT -p icmp --icmp-type 8 -j DROP //不允许接受icmp数据包到本地
这条命令,作用是禁止他人ping你的机器,而你可以ping通其他机器
3.iptables nat表应用
需求1:B机器联网外网
A机器2块网卡分别是外网和内网,B机器只有内网,可以让B机器联网外网
首先我们做个测试:
步骤1:在虚拟机。A机器添加一个内网网卡,B机器也添加内网网卡。 网卡模式并设置为LAN区段,自定义名字一样。
给ens37 设置IP;并查看使用ifconfig ens37 192.168.100.1/24给第一台机器
先给另一台机器关闭ens33 命令ifdown ens33使用相同的手法给ens37添加一个ip看是否能ping通第一台上的机器
此时只是机器A和机器B相连,却不能连接外网
在机器A上设置,打开路由转发
增加规则,并查看 (规则的目的是让100.0的网段能够上网)
B机器设置网关
- route -n #查看网关
- route add default gw 192.168.100.1 #添加网关命令
设置DNS,在vi /etc/resolv.conf 添加 nameserver :119.29.29.29
C机器连接B机器
C机器只能和A通信,让C机器可以直接连通B机器的22端口
首先设置机器A;清除之前设置的规则
iptables -t nat -D POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE #清除之前所设置的规则
增加新的规则,并查看规则
- iptables -t nat -A PREROUTING -d 192.168.71.130 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22 #进去的包
- iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.71.130 #回来的包
- 此时需要给B机器设置网关;之前已经设置了。若没有设置必须设置,才能联网
注意:机器A有两个网卡:192.168.112.136和192.168.112.100.1;192.168.112.136这个一直和主机相连接;因此机器A一直可以用Xshell远程登录
用W查看系统负载,可以看到源来自192.168.71.1就是C机器
这说明了,机器C:192.168.71.1已经和机器B:192.168.100.100相连。机器C和A能够通信,而通过A机器来连接B机器的映射端口1122,达到了C和B通信;而且机器B也通过映射端口1122,能够连接外网