防火墙分类
硬件:
用途: 整个企业入口
三层路由: H3C 华为 Cisco(思科)
深信服
软件:
用途: 网站内部封ip
iptables 写入到Linux内核中以后服务docker
firewalld Centos7
云防墙
阿里云:安全组
名词
容器:瓶子罐子存放东西 表(table):存放链的容器链(chain):存放规则的容器规则(policy):准许或拒绝规则 | Netfilter | 表(tables) | 链(chains) | 规则(Policy) | | —- | —- | —- | —- | | 一栋楼 | 楼里的房子 | 房子里的柜子 | 柜子里衣服,摆放规则 | | iptables | nat/filter | | |
防火墙规则匹配流程
- 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
- 如果匹配上规则,即明确表示是阻止还是通过,数据包就不再向下匹配新的规则.
- 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
- 防火墙的默认规则是所有规则执行完才执行的。
表与链
四表五链
四表:filter表(**默认**) nat表 raw表 mangle表
nat表的功能一般在云服务器不能用 filter表可以
filter表
filter表 | 强调:主要和主机自身相关,真正负责主机防火墙功能的(过滤流入流出主机的数据包) filter表示iptables默认使用的表,这个表定义了三个链( chains ) 企业工作场景:主机防火墙 |
---|---|
INPUT | 负责过滤所有目标地址是本机地址的数据包通俗来说:就是过滤进入主机的数据包 |
FORWARD | 负责转发流经主机的数据包。起转发的作用,和NAT关系很大,后面会详细介绍LVS NAT模式, net.ipv4.ip_forward=0 |
OUTPUT | 处理所有源地址是本机地址的数据包 通俗的讲:就是处理从主机发出去的数据包 |
NAT表
NAT表 | 负责网络地址转换的,即来源与目的IP地址和port的转换。 应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换服务相关。 工作场景: 1.用于企业路由( zebra )或网关( iptables ),共享上网( POSTROUTING ) 2.做内部外部IP地址一对一映射( dmz),硬件防火墙映射IP到内部服务器,ftp服务( PREROUTING ) 3. WEB,单个端口的映射,直接映射80端口( PREROUTING ) 这个表定义了3个链,nat功能相当于网络的acl控制。和网络交换机acl类似。 |
---|---|
OUTPUT | 和主机放出去的数据包有关,改变主机发出数据包的目的地址。 |
PREROUTING | 在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等 就是收信时,根据规则重写收件人的地址。. 例如:把公网IP : xxx.xxx.xxx.xxx映射到局域网的xx.xx.xx.xx服务器.上。 如果是web服务,可以报80转换为局域网的服务器9000端口上 |
POSTROUTING | 在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址,源端口等 写好发件人的地址,要让家人回信时能够有地址可回。 例如。默认笔记本和虚拟机都是局域网地址,在出网的时候被路由器将源地址改为了公网地址。 生产应用:局域网共享上网。 |
perrouting 数据来之前
postrouting 数据离开的时候
安装和使用
安装
~]# yum install iptables iptables-services -y
启动
Centos7
~]# systemctl start iptables.service
~]# systemctl enable iptables.service
Centos6
~]# /etc/init.d/iptables.service
~]# chkconfig iptables on
命令参数
-n 不要吧ip端口转换成服务名 例如0.0.0.0/0 会自动转换成anywhere
-t 指定表(默认是filter表)
-I 添加规则(放在最前 写拒绝规则的时候使用)
-A append 添加规则(放在最后) 后面指定链(INPUT..)
-p 指定协议
--dport (dest)目标端口 指定端口后面需要指定协议 tcp/udp/icmp(ping)/all
-j 处理的方法(DROP|ACCEPT)或者REJECT
-D 删除规则
-s (source)指定源IP 范围 或者网段
--line-number 显示行号
-m multiport 可以添加多个端口
DROP 丢掉数据无返回信息
REJECT 丢掉数据返回信息
查看当前防火墙规则
~]# iptables -t nat -nL
~]# iptables -t filter -nL
~]# iptables -nL
Chain INPUT (policy ACCEPT) <---默认规则 放行
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
防火墙关闭后 如果使用iptables -nL查看 , iptables会自动开启
模块加载
modprobe ip_tables 是防火墙的核心模块,负责维护防火墙的规则表,通过这些规则,实现防火墙的核心功能。归纳起来,主要有三种功能:包过滤( filter ) NAT 以及包处理( mangle )
modprobe iptable_filter 防火墙数据包过滤模块,实现对数据包的过滤与放行功能
modprobe iptable_nat 防火墙数据包转发模块,用于对数据包进行修改,从而实现数据转发的目的
modprobe ip_conntrack 主要用于修改应用层协议控制包,无比重要的作用就是实现nat
modprobe ip_conntrack_ftp 与ftp服务nat映射相关的模块
modprobe ip_nat_ftp 与ftp 服务nat映射相关的模块
modprobe ipt_state 防火墙状态信息模块,在新版centos6系统中已经忽略此模块的加载
查看
~]# lsmod |egrep "nat|filter|ipt"
iptable_nat 12875 0
nf_nat_ipv4 14115 1 iptable_nat
nf_nat 26787 1 nf_nat_ipv4
ipt_REJECT 12541 2
nf_reject_ipv4 13373 1 ipt_REJECT
nf_conntrack 133053 4 nf_nat,nf_nat_ipv4,xt_conntrack,nf_conntrack_ipv4
iptable_filter 12810 1
ip_tables 27126 2 iptable_filter,iptable_nat
libcrc32c 12644 3 xfs,nf_nat,nf_conntrack
清空规则
iptables -Z 清空所有规则,不会处理默认规则
iptables -X 删除用户自定义的链
iptables -F 链的计数器清零(数据包计数器与数据包字节计数器)
删除规则
只删除某一个规则
查看规则的行号
~]# 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
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
1 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
删除第一行规则
~]# iptables -D INPUT 1
添加规则举例
拒绝规则写在前面
filter表
黑名单模式
实现只能通过内网访问22端口
iptables -A INPUT -p tcp ! -s 172.16.1.0/24 --dport 22 -j DROP
!
表示 不是172.16.1.0/24这个网段就拒绝
屏蔽端口
# 只能访问80 443 22
iptables -I INPUT -p tcp -m multiport ! --dport 80,443,22 -j DROP
# 屏蔽范围端口
iptables -I INPUT -p tcp -m muLtiport --dport 1024:2048 j DROP
测试是否成功 可以用 nc-kl 1025
然后另一台机器telnet
禁用某个IP
~]# iptables -I INPUT -p tcp -s 10.0.0.6 -j DROP
禁ping
iptables -I INPUT -p icmp -j DROP
ICMP 协议 是ping的协议
ping在其中的类型是8 所以命令中准确点可以加上—icmp-type 8
通过内核参数也可以禁ping
# 临时
~]# echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all
永久
~]# net.ipv4.icmp_echo_ignore_a11=1 写入到/etc/sysctl.conf
~]# sysct1 -P #生效
限制并发速率
--m limit
限制模块-m limit --1imit 10/minute
# 每分钟只能有10个数据包(单位可以是second/minute/hour)
白名单模式
只允许10网段通过
iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT 只允许10网段通过
iptables -P INPUT DROP # 修改默认规则为拒绝
nat表
共享上网
云服务器不能用 阿里云可以用NAT网关
需要把共享上网主机的内核转发模块打开net.ipv4.ip_forward=1
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 j SNAT --to-source 10.0.0.61
#修改的是POSTROUTING链 源ip是172.16.1. 0/24 经过防火墙处理修改为10.0.0.61
然后另一台主机网关修改为10.0.0.61的内网IP
端口转发
用户访问a机器的一个端口 转发到b机器的一个端口
iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9001 -j DNAT -- to-destination 172.16.1.7:22
访问10.0.0.61的9000端口转发到了172.16.1.7的22端口
规则的备份 及永久生效
永久生效
~]# iptables-save >/etc/sysconfig/iptables #启动默认找的配置文件
恢复
~]# iptables-restore </etc/sysconfig/iptables
备份
~]# iptables-save >>/root/rul
[root@web03 ~]# ll
total 8
-rw-------. 1 root root 1499 Jan 10 14:42 anaconda-ks.cfg
-rw-r--r-- 1 root root 472 May 14 10:55 rul
~]# cat rul
# Generated by iptables-save v1.4.21 on Tue May 14 10:55:43 2019
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [181:16663]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
# Completed on Tue May 14 10:55:46 2019
~]#
~]# iptables -X
~]# iptables -F
~]# iptables -Z
~]#
~]# iptables-restore </root/rul
~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT)
target prot opt source destination