四类防火墙:
基础类防火墙:
IDS类防火墙:入侵检测系统,
IPS类防火墙:入侵防御系统,
主动安全类:waf(web应用防火墙),daf(数据库应用·防火墙)
防火墙有软件和硬件:
- 硬件:
360网擎,天安信,绿盟科技
- 软件:
C6:防火墙管理工具iptables,内核态netfilter
C7:防火墙管理工具firewall(一般会装iptables),内核态netfilter
防火墙的四表五链:
- 四表:
1.raw:数据报文跟踪
2.mangle:数据报文修改
3.nat:地址转换
4.filter:数据报文过滤
- 五链:内核态netfilter中的五个接口
1.INPUT:数据入站
2.OUTPUT:数据出站
3.FORWARD:数据转发
4.PREROUTING:路由前
5.POSTROUTING:路由后
- 规则:
自定义规则--ACCEPT,DROP(优先级高)
默认规则--ACCEPT,ALLOW,拒绝等
表与链和规则的关系:
顺序:
- 规则循序:
自上而下依次匹配,匹配既停止
- 表顺序:
raw mangle nat filter
- 链顺序:
入站:PREROUTING INPUT
出站:OUTPUT POSTOUTING
转发:PREROUTING FORWARD POSTOUTING
表上所对应的链:(红色标识部分熟记)
将表和链顺序结合起来:
入站:把中间的一大部分理解为一个防火墙,入站数据进来先依次经过各个表的PREROUTING,然后经过路由选择,如果是本地的那么就往上走,要依次经过各个表的INPUT,到达本机应用程序
出站:出站数据依次经过各个表的OUTPUTING,然后再经过各个表的POSTROUTING
转发:先经过各个表的PREROUTING,然后再经过各个表的FORWARD链,再经过各个表的POSTROUTING
表与链和规则的关系:
liptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
表名:
-t 指定表名 (不使用-t指定默认匹配fliter表)
控制类型:选项和链名配合使用
选项:添加规则---A末尾追加 -I 开头插入
链名:五条链
条件:
通用匹配条件:-p 协议名 -s 原地址 -d 目的地址 -i 入站网卡 -o 出站网卡(可以多配合使用)
隐含匹配条件:-sport 源端口 -port 目的端口 -icmp-type ICMP类型
显式匹配条件:
多端口-m multiport --sport 源端口列表 -m multiport --dport 目的端口列表
IP范围匹配-m iprange --src-range IP范围
MAC地址匹配 -m mac --mac-source MAC地址
状态匹配 -m state --state
控制类型:
ACCEPT: 允许通过
DROP: 直接丢弃,不给出任何回应
REJECT: 拒绝通过,会给出提示
LOG: 记录日志信息,然后传给下一条规则继续匹配
SNAT: 修改数据包源地址
DNAT: 修改数据包目的地址
REDIRECT: 重定向
常用命令:
- 查看指定表的规则: iptables -t mangle -L
- 查看以数字的形式显示端口和地址信息: iptables -L -n
- 查看过滤数据包的数量: iptables -L -v
- 查看以行号显示: iptables -L --line-numbers
- 按行号删除指定链规则: iptables -D INPUT 1
- 清空当前filter表的链的所有规则: iptables -F
- 清空指定表的指定链的规则: iptables -t filter -F OUTPUT
- 清空防火墙所有规则: echo " " > /etc/sysconfig/iiptables
- 为指定的链设置默认规则: iptables -t filter -P OUTPUT ACCECT
- 查看端口和条件的对应关系: cat /etc/services
规则演示:
当原地址是192.168.66.11的数据报文的转发请求就拒绝:iptables -A FORWARD -s 192.168.1.11 -j PEJECT
当原地址是10.20.30.0/24的入站数据报文请求就丢弃:iptables -I INPUT -s 10.20.30.0/24 -j DROP
当协议是icmp的入站数据报文就丢弃: iptables -I INPUT -p icmp -j DROP
当入站网卡是eth1原地址是172.16.0.0网段的入站请求就丢弃: iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP
当原地址是4.0的时候目的端口是53udp协议的转发请求就接收:iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
自己能ping通别人,别人不能ping通自己:iptables -t filter -A INPUT -p icmp --icmp-type 0 -j ACCEPT(自己能ping通别人)
iptables -t filter -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -t filter -A INPUT -p icmp -j DROP(拒绝别人ping自己)
0级别(回显) 3级别(目标未知)
当端口为20,80,22,443的入站请求接收:iptables -A INPUT -m mulitport --dport 20,80,22,443 -j ACCEPT
将新发起连接的请求拒绝掉:iptables -I INPUT -p tcp --dport 21 -m state --state NEW -j REJECT
SNAT:把源地址伪装成公网IP
将源地址伪装成公网IP:iptables -t nat -A POSTROUTING -s 192.168.66.0/24 -o eth1 -j SNAT --to-source 10.10.10.11
实验前介绍:SNAT和DNAT
SNAT:在路由后改变发送过来的数据包的源地址为公网IP
DNAT:在路由前改变发送过来的数据包的目标地址为内网地址
SNAT和DNAT的区别:SNAT是直接访问公网地址;DNAT是访问路由器
1.模拟内网通过路由器访问公网:(SNAT)
- 实验介绍:模拟内网访问公网,服务器该如何配置
- 实验环境:三台机器:192.168.66.11;192.168.66.12,20.20.20.12;20.20.20.13
11主机把网关指向12机器,12机器开启路由转发,13配置web服务器
- 实验原理:
用A直接pingC是不通的,如果使用tcpdump -nA port 80抓包的话,会发现C可以抓到,但是A收不到返回信息
A指定网关到B的内网网卡,B的外网网卡正好是20.20,B把数据包转发给C,C把目标地址和源地址改变(S20.20.20.12;D192.168.66.11),但是C是公网不可能去指定网关到B的外网网卡,所以数据包回不去,为了解决这种情况,使用SNAT;A的数据包发送过来,路由器将源地址改变成C的网段的IP,这样公网就可以不需要配网关返回数据包了;因为公网不可能去配置网关,所以设置防火墙改变源地址IP
网关:访问局域网内没有的IP网址的时候,就交给和自己相同地址的网关处理,如果路由器里的另一张网卡是被访问的IP网段,那么就会把数据包发送
SNAT(源地址转换):在路由后改变发送过来的数据包的源地址为公网IP,这样公网客户端就可以将数据包返回,不需要配网关
- 防火墙设置:
iptables -t nat -A POSTROUTING -s 192.168.66.0/24 -o eth1 -j SNAT --to-source 20.20.20.12
指定192.168.66.0网段的IP,出口网卡是路由器的出站网卡在nat表的路由后,修改数据包源地址为20.20.20.12
2.模拟内网通过路由器访问公网:(SNAT)
- 实验环境:两台机器:192.168.66.11;192.168.66.12,NATdhcp获取
- 实验搭建:
11主机配置网关指定到192.168.66.12,添加DNS;12添加防火墙规则:iptables -t nat -A POSTROUTING -s 192.168.66.0/24 -o eth1 -j SNAT --to-source 192.168.157.128
- 测试:
外网通过路由器访问内网:(DNAT)
实验环境:三台机器:192.168.66.11;192.168.66.12,20.20.20.12;20.20.20.13
66.11主机是web服务器,66.12主机是路由器,20.13主机是公网客户
实验搭建:
66.11主机添加网关:echo "GATEWAY=192.168.66.12" >> /etc/sysconfig/network-scripts/ifcfg-eth0
66.12主机开启路由转发:vim /etc/sysctl.conf
66.12主机定义防火墙规则:iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 -j DNAT --to-destination 192.168.66.11
66.13主机下载apache:
实验结果:用公网的服务器curl web服务器、
端口映射:如果apache服务器的端口不是80了,那么些防火墙的规则的时候要
将apache的端口变成1234,vim /etc/httpd/conf/http
路由器编写防火墙规则:iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 -j DNAT --to-destination 192.168.66.11:1234
访问测试: