Linux防火墙

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Linux防火墙相关的知识,希望对你有一定的参考价值。

1、本章内容
防火墙的概念
iptables的基本认识
iptables的组成
iptables的基本语法
iptables之forward的概念
iptables之地址转换法则
SNAT源地址转换的具体实现
DNAT目标地址转换的具体实现
firewalld介绍
firewalld配置命令
rich规则

2、安全技术
***检测与管理系统(Intrusion Detection Systems):特点是不阻断任何网络访问,量
化、定位来自内外网络的威胁情 况,主要以提供报告和事后监督为主,提供有针对性的指导
措施和安全决策依据。一般采用旁路部署方式;IDS
***防御系统(Intrusion Prevention System):以透明模 工作,分析数据包的内容如:溢
出×××、拒绝服务×××、木 马、蠕虫、系统漏洞等进行准确的分析判断,在判定为×××行为
后立即予以阻断,主动而有效的保护网络的安全,一般采用在线部署方式;IPS
防火墙( FireWall ):隔离功能,工作在网络或主机边缘, 对进出网络或主机的数据包基
于一定的规则检查,并在匹配某规则时由规则定义的行为进行处理的一组功能的组件,基本
上的实现都是默认情况下关闭所有的通过型访问,只开放允许访问的策略;
注意:IPS是对应用层的数据进行分析,判断数据是干什么的,而防火墙是比较底层的,基于规
则的检查;企业防火墙一般是出不管,入就检查;国外的网的访问的防火墙是个例外;有的企业
还可以采用DMZ(非军事化区),即2个防火墙中间的区域,可以放提供对外服务的邮件服务器

3、防火墙的分类
防火墙的分类
主机防火墙:服务范围为当前主机
网络防火墙:服务范围为防火墙一侧的局域网
硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一 个部分功能基于软件实现,
Checkpoint,NetScreen
软件防火墙:运行于通用硬件平台之上的防火墙的应用软件
网络层防火墙:OSI下面第三层 基于ip、端口号防止访问QQ
应用层防火墙/代理服务器:代理网关,OSI七层 基于数据关键字防止访问qq
注意:有防水墙是专门用来防止内部的×××的;应用层可以识别数据是干什么的,有图片否等
4、网络型防火墙
网络层防火墙
包过滤防火墙
网络层对数据包进行选择,选择的依据是系统内设置的过滤逻辑 ,被称为访问控制列表
(ACL),通过检查数据流中每个数据的源地址,目的地址,所用端口号和协议状态等因
素,或他们的组合来确定是否允许该数据包通过
优点:对用户来说透明,处理速度快且易于维护
缺点:无法检查应用层数据,如病毒等

5、应用层防火墙
应用层防火墙/代理服务型防火墙(Proxy Service)
将所有跨越防火墙的网络通信链路分为两段
内外网用户的访问都是通过代理服务器上的“链接”来实现
优点:在应用层对数据进行检查,比较安全
缺点:增加防火墙的负载
现实生产环境中所使用的防火墙一般都是二者结合体
即先检查网络数据,通过之后再送到应用层去检查

6、iptables的基本认识
Netfilter组件
内核空间,集成在linux内核中
扩展各种网络服务的结构化底层框架
内核中选取五个位置放了五个hook(勾子) function(INPUT、 OUTPUT、FORWARD、
PREROUTING、POSTROUTING), 而这五个hook function向用户开放,用户可以通过一
个命令工具(iptables)向其写入规则
由信息过滤表(table)组成,包含控制IP包处理的规则集( rules),规则被分组放在链
(chain)上
三种报文流向:
流入本机:PREROUTING --> INPUT-->用户空间进程
流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
转发:PREROUTING --> FORWARD --> POSTROUTING
注意:/boot/config-3.10.0-693.el7.x86_64文件记录了Linux内核编译安装时哪些功能启用了,哪
些功能没有启用;勾子是开发程序是留下的API开发接口,其他开发人员开发的程序可以通过这
个勾子控制之前程序的运行;5个勾子代表5条链子,即5个不同的检查点;

由图可知1为PREROUTING,2为INPUT,3为OUTPUT,4为FORWARD,5为POSTROUTING

7、iptables的基本认识
防火墙工具
iptables
命令行工具,工作在用户空间
用来编写规则,写好的规则被送往netfilter,告诉内核如何去处理信息包
firewalld
CentOS 7引入了新的前端管理工具
管理工具:
firewall-cmd 命令行
firewall-config 图形 需要先开启防火墙才能执行此命令

8、iptables的组成
iptables由四个表和五个链以及一些规则组成
四个表table:filter、nat、mangle、raw
filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包
nat表:network address translation 地址转换规则表
mangle:修改数据标记位规则表
Raw:关闭NAT表上启用的连接跟踪机制,加快封包穿越防火墙速度 不记录地址的转换
优先级由高到低的顺序为:raw-->mangle-->nat-->filter
五个内置链chain 链上判断表
INPUT
OUTPUT
FORWARD
PREROUTING
POSTROUTING

9、Netfilter表和链对应关系

10、数据包过滤匹配流程

11、IPTABLES和路由
路由功能发生的时间点
报文进入本机后
? 判断目标主机是否为本机
是:INPUT
否:FORWARD
报文离开本机之前
? 判断由哪个接口送往下一跳

