Iptables及Firewalld加固服务器安全

中心主题
Iptables及Firewalld加固服务器安全
信息安全概述
系统安全策略
SSH端口修改,SUDO,禁用管理员登录
文件指纹
数据安全
加密
认证
selinux,自身程序用于自身文件的访问,修改删除监控
网络防火墙
应用安全防火墙
WAF
WAF => Web Application Firewall ,可以用来屏蔽常见的网站漏洞***,如SQL注入,XML注入、XSS等。一般针对的是应用层而非网络层的***,从技术角度应该称之为Web IPS。其防护重点是SQL注入。
https://baike.baidu.com/item/WAF/3239498?fr=aladdin
网络防火墙
思科ASA5550
华为USG6650
启明星辰 天清汉马 USG-2000C
也称UTM
UTM安全设备的定义是指一体化安全设备,它具备的基本功能包括网络防火墙、网络***检测/防御和网关防病毒功能,但这几项功能并不一定要同时得到使用,不过它们应该是UTM设备自身固有的功能。
防毒墙
垃圾邮件病毒邮件过滤
国信冠Yorton-2000应用安全网关
趋势科技
***检测
IDS,IPS(网络扫描,网络嗅探)
绿盟,华为,天融信,启明星辰
上网行为管理
网康NI3200-50
均价100人1WRMB
传输安全
*** 虚拟专用网
Linux软件防火墙
前身:ipfwadm,ipchains
centos6:iptables(服务器自身和网络通信流量控制)
centos7:firewall
建议
关闭Linux自身防火墙。(解决安全问题尽量不给服务器配置外网IP.需要访问的话,就使用代理转发。)因为高并发,iptables会加大延迟。
除非并发小,服务器必须处于公网。考虑开启防火墙。
iptables
主机型
iptables防火墙
概述
前言:linux提供了大量的网络服务,FTP,WEB,EMAIL.DB等,保护互联网用户对他们的访问义不容辞。通过linux防火墙,

防火墙有:netfilter和iptables可以有效控制进出服务器的流量和流经服务器的流量。今天主要掌握墙的结构,匹配流程和编写规则。
netfilter:内核态,即不以文件和形式存在(kernal space)的防火墙。
iptables:用户态,在/sbin/iptables存在(User space)的防火。操作上二者没有区分。
TCP/IP五层模型分类
linux-iptables主机型防火墙工作在2,3,4层,对TCP/IP数据包进行过滤和限制。属于包过滤型防火墙。(除非编译内核才可以使iptables支持7层)
缺点
(1)防火墙虽然可以过滤互联网的数据包,但却无法过滤内部网络的数据包。因此若有人从内部网络***时,防火墙没有作用。
(2)电脑本身的操作系统亦可能因一些系统漏洞,使***者可以利用这些漏洞绕过防火墙过滤,从而***电脑。
(3)防火墙无法有效阻挡病毒***,尤其是隐藏在数据中的病毒。
(4)正常状况下,所有互联网的数据包软件都应经过防火墙的过滤,这将造成网络交通的瓶颈。例如在***性数据包出现时,***者会不时寄出数据包,让防火墙疲于过滤数据包,而使一些合法数据包软件亦无法正常进出防火墙。
PS:没有绝对安全的操作系统,虽然防火墙有这些缺点,但还是能阻挡大多数来自于外网的***!
table&Chain&police
四个表
filter过滤/nat装换/mangle碾压/raw生的
主要是filter和nat
表像安防小队
五个链
概述
PREROUTING预路由,
POSTROUTING已路由,
INPUT入站,
OUTPUT出站,
FORWARD转发
主要是INPUT,OUTPUT,POSTROUTING
链安防员
一堆策略
如192.168.100.10 DROP
如192.168.100.20 ACCEPT
图示
架构图
自由主题

                    关系图
重点图
fileter:INOUT/OUTPUT/FORWARD
表链关系
filter表
INPUT
访问本机的数据包进行过滤
FORWARD
途径本机的数据包进行过过滤
OUTPUT
本机访问互联网的数据包进行过滤
总结
根据规则来处理数据包,如转或者丢。

