网络安全对于企业的信息安全极为重要,也对Ubuntu server的系统安全至关重要。网络不安全了,即使操作系统武装到牙齿,也难免不中招。
不要老是迷信什么“土办法”或“偏方”就一定要比大厂的整体安全方案强,多数时候,在网络安全上缩减必要的成本是不明智的,企业为了从安全方面省点小钱而招致巨大损失,血淋淋的例子实在太多了。
— 防火墙的选择 —
Ubuntu server环境,防火墙有很多选择,从最为易用便捷的UFW防火墙,到较新的动态防火墙Firewalld,再到较为专业的防火墙iptables一应俱全,如何选择一款合适的防火墙呢?没有标准答案,但肯定有最合适的选择。
其中,iptables这个工具功能全面强大,可以实现很多UFW及Firewalld无法完成的网络功能,推荐有一定基础的用户使用。
下面将以iptables为例,就防火墙的部署及配置等多个方面提高系统的安全性进行演示。
— iptables防火墙的结构 —
iptables是Linux中功能最为强大的防火墙,使用灵活,可以对流入和流出服务器的数据包进行很精细的控制,当然如果只是用来开启或禁止某个网络服务的某个网络端口,它和UFW以及Firewalld都差不多。
iptables的三大核心要素是表,链和规则。
一言以蔽之,iptables是表的集合,包含四张表(常用的三张),表则是链的集合,每个表都包含若干个链, 而链则是规则的集合,真正过滤规则是属于链,iptables的内部结果如图所示。
— iptables的部署 —
iptables可以说是Linux系统中功能最为强大的防火墙了,虽然Ubuntu server预置的防火墙是UFW,但可以自动动手将iptables安装到Ubuntu server,关键操作如下:
sudo aptitude updatesudo aptitude purge ufwsudo aptitude purge firewalldsudo aptitude install -y iptables #默认安装,仅在没有安装的系统中执行
— iptables的使用 —
成功安装后就可以使用iptables功能强大的命令行工具了,需要注意的是,iptables的命令仅当前会话有效,如果不保存的话,重启后防火墙规则全部丢失。
此外,每条iptables的命令都可以翻译成一条规则定义并保存到iptables的相关文件,随时调用,即使重启服务器也不怕。先来熟悉iptable的通用命令结构:
iptables [-t tbl] -COMMAND 链名 匹配条件 相应操作 #[-t tbl]为可选参数,-t用来指定具体操作那张表,不指定的话默认是Filter表
◆COMMAND
命令选项用于指定iptables的执行方式,包括插入规则,删除规则和添加规则,高频命令如下:
-A:在规则列表的最后增加1条规则 #简写(一个横杠)和全称(两个横杠),敲对了使用那个都可以,推荐使用简写不容易犯错
-D:从规则列表中删除1条规则
-F:删除表中所有规则
-I:在指定的位置插入1条规则
-L:查看iptables规则列表
-P:定义默认策略
-R:替换规则列表中的某条规则
-X:删除自定义链
-Z:将表中数据包计数器和流量计数器归零
◆匹配条件
匹配条件用来实现更为精细和具体的条件,如网络接口名称,协议名称,源目的端口号等,高频匹配条件如下:
-i:网络接口名称 #指定数据包从哪个网络接口进入
-m:匹配的模块 #指定数据包规则所使用的过滤模块
-o:网络接口名称 #指定数据包从哪个网络接口输出
-p:协议名称 #指定数据包匹配的协议,如TCP、UDP和ICMP等
-s:源地址或子网地址 #指定数据包匹配的源地址
-state:数据包当前状态 #指定ESTABLISHED,RELATED等
-sport:源端口号 #指定数据包匹配的源端口号
-dport:目的端口号 #指定数据包匹配的目的端口号iptables规则的动作
◆相应操作
对于符合过滤规则或条件的数据包,需要进行相应的操作,如下:
-ACCEPT:接受数据包
-DNAT:目标地址转换,即改变数据包的目的地址。例如:将的广域网IP(222.101.98.54/24) ==> 局域网的IP(.1/24),且在NAT表的PREROUTING链上进行该动作
-DROP:丢弃数据包
-LOG:日志功能,将符合规则的数据包的相关信息记录在日志中,便于分析和排错
-MASQUERADE:IP伪装,改写数据包来源IP为防火墙的IP及端口,和SNAT不同的是,当进行IP伪装时,不需指定要伪装成哪个IP,IP会从网卡直接读取
-EDIRECT:与DROP基本一样,区别在于它除了阻塞包之外,还向发送者返回错误信息
-SNAT:源地址转换,即改变数据包的源地址
— iptables命令实例 —
掌握了那么多参数,学以致用一下,下面就是三个典型的iptables命令:
sudo iptables -A INPUT -i ens33 -p tcp --sport 22 -j ACCEPT
sudo iptables -A INPUT -i ens33 -p tcp --sport 80 -j ACCEPT
sudo iptables -A INPUT -i ens33 -p tcp --sport 443 -j ACCEPT
上述命令看似复杂,但将其拆开来看的话,其实真的很简单。
首先,这条命令或规则中的-A表示将此条规则附加到的iptables规则上,由于没有指定链名,故采用默认的链Filter。
随后的-i参数指定了此规则所用的网络接口 ens33,在编写自己的规则时,由于服务器网口众多,请确保知道通过哪个网口连接到网络。
-p参数用于指定协议,以上这条规则适用于TCP协议,-m参数有点不同,用于判断必须满足的条件才能使流量不被拒绝,过滤条件是数据包的状态。
--state参数后接具体状态名,如ESTABLISHED或RELATED等,还有就是--sport参数表示源端口,告诉iptables流量来自哪个端口,后还有-j参数,它用于对符合此条iptables规则的数据包所执行的操作,如ACCEPT、DROP或REJECT等。
— iptables高频规则及命令 —
对于Ubuntu server而言,实现基本的安全,iptables高频使用的规则及命令如下,由于服务器网卡众多,下面将采用默认的网卡ens33。
◆查看当前所有规则
查看当前所有规则,可以运行如下命令:
sudo iptables -vnL
开始使用iptables之前,需要注意的是,使用iptables时,规则添加的顺序至关重要,当然这一条对其他防火墙也或多或少地适用。
◆清除当前所有规则
彻底清除之前添加了一些规则,可以通过如下命令将其清除:
sudo iptables -Fsudo iptables -Xsudo iptables -Z
清理当前所有规则的目的是防止当前的规则影响自己规则,并能够按照自己的想法生效,建议先将老规则保存后再执行此命令比较稳妥,具体方法详见下文。
◆允许回路Loopback
环回接口Loopback是Linux系统所使用的内部接口,一定要允许回路Loopback,关键操作如下:
sudo iptables -A INPUT -i lo -j ACCEPT
◆禁止其他主机Ping Ubuntu服务器
通常服务器不允许其他主机ping自己,实现方法如下:
sudo iptables -A INPUT -i ens33 -p icmp -j DROP
如果要禁止来自某一IP的ping,可以使用如下命令:
sudo iptables -A INPUT -i ens33 -p icmp -s 192.168.1.4 -j DROP #禁止192.168.1.4发出的ping
◆封杀指定IP
可使用iptables封杀指定IP,关键操作如下:
sudo iptables -I INPUT -i ens33 -s 192.168.1.4 -j DROP #DROP掉来自192.168.1.4的所有数据包
在上述规则存在的添加下,要解封IP 192.168.1.23,只需将参数-I换成-D即可。此外如果要想清空封掉的IP地址,可以运行如下命令:
sudo iptables -F
◆封杀指定网段
要添加IP段到封停列表中,使用下面的命令:
sudo iptables -I INPUT -i ens33 -s 192.168.1.0/24 -j DROP #DROP掉所有来自192.168.1.0网段的数据包
◆封杀指定端口
可使用iptables封杀指定IP端口,关键操作如下:
sudo iptables -I INPUT -i ens33 -p tcp --dport 1234 -j DROP #封杀123端口
如果要放行某些IP的1234端口,可以进行如下操作:
sudo iptables -I INPUT -i ens33 -s 192.168.1.0/24 -p tcp --dport 1234 -j ACCEPT #放行源地址来自192.168.1.0网段1234端口的所有数据包
◆允许SSH服务
服务器大多需要SSH服务,iptables需要开启SSH端口,具体操作如下:
sudo iptables -A INPUT -i ens33 -p tcp --dport 22 -j ACCEPT
◆允许Web服务
服务器大多需要访问Web服务的,可用如下规则打开Web服务访问:
sudo iptables -A INPUT -i ens33 -p tcp --dport 80 -j ACCEPTsudo iptables -A INPUT -i ens33 -p tcp --dport 443 -j ACCEPT
◆允许域名服务
服务器要启用DNS服务,iptables需要开启相应端口,关键操作如下:
sudo iptables -A INPUT -i ens33 -p tcp --dport 53 -j ACCEPTsudo iptables -A INPUT -i ens33 -p udp --dport 53 -j ACCEPT #大于512字节的请求将使用TCP的53端口,因为UDP报文的最大长度为512字节,而TCP的报文长度则可以超过512字节
◆允许时间服务
需要允许的计算机连接到NTP服务器以获取时间,具体操作如下:
sudo iptables -A INPUT -i ens33 -p udp --dport 123 -j ACCEPT
◆允许Email服务
对于电子邮件的发送和接收比较麻烦,这里采用默认和安全两种方式,关键操作如下:
SMTPsudo iptables -A INPUT -i ens33 -p tcp --dport 25 -j ACCEPTsudo iptables -A INPUT -i ens33 -p tcp --dport 465 -j ACCEPTPOP3sudo iptables -A INPUT -i ens33 -p tcp --dport 110 -j ACCEPTsudo iptables -A INPUT -i ens33 -p tcp --dport 995 -j ACCEPTIMAPsudo iptables -A INPUT -i ens33 -p tcp --dport 143 -j ACCEPTsudo iptables -A INPUT -i ens33 -p tcp --dport 993 -j ACCEPT
如果是上述之外的服务,如MySQL或Postgre等,请用相应端口替换即可。
◆拒绝其它数据包
需要的端口和协议都开启了,最后就需要iptables绝对拒绝上面规则之外的数据包内容,参考操作如下:
sudo iptables -A INPUT -j REJECTsudo iptables -A FORWARD -j REJECTsudo iptables -A OUTPUT -j REJECT
由于企业的需求千变万化,需求又不尽相同,而防火墙的配置参数既多又复杂,故上述所有的防火墙规则仅供学习和参考,待掌握之后再在此基础上定制出最适合自己应用环境的防火墙规则,让防火墙为服务器的安全出一份力。
— iptables命令保存为规则文件 —
前面展示了iptables的强大功能及高频操作,所有操作都可以通过命令行来实现,缺点是配置繁琐,且无法保存防火墙规则。
企业应用实际中,如果总是一条条的键入iptables规则,一方面很容易出错,因为iptable命令大多很长,另一方面,好不容易键入的规则一旦服务器重启将全部丢失。
可以通过创建iptables规则文件来实现,并且规则文件可以保存,重启服务器后可以直接调用,比通过命令行的方式便捷得多,关键操作如下:
sudo iptables-save > ~/iptables_save_03062019.txt
— 导入iptables规则 —
前面保存了iptables的规则,如何恢复呢?只需运行如下命令即可导入保存号的iptables规则文件:
sudo iptables-restore < ~/iptables_save_03062019.txt
最后还需要强调的是,通过手动或规则文件添加的iptables规则都不是永久的。如果重启服务器,这些规则都将被清空,需要重新添加或从文件导入。
关注微信公众号:安徽思恒信息科技有限公司,了解更多技术内容……