12、内核中数据包的传输过程
内核中数据包的传输过程
当一个数据包进入网卡时,数据包首先进入PREROUTING链, 内核根据数据包目的IP判断
是否需要转送出去 ?
如果数据包就是进入本机的,数据包就会沿着图向下移动,到达 INPUT链。数据包到达
INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包经过
OUTPUT链, 然后到达POSTROUTING链输出;
如果数据包是要转发出去的,且内核允许转发,数据包就会向右移动,经过FORWARD链,
然后到达POSTROUTING链输出;

13、iptables规则
规则rule:根据规则的匹配条件尝试匹配报文,对匹配成功的报文根据规则定义的处理动作作出
处理
匹配条件:默认为与条件,同时满足
基本匹配:IP,端口,TCP的Flags(SYN,ACK等)
扩展匹配:通过复杂高级功能匹配
处理动作:称为target,跳转目标
内建处理动作:ACCEPT,DROP,REJECT,SNAT,DNAT MASQUERADE,MARK,LOG...
自定义处理动作:自定义chain,利用分类管理复杂情形
规则要添加在链上,才生效;添加在自定义上不会自动生效
链chain:
内置链:每个内置链对应于一个钩子函数
自定义链:用于对内置链进行扩展或补充,可实现更灵活的规 则组织管理机制;只有Hook
钩子调用自定义链时,才生效;相当于函数,供勾子进行调用;

14、iptables添加要点
iptables规则添加时考量点
要实现哪种功能:判断添加在哪张表上
报文流经的路径:判断添加在哪个链上
报文的流向:判断源和目的
匹配规则:业务需要
链上规则的次序,即为检查的次序,因此隐含一定的法则
同类规则(访问同一应用),匹配范围小的放上面
不同类规则(访问不同应用),匹配到报文频率较大的放上面
将那些可由一条规则描述的多个规则合并为一个
设置默认策略
实验环境准备:
Centos7:
systemctl stop firewalld.service
systemctl disable firewalld. service
Centos6:
service iptables stop;
chkconfig iptables off 意味着不用系统自带的iptables策略,而是自己定义策略;并
不是将iptables功能关闭了;

15、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]

16、简单示例
Fliter表中INPUT规则

iptables -A INPUT -s 172.18.62.60 -j DROP:-A指定链,-s指定源地址,-j指定执行动作
iptables -vnL:-v显示详细信息如处理多少包,-n以数字方式显示,-L显示列表
iptables -A INPUT -s 172.18.62.60 -j REJECT
17、iptables命令
规则格式:iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j
targetname [per-targetoptions]
-t table:
raw, mangle, nat, [filter]默认
SUBCOMMAND:
1、链管理:
-N:new, 自定义一条新的规则链
-X:delete,删除自定义的空的规则链
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃
注意:设置修改策略前先备份策略,将它的还原做成几分钟的计划任务,然后再修
改策略,如果修改得登录不上远程服务器了就等几分钟计划任务执行,还原本来的
策略进行连接;
例子:iptables -P INPUT DROP
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
实验:自定义链
(1)创建并使用
iptables -N invalid_packets 创建一条新的链
iptables -E invalid_packets INVALID_PACKAGES 如果名字不合适可以进行重命名

iptables -A INVALID_PACKAGES -p tcp --tcp-flags ALL ALL -j REJECT 链中定义无效规
则;
iptables -A INVALID_PACKAGES -p tcp --tcp-flags ALL NONE -j REJECT 链中定义无效规
则;

iptables -A OUTPUT -j INVALID_PACKAGES 在输出链调用新定义的链规则
iptables -I INPUT -j INVALID_PACKAGES 在输入链调用新定义的链规则
(2)删除新定义的链
iptables -D INPUT 1 删除新旧链的联系
iptables -D OUTPUT 1 删除新旧链的联系

iptables -F INVALID_PACKAGES 清除新定义链的规则

iptables -X INVALID_PACKAGES 删除空的链
18、iptables命令
2、查看:
-L:list, 列出指定鏈上的所有规则,本选项须置后
-n:numberic,以数字格式显示地址和端口号
-v:verbose,详细信息
-vv 更详细
-x:exactly,显示计数器结果的精确值,而非单位转换后的易读值
--line-numbers:显示规则的序号
常用组合:
--vnL
--vvnxL --line-numbers
iptables -D INPUT 1 删除编号为1的规则
-S selected, 以iptables-save 命令格式显示链上规则,可以重定向进行存盘

19、iptables命令
3、规则管理:
-A:append,追加
-I:insert, 插入,要指明插入至的规则编号,默认为第一条
例:iptables -I INPUT 1 -s 172.18.65.32 -j REJECT
iptables -I INPUT 3 -s 172.18.62.60 -p icmp -j ACCEPT
-D:delete,删除
(1) 指明规则序号
(2) 指明规则本身
例子:iptables -D INPUT 3 删除第3条记录
-R:replace,替换指定链上的指定规则编号
例子:iptables -R INPUT 3 -s 192.168.27.1 -j REJECT
-F:flush,清空指定的规则链
例子:iptables -F OUTPUT
-Z:zero,置零
iptables的每条规则都有两个计数器
(1) 匹配到的报文的个数
(2) 匹配到的所有报文的大小之和
chain:PREROUTING,INPUT,FORWARD,OUTPUT, POSTROUTING

20、iptables命令
匹配条件
基本:通用的,PARAMETERS
扩展:需加载模块,MATCH EXTENTIONS 需要将安装的模块启用
1、基本匹配条件:无需加载模块,由iptables/netfilter自行提供
[!] -s, --source address[/mask][,...]:源IP地址或范围 !表示取反
例子:iptables -A INPUT ! -s 172.18.62.60 -j REJECT
[!] -d, --destination address[/mask][,...]:目标IP地址或范围
[!] -p, --protocol protocol:指定协议,可使用数字如0(all) protocol: tcp, udp, icmp,
icmpv6, udplite,esp, ah, sctp, mh or “all“ 参看:/etc/protocols
例子:iptables -I INPUT 4 -s 172.18.62.60 -p tcp -j ACCEPT
[!] -i, --in-interface name:报文流入的接口;只能应用于数据报文流入环节,只应用于
INPUT、FORWARD、PREROUTING链
例子:iptables -I INPUT 3 -i ens33,lo -j ACCEPT
[!] -o, --out-interface name:报文流出的接口;只能应用于数据 报文流出的环节,只应用于
FORWARD、OUTPUT、POSTROUTING链
例子:iptables -A OUTPUT -d 17.18.62.60 -j REJECT
注意:ping命令走的是icmp协议;iptables -I INPUT 3 -j REJECT此命令执行后ping不回来了??

