linux防火墙(一)
安全技术
入侵检测与管理系统IDS(Intrusion Detection Systems):特点是不阻断任何网络访问,量化、定位来自内外网络的威胁情况,主要以提供报告和事后监督为主,提供有针对性的指导措施和安全决策依据。一般采用旁路部署方式。
入侵防御系统IPS(Intrusion Prevention System):以透明模式工作,分析数据包的内容如:溢出攻击、拒绝服务攻击、木马、蠕虫、系统漏洞等进行准确的分析判断,在判定为攻击行为后立即予以阻断,主动而有效的保护网络的安全,一般采用在线部署方式。
防火墙( FireWall ):隔离功能,工作在网络或主机边缘,对进出网络或主机的数据包基于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略。
防火墙的分类
防火墙的分类
(1)主机防火墙:服务范围为当前主机 网络防火墙:服务范围为防火墙一侧的局域网 (2)硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现,如:Checkpoint,NetScreen 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件 (3)网络层防火墙:OSI模型下四层 应用层防火墙/代理服务器:代理网关,OSI模型七层
网络层防火墙
包过滤防火墙 网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑,被称为访问控制列表(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因素,或他们的组合来确定是否允许该数据包通过 优点:对用户来说透明,处理速度快且易于维护 缺点:无法检查应用层数据,如病毒等
应用层防火墙
应用层防火墙/代理服务型防火墙(Proxy Service) 将所有跨越防火墙的网络通信链路分为两段 内外网用户的访问都是通过代理服务器上的“链接”来实现 优点:在应用层对数据进行检查,比较安全 缺点:增加防火墙的负载
现实生产环境中所使用的防火墙一般都是二者结合体
即先检查网络数据,通过之后再送到应用层去检查
iptables的基本认识
Netfilter组件
内核空间,集成在linux内核中 官网文档:https://netfilter.org/documentation/ 扩展各种网络服务的结构化底层框架 内核中选取五个位置放了五个hook(勾子) function(INPUT、OUTPUT、FORWARD、PREROUTING、POSTROUTING),而这五个hook function向用户开放,用户可以通过一个命令工具(iptables)向其写入规则 由信息过滤表(table)组成,包含控制IP包处理的规则集(rules),规则被分组放在链(chain)上
三种报文流向:
流入本机:PREROUTING --> INPUT-->用户空间进程 流出本机:用户空间进程 -->OUTPUT--> POSTROUTING 转发:PREROUTING --> FORWARD --> POSTROUTING
访问HTTPD服务时,需要对HTTPD服务进行安全控制:要求只能让1号机器进行访问,而2机器不能访问?
最合理的设置位置就是在INPUT位置设置1机器允许访问,2机器进行拒绝,而如果设置在prerouting位置时,如果机器2需要穿过linux router去到达另一个主机就无法到达,此配置不合理,如果配置在OUTPUT位置时,就会使HTTPD服务无法访问右侧的主机。
防火墙工具
iptables
命令行工具,工作在用户空间 用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
firewalld
CentOS 7 引入了新的前端管理工具
管理工具:
firewall-cmd 命令行 firewall-config 图形
iptables的组成
iptables由五个表和五个链以及一些规则组成
五个表table:filter、nat、mangle、raw、security
filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包 nat表:network address translation 地址转换规则表 mangle:修改数据标记位规则表 raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度 security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现 优先级由高到低的顺序为:security -->raw-->mangle-->nat-->filter
五个内置链chain
INPUT OUTPUT FORWARD PREROUTING POSTROUTING
Netfilter表和链对应关系
在linux中查看表有几种类型的链,可以使用tab键补全查看链信息。
数据包过滤匹配流程
IPTABLES和路由
路由功能发生的时间点
报文进入本机后
•判断目标主机是否为本机 是:INPUT 否:FORWARD
报文离开本机之前
•判断由哪个接口送往下一跳
内核中数据包的传输过程
内核中数据包的传输过程
当一个数据包进入网卡时,数据包首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去 如果数据包就是进入本机的,数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROUTING链输出 如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出
iptables规则
规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出处理
匹配条件:默认为与条件,同时满足
基本匹配:IP,端口,TCP的Flags(SYN,ACK等) 扩展匹配:通过复杂高级功能匹配
处理动作:称为target,跳转目标
内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNATMASQUERADE,MARK,LOG... 自定义处理动作:自定义chain,利用分类管理复杂情形
规则要添加在链上,才生效;添加在自定义上不会自动生效
链chain: 内置链:每个内置链对应于一个钩子函数 自定义链:用于对内置链进行扩展或补充,可实现更灵活的规则组织管理机制;只有Hook钩子调用自定义链时,才生效
iptables添加要点
iptables规则添加时考量点
要实现哪种功能:判断添加在哪张表上 报文流经的路径:判断添加在哪个链上 报文的流向:判断源和目的 匹配规则:业务需要
实验环境准备:
Centos7:
systemctl stop firewalld.service systemctl disable firewalld. service
Centos6:
service iptables stop chkconfig iptables off
查看防火墙规则是否清干净?此时没有清干净,是因为有虚拟网卡存在导致(virbr0驱动存在,需要卸载)
[root@centos777~]#iptables -vnL 查看表所有链内容,还有其他部分信息 Chain INPUT (policy ACCEPT 1289 packets, 127K bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53 0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67 0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * virbr0 0.0.0.0/0 192.168.122.0/24 ctstate RELATED,ESTABLISHED 0 0 ACCEPT all -- virbr0 * 192.168.122.0/24 0.0.0.0/0 0 0 ACCEPT all -- virbr0 virbr0 0.0.0.0/0 0.0.0.0/0 0 0 REJECT all -- * virbr0 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable 0 0 REJECT all -- virbr0 * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable Chain OUTPUT (policy ACCEPT 1018 packets, 103K bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT udp -- * virbr0 0.0.0.0/0 0.0.0.0/0 udp dpt:68 [root@centos777~]#ip a 可以看到有virbr0的虚拟网卡驱动 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:f4:9f:15 brd ff:ff:ff:ff:ff:ff inet 192.168.34.102/24 brd 192.168.34.255 scope global noprefixroute ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fef4:9f15/64 scope link valid_lft forever preferred_lft forever 4: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 52:54:00:9d:62:0a brd ff:ff:ff:ff:ff:ff inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0 valid_lft forever preferred_lft forever 5: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast master virbr0 state DOWN group default qlen 1000 link/ether 52:54:00:9d:62:0a brd ff:ff:ff:ff:ff:ff
卸载虚拟网卡驱动,卸载完之后LINUX系统重新启动
[root@centos777~]#yum remove libvirt-daemon -y [root@centos777~]#reboot
此时查看防火墙情况,已经全部清空。
iptables命令
man 8 iptables iptables [-t table] {-A|-C|-D} chain rule-specification iptables [-t table] -I chain [rulenum] rule-specification iptables [-t table] -R chain rulenum rule-specification iptables [-t table] -D chain rulenum iptables [-t table] -S [chain [rulenum]] iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...] iptables [-t table] -N chain iptables [-t table] -X [chain] iptables [-t table] -P chain target iptables [-t table] -E old-chain-name new-chain-name rule-specification = [matches...] [target] match = -m matchname [per-match-options] target = -j targetname [per-target-options]
简单示例
Filter表中INPUT规则
规则格式:iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
-t table:
raw, mangle, nat, [filter]默认
SUBCOMMAND:
1、链管理:
-N:new, 自定义一条新的规则链 -X:delete,删除自定义的空的规则链 -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有: ACCEPT:接受 DROP:丢弃 -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
示例:
A主机:192.168.34.101
B主机:192.168.34.102
(1)在A主机设置防火墙功能,丢弃掉B主机的访问信息
[root@centos7]#iptables -t filter -A INPUT -s 192.168.34.102 -j DROP
(2)在B主机pingA主机,此时无反应,可以怀疑是A主机配置规则问题
[root@centos777~]#ping 192.168.34.101 PING 192.168.34.101 (192.168.34.101) 56(84) bytes of data.
(3)在A主机开始进行抓包排错,可以看到只有B主机pingA主机的信息,没有A主机返回B主机的信息,说明是A主机的配置问题;如果B主机PING的时候A主机未收到,就是中间网络问题,可以判断问题出在哪里
[root@centos7network-scripts]#tcpdump -i ens33 -nn host 192.168.34.102 此时只可以看到只有B主机Ping到A主机的信息,没有A主机到B主机的信息,就可以怀疑是B主机设置规则问题 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes 14:45:54.717118 IP 192.168.34.102 > 192.168.34.101: ICMP echo request, id 7494, seq 197, length 64 14:45:55.717241 IP 192.168.34.102 > 192.168.34.101: ICMP echo request, id 7494, seq 198, length 64 14:45:56.717162 IP 192.168.34.102 > 192.168.34.101: ICMP echo request, id 7494, seq 199, length 64 14:45:57.717258 IP 192.168.34.102 > 192.168.34.101: ICMP echo request, id 7494, seq 200, length 64 14:45:58.717378 IP 192.168.34.102 > 192.168.34.101: ICMP echo request, id 7494, seq 201, length 64
(4)已经排查出是A主机规则问题,没有返回给B主机内容,清空A主机的防火墙规则
[root@centos7network-scripts]#iptables -F
(5)此时B主机就可以ping通
[root@centos777~]#ping 192.168.34.101 PING 192.168.34.101 (192.168.34.101) 56(84) bytes of data. 64 bytes from 192.168.34.101: icmp_seq=721 ttl=64 time=0.721 ms 64 bytes from 192.168.34.101: icmp_seq=722 ttl=64 time=0.429 ms 64 bytes from 192.168.34.101: icmp_seq=723 ttl=64 time=0.477 ms 64 bytes from 192.168.34.101: icmp_seq=724 ttl=64 time=0.630 ms 64 bytes from 192.168.34.101: icmp_seq=725 ttl=64 time=0.424 ms
2、查看:
-L:list, 列出指定鏈上的所有规则,本选项须置后 -n:numberic,以数字格式显示地址和端口号 -v:verbose,详细信息 -vv 更详细 -x:exactly,显示计数器结果的精确值,而非单位转换后的易读值 --line-numbers:显示规则的序号
常用组合:
-vnL -vvnxL --line-numbers -S selected,以iptables-save 命令格式显示链上规则
3、规则管理:
-A:append,追加 -I:insert, 插入,要指明插入至的规则编号,默认为第一条 -D:delete,删除 (1) 指明规则序号 (2) 指明规则本身 -R:replace,替换指定链上的指定规则编号 -F:flush,清空指定的规则链 -Z:zero,置零
iptables的每条规则都有两个计数器
(1) 匹配到的报文的个数
(2) 匹配到的所有报文的大小之和
chain:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
示例:
(1)定义三条防火墙规则
[root@centos7~]#iptables -A INPUT -s 192.168.34.102 -j REJECT [root@centos7~]#iptables -A INPUT -s 192.168.34.100 -j REJECT [root@centos7~]#iptables -A INPUT -s 192.168.34.103 -j REJECT
(2)删除第一条规则
[root@centos7~]#iptables -vnL --line-numbers 查看防火墙规则全部信息 Chain INPUT (policy ACCEPT 76 packets, 5484 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT all -- * * 192.168.34.102 0.0.0.0/0 reject-with icmp-port-unreachable 2 0 0 REJECT all -- * * 192.168.34.100 0.0.0.0/0 reject-with icmp-port-unreachable 3 0 0 REJECT all -- * * 192.168.34.103 0.0.0.0/0 reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 49 packets, 5340 bytes) num pkts bytes target prot opt in out source destination [root@centos7~]#iptables -D INPUT 1 删除第一条规则 [root@centos7~]#iptables -vnL --line-numbers Chain INPUT (policy ACCEPT 5 packets, 356 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT all -- * * 192.168.34.100 0.0.0.0/0 reject-with icmp-port-unreachable 2 0 0 REJECT all -- * * 192.168.34.103 0.0.0.0/0 reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 4 packets, 416 bytes) num pkts bytes target prot opt in out source destination
(3)插入一个防火墙规则,默认插入到第一条规则上
[root@centos7~]#iptables -I INPUT -s 192.168.34.105 -j REJECT [root@centos7~]#iptables -vnL --line-numbers Chain INPUT (policy ACCEPT 50 packets, 3648 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT all -- * * 192.168.34.105 0.0.0.0/0 reject-with icmp-port-unreachable 192.168.34.105禁止的规则在第一条 2 0 0 REJECT all -- * * 192.168.34.100 0.0.0.0/0 reject-with icmp-port-unreachable 3 0 0 REJECT all -- * * 192.168.34.103 0.0.0.0/0 reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 34 packets, 3040 bytes) num pkts bytes target prot opt in out source destination
(4)追加一条防火墙规则,默认加在最后一条
[root@centos7~]#iptables -A INPUT -s 192.168.34.8 -j REJECT [root@centos7~]#iptables -vnL --line-numbers Chain INPUT (policy ACCEPT 53 packets, 4044 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT all -- * * 192.168.34.105 0.0.0.0/0 reject-with icmp-port-unreachable 2 0 0 REJECT all -- * * 192.168.34.100 0.0.0.0/0 reject-with icmp-port-unreachable 3 0 0 REJECT all -- * * 192.168.34.103 0.0.0.0/0 reject-with icmp-port-unreachable 4 0 0 REJECT all -- * * 192.168.34.8 0.0.0.0/0 reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 38 packets, 3512 bytes) num pkts bytes target prot opt in out source destination
插入到指定的编号,默认的编号1会自动下调,将访问频次高的放前面,此项比较重要,如果192.168.34.0/24网段被拒绝,就无法远程连接,加上此选项:windows远程就能连接
[root@centos7~]#iptables -I INPUT 1 -s 192.168.34.1 -j ACCEPT
替换之前写错指定编号的内容,可以重新写
[root@centos7~]#iptables -R INPUT 2 -s 192.168.34.8 -j REJECT
清空计数规则
[root@centos7~]#iptables -Z INPUT
匹配条件
基本:通用的,PARAMETERS 扩展:需加载模块,MATCH EXTENTIONS
1、基本匹配条件:无需加载模块,由iptables/netfilter自行提供
[!] -s, --source address[/mask][,...]:源IP地址或范围 [!] -d, --destination address[/mask][,...]:目标IP地址或范围 [!] -p, --protocol protocol:指定协议,可使用数字如0(all) protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or“all“
参看:/etc/protocols
[!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于INPUT、FORWARD、PREROUTING链 [!] -o, --out-interface name:报文流出的接口;只能应用于数据报文流出的环节,只应用于FORWARD、OUTPUT、POSTROUTING链
示例:
(1)一次可以插入两条规则
[root@centos7~]#iptables -I INPUT 3 -s 192.168.34.8,192.168.34.45 -j REJECT 插入了一个编号的规则,实际显示的是两个规则 [root@centos7~]#iptables -vnL --line-numbers Chain INPUT (policy ACCEPT 59 packets, 4232 bytes) num pkts bytes target prot opt in out source destination 1 0 0 REJECT all -- * * 192.168.34.105 0.0.0.0/0 reject-with icmp-port-unreachable 2 0 0 REJECT all -- * * 192.168.34.100 0.0.0.0/0 reject-with icmp-port-unreachable 3 0 0 REJECT all -- * * 192.168.34.45 0.0.0.0/0 reject-with icmp-port-unreachable 显示3和4规则 4 0 0 REJECT all -- * * 192.168.34.8 0.0.0.0/0 reject-with icmp-port-unreachable 5 0 0 REJECT all -- * * 192.168.34.103 0.0.0.0/0 reject-with icmp-port-unreachable 6 0 0 REJECT all -- * * 192.168.34.8 0.0.0.0/0 reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 39 packets, 3748 bytes) num pkts bytes target prot opt in out source destination
(2)全部拒绝访问规则,允许规则内的IP地址访问,生产中可以将不是公司内部的IP地址全部进行拒绝访问,只允许指定的IP地址和lo回环网卡的IP地址访问即可。
[root@centos7~]#iptables -A INPUT -s 192.168.34.1 -j ACCEPT 加入本地windows系统的IP地址,否则无法远程连接 [root@centos7~]#iptables -A INPUT -s 192.168.34.102 -j ACCEPT [root@centos7~]#iptables -A INPUT -s 192.168.34.101 -j ACCEPT [root@centos777~]#iptables -A INPUT -j REJECT 拒绝所有的IP地址访问,只有在规则内的IP地址才能访问 [root@centos777~]#iptables -I INPUT 5 -s 192.168.34.102,127.0.0.1 -j ACCEPT 可以允许192.168.34.102和回环网卡访问 [root@centos777~]#iptables -A INPUT -i lo -j ACCEPT 加上回环网卡IP地址,需要自己连接上,避免自己无法连接
查看规则信息
[root@centos7~]#iptables -vnL --line-numbers Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 277 20776 ACCEPT all -- * * 192.168.34.1 0.0.0.0/0 2 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 3 1 67 ACCEPT all -- * * 192.168.34.102 0.0.0.0/0 4 1 67 ACCEPT all -- * * 192.168.34.101 0.0.0.0/0 5 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
(3)清除OUTPUT规则
[root@centos777~]#iptables -F OUTPUT