linux下的防火墙功能是非常丰富的,但阿铭在日常的运维工作中,使用它的情况并不多。所以阿铭打算把一些常用的知识点介绍给大家。
14.4.1 selinux
selinux是linux系统特有的安全机制。因为这种机制的限制太多,配置也特别烦琐,所以几乎没有人真正应用它。安装完系统,我们一般都要把selinux关闭,以免引起不必要的麻烦。临时关闭selinux的方法为:
# setenforce 0
但这仅仅是临时的,要想永久关闭需要更改配置文件/etc/selinux/config,需要把selinux= enforcing改成selinux=disabled,更改后的内容如下所示:
# cat /etc/selinux/config# this file controls the state of selinux on the system.# selinux= can take one of these three values:# enforcing - selinux security policy is enforced.# permissive - selinux prints warnings instead of enforcing.# disabled - no selinux policy is loaded.selinux=disabled# selinuxtype= can take one of three two values:# targeted - targeted processes are protected,# minimum - modification of targeted policy. only selected processes are protected.# mls - multi level security protection.selinuxtype=targeted
更改完该配置文件后,重启系统方可生效。可以使用getenforce命令获得当前selinux的状态,如下所示:
# getenforcedisabled
阿铭的selinux早就关闭了,所以会显示为disabled,如果还没有关闭默认会输出enforcing。当使用setenforce0这个命令后,再执行getenforce命令会输出permissive。
14.4.2 netfilter
在之前的centos版本(比如centos6)的防火墙为netfilter,从centos7开始,防火墙为firewalld。很多朋友把linux的防火墙叫作iptables,其实这样叫并不太恰当,iptables仅仅是一个工具。对于centos 7或者8上的firewalld,阿铭目前在工作中使用得并不多。当然,即使是firewalld,同样也支持之前版本的命令用法,也就是说它是向下兼容的。
关于这一节的内容,阿铭是这样安排的。首先要大概讲一下之前版本iptables的常用用法,然后再介绍一下firewalld的一些用法。下面阿铭先教你如何把firewalld关闭,然后开启之前版本的iptables。示例命令如下:
# systemctl stop firewalld #关闭firewalld服务# systemctl disable firewalld #禁止firewalld服务开机启动,后面将会详细讲解removed symlink /etc/systemd/system/dbus-org.fedoraproject.firewalld1.service.removed symlink /etc/systemd/system/basic.target.wants/firewalld.service. # yum install -y iptables-services #安装iptables-services,这样就可以使用之前版本的iptables了# systemctl enable iptables #让它开机启动created symlink from /etc/systemd/system/basic.target.wants/iptables.service to/usr/lib/systemd/system/iptables.service.# systemctl start iptables #启动iptables服务
到此,咱们就可以使用之前版本的iptables了。centos上默认设有iptables规则,这个规则虽然很安全,但对于我们来说没有用,反而会造成某些影响,所以阿铭建议你先清除规则,然后把清除后的规则保存一下。示例命令如下:
# iptables -nvlchain input (policy accept 0 packets, 0 bytes)pkts bytes target protopt in out source destination 21 1620 accept all -- * * 0.0.0.0/0 0.0.0.0/0 state related,established0 0 accept icmp -- * * 0.0.0.0/0 0.0.0.0/0 0 0 accept all -- lo * 0.0.0.0/0 0.0.0.0/0 0 0 accept tcp -- * * 0.0.0.0/0 0.0.0.0/0 state new tcp dpt:220 0 reject all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedchain forward (policy accept 0 packets, 0 bytes)pkts bytes target prot opt in out source destination 0 0 reject all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibitedchain output (policy accept 16 packets, 1536 bytes)pkts bytes target prot opt in out source destination# iptables –f# service iptables saveiptables: saving firewall rules to /etc/sysconfig/iptables:[ ok ]
上例中,-nvl选项表示查看规则,-f选项表示清除当前规则,但清除只是临时的,重启系统或者重启iptalbes服务后还会加载已经保存的规则,所以需要使用serviceiptables save保存一下规则。通过上面的命令输出,我们也可以看到,防火墙规则保存在/etc/sysconfig/iptables中,你可以查看一下这个文件。
1. netfilter的5个表
filter表主要用于过滤包,是系统预设的表,这个表也是阿铭用得最多的表。该表内建3个链:input、output以及forward。input链作用于进入本机的包,output链作用于本机送出的包,forward链作用于那些跟本机无关的包。
nat表主要用于网络地址转换,它也有3个链。prerouting链的作用是在包刚刚到达防火墙时改变它的目的地址(如果需要的话),output链的作用是改变本地产生的包的目的地址,postrouting链的作用是在包即将离开防火墙时改变其源地址。该表阿铭仅偶尔会用到。
mangle表主要用于给数据包做标记,然后根据标记去操作相应的包。这个表几乎不怎么用,除非你想成为一个高级网络工程师,否则就不需要太关注。
raw表可以实现不追踪某些数据包,默认系统的数据包都会被追踪,但追踪势必消耗一定的资源,所以可以用raw表来指定某些端口的包不被追踪。这个表,阿铭从来没用过。
security表在centos 6中是没有的,它用于强制访问控制(mac)的网络规则。可以说这个表阿铭都没有深入研究过,更别说使用了。所以,你暂时不用理会它。
2. netfilter的5个链
5个链分别为prerouting、input、forward、output、postrouting。
prerouting:数据包进入路由表之前。
input:通过路由表后目的地为本机。
forwarding:通过路由表后,目的地不为本机。
output:由本机产生,向外转发。
postroutiong:发送到网卡接口之前。
具体的数据包流向,可以参考下面图:
表和链对应的关系图如下:
3. iptables基本语法
iptables是一个非常复杂和功能丰富的工具,所以它的语法也是很有特点的。下面阿铭就给大家介绍几种常用的语法。
(1) 查看规则以及清除规则,其用法如下:
# iptables -t nat -nvl
chain prerouting (policy accept 0 packets, 0 bytes)pkts bytes target prot opt in out source destination chain input (policy accept 0 packets, 0 bytes)pkts bytes target prot opt in out source destination chain postrouting (policy accept 4 packets, 384 bytes)pkts bytes target prot opt in out source destination chain output (policy accept 4 packets, 384 bytes)pkts bytes target prot opt in out source destination
-t选项后面跟表名,-nvl表示查看该表的规则,其中-n表示不针对ip反解析主机名,-l表示列出,-v表示列出的信息更加详细。如果不加-t选项,则打印filter表的相关信息,如下所示:
# iptables -nvlchain input(policy accept 252 packets, 19329 bytes)pkts bytes target prot opt in out source destination chain forward(policy accept 0 packets, 0 bytes)pkts bytes target prot opt in out source destination chain output(policy accept 222 packets, 24340 bytes)pkts bytes target prot opt in out source destination
上例和-tfilter打印的信息是一样的。关于清除规则的命令中,阿铭用得最多就是下面两个:
# iptables -f# iptables -z
这里-f表示把所有规则全部删除,如果不加-t指定表,默认只清除filter表的规则。-z表示把包以及流量计数器置零(这个阿铭认为很有用)。
(2) 增加/删除一条规则,其用法如下:
# iptables -a input -s 192.168.72.1 -p tcp --sport 1234 -d 192.168.72.128 --dport 80 -j drop
这里没有加-t选项,所以针对的是filter表。这条规则中各个选项的作用如下。
-a/-d:表示增加/删除一条规则。
-i:表示插入一条规则,其实效果跟-a一样。
-p:表示指定协议,可以是tcp、udp或者icmp。
--dport:跟-p一起使用,表示指定目标端口。
--sport:跟-p一起使用,表示指定源端口。
-s:表示指定源ip(可以是一个ip段)。
-d:表示指定目的ip(可以是一个ip段)。
-j:后面跟动作,其中accept表示允许包,drop表示丢掉包,reject表示拒绝包。
-i:表示指定网卡(不常用,但偶尔能用到)。
下面阿铭再多举几个例子来帮你理解这些概念:
# iptables -i input -s1.1.1.1 -j drop
上例表示插入一条规则,把来自1.1.1.1的所有数据包丢掉。下例表示删除刚刚插入的规则:
# iptables -d input -s1.1.1.1 -j drop
注意删除一条规则时,必须和插入的规则一致。也就是说,两条iptables命令,除了-i和-d不一样外,其他地方都一样。
下例表示把来自2.2.2.2并且是tcp协议到本机80端口的数据包丢掉:
# iptables -i input -s2.2.2.2 -p tcp --dport 80 -j drop
注意,--dport/--sport必须和-p选项一起使用,否则会出错。
下例表示把发送到10.0.1.14的22端口的数据包丢掉:
# iptables -i output -p tcp --dport 22 -d10.0.1.14 -j drop
下例表示把来自192.168.1.0/24这个网段且作用在ens33上的包放行:
# iptables -a input -s 192.168.1.0/24 -i ens33 -j accept# iptables -nvl |grep '192.168.1.0/24'0 0 accept all -- ens33 * 192.168.1.0/24 0.0.0.0/0
有时候服务器上的iptables过多了,你想删除某一条规则,但又不容易掌握创建时的规则。其实有一种比较简单的方法,先查看iptables规则,示例命令如下:
# iptables -nvl --line-numberschain input (policyaccept 309 packets, 23689 bytes)num pkts bytes target prot opt in out source destination1 0 0 accept all -- ens33 * 192.168.1.0/24 0.0.0.0/0
然后删除某一条规则,使用如下命令:
# iptables -d input 1
这里-d后面依次跟链名、规则num。这个num就是查看iptables规则时第1列的值。随后查看刚才的规则时已经没有了,如下所示:
# iptables -nvl --line-numbers
iptables还有一个选项经常用到,即-p(大写)选项,它表示预设策略。其用法如下:
# iptables -p input drop
-p后面跟链名,策略内容或为drop,或为accept,默认是accept。注意:如果你在连接远程服务器,千万不要随便执行这个命令,因为一旦输入命令并回车,远程连接就会被断开。
这个策略一旦设定后,只有使用命令iptables-p input accept才能恢复成原始状态。下面阿铭针对一个小需求介绍一下如何设定iptables规则。
需求:只针对filter表,预设策略input链drop,其他两个链accept,然后针对192.168.72.0/24开通22端口,对所有网段开放80端口,对所有网段开放21端口。
这个需求不算复杂,但是因为有多条规则,所以最好写成脚本的形式。脚本内容如下:
# vi /usr/local/sbin/iptables.sh #写入如下内容#! /bin/bashipt=/usr/sbin/iptables$ipt -f$ipt -p input drop$ipt -p output accept$ipt -p forward accept$ipt -a input -s 192.168.72.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/bash /usr/local/sbin/iptables.sh即可。如果想开机启动时初始化防火墙规则,则需要在/etc/rc.d/rc.local中添加一行/bin/bash/usr/local/sbin/iptables.sh。执行过程如下:
# sh /usr/local/sbin/iptables.sh# iptables -nvlchain input (policy drop 0 packets, 0 bytes)pkts bytes target prot opt in out source destination20 1580 accept tcp -- * * 192.168.72.0/24 0.0.0.0/0 tcp dpt:220 0 accept tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:800 0 accept tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:21
运行脚本后,查看规则就是这样的,这里可以看到阿铭的第一条规则中已经有20个包(第一列)被放行过了。
关于icmp的包有一个比较常见的应用,如下所示:
# iptables -i input -p icmp --icmp-type 8 -j drop
这里--icmp-type选项要跟-picmp一起使用,后面指定类型编号。这个8指的是能在本机ping通其他机器,而其他机器不能ping通本机,请牢记。
4. nat表的应用
其实,linux的iptables功能是十分强大的。阿铭的一位老师曾经这样形容linux的网络功能:只有想不到,没有做不到!也就是说,只要你能够想到的关于网络的应用,linux都能帮你实现。你在日常生活中应该接触过路由器,它的功能就是分享上网。本来一根网线过来(其实只有一个公网ip),通过路由器后,路由器分配一个网段(私网ip),这样连接路由器的多台pc都能连接因特网,而远端的设备认为你的ip就是那个连接路由器的公网ip。这个路由器的功能其实就是由linux的iptables实现的,而iptables又是通过nat表作用而实现的。
在这里,阿铭举一个例子来说明iptables是如何实现这个功能的。假设你的机器上有两块网卡eth0和eth1,其中eth0的ip为10.0.2.68,eth1的ip为192.168.1.1。eth0连接了因特网,但eth1没有连接。现在有另一台机器(192.168.1.2)和eth1是互通的,那么如何设置才能让连接eth1的这台机器连接因特网,和10.0.2.68互通呢?方法很简单,如下所示:
# echo 1 > /proc/sys/net/ipv4/ip_forward# iptables -t nat -a postrouting -s 192.168.1.0/24 -o eth0 -j masquerade
这里,第一个命令涉及内核参数相关的配置文件,它的目的是打开路由转发功能,否则无法实现我们的应用。第二个命令则是iptables对nat表做了一个ip转发的操作。-o选项后面跟设备名,表示出口的网卡;masquerade表示伪装。关于nat表,阿铭不想多讲,你只要学会这个路由转发功能即可,其他的东西交给网络工程师去学习吧,毕竟你将来是要做linux系统工程师的。
5. 保存和备份iptables规则
前面阿铭提到过,咱们设定的防火墙规则只保存在内存中,并没有保存到某一个文件中。也就是说,当系统重启后以前设定的规则就没有了,所以设定好规则后要先保存一下。命令如下:
# service iptables saveiptables: savingfirewall rules to /etc/sysconfig/iptables:[ ok ]
它会提示你防火墙规则保存在/etc/sysconfig/iptables文件内,这个文件就是iptables的配置文件。所以日后如果你遇到备份防火墙规则的任务,只要复制一份这个文件的副本即可。
有时我们需要清除防火墙的所有规则,使用命令iptables-f固然可以,但最好的办法还是停止防火墙服务,如下所示:
# service iptables stopredirecting to /bin/systemctl stop iptables.service
这样防火墙就失效了,但是一旦重新设定规则(哪怕只有一条),防火墙服务会自动开启。下面阿铭介绍一个用来备份防火墙规则的命令,如下所示:
# sh /usr/local/sbin/iptables.sh# iptables-save > myipt.rule# cat myipt.rule# generated byxtables-save v1.8.2 on fri jun 26 15:27:41 2020*security:input accept [809:137209]:forward accept [0:0]:output accept [682:88704]commit# completed on fri jun 26 1541 2020# generated by xtables-save v1.8.2 on fri jun 26 1541 2020*raw:prerouting accept [133:10536]:output accept [111:20700]commit# completed on fri jun 26 1541 2020# generated by xtables-save v1.8.2 on fri jun 26 1541 2020*mangle:prerouting accept [133:10536]:input accept [133:10536]:forward accept [0:0]:output accept [111:20700]:postrouting accept [111:20700]commit# completed on fri jun 26 1541 2020# generated by xtables-save v1.8.2 on fri jun 26 1541 2020*nat:prerouting accept [0:0]:input accept [0:0]:postrouting accept [0:0]:output accept [0:0]commit# completed on fri jun 26 1541 2020# generated by xtables-save v1.8.2 on fri jun 26 1541 2020*filter:input drop [108:8568]:forward accept [0:0]:output accept [111:20700]-a input -s 192.168.72.0/24 -p tcp -m tcp --dport 22 -j accept-a input -p tcp -m tcp --dport 80 -j accept-a input -p tcp -m tcp --dport 21 -j acceptcommit# completed on fri jun 26 1541 2020
先执行一下刚才的iptables脚本,使用iptables-save命令重定向到一个文件里。若想要恢复这些规则,使用下面的命令即可:
# iptables-restore < myipt.rule
三防智能手机的优秀性能是怎样的
2019年中国网络安全产业规模将超过600亿元年增长率超过20%
小米新品笔记本23日发布,小米5C或惊喜亮相!
智慧家庭新经济:重新定义互联家庭
中国联通与红豆集团战略合作,推进5G+纺织服装工业互联网
Linux下的防火墙
感谢凡亿教育:高速PCB期培训点亮了未来
什么是空心杯电机?空心杯电机的工艺 空心杯电机的应用
arm的协处理器有几个?ARM协处理器详解
大制造与传统制造的区别是什么
生物识别新方式:指纹认证和面部认证都不及汗液认证
超小!安信可这5款迷你封装WiFi+BLE模块了解一下
无线网络WiMax射频测试应用
送配电装置系统是什么_送配电设备系统如何调试
MLX9042x系列产品荣获“维科杯中国汽车行业优秀汽车电子创新产品奖”
690V低压接地电阻柜内都有哪些配置?
vivo X90s搭载联发科9200+芯片发布 全大核天玑9300颠覆智能手机时代
照明故障的原因及处理
三星的平板市场份额继续排第二 一直保持增长态势
双音多频解调电路