就是实现主机型防火墙的主要表。
内核模块 iptable_filter
nat
PREROUTING
修改目的地址
POSTTOUTING
修改源地址
OUTPUT
主要是控制内部
总结
转换地址的表(改IP,改端口。
当网关使用的linux。保护内外网流量。
内核模块叫iptable_nat)
mangle
PREROUTING,POSTROUTING,INPUIT,OUTPUT,FORWARD
流量整形的表。
路由标记用的表。改TOS,TTL,Mark标记策略路由等,
内核模块iptables_mangle
raw
PREROUTING,OUTPUT
新表,数据包跟踪 iptables_raw
表的应用顺序
raw-》mangle-》nat-》filter
链之间的顺序
入站
比如访问自身的web服务流量。先PREROUTING(是否改地址),再INPUT(是否允许)到达程序。
转发
经过linux网关的流量。 先PREROUTING(是否改地址),然后路由。转发给FORWARD(转发或者丢弃),最后经过POSTROUTING(看看改不改地址。如NAT
出站
源自linux自身的流量。 先OUTPUT,然后路由。再给POSTROUTING(是否改IP)。
规则的应用顺序
ACL逐条匹配,匹配即停止。(除了LOG规则)
编写防火墙规则
基本语法
iptables -t 表名 管理选项 [链名] [匹配条件] [-j 控制类型]
-t 表名
每个表都可以用。不写默认filter表。
管理选项
操作方式如插入,删除,查看等。
链名
匹配条件
数据包特征ip,端口等
控制类型
数据包处理方式,ACCEPT允许,REJECT拒绝,DROP丢弃,LOG日志(log不适用匹配即停止,记录后下一条)等。
示例1
iptable体验示例。其他参数后续讲解
需求:禁止自己被ping,在filter表的INPUT链插入一个丢弃icmp的规则。
1 定义规则
iptables -t filter -I INPUT -p icmp -j REJECT
2 验证
iptables -L
使用其他主机ping 本机IP
3 删除规则
iptables -t filter -D INPUT -p icmp -j DROP
添加查看删除规则
1 添加新的规则
-I:在链的开头(或指定序号)插入一条规则
-A:在链的末尾追加一条规则
2 查看规则列表
-L:列出所有的规则条目
-n:以数字形式显示地址、端口等信息
-v:以更详细的方式显示规则信息
--line-numbers:查看规则时,显示规则的序号(方便之处,通过需要删除规则-D INPUT 1
3 删除、清空规则
-D:删除链内指定序号(或内容)的一条规则
-F:清空所有的规则(-X是清理自定义的链,用的少;-Z清零规则序号)
4 设置默认策略
-P:为指定的链设置默认规则
5 示例:
观察iptable规则添加的方法,删除和查询的方法。
本案例并不是为了体验策略效果。
iptables -t filter -A INPUT -p tcp -j ACCEPT
#最后一行
iptables -I INPUT -p udp -j ACCEPT
#第一行
iptables -I INPUT 2 -p icmp -j ACCEPT
(插入到第2行)#第二行
iptables -L
#看一看
iptables -D INPUT 3
#删一行
查看行号
iptables -L --line-numbers
iptables -L
#看一看
-x -v -n
iptables -F
#全清空(改不了默认)
iptables -L
#看一看
iptables -t filter -P INPUT ACCEPT
#配默认(入站链 默认同意)
规则的匹配条件
①通用匹配(协议,地址,接口),可以独立使用
协议
#不让别人ping自己
iptables -I INPUT -p icmp -j DROP
请清理规则。
地址
#禁止源1.11主机进来。(换个主机ping一下,就可以通信)
iptables -I INPUT -s 192.168.122.1 -j REJECT
#禁止源10网段的数据包。
iptables -I INPUT -s 192.168.122.0/24 -j DROP
物理接口
#谁也连不上。
iptables -I INPUT -i eth0 -j DROP
②隐含匹配--sport/--dport,需要协议的前提。
端口匹配
#允许个别端口,如网站端口,网站访问就能进来了。
iptables -I INPUT -s 192.168.100.254/24 -p tcp --dport 80 -j ACCEPT
(请思考,如何拒绝该主机访问80端口)
#这是一片端口。放行FTP(验证略)
iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT
#这是一片端口。放行FTP(验证略)
iptables -I INPUT -p tcp --dport 24500:24600 -j ACCEPT
标记位匹配(SYN,ACK,RST,)
#可以测试一下网站还能不能看了。注意杀掉之前的程序。
iptables -I INPUT -i eth0 -p tcp --tcp-flags SYN,RST,ACK SYN -j DROP
ICMP类型匹配(请求8回应0不可达3)
#自己ping别人可以,反过来不可以。
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
(请思考,如果换成OUTPUT会是什么结果呢)
#自己不能ping别人了。别人可以ping自己。
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
#同意3型包(网络不可达)通过。验证略
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
#拒绝任何ping协议
iptables -A INPUT -p icmp -j DROP
③显示匹配(通过调用模块:lsmod | grep xt_ 来加载内核扩展模块,如端口匹配,IP范围,MAC地址,状态等特殊匹配)
多端口匹配
语法
-m multiport --sports
-m multiport --dports
#一次放行多个端口。更加自由
iptables -A INPUT -p tcp -m multiport --dport 80,20,21 -j DROP
IP范围匹配
语法
-m iprange --src-range
#自定义IP范围
iptables -I INPUT -p tcp -m iprange --src-range 192.168.100.21-192.168.100.28 -j ACCEPT
MAC地址匹配
语法
-m mac --mac-source
#放一个MAC地址进来,如果都放进来了,可以反着写,写丢弃
iptables -I INPUT -m mac --mac-source 00:0C:29:64:E3:8D -j ACCEPT
TCP状态匹配
语法
-m state --state
根据iptables跟踪链接状态,来定义链接的3个状态new新,established相应,related已有
iptables -I INPUT -p tcp -m multiport --dport 80 -j ACCEPT
iptables -I INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -P INPUT DROP
Web服务器的iptables规则
IPT="/usr/sbin/iptables"
$IPT --delete-chain
$IPT --flush
$IPT -P INPUT DROP #1
$IPT -P FORWARD DROP#1
$IPT -P OUTPUT DROP #1
$IPT -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #2
$IPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT #3
$IPT -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT #3
$IPT -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT#3
$IPT -A INPUT -p tcp -m tcp --dport 873 -j ACCEPT #3
$IPT -A INPUT -i lo -j ACCEPT #4
$IPT -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT#5
$IPT -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT #5
$IPT -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #6
$IPT -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT #7
$IPT -A OUTPUT -o lo -j ACCEPT #4
$IPT -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT #8
$IPT -A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT #9
$IPT -A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT#10
$IPT -A OUTPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT #10
service iptables save
service iptables restart
存为脚本iptables. sh,执行sh iptables. sh自动配置防火墙。
解释:
#1、设置INPUT,FORWARD,OUTPUT链默认target为DROP,也就是外部与服务器不能通信。
#2、设置当连接状态为RELATED和ESTABLISHED时,允许数据进入服务器。
#3、设置外部客户端连接服务器端口80,22,21,873。
#4、允许内部数据循回。
#5、允许外部ping服务器。
#6、设置状态为RELATED和ESTABLISHED的数据可以从服务器发送到外部。
#7、允许服务器使用外部dns解析域名。
#8、设置服务器连接外部服务器端口80。
#9、允许服务器发送邮件。
#10、允许从服务器ping外部。
iptables保存:iptables-save
iptables还原:iptables-restore
网络型
前言
filter表主要做服务器流量控制。控制别人访问服务器的。
nat表主要做网关路由器的。网络地址转换。SNAT和DNAT
nat 网络地址转换
案例1(SNAT)
前言
1 internet访问,在没有NAT时,外部服务器对内部的私有地址是无法进行路由的。做了SNAT就可以转换地址,进行路由通信。
(注意:您的网卡名称不是ens32;注意:您的虚拟网络名称不是VMNET1)
环境
CENTOS7A:内网客户机:192.168.100.10 ens32 VMnet1 GATEWAY:192.168.100.20
CENTOS7B:网关内网 :192.168.100.20 ens32 VMnet1 GATEWAY:无
CENTOS7B:网关外网 :192.168.200.10 ens33 VMnet2 GATEWAY:无
CENTOS7C:网关服务器:192.168.200.20 ens32 VMnet2 GATEWAY:192.168.200.10 (WEB 服务器)
原理
原理图示

                    原理PPT
NAT-SNAT地址转换原理.ppt
演示
1 配置IP,将同一网段打通。注意配置网关地址。
2 启动CENTOS7B的路由转发功能,后测试内外网互通。成功
echo "net.ipv4.ip_forward = 1" >>/usr/lib/sysctl.d/50-default.conf (重启一下)
sysctl -a | grep ip_forward
3 删除CENTOS7C的网关,模拟私有IP没有路由的情况。尝试通信失败。
4 建立SNAT。通信成功。
iptables -FXZL
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j SNAT --to-source 192.168.200.10
参数
-t nat
NAT表
-A POSTROUTING
追加,已路由链
-s 192.168.100.0/24
源地址
-o ens33
接口33,出方向
-j SNAT
动作:源地址转换
--to-source 192.168.200.10
源地址转成 200.10
5 通过CENTOS7Cweb主机的访问日志,可以看出来访者。
less /var/log/httpd/access_log
案例2(MASQUERADE)
前言
MASQUERADE —— 地址伪装

地址伪装:适用于外网IP地址非固定的情况
因为:对于ADSL拨号连接,接口通常为 ppp0、ppp1
所以:将SNAT规则改为MASQUERADE即可,使动态地址作为SNAT的目标地址。效果同前一个实验。
演示
iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
参数
-t nat
-A POSTROUTING
-s 192.168.100.0/24
-o ens33
-j MASQUERADE
案例3(DNAT)
前言
发布内网服务器,DNAT转换目标地址
演示
①先部署内网服务器。100.10部署成web/ssh
②在网关配置DNAT,外网访问内网测试成功。
iptables -t nat -A PREROUTING -i ens33 -d 192.168.200.10 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.10
参数
-t nat
-A PREROUTING
-i ens33
-d 192.168.200.10
-p tcp --dport 80
-j DNAT
--to-destination 192.168.100.10
案例4(PNAT)
前言
DNAT端口转换(映射)。安全性更高。比如内网服务器的SSH程序的22号端口。发布时SSH使用2345端口。
演示
配置端口映射
iptables -t nat -A PREROUTING -i ens33 -d 192.168.200.10 -p tcp --dport 2345 -j DNAT --to-destination 192.168.100.10:22
参数
-t nat
NAT表
-A PREROUTING
预路由链
-i ens33
接口33 ,入方向
-d 192.168.200.10
目的地址 200.10
-p tcp --dport 2346
协议,端口2346
-j DNAT
目标地址转换
--to-destination 192.168.100.10:22
转成目标地址100.10
那么外网访问的时候,就要访问改过的外网地址和端口了。
ssh -p 2346 192.168.200.10
firewalld
Linux防火墙
内核模块:netfilter
rhel 6:iptables
rhel 7:firewall-cmd工具,firewalld服务
firewalld是CentOS 7.0新推出的管理netfilter的工具
firewalld是配置和监控防火墙规则的系统守护进程。可以实 现iptables,ip6tables,ebtables的功能
firewalld服务由firewalld包提供
firewalld支持划分区域zone,每个zone可以设置独立的防火墙 规则
归入zone顺序:
1.先根据数据包中源地址,将其纳为某个zone
2.纳为网络接口所属zone
3.纳入默认zone,默认为public zone,管理员可以改为其它zone
网卡默认属于public zone
lo网络接口属于trusted zone
这三个的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去查找,如果前两个都找不到才会使用第三个,也就是在firewalld.conf中配置的默认zone。
区域zone
trusted
允许经过的流量通过
home/internal
仅允许ssh数据通过
work
仅允许ssh,ipp-client,dhcpv6-client数据通过
public
默认区域,仅允许ssh,dhcpv6-client数据通过
external
仅允许ssh数据通过,通过该区域的数据将会伪装(SNAT/DNAT)
dmz
非军事化区域 仅允许ssh数据通过
block
拒绝经过流量
drop
拒绝经过流量(甚至不进行ICMP错误进行回应)
常用端口
http 80/tcp, https 443/tcp, ssh 22/tcp
telnet 23/tcp,
dns 53/udp(解析主机名) 53/tcp(区域同步)
ftp 20/tcp, 21/tcp
dhcp 67/udp, 68/udp
mail 25/tcp(SMTP), 110/tcp(POP3), 143/tcp(IMAP4)
mysql 3306/tcp
ntp 123/udp
samba 137/udp, 138/udp; 139/tcp,445/tcp
iscsi 3260/tcp
1、查看默认区域
firewall-cmd --get-default-zone
public
2、更改默认区域
firewall-cmd --set-default-zone=trusted
会同时修改接口所属的区域。接口修改至默认区域
firewall-cmd --reload
3、查看dmz区域的详细信息
firewall-cmd --list-all --zone=dmz
dmz
target: default
icmp-block-inversion: no
interfaces:
sources:
services: ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
target:目标,可以理解为默认行为,如果不设置默认为default
ACCEPT, DROP, REJECT, RETURN
LOG, SNAT, DNAT, REDIRECT, MASQUERADE
icmp-block:icmp报文阻塞,可以按照icmp类型进行设置
interface:接口,可以理解为网卡
service:这个在前面学生已经给大家解释过了,他表示一个服务
source:源地址,可以是ip地址也可以是ip地址段
注意相同的source节点只 可以在一个zone中进行配置,也就是说同一个源地址只能对于一个zone
port:端口,使用port可以不通过service而直接对端口进行设置
masquerade:ip地址伪装,也就是按照源网卡地址进行NAT转发
forward-port:端口转发
rule:自定义规则

  1. 向dmz区域添加服务
    firewall-cmd --permanent --add-service=http --zone=dmz
    --permanent表 示是否存储到配置文件中(如果存储到配置文件中这不会立即生效)

    firewall-cmd --reload

                访问验证验证
    使用100.20访问100.10的页面
    5.指定IP地址为192.168.100.20/24的客户端进入drop区域
    firewall-cmd --permanent --add-source=192.168.100.20/24 --zone=drop
    192.168.100.20访问失败
    firewall-cmd --reload
    访问验证
    使用100.20访问100.10的页面
    6.将192.168.100.20/24移除drop区域
    firewall-cmd --permanent --remove-source=192.168.100.20/24 --zone=drop
    firewall-cmd --reload
    查询验证
    firewall-cmd --list-all-zones
    7.将端口ens32的移入drop区域(免验证)
    firewall-cmd --permanent --add-interface=ens32 --zone=drop
    firewall-cmd --reload
    讲接口还原
    firewall-cmd --permanent --add-interface=ens32  --zone=public
    8.向pubic区域添加服务,以添加端口的方式
    firewall-cmd --permanent --add-port=80/tcp --zone=public
    firewall-cmd --reload
    验证略
    9.删除服务、端口
    firewall-cmd --permanent --remove-service=http --zone=public
    注意iptables
    firewall-cmd --reload
    验证
    firewall-cmd --permanent --remove-port=443/tcp --zone=dmz
    firewall-cmd --reload
    免验证
    10.富规则(略)
    拒绝从192.168.0.11的所有流量.当address 选项使用source 或 destination时,必须用family= ipv4 |ipv6.
    firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=10.18.41.249/32 drop'
    限制每分钟只有两个连接到ftp服务
    firewall-cmd --add-rich-rule='rule service name=ftp limit value=2/m accept'
    接受所有192.168.1.0/24子网端口范置7900-7905的TCP流量
    firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcp accept'