一 防火墙简介
Redhat 7 系统已经使用firewalld服务替代了iptables服务,但依然可以使用iptables 进行管理内核的netfilter。
1 防火墙管理工具
防火墙主要是基于策略对外部请求进行过滤,成为公网和内网之间的保护屏障,防火墙规则策略可以是基于端口和地址来进行控制最终让合法的用户请求流入到内网中,其余的均被丢弃
iptables和Firewalls 都是防火墙管理工具,它们只是用来定义防火墙规则工鞥呢的管理工具,将定义好的规则交给内核中的netfilter 及网络过滤器来读取,从而真正实现防火墙的功能,所以在其配置思路上是完全一致的,因此Firewalls和iptables之间不能共存
二 Firewalls 防火墙的配置与管理
可以通过图形界面工具 firewall-config或者命令行执行 firewall-cmd 启用或者关闭防火墙特性。
1 Firewalls 区域情况:
Trusted (信任) 可接受所有的网络连接
Home(家庭) 用于家庭网络,仅接受ssh,mdns,ipp-client,samba-client,或dhcpv6-client服务
Internal(内部) 用于内部网络,仅接受ssh,mdns,ipp-client,samba-client,dhcpv6-cilent服务链接
Work(工作) 用于工作区,仅接受ssh,ipp-client或dhcpv6-client链接
Public(公共) 在公共区域内使用,仅接受ssh或dhcpv6-client服务链接,为firewall 的默认区域
External (外部) 出去的IPV4网络链接通过此区域伪装和转发,仅接受ssh服务链接
Dmz(非军事区) 仅接受ssh服务链接
Block (限制) 拒绝所有网络连接
drop(丢弃) 任何接受的网络数据包都被丢弃,没有任何回复
2 字符管理工具
--get-defaut-zone 查询默认的区域名称
--set-default-zone=<区域名称> 设置默认区域,永久生效
--get-zones 显示可用的区域
--get-services 显示预先定义的服务
--get-active-zones 显示当前正在使用的区域与网卡名称
--add-source= 将来源此IP地址或子网的流量导向指定的区域
--remove-source 不再将此IP地址或子网的流量导向某个指定区域
--add-interface=<网卡名称> 将来自于该网卡的所有流量都导向某个指定区域
--change-interface=<网卡名称> 将某个网卡与区域做关联
--list-all 显示当前区域的网卡配置参数,资源。端口以及服务等信息
--list-all-zones 显示所有区域的网卡配置参数,资源,端口以及服务
--add-service=<服务名> 设置默认区域允许该服务的流量
--add-port=<端口号/协议> 允许默认区域允许该端口的流量
--remove-service=<服务名> 设置默认趣图不再允许该服务的流量
--remove-port=<端口号/协议> 允许默认区域不允许改端口的流量
Firewalld服务有两份规则策略配置记录
runtime:当前正在生效
permanent:永久生效 其永久生效必须加上--permanent 并需要--reload进行重载防火墙处理
3 基本配置与说明:
1 图形化配置
1 永久模式和临时模式
1 基本配置 :
1 启动图形化界面并打入后台运行:
2 默认的访问规则是public,可以更改
2 运行模式
当设备或服务重启时配置丢失,只会在当前情况下生效
当前生效的只要勾选即可生效但配置必须是运行时
使用命令行查看是否成效
访问测试:
取消勾选:
查看生效情况:
测试:
2 永久模式,会永久生效,但需要重载防火墙
选择永久模式并勾选httpd
查看:
重载防火墙
查看配置:
重启服务并查看配置,则配置保存成功
2 修改服务端口进行访问限制
1 修改防火墙中服务对应端口
修改端口使得其可以透过防火墙
查看其可以正常访问
修改端口并重启服务:
查看,则不能访问,因为http默认的端口是80,因此需要在配置文件中修改防火墙的默认端口
修改端口
、
重启服务
测试,则可以访问:
2 通过图形化界面添加端口进行访问
当不修改配置文件时
此处选择的是运行时,及即可生效,也可以使用永久式,需要重载防火墙。
3 配置文件默认区域中添加相关配置
添加http协议以及8080端口映射:
2 命令行模式配置
1 区域相关
查看激活区域
查看默认区域
指定区域
修改默认区域
查看修改结果
查看所有区域
查看防火墙可以控制的服务
2 配置不同区域的访问
进行修改为work区域
进行测试查看
修改端口:
添加http规则:
查看:
实战:
1 通过服务限制
配置网路使得其可以通过一个网卡进行访问httpd服务,另一个网卡不能进行httpd的访问(可以使用端口进行限制,也可以使用IP地址范围进行限制)
1 在服务器端的网络配置情况
在其中将网卡ens35加入内部区域,则其可以访问所有的服务,包括HTTP,而网卡ens32则不能访问HTTP服务
2 在客户端实验情况
原因:
2 通过IP地址限制
Firewall-cmd --reload 当配置不允许当前正在连接的服务,其重置不会导致服务中断,而firewall-cmd --complte-reload 则会中断当前服务
4 direct rules 富规则
通过Firewall-cmd工具,可以使用--direct选项在运行时增加或产出链,直接端口模式适用于服务或者程序,以便在运行时间内增加特定的防火墙规则。直接端口模式添加的规则优先应用
5 案例
1 访问主机跳转
2 NAT 进行外部主机连接
1 删除原有配置,其中masquerade: yes 必须开启
打开内核转发功能
查看链接外网的端口已经关闭
修改网关,使其网关为网关主机对应的内网IP地址
重启服务
进行测试查看
二 iptables 的配置
1 基本用法:
iptables [-t table] [subcommand] chain [rulenum] [options...] [match] [target]
iptables [-t 表名] <-A|-I|-D|-R> 链名 [规则编号][-i|o 网卡名称][-p 协议类型][-s 源ip地址][源子网][--sport 源端口号][-d 目标ip地址|目标子网][--dport 目标端口号][-j 处理动作]
2 详细用法说明:
1table
filter:一般的过滤功能,包含input,forward,output。默认选项
nat:用于地址转换、映射、端口映射等,包含prerouting,postrouting
mangle:用于对特定数据包的修改,包含prerouting,output,forward,input,postrouting
raw:一般是为了不再让iptables做数据包的连接跟踪处理,从而×××能,包含prerouting,output
2)subcommand选项
1》链管理
-N :new, 自定义一条新的规则链
-X :delete ,删除自定义的空的规则链
-P :Policy ,设置默认策略;对filter 表中的链而言,其默认策略有:ACCEPT :接受,DROP :丢弃
-E :重命名自定义链;引用计数不为0 的自定义链不能够被重命名,也不能被删除
2》查看:
-L :list, 列出指定鏈上的所有规则,本选项须置后
-n :numberic ,以数字格式显示地址和端口号
-v :verbose ,详细信息
-vv:更详细
-x :exactly ,显示计数器结果的精确值, 而非单位转换后的易读值
--line-numbers :显示规则的序号
-S :selected, 以iptables-save命令格式显示链上规则
常用组合:
--vnL
--vvnxL --line-numbers
3》规则管理:
-A :append,追加
-I :insert,插入,要指明插入的规则编号,默认为第一条。
-D :delete,删除。(1)指明规则序号,(2)指明规则本身
-R :replace ,替换指定链上的指定规则编号
-F :flush ,清空指定的规则链
-Z :zero ,置零
iptables 的每条规则都有两个计数器
(1)匹配到的报文的个数
(2)匹配到的所有报文的大小之和
3链chain:
INPUT:通过路由表判断后目的地是本机,然后进入本机内部资源
OUTPUT:有本机产生的数据向外部转发
FORWARD:通过路由表判断后目的地不是本机,然后通过路由转发到其他地方
PREROUTING:流入的数据包进入路由表之前
POSTROUTING:传出的数据包到达网卡出口之前
4match,匹配条件
基本:通用的,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 链
2扩展匹配条件:
需要加载扩展模块(/usr/lib64/xtables/*.so),方可生效,是对某一种功能的扩展,经由扩展模块引入的匹配机制。
查看帮助:man iptables-extensions
1隐式扩展 :对某一种协议的扩展
在使用-p 选项指明了特定的协议时,无需再用-m 选项指明扩展模块的扩展机制,不需要手动加载扩展模块。
-p做协议匹配,协议有:tcp,udp,icmp,icmpv6,ah,esp,sctp,mh,all
1.tcp 协议,-m tcp,扩展选项
[!] --source-port, --sport port[:port] :匹配报文tcp首部源端口,可为端口范围
[!] --destination-port,--dport port[:port] :匹配报文目标端口,可为范围
[!] --tcp-flags mask comp:mask需检查的标志位列表,用逗号分隔,如 SYN,ACK,FIN,RST,PSH,URG,ALL,NONE.comp在mask列表中必须为1的标志位列表,无指定则必须为0,用逗号分割
[!] --syn :用于匹配第一次握手。相当于:--tcp-flags SYN,ACK,FIN,RST,SYN
2.udp 协议,-m udp,扩展选项
[!] --source-port, --sport port[:port] :匹配报文udp首部的源端口;可以是端口范围
[!] --destination-port,--dport port[:port] :匹配报文udp首部的目标端口;可以是端口范围
3.icmp
ICMP是(Internet Control Message Protocol)Internet控制报文协议。它是TCP/IP协议族的一个子协议,用于在IP主机、路由器之间传递控制消息。控制消息是指网络通不通、主机是否可达、路由是否可用等网络本身的消息。这些控制消息虽然并不传输用户数据,但是对于用户数据的传递起着重要的作用。)
-m icmp:专有选项
[!] --icmp-type {type[/code]|typename}:type/code为 0/0 echo-reply表示icmp 应答,type/code为8/0 echo-request表示icmp 请求
2显式扩展 :
额外附加的更多的匹配规则,功能性扩展
必须使用-m 选项指明要调用的扩展模块的扩展机制,要手动加载扩展模块,即[-m matchname [per-match-options]
-m 模块名称
每个模块会引入新的匹配机制
可以通过rpm -ql iptables 来获得那些模块可用,模块是以.so结尾的。
使用帮助:
man iptables (CentOS6)
man iptables-extensions(centos7)
- multiport扩展
以离散方式定义多端口匹配, 最多指定15 个端口
[!] --source-ports,--sports port[,port|,port:port]...:指定多个源端口
[!] --destination-ports,--dports port[,port|,port:port]...:指定多个目标端口
[!] --ports port[,port|,port:port]...:多个非连续的源或目标端口
示例:
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT - iprange扩展
指明连续的(但一般不是整个网络)ip 地址范围
[!] --src-range from[-to]:源IP 地址范围
[!] --dst-range from[-to]:目标IP 地址范围
示例:
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP - mac 扩展
指明源MAC 地址
适用于:PREROUTING, FORWARD,INPUT chains
[!] --mac-source XX:XX:XX:XX:XX:XX
示例:
iptables -A INPUT -s 172.16.0.100 -m mac --mac-source 00:50:56:12:34:56 -j ACCEPT
iptables -A INPUT -s 172.16.0.100 -j REJECT - string 扩展
对报文中的应用层数据做字符串模式匹配检测
--algo {bm|kmp} :字符串匹配检测算法,bm :Boyer-Moore,kmp :Knuth-Pratt-Morris
--from offset :开始偏移
--to offset :结束偏移
[!] --string pattern :要检测的字符串模式
[!] --hex-string pattern :要检测字符串模式,16 进制格式
示例:
iptables -A OUTPUT -s 172.16.100.10 -d 0/0 -p tcp --sport 80 -m string --algo bm --string “google" -j REJECT - time扩展
根据将报文到达的时间与指定的时间范围进行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:开始日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:停止日期
--timestart hh:mm[:ss]:开始时间
--timestop hh:mm[:ss]:停止时间
[!] --monthdays day[,day...]:每个月的几号
[!] --weekdays day[,day...]:星期几
--kerneltz :内核时区,不建议使用,CentOS7 系统默认为UTC
注意:centos6 不支持kerneltz,--localtz 指定本地时区( 默认)
示例:
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP - connlimit 扩展
根据每客户端IP 做并发连接数数量限制,即每个客户端最多可同时发起的连接数量,通常分别与默认的拒绝或允许策略配合使用,可防止CC(Challenge Collapsar 挑战黑洞) ***
--connlimit-upto n :匹配,限定并发连接数的上限
--connlimit-above n :匹配,限定并发连接数的下限
示例:
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT - limit扩展
基于收发报文的速率做匹配,使用令牌桶过滤器
--limit rate[/second|/minute|/hour|/day]:数率限定
--limit-burst number:突发数率限定
示例:
iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT
iptables -I INPUT 2 -p icmp -j REJECT - state 扩展
状态检测扩展,根据“连接追踪机制”去检查连接的状态,较耗资源。
追踪本机上的请求和响应之间的关系,状态有如下几种:
NEW :新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
ESTABLISHED :NEW 状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
RELATED :新发起的但与已有连接相关联的连接,如:ftp 协议中的数据连接与命令连接之间的关系
INVALID :无效的连接,如flag 标记不正确
UNTRACKED :未进行追踪的连接,如raw
[!] --state:state就是NEW等状态
示例:
iptables -A INPUT -d 172.16.100.10 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.100.10 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
1
以上连接追踪功能内核会在内存中开辟一段专用的空间用于存储连接的状态等,由于此段内存空间是有限的,因此就必须对连接追踪功能进行一些调整限制。
有关的内核参数由以下提供:
已经追踪到的并记录下来的连接信息库
/proc/net/nf_conntrack
调整连接追踪功能所能够容纳的最大连接数量
/proc/sys/net/nf_conntrack_max
不同的协议的连接追踪时长
/proc/sys/net/netfilter/
注意:CentOS7 需要加载模块: modprobe nf_conntrack
2
iptables 的链接跟踪表最大容量为/proc/sys/net/nf_conntrack_max ,各种状态的超时链接会从表中删除;当模板满载时,后续连接可能会超时
解决方法两个:
(1) 加大nf_conntrack_max 值
vi /etc/sysctl.conf
net.nf_conntrack_max = 393216
net.netfilter.nf_conntrack_max = 393216
(2) 降低 nf_conntrack timeout 时间
vi /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
iptables -t nat -L -n
3开放被动模式的ftp服务
(1)装载ftp 连接追踪的专用模块:
跟踪模块路径:/lib/modules/kernelversion/kernel/net/netfilter
vim /etc/sysconfig/iptables-config 配置文件
IPTABLES_MODULES=" nf_conntrack_ftp "
modproble nf_conntrack_ftp
(2)放行请求报文:
命令连接:NEW, ESTABLISHED
数据连接:RELATED, ESTABLISHED
iptables –I INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW -j ACCEPT
(3)放行响应报文:
iptables -I OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
5)terget,处理动作
-j targetname [per-target-options]:跳转目标
简单:
ACCEPT :接受
DROP :丢弃
扩展:
REJECT :明确拒绝,默认
RETURN :返回调用链
REDIRECT :端口重定向
LOG :记录日志,dmesg
MARK :做防火墙标记
DNAT :目标地址转换
SNAT :源地址转换
MASQUERADE :地址伪装
自定义链:
LOG:非中断target, 本身不拒绝和允许, 放在拒绝和允许规则前并将日志记录在/var/log/messages 系统日志中
--log-level level:级别有emerg, alert, crit, error,warning, notice, info or debug
--log-prefix prefix:日志前缀,用于区别不同的日志,最多29个字符。
示例:
iptables -I INPUT -s 10.0.1.0/24 -p tcp -m multimport --dports 80,21,22,23 -m state --state NEW -j L
基础
1 安装服务
2 启动服务并设置开机自启动
3 查看默认配置并使用-F清空当前配置
4 查看默认表中配置
查看配置文件中默认配置
保存当前空配置
保存查看保存情况
匹配规则,如果其中不存在匹配选项,则默认匹配policy中的内容
访问查看,则可以正常访问
修改INPUT默认匹配规则
进行访问,则不能访问
添加HTTP相关访问规则,则可以访问
正常
5 实验案例
使用iptables防火墙管理使得只可以访问ssh服务
1 关闭Firewalls防火墙
2 安装并开启iptables防火墙:
3 查看原有配置
4 清空配置并保存
5 进行配置
修改链
创建一个链
配置防火墙的包过滤规则只针对于第一个包进行过滤,不针对其后面的包进行过滤,这样有利于对CPU资源的节省,其只允许ssh 和 http 的链接
ip tables NAT 的管理配置