21、iptables命令
2 扩展匹配条件:需要加载扩展模块(/usr/lib64/xtables/*.so) ,方可生效
查看帮助 man iptables-extensions centos7上进行查询扩展用法
(1)隐式扩展:在使用-p选项指明了特定的协议时,无需再用-m选项指明扩展模块的扩展机制,不
需要手动加载扩展模块
tcp协议的扩展选项
[!] --source-port, --sport port[:port]:匹配报文源端口,可为端口范围
例子:iptables -I INPUT 3 -s 172.18.62.60 -p tcp --dport 445 -j ACCEPT
iptables -I INPUT 3 -s 172.18.62.60 -p tcp --dport 139 -j ACCEPT 响应包
smbclient -L 172.18.62.61 samba客户端进行访问测试
[!] --destination-port,--dport port[:port]:匹配报文目标端口,可为范围
例子:iptables -I INPUT 3 -s 172.18.62.60 -p tcp --dport=22 -j ACCEPT
iptables -I INPUT 3 -s 172.18.62.60 -p tcp --dport 80 -j ACCEPT
iptables -I INPUT 3 -s 172.18.62.60 -p tcp --dport 22:80 -j ACCEPT
[!] --tcp-flags mask comp mask 需检查的标志位列表,用,分隔
例如 SYN,ACK,FIN,RST comp 在mask列表中必须为1的标志位列表,无指定则必
须为 0,用,分隔;

22、tcp协议的扩展选项
示例:
--tcp-flags SYN,ACK,FIN,RST SYN 表示要检查 的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0
--tcp-flags SYN,ACK,FIN,RST SYN,ACK 二次握手的情况
--tcp-flags ALL ALL 所有的标记位都为1,无效,拒绝
--tcp_flags ALL NONE 所有标记位都为0,无效的数据包拒绝
[!] --syn:用于匹配第一次握手
相当于:--tcp-flags SYN,ACK,FIN,RST SYN

23、iptables命令
udp
[!] --source-port, --sport port[:port]:匹配报文的 源端口;可以是端口范围
[!] --destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围
icmp
[!] --icmp-type {type[/code]|typename}
type/code
0/0 echo-reply icmp应答
8/0 echo-request icmp请求
例子:iptables -A OUTPUT -p icmp --icmp-type 0 -d 172.18.62.60 -j REJECT 一个可以ping
通另一个,但是另一个ping不通一个;
(2)显式扩展:必须使用-m选项指明要调用的扩展模块的扩展 机制,要手动加载扩展模块
[-m matchname [per-match-options]]

24、iptables命令
处理动作:
-j targetname [per-target-options]
简单: ACCEPT,DROP
扩展: REJECT:--reject-with:icmp-port-unreachable默认
RETURN:返回调用链 ,当前规则完成,继续当前链的匹配下一条规则
REDIRECT:端口重定向
LOG:记录日志,dmesg
MARK:做防火墙标记
DNAT:目标地址转换
SNAT:源地址转换
MASQUERADE:地址伪装
...
自定义链:

25、iptables命令
显式扩展:必须显式地指明使用的扩展模块进行的扩展
使用帮助:
CentOS 6: man iptables
CentOS 7: man iptables-extensions
1、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;
实验:samba服务
iptables -I INPUT 3 -p tcp -m multiport --dports 445,139 -j ACCEPT
iptables -I INPUT 3 -p udp --dport 137:138 -j ACCEPT
smbclient -L 172.18.62.61 进行测试
26、iptables命令
2、iprange扩展
指明连续的(但一般不是整个网络)ip地址范围
[!] --src-range [from]-[to] 源IP地址范围
[!] --dst-range [from]-[to] 目标IP地址范围
示例: iptables -A INPUT -d 172.16.1.100 -p tcp --dport 80 -m iprange --src-range 172.16.1.5-
172.16.1.10 -j DROP;
实验:samba服务
iptables -I INPUT 3 -m iprange --src-range 172.18.62.6-172.18.62.70 -j ACCEPT
iptables -I INPUT 3 -m iprange --src-range 172.18.62.5 -j ACCEPT 单个地址
smbclient -L 172.18.62.61 进行测试
27、iptables命令
3、mac扩展
指明源MAC地址
适用于:PREROUTING, FORWARD,INPUT chains
[!] --mac-source XX:XX:XX:XX:XX:XX
示例: iptables -A INPUT -s 172.16.0.100 -m mac --macsource 00:50:56:12:34:56 -j ACCEPT
iptables -A INPUT -s 172.16.0.100 -j REJECT;
实验:samba服务
ip a A机器
然后断开A机器的网卡
vim /etc/sysconfig/network-scripts/ifcfg-eth0 C机器
MACADDR=00:0c:29:c7:98:27
service network restart
iptables -I INPUT 3 -m mac --mac-source 00:0c:29:c7:98:27 -j ACCEPT
smbclient -L 172.18.62.61 进行测试
28、iptables命令
4、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;
实验:samba服务
yum install httpd
echo www.google.com > /var/www/html/test.html
echo www.magedu.com.com > /var/www/html/test2.html
iptables -I OUTPUT -m string --algo bm --string "google" -j REJECT
tcpdump -i ens33 port 80 -nn 可以在目的机器进行抓包观察
curl 172.18.62.61/test.html 进行测试
29、iptables命令
5、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;

30、iptables命令
6、connlimit扩展
根据每客户端IP做并发连接数数量匹配
可防止CC(Challenge Collapsar挑战黑洞)××× ,即dos×××的变种
--connlimit-upto n:连接的数量小于等于n时匹配
--connlimit-above n:连接的数量大于n时匹配
通常分别与默认的拒绝或允许策略配合使用
示例:
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -
j REJECT;
实验:测试connlimit模块
iptables -I INPUT 3 -m connlimit --connlimit-upto 2 -j ACCEPT
ssh 172.18.62.61 测试,在同一ip的多个客户端
31、iptables命令
7、limit扩展
基于收发报文的速率做匹配
令牌桶过滤器
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
示例: iptables -I INPUT -d 172.16.100.10 -p icmp --icmptype 8 -m limit --limit 3/minute --
limit-burst 5 -j ACCEPT iptables -I INPUT 2 -p icmp -j REJECT;
注意:此模块可以用于刚上线服务器获取缓存,缓减压力;
实验:测试limit模块
iptables -I INPUT 3 -m limit --limit 20/minute --limit-burst 10 -j ACCEPT
ping 172.18.62.61 测试发现刚开始正常,10个包后就出现丢包的现象
32、iptables命令
8、state扩展
根据”连接追踪机制“去检查连接的状态,较耗资源
conntrack机制:追踪本机上的请求和响应之间的关系
状态有如下几种:
NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第
一次发出的请求;
ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行
的通信状态
RELATED:新发起的但与已有连接相关联的连接,如: ftp协议中的数据连接与命令连接之
间的关系
INVALID:无效的连接,如flag标记不正确
UNTRACKED:未进行追踪的连接,如raw表中关闭追踪
实验:实现旧的所有连接不断开继续工作,新的连接只能连接httpd服务
iptables -I INPUT 3 -p tcp --dport 80 -m state --state NEW -j ACCEPT
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -vnL
curl 172.18.62.61 测试网页
33、iptables命令
[!] --state state
示例:
iptables -A INPUT -d 172.16.1.10 -p tcp -m multiport -- dports 22,80 -m state --state
NEW,ESTABLISHED -j ACCEPT ;
iptables -A OUTPUT -s 172.16.1.10 -p tcp -m multiport --sports 22,80 -m state --state
ESTABLISHED -j ACCEPT ;
已经追踪到的并记录下来的连接信息库
/proc/net/nf_conntrack
调整连接追踪功能所能够容纳的最大连接数量
/proc/sys/net/nf_conntrack_max
不同的协议的连接追踪时长
/proc/sys/net/netfilter/
注意:CentOS7 可以手动加载模块: modprobe nf_conntrack
lsmod|grep nf_con 可以查看模块
实验:更改最大连接数量
cat /proc/sys/net/nf_conntrack_max 查看最大连接数量
vim /etc/sysctl.conf
net.nf_conntrack_max=666666
sysctl -p 更改生效
34、iptables命令
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
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n

35、iptables命令
开放被动模式的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 ESTABLISHED,RELATED -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
实验:防火墙对ftp服务的策略
服务器上:
modprobe nf_conntrack_ftp 加载模块
iptables -R INPUT 3 -p tcp --dport 21 -m state --state NEW -j ACCEPT
iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -vnL
cp /etc/fstab /var/ftp/pub/
另一个机器上:
ftp 172.18.62.61
用ftp账号登录,密码没有
ls命令即可数据通道被动模式连接成功
36、开放被动模式的ftp服务示例
yum install vsftpd
systemctl start vsftpd
modprobe nf_conntrack_ftp
iptables -F
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -m state -- state NEW -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -vnL

37、iptables命令
Target:
ACCEPT, DROP, REJECT, RETURN
LOG, SNAT, DNAT, REDIRECT, 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 multiport -- dports 80,21,22,23 -m state --
state NEW -j LOG --logprefix "new connections: ";
实验:测试防火墙日志的记录
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "new ssh
connection" 放到第一条进行符合条件的防火墙日志记录
iptables -vnL 查看防火墙的状态
tail /var/log/messages -f 在被访问的机器上跟踪日志状态;

38、iptables命令
任何不允许的访问,应该在请求到达时给予拒绝
规则在链接上的次序即为其检查时的生效次序
基于上述,规则优化
1 安全放行所有入站和出站的状态为ESTABLISHED状态连接
2 谨慎放行入站的新请求
3 有特殊目的限制访问功能,要在放行规则之前加以拒绝
4 同类规则(访问同一应用),匹配范围小的放在前面,用于特 殊处理
5 不同类的规则(访问不同应用),匹配范围大的放在前面
6 应该将那些可由一条规则能够描述的多个规则合并为一条
7 设置默认策略,建议白名单(只放行特定连接)
1) iptables -P,不建议
2) 建议在规则的最后定义规则做为默认策略;

39、iptables命令
规则有效期限:
使用iptables命令定义的规则,手动删除之前,其生效期限为 kernel存活期限
保存规则:
保存规则至指定的文件
CentOS 6
service iptables save
将规则覆盖保存至/etc/sysconfig/iptables文件中

CentOS 7 可用下面方法保存规则
iptables -S > /PATH/TO/SOME_RULES_FILE 此项的保存格式不适合用iptables-
restore命令进行恢复;
iptables-save > /PATH/TO/SOME_RULES_FILE 此项适合恢复
总结:
service iptables save centos6保存防火墙内容到/etc/sysconfig/iptables文件中
service iptables start 一旦重启iptables服务,就会重读文件获得规则
备份防火墙规则内容然后进行恢复:
cp /etc/sysconfig/iptables /backups/iptables
iptables-restore < /backups/iptables
service iptabels reload 可以不重启就重新读取/etc/sysconfig/iptables文件的内容
防止防火墙策略配置出错的命令和脚本:
service iptables save 保存磁盘
cp /etc/sysconfig/iptables /backups/iptables.bak
vim restore_iptables.sh
#!/bin/bash
cp /backups/iptables.bak /etc/sysconfig/iptables
service iptables reload
yum whatprovides at
yum install at
chkconfig --list atd
service atd start
cat restore_iptables.sh | at now+5minute 计划任务5分钟后执行
40、iptables命令
CentOS 6:
service iptables restart
会自动从/etc/sysconfig/iptables 重新载入规则
CentOS 7 重新载入预存规则文件中规则:
iptables-restore < /PATH/FROM/SOME_RULES_FILE
-n, --noflush:不清除原有规则
-t, --test:仅分析生成规则集,但不提交
开机自动重载规则文件中的规则:
(1) 用脚本保存各iptables命令;让此脚本开机后自动运行
/etc/rc.d/rc.local文件中添加脚本路径
/PATH/TO/SOME_SCRIPT_FILE
(2) 用规则文件保存各规则,开机时自动载入此规则文件中的规则
/etc/rc.d/rc.local文件添加
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
(3)自定义Unit File,进行iptables-restore

41、网络防火墙
iptables/netfilter网络防火墙:
(1) 充当网关
(2) 使用filter表的FORWARD链
注意的问题:
(1) 请求-响应报文均会经由FORWARD链,要注意规则 的方向性
(2) 如果要启用conntrack机制,建议将双方向的状态为 ESTABLISHED的报文直接放行
注意:Linux服务器可以当做路由器来使用,可以作为网络防火墙
实验:实现网络防火墙,内网的ftp和http,ssh服务可以外网访问,其它不行,内网访问外网不控
制;A<---->B<---->C
(1)使用A机器模拟外网
hostname wanServer 修改主机名标识外网
nmcli connection modify ens37 ipv4.method manual ipv4.addresses 192.168.42.60/24
修改网卡ens37的通外网的ip地址为192.168.42.60
nmcli connection modify ens37 ipv4.gateway 192.168.42.61 修改网关指向路由器
nmcli connection up ens37 使得更改生效
route -n 查看路由指向,保证只能从指向路由器的接口出去,可以使用如下命令:
ifconfig ens33 down
ping 172.18.62.62 关掉内网进行测试是否配置正确
测试最终目的
(2)使用B机器模拟路由器转发
hostname router 修改主机名标识路由器
sysctl -a|grep ip_for 查看设置转发的配置
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
sysctl -p 使得设置转发生效
nmcli connection show 查看网卡
nmcli connection ens37 ipv4.method manual ipv4.addresses 192.168.42.61/24 设置路由
器的ens37网卡的地址;
nmcli connection ens33 ipv4.method manual ipv4.addresses 172.18.62.61/16 设置路由
器ens33的网卡的通外网的地址;
route -n 查看路由,保证两个网卡都可以转发
测试可以ping通且63个路由穿过之后,防火墙策略实现最终目的
1)实现外网不能连接通内网,但是内网可以连接外网
iptables -A FORWARD -d 172.18.62.62 -m state --state NEW -j REJECT
2)实现外网不能ping通内网,但是内网可以连接外网
iptables -A FORWARD -d 172.18.0.0/24 -p icmp --icmp-type 8 -j REJECT
3)实现外网访问内网的ftp和http,ssh服务,其它不行,而内网可以随意访问外网
lsmod|grep nf_conn 搜索实现连接追踪端口的模块
modprobe nf_conntrack_ftp 加载模块
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -d 172.18.62.62 -p tcp -m multiport --dports 21,80,22 -m
state --state NEW -j ACCEPT;
iptables -A FORWARD -j REJECT
(3)使用C机器模拟内网
hostname lanServer 修改主机名标识内网
nmcli connection show 查看网卡
nmcli connection modify ens37 ipv4.method manual ipv4.addresses 192.168.42.62/24
设置ens37网卡的通外网的地址
nmcli connection modify ens33 ipv4.method manual ipv4.addresses 172.18.62.62/16 设置
ens33网卡的地址;
nmcli connection modify ens33 connection.id eth1 修改网卡的名字
nmcli connection modify ens37 connection.id eth0 修改网卡名字
nmcli connection modify eth1 ipv4.gateway 172.18.62.61/16 修改网关指向
route -n
nmcli connection up ens33 生效
ifconfig ens37 down
ping 192.168.42.60 关掉外网测试

yum install vsftpd httpd
systemctl start vsftpd httpd
42、NAT
NAT: network address translation
PREROUTING,INPUT,OUTPUT,POSTROUTING
请求报文:修改源/目标IP,由定义如何修改
响应报文:修改源/目标IP,根据跟踪机制自动实现
SNAT:source NAT POSTROUTING, INPUT
让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装
请求报文:修改源IP
注意:是将私有ip替换为公有ip转发到互联网
DNAT:destination NAT PREROUTING , OUTPUT
把本地网络中的主机上的某服务开放给外部网络访问(发 布服务和端口映射),但隐藏真实IP
请求报文:修改目标IP
PNAT: port nat,端口和IP都进行修改

注意:SNAT和DNAT是站在发请求的客户端来看的;
43、SNAT
nat表的target:
SNAT:固定IP
--to-source [ipaddr[-ipaddr]][:port[-port]]
--random
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP
示例: iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! – d 10.0.1.0/24 -j SNAT --to-source
172.18.1.6- 172.18.1.9;
注意:如果没有NAT转换地址,那么内网地址出去发送请求后回不来
实验:实现内网访问外网时地址的转换
(1)A机器代表外网 ip192.168.42.60
在虚拟机中将机器A的内网网卡ens33下线,用外网的ip连接ssh
route del -net 172.18.0.0 netmask 255.255.0.0 删除多余的路由
yum install httpd
systemctl start httpd
tcpdump -i ens37 host 192.168.42.61 -nn 在内网ping测试时进行抓包
tail /var/log/httpd/access_log 查看日志记录,发现记录的是192.168.42.61地址到达的
包,而不是172.18.62.62地址;
(2)B机器代表NAT转发器 ip1 172.18.62.61 ip2 192.168.42.61
vim /etc/sysctl.conf 配置文件设置转发的选项
net.ipv4.ip_forward=1
sysctl -p 转发生效
iptables -vnL -t nat 查看防火墙设置
iptables -t nat -A POSTROUTING -s 172.18.0.0/16 ! – d 172.18.0.0/16 -j SNAT --to-
source 192.168.42.61;
(3)C机器代表内网 ip 172.18.62.62
在虚拟机设置中将外网的网卡ens37下线
route del default gw 192.168.42.1 删除原来的默认路由网关
route del -net 192.168.0.0 netmask 255.255.0.0 删除多余的路由地址
route add default gw 172.18.62.61 添加路由指向,也可去文件设置网关永久生效
curl 192.168.42.60 测试
ping 192.168.42.60
44、SNAT
MASQUERADE:动态IP,如拨号网络
--to-ports port[-port]
--random
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE
示例:
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! – d 10.0.1.0/24 -j MASQUERADE
注意:此可以用在固定ip时
实验:内网访问外网时转换为动态ip
(1)在上一个SNAT的实验的基础上,将B机器的防火墙的地址转换策略清空
(2)设置新的地址转换策略以应对拨号上网的而带来的ip地址的变化
iptables -t nat -A POSTROUTING -s 172.18.0.0/16 ! -d 172.18.0.0/16 -j MASQUERADE
(3)进行测试
C机器上执行:
curl 192.168.42.60 测试
ping 192.168.42.60
A机器上执行:
tcpdump -i ens37 host 192.168.42.61 -nn 在内网ping测试时进行抓包
tail /var/log/httpd/access_log 查看日志记录,发现记录的是192.168.42.61地址到达的
(4)总结
MASQUERADE选项可以自动获取地址转换器上的公有IP地址,进行地址转换
注意:固定ip的性能更好,动态ip的性能不行;
45、DNAT
DNAT --to-destination [ipaddr[-ipaddr]][:port[-port]] ? iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT] ? 示例: iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 22 -j DNAT --todestination 10.0.1.22 iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --todestination 10.0.1.22:8080
实验:实现外网访问内网时的ip地址的转换
(1)A机器代表外网 ip192.168.42.60
在虚拟机中将机器A的内网网卡ens33下线,用外网的ip连接ssh
route del -net 172.18.0.0 netmask 255.255.0.0 删除多余的路由
yum install httpd
systemctl start httpd
curl 192.168.42.61 测试httpd服务,前后比较可以访问
ftp 192.168.42.61 测试访问ftp服务,前后比较可以访问,但是由于主动模式和被动模
式的原因,不能达到预期目的;
mysql -uroot -h192.168.42.61 测试数据库连接(先在数据库机器修改数据库连接
的主机);
(2)B机器代表NAT转发器 ip1 172.18.62.61 ip2 192.168.42.61
vim /etc/sysctl.conf 配置文件设置转发的选项
net.ipv4.ip_forward=1
sysctl -p 转发生效
iptables -vnL -t nat 查看防火墙设置i
iptables -t nat -A PREROUTING -d 192.168.42.61 -p tcp --dport 3306 -j DNAT --to-
destination 172.18.62.63; 设置外网访问数据库的策略
iptables -t nat -A PREROUTING -d 192.168.42.61 -p tcp --dport 21 -j DNAT --to-
destination 172.18.62.63; 设置外网访问ftp服务的策略
iptables -t nat -A PREROUTING -d 192.168.42.61 -p tcp --dport 80 -j DNAT --to-
destination 172.18.62.63; 设置外网访问httpd服务的策略
(3)C机器代表内网 ip 172.18.62.62
在虚拟机设置中将外网的网卡ens37下线
route del default gw 192.168.42.1 删除原来的默认路由网关
route del -net 192.168.0.0 netmask 255.255.0.0 删除多余的路由地址
route add default gw 172.18.62.61 添加路由指向,也可去文件设置网关永久生效
(4)D机器也代表内网 ip172.18.62.63
在虚拟机设置中将外网的网卡ens37下线
route add default gw 172.18.62.61 添加路由指向,也可去文件设置网关永久生效
将其他没用的路由都删除
yum install vsftpd 安装ftp服务
systemctl start vsftpd
systemctl stop firewalld 确保默认策略防火墙关闭
yum install mariadb-server 安装数据库服务
systemctl start mariadb
update mysql.user set host=‘192.168.42.%‘ where host=‘localhost.localdomain‘; 修改
主机的时候修改以主机名为主机的用户,不要修改代表本机的主机如localhost;否则会
访问不了;
show processlist; 显示连接本机的进程
46、转发
REDIRECT:
NAT表
可用于:PREROUTING OUTPUT 自定义链
通过改变目标IP和端口,将接受的包转发至不同端口 如发送到一个主机80端口,在转发
到这台主机的其他真正提供服务的端口;
--to-ports port[-port]
示例: iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport 80 -j REDIRECT --to-
ports 8080;
注意:原来的80端口是不在监听的,但是可以外界可以扫描出80端口;因为nat端口转发是内核
级的;
此为面试题
实验:转发
(1)基于上一个DNAT实验进行本次实验
(2)在D机器上配置策略
vim /etc/httpd/conf/httpd.conf
Listen 10086
systemctl restart httpd
iptables -t nat -A PREROUTING -d 172.18.62.62 -p tcp --dport 80 -j REDIRECT --to-ports
10086;
(3)在A机器上进行测试
curl 192.168.42.61
47、firewalld服务
firewalld是CentOS 7.0新推出的管理netfilter的工具
firewalld是配置和监控防火墙规则的系统守护进程。可以实 现iptables,ip6tables,ebtables的功能
firewalld服务由firewalld包提供
firewalld支持划分区域zone,每个zone可以设置独立的防火墙规则
归入zone顺序:
先根据数据包中源地址,将其纳为某个zone
纳为网络接口所属zone
纳入默认zone,默认为public zone,管理员可以改为其它zone
网卡默认属于public zone,lo网络接口属于trusted zone

48、firewalld zone分类

注意:block对已经连接的主机是不限制的;
49、预定义服务

50、firewalld配置
firewall-cmd --get-services 查看预定义服务列表 ,预定义服务用的是标准端口
/usr/lib/firewalld/services/*.xml预定义服务的配置
三种配置方法
firewall-config (firewall-config包)图形工具
firewall-cmd (firewalld包)命令行工具
/etc/firewalld 配置文件,一般不建议

51、firewall-cmd 命令选项
--get-zones 列出所有可用区域
--get-default-zone 查询默认区域
--set-default-zone= 设置默认区域
--get-active-zones 列出当前正使用的区域
--add-source=[--zone=] 添加源地 址的流量到指定区域,如果无--zone= 选项,使用默认区域
--remove-source= [--zone=] 从指定区 域中删除源地址的流量,如果无--zone= 选项,使用默认区
域;
--add-interface=[--zone=] 添 加来自于指定接口的流量到特定区域,如果无--zone= 选项 ,使用
默认区域;
注意:firewall-cmd命令执行前必须将防火墙开启;针对的内置服务都是标准端口的服务

52、firewall-cmd 命令选项
--change-interface=[--zone=]
改变指定接口至新的区域,如果无--zone= 选项,使用默认区域
--add-service= [--zone=] 允许服务的流量通过,如果无--zone= 选项,使用默认区域
例子:firewall-cmd --add-service=http
--add-port=[--zone=] 允许指定端口和协议的流量,如果无--zone= 选项,使用默认区域
例子:firewall-cmd --add-port=8080/tcp
53、firewall-cmd 命令选项
--remove-service= [--zone=] 从区域中删除指定服务,禁止该服务流量,如果无--zone= 选 项,
使用默认区域;
--remove-port=[--zone=] 从区域中删除指定端口和协议,禁止该端口的流量,如果无--zone= 选
项,使用默认区域;
--reload 删除当前运行时配置,应用加载永久配置
--list-services 查看开放的服务
--list-ports 查看开放的端口
--list-all [--zone=] 列出指定区域的所有配置信息,包括接口,源地址,端口,服务等,如果无-
-zone= 选项,使用默认区域;

54、firewall-cmd 命令示例
查看默认zone
firewall-cmd --get-default-zone
默认zone设为dmz
firewall-cmd --set-default-zone=dmz
在internal zone中增加源地址192.168.0.0/24的永久规则
firewall-cmd --permanent --zone=internal -- add-source=192.168.0.0/24
在internal zone中增加协议mysql的永久规则
firewall-cmd --permanent –zone=internal --addservice=mysql
加载新规则以生效
firewall-cmd --reload

55、实验:配置firewalld
systemctl mask iptables ipv4的iptables功能关闭,不能用start启动了
systemctl mask ip6tables ipv6的iptables功能关闭
systemctl status firewalld
systemctl enable firewalld
systemctl start firewalld
firewall-cmd --get-default-zone
firewall-cmd --set-default-zone public
firewall-cmd --permanent --zone=public --list-all
firewall-cmd --permanent --zone=public --addport 8080/tcp
firewall-cmd ---reload

56、其它规则
当基本firewalld语法规则不能满足要求时,可以使用以下更复杂的规则
rich-rules 富规则,功能强,表达性语言
Direct configuration rules 直接规则,灵活性差
帮助:man 5 firewalld.direct

57、管理rich规则
rich规则比基本的firewalld语法实现更强的功能,不仅实现允许/拒绝,还可以实现日志syslog和auditd,也可以实现端口转发,伪装和限制速率
rich语法:
rule
[source]
[destination]
service|port|protocol|icmp-block|masquerade|forward-port
[log]
[audit]
[accept|reject|drop]
man 5 firewalld.richlanguage

58、规则
规则实施顺序:
该区域的端口转发,伪装规则
该区域的日志规则
该区域的允许规则
该区域的拒绝规则
每个匹配的规则生效,所有规则都不匹配,该区域默认规则生效

59、rich规则选项

60、rich规则示例
拒绝从192.168.0.11的所有流量,当address选项使用source 或 destination时,必须用family=
ipv4 |ipv6.
firewall-cmd --permanent --zone=cla***oom --add-richrule=‘rule family=ipv4 source
address=192.168.0.11/32 reject‘
限制每分钟只有两个连接到ftp服务
firewall-cmd --add-rich-rule=‘rule service name=ftp limit value=2/m accept’
抛弃esp( IPsec 体系中的一种主要协议)协议的所有数据包
firewall-cmd --permanent --add-rich-rule=‘rule protocol value=esp drop‘
接受所有192.168.1.0/24子网端口范围7900-7905的TCP流量
firewall-cmd --permanent --zone=vnc --add-rich-rule=‘rule family=ipv4 source
address=192.168.1.0/24 port port=7900- 7905 protocol=tcp accept‘;

61、rich日志规则
log [prefix="<PREFIX TEXT>" [level=<LOGLEVEL>]
[limit value="RATE/DURATION"]
<LOGLEVEL>可以是 emerg,alert, crit, error, warning, notice, info, debug.
<DURATION>s:秒, m:分钟, h:小时, d:天
audit [limit value="RATE/DURATION"]

62、rich日志规则实例
接受ssh新连接,记录日志到syslog的notice级别,每分钟最 多三条信息
firewall-cmd --permanent --zone=work --add-richrule=‘rule service name="ssh" log
prefix="ssh " level="notice" limit value="3/m" accept
从2001:db8::/64子网的DNS连接在5分钟内被拒绝,并记录到日志到audit,每小时最大记录一条信
息;
firewall-cmd --add-rich-rule=‘rule family=ipv6 source address="2001:db8::/64" service
name="dns" audit limit value="1/h" reject‘ --timeout=300;

63、规则示例
firewall-cmd --permanent --add-rich-rule=‘rule family=ipv4 source address=172.25.X.10/32
service name="http" log level=notice prefix="NEW HTTP " limit value="3/s" accept‘
firewall-cmd --reload
tail -f /var/log/messages
curl http://serverX.example.com

64、伪装和端口转发
NAT网络地址转换,firewalld支持伪装和端口转发两种NAT方式
伪装NAT
firewall-cmd --permanent --zone= --addmasquerade
firewall-cmd --query-masquerade 检查是否允许伪装
firewall-cmd --add-masquerade 允许防火墙伪装IP
firewall-cmd --remove-masquerade 禁止防火墙伪装IP
示例: firewall-cmd --add-rich-rule=‘rule family=ipv4 source address=192.168.0.0/24
masquerade‘;

65、端口转发
端口转发:将发往本机的特定端口的流量转发到本机或不同机器的另一个端口。通常要配合地址
伪装才能实现
firewall-cmd --permanent --zone= --add-forwardport=port=:proto=[:toport=][:toaddr=] 说明:
toport= 和toaddr= 至少要指定一个
示例:
转发传入的连接9527/TCP,到防火墙的80/TCP到public zone 的192.168.0.254
firewall-cmd --add-masquerade 启用伪装
firewall-cmd --permanent --zone=public --addforward
port=port=9527:proto=tcp:toport=80:toaddr= 192.168.0.254
firewall-cmd --reload
注意:RHCE考点
66、rich规则
rich规则语法:
forward-port port=<PORTNUM> protocol=tcp|udp [toport=<PORTNUM>] [to-addr=<ADDRESS>]
示例:
转发从192.168.0.0/24来的,发往80/TCP的流量到防火墙的 端口8080/TCP
firewall-cmd --permanent --zone=work --add-richrule=‘rule family=ipv4 source
address=192.168.0.0/24 forward-port port=80 protocol=tcp to-port=8080‘

67、rich规则示例
firewall-cmd --permanent --add-rich-rule ‘rule family=ipv4 source address=172.25.X.10/32 、
forwardport port=443 protocol=tcp to-port=22‘;
firewall-cmd --reload
ssh -p 443 serverX.example.com

以上是关于Linux防火墙的主要内容,如果未能解决你的问题,请参考以下文章

linux查看防火墙配置的命令

如何配置linux下的防火墙?

linux 如何查看防火墙是不是开启

在linux里面如何设置防火墙?

如何配置linux下的防火墙?

linux 防火墙开启不了怎么办