目录
2、用例2
一:什么是防火墙
1、什么是防火墙
防止别人恶意入侵服务器的软件。
2、防火墙分类
从逻辑上讲。防火墙可以大体分为主机防火墙和网络防火墙。
主机防火墙:针对于单个主机进行防护。
网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网。
网络防火墙和主机防火墙并不冲突,可以理解为,网络防火墙主外(集体), 主机防火墙主内(个人)。
从物理上讲,防火墙可以分为硬件防火墙和软件防火墙。
硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。
3、防火墙的原理
通过iptables规则操作netfilter系统安全框架,从而实现对网络的安全过滤。
详细描述:
iptables其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的”安全框架”中,这个”安全框架”才是真正的防火墙,这个框架的名字叫netfilter
netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。
iptables其实是一个命令行工具,位于用户空间,我们用这个工具操作真正的框架。
netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
Netfilter是Linux操作系统核心层内部的一个数据包处理模块,它具有如下功能:
网络地址转换(Network Address Translate)
数据包内容修改
以及数据包过滤的防火墙功能
所以说,虽然我们使用service iptables start启动iptables”服务”,但是其实准确的来说,iptables并没有一个守护进程,所以并不能算是真正意义上的服务,而应该算是内核提供的功能。
4、防火墙是通过什么过滤网络
防火墙是通过四表五链来过滤网络的。
iptables 是集成在 Linux 内核中的包过滤防火墙系统。使用 iptables 可以添加、删除具体的过滤规则,iptables 默认维护着 4 个表和 5 个链,所有的防火墙策略规则都被分别写入这些表与链中。
5、什么是表
表是具备某些具体功能的防火墙安全过滤规则。
“四表”是指 iptables 的功能,默认的 iptables规则表有
filter 表(过滤规则表)防火墙
nat 表(地址转换规则表)network address translation网络地址转换功能;内核模块:iptable_nat
mangle(修改数据标记位规则表)、拆解报文,做出修改,并重新封装 的功能;iptable_mangle
raw(跟踪数据表规则表):关闭nat表上启用的连接追踪机制;iptable_raw
filter 表:控制数据包是否允许进出及转发,可以控制的链路有 INPUT、FORWARD 和 OUTPUT。
nat 表:控制数据包中地址转换,可以控制的链路有 PREROUTING、INPUT、OUTPUT 和 POSTROUTING。
mangle:修改数据包中的原数据,可以控制的链路有 PREROUTING、INPUT、OUTPUT、FORWARD 和 POSTROUTING。
raw:控制 nat 表中连接追踪机制的启用状况,可以控制的链路有 PREROUTING、OUTPUT。
6、什么是链
链是将表的过滤规则放置在具体的位置去执行。
“五链”是指内核中控制网络的 NetFilter 定义的 5 个规则链。每个规则表中包含多个数据链:
INPUT(入站数据过滤)、
OUTPUT(出站数据过滤)、
FORWARD(转发数据过滤)、
PREROUTING(路由前过滤)、
POSTROUTING(路由后过滤)
防火墙规则需要写入到这些具体的数据链中。
Linux 防火墙的过滤框架如下:
如果是外部主机发送数据包给防火墙本机,数据将会经过 PREROUTING 链与 INPUT 链;如果是防火墙本机发送数据包到外部主机,数据将会经过 OUTPUT 链与 POSTROUTING 链;如果防火墙作为路由负责转发数据,则数据将经过 PREROUTING 链、FORWARD 链以及 POSTROUTING 链。
7、链的使用场景
流入:PREROUTING ---> INPUT
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
流出:POSTROUTING <--- OUTPUT
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
流经:PREROUTING ---> FORWARD ---> POSTROUTING
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
报文流向经过的链
到B网络某进程的报文:PREROUTING –> INPUT
由B网络的某进程发出报文:OUTPUT –> POSTROUTING
由B网络转发的报文:PREROUTING –> FORWARD –> POSTROUTING
8、表和链之间的关系
filter : INPUT --> FORWARD --> OUTPUT
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
nat : PREROUTING --> INPUT --> OUTPUT --> POSTROUTING
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
mangle : PREROUTING --> INPUT --> FORWARD --> OUTPUT --> POSTROUTING
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
raw : PREROUTING --> OUTPUT
>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
9、iptables语法格式
iptables 命令的基本语法格式如下:
[root@liangxu ~]# iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION
各参数的含义为:
-t:指定需要维护的防火墙规则表 filter、nat、mangle或raw。在不使用 -t 时则默认使用 filter 表。
COMMAND:子命令,定义对规则的管理。
chain:指明链表。
CRETIRIA:匹配参数。
ACTION:触发动作。
10、表和链之间是怎么实现网络过滤的
格式:iptables -t 表名 选项 链名称 条件 动作
-t: 指定操作的表
-A, --append 追加一条规则到链中
-D, --delete 删除链中的规则
-I, --insert 插入一条规则,插入到顶部
-R, --replace 修改
-L, --list 列出当前的规则
-S, --list-rules 列出所有的规则
-F, --flush 清空
-Z, --zero 清空计数器( 包数量 、包大小)
-X, --delete-chain 删除一个自定义链
-P, --policy 指定链的默认策略
-n 不反解
-v 查询更详细
--line--number iptables规则编号
-p 指定协议
-j 指定动作
参数:
-s 源地址
-d 目标地址
--sport 源地址的端口
--dport 目标地址的端口
--to-ports 转发的端口
iptables匹配规则是从上到下进行匹配的
[root@web01 ~]# iptables -F
[root@web01 ~]# iptables -L
[root@master ~]# iptables -L -v -n -t nat --line-number
11、支持过滤的协议有哪些
TCP/UDP
ICMP ping协议
ALL 所有的协议
12、支持过滤的动作
常用:
ACCEPT 将数据包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链。
REJECT 拦阻该数据包,并传送数据包通知对方。
DROP 丢弃包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。
REDIRECT 将包重新导向到另一个端口,进行完此处理动作后,将会继续比对其它规则。
iptables 命令触发动作及各自的功能
触发动作 功 能
ACCEPT 允许数据包通过
DROP 丢弃数据包、不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,超时才会有反应。
REJECT 拒绝数据包通过、必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。
DNAT 目标地址转换
SNAT 源地址转换,解决内网用户用同一个公网地址上网的问题。
MASQUERADE 地址欺骗、是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。
REDIRECT 重定向、在本机做端口映射
LOG 将数据包信息记录 syslog 曰志在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
14、Iptables的模块
multiport模块
可以指定多个端口。
--dports
iprange模块
匹配多个IP或者网段
--src-range from[-to]: 源地址范围
--dst-range from[-to]: 目标地址范围
string模块
匹配数据包中包含那些字符串
--string pattern # 指定要匹配的字符串
--algo {bm|kmp} # 匹配的查询算法
time模块
根据时间匹配报文(使用的时间是UTC)。
--timestart hh:mm[:ss] # 开始时间
--timestop hh:mm[:ss] # 结束时间
--monthdays day[,day...] # 指定一个月的某一天
--weekdays day[,day...] # 指定周 还是 周天
icmp模块
--icmp-type {type[/code]|typename}
echo-request (8) 请求
echo-reply (0) 回应
connlimit模块
--connlimit-upto n # 如果现有连接数小于或等于 n 则 匹配
--connlimit-above n # 如果现有连接数大于n 则匹配
limit模块
# 针对 报文速率 进行限制。 秒、分钟、小时、天。
--limit rate[/second|/minute|/hour|/day] # 报文数量
--limit-burst number # 报文数量(默认:5)
1、用例及练习
练习1:请说明,禁止访问B网络该怎么实现
表:filter
链:INPUT
iptables -t filter -I INPUT -s 10.10.10.10 -p ALL -j DROP
练习2:实现禁止访问本机
iptables -t filter -I INPUT -p ALL -j DROP
练习3:禁止ping本机
[root@web01 ~]# iptables -t filter -I INPUT -p icmp -j REJECT
练习3:只允许访问192.168.230.7的22端口
iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -t filter -A INPUT -p tcp -j DROP
练习4:只允许192.168.230.61访问192.168.230.7的80端口
iptables -t filter -I INPUT -p tcp -s 192.168.230.61 --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
练习5:要求访问192.168.230.7的8080端口转发至80端口,且只允许192.168.230.61访问192.168.230.7的8080端口
iptables -t nat -I PREROUTING -p tcp -s 192.168.230.61 --dport 8080 -j REDIRECT --to-port 80
iptables -t filter -I INPUT -p tcp --dport 8080 -s 192.168.230.61 -j ACCEPT
iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT
[root@web01 ~]# iptables -t filter -R INPUT 2 -p tcp --dport 8080 -s 192.168.230.61 -j ACCEPT
Iptables的模块,对应联系
1、 multiport模块
可以指定多个端口。
--dports
练习6:只允许访问80, 443, 8080这三个端口,使用一条iptables规则
iptables -t filter -I INPUT -p tcp -m multiport --dports 80,443,8080,22 -j ACCEPT
iptabels -t filter -A INPUT -p tcp -j DROP
练习7:只允许192.168.230.61访问192.168.230.7的80和443端口
iptables -t filter -I INPUT -p tcp -s 192.168.230.61 -m multiport --dports 80,443-j ACCEPT
iptabels -t filter -A INPUT -p tcp -j DROP
2、 iprange模块
匹配多个IP或者网段
--src-range from[-to]: 源地址范围
--dst-range from[-to]: 目标地址范围
练习8:禁止192.168.230.0/24网段的机器访问
iptables -t filter -I INPUT -p tcp -m iprange --src-range 192.168.230.1-192.168.230.254 -j DROP
练习9:只允许192.168.230.0/24网段的机器访问192.168.230.7的80端口
iptables -t filter -I INPUT -p tcp -m iprange --src-range 192.168.230.1-192.168.230.254 --dport 80 -j ACCEPT
iptables -t filter -A INPUT -p tcp -j DROP
4、string模块
匹配数据包中包含那些字符串
--string pattern # 指定要匹配的字符串
--algo {bm|kmp} # 匹配的查询算法
练习10 : 当数据包中包含 hello 字符的,全部不允许访问
[root@web01 hello]# yum install httpd -y
[root@web01 hello]# systemctl start httpd
[root@web01 ~]# echo "hello world" > /var/www/html/1.html
[root@web01 ~]# echo "你好 world" > /var/www/html/2.html
[root@web01 hello]# iptables -t filter -I OUTPUT -p tcp -m string --string "hello" --algo kmp -j DROP
练习11:当数据包中包含 China 字符的,全部允许访问,其他的不允许。
iptables -t filter -I OUTPUT -p tcp -m string --string "China" --algo kmp -j ACCEPT
iptables -t filter -A OUTPUT -p tcp -j DROP
5、time模块
根据时间匹配报文(使用的时间是UTC)。
--timestart hh:mm[:ss] # 开始时间
--timestop hh:mm[:ss] # 结束时间
--monthdays day[,day...] # 指定一个月的某一天
--weekdays day[,day...] # 指定周 还是 周天
练习12:要求早上8:30 —— 10:30之间不允许访问
[root@web01 ~]# iptables -t filter -I INPUT -p tcp --dport 80 -m time --timestart 6:30 --timestop 9:30 -j DROP
练习13:要求早上7:30 - 9:30 和 14:30 - 17:30之间不能访问,其他时段可以。
[root@web01 ~]# iptables -t filter -I INPUT -p tcp --dport 80 -m time --timestart 23:30 --timestop 1:30 -j DROP
[root@web01 ~]# iptables -t filter -I INPUT -p tcp --dport 80 -m time --timestart 6:30 --timestop 9:30 -j DROP
6、icmp模块
--icmp-type {type[/code]|typename}
echo-request (8) 请求
echo-reply (0) 回应
练习14:要求别人无法ping本机,但是本机可以ping别人
[root@web01 ~]# iptables -t filter -I INPUT -p icmp -m icmp --icmp-type echo-request -j DROP
练习15:要求本机可以ping百度,只有192.168.230.61可以ping本机
iptables -t filter -I INPUT -p icmp -m icmp --icmp-type echo-request -j DROP
iptabels -t filter -I INPUT -p icmp -s 192.168.230.61 -j ACCEPT
iptables -t filter -A INPUT -p icmp -j DROP
7、connlimit模块
--connlimit-upto n # 如果现有连接数小于或等于 n 则 匹配
--connlimit-above n # 如果现有连接数大于n 则匹配
练习16:只允许有2台机器同时链接本机
yum install telnet* -y
systemctl start telnet.socket
iptables -t filter -I INPUT -p tcp -m connlimit --connlimit-upto 2 -j ACCEPT
iptables -t filter -A INPUT -p tcp -j DROP
练习17:只允许有1台机器同时链接本机
yum install telnet* -y
systemctl start telnet.socket
iptables -t filter -I INPUT -p tcp -m connlimit --connlimit-upto 1 -j ACCEPT
iptables -t filter -A INPUT -p tcp -j DROP
8、limit模块
# 针对 报文速率 进行限制。 秒、分钟、小时、天。
--limit rate[/second|/minute|/hour|/day] # 报文数量
--limit-burst number # 报文数量(默认:5)
# 1.限速:限制传输的带宽在500k左右(500 * 1000 = 500000 / 1500 = 333 包)
[root@web01 ~]# iptables -t filter -I INPUT 1 -p tcp -m limit --limit 9000/s -j ACCEPT
[root@web01 ~]# iptables -t filter -A INPUT -p tcp -j DROP
# 2.允许10个数据报文快速通过,超过的数据报文 1/m
[root@web01 ~]# iptables -t filter -I INPUT -p icmp -m limit --limit-burst 10 --limit 1/m -j ACCEPT
[root@web01 ~]# iptables -t filter -A INPUT -p tcp -j DROP
# 3.限制每分钟接收10个icmp的数据报文,
[root@web01 ~]# iptables -t filter -I INPUT -p icmp -m limit --limit 10/m -j ACCEPT
[root@web01 ~]# iptables -t filter -A INPUT -p icmp -j DROP
# 案例
对所有的地址开放本机的tcp(80、22、8080-9090)端口的访问
允许对所有的地址开放本机的基于ICMP协议的数据包访问
其他未被允许的端口禁止访问
iptables -t filter -I INPUT -p tcp -m multiport --dport 80,22,8080:9090 -j ACCEPT
iptables -t filter -I INPUT -p icmp -j ACCEPT
iptables -t filter -A INPUT -j DROP
用例2
规则的查看与清除
使用 iptables 命令可以对具体的规则进行查看、添加、修改和删除
1) 查看规则
对规则的查看需要使用如下命令:
[root@liangxu ~]# iptables -nvL
各参数的含义为:
-L 表示查看当前表的所有规则,默认查看的是 filter 表,如果要查看 nat 表,可以加上 -t nat 参数。
-n 表示不对 IP 地址进行反查,加上这个参数显示速度将会加快。
-v 表示输出详细信息,包含通过该规则的数据包数量、总字节数以及相应的网络接口。
【例 1】查看规则。 首先需要使用 su 命令,切换当前用户到 root 用户。然后在终端页面输入命令如下:
[root@liangxu ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
复制代码
2) 添加规则
添加规则有两个参数分别是 -A 和 -I。其中 -A 是添加到规则的末尾;-I 可以插入到指定位置,没有指定位置的话默认插入到规则的首部。
【例 2】查看当前规则。首先需要使用 su 命令,切换当前用户到 root 用户,然后在终端页面输入命令如下:
[root@liangxu ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
【例 3】添加一条规则到尾部。 首先需要使用 su 命令,切换当前用户到 root 用户,然后在终端页面输入如下命令:
[root@liangxu ~]# iptables -A INPUT -s 192.168.1.5 -j DROP
[root@liangxu ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
6 DROP all -- 192.168.1.5 0.0.0.0/0
3) 修改规则
在修改规则时需要使用-R参数。
【例 4】把添加在第 6 行规则的 DROP 修改为 ACCEPT。首先需要使用 su 命令,切换当前用户到 root 用户,然后在终端页面输入如下命令:
[root@liangxu ~]# iptables -R INPUT 6 -s 194.168.1.5 -j ACCEPT
[root@liangxu ~]# iptables -nL --line-number
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
6 ACCEPT all -- 194.168.1.5 0.0.0.0/0
对比发现,第 6 行规则的 target 已修改为 ACCEPT。
4) 删除规则
删除规则有两种方法,但都必须使用 -D 参数。
【例 5】删除添加的第 6 行的规则。首先需要使用su命令,切换当前用户到 root 用户,然后在终端页面输入如下命令:
[root@liangxu ~]# iptables -D INPUT 6 -s 194.168.1.5 -j ACCEPT
或
[root@liangxu ~]# iptables -D INPUT 6
注意,有时需要删除的规则较长,删除时需要写一大串的代码,这样比较容易写错,这时可以先使用 -line-number 找出该条规则的行号,再通过行号删除规则。