防火墙基础概念
Netfilter/iptables 是unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具
iptables防火墙功能十分强大,使用非常灵活.可以对流入和流出服务的数据包进行很精细的控制
主要工作在OSI7层模型二,三 ,四层.可以对防火墙服务内核进行重新编译,可以支持7层防护(squid+iptables=waf)
防火墙工作流程
1. 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤
2. 如果匹配上规则,即明确表示是阻止还是通过,数据包就不再向下匹配新的规则
3. 如何规则中没有明确表明是阻止还是通过,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过
4. 防火墙的默认规则是所有规则执行完才执行
防火墙表
防火墙进行防护的策略维度 4个维度
filter表
防火墙使用的默认表。可以实现对数据包过滤处理
表下面含有的链:
INPUT:对访问进入防火墙服务的流量进行管理控制 外面人 -INPUT-> 房子(防火墙)
FORWARD:对访问经过防火墙流量进行管理控制 外面人 - 房子(FORWARD) - 后花园(架构中内部主机) nat配合
OUTPUT:对内部访问外部流量进行管理控制 房子(人) -OUTPUT-> 外面世界
nat表
可以将访问目标或源信息进行转换(映射)
PREROUTING:在进行数据包路由转发之前,对数据包里面目标地址(IP)或者目标端口进行转换
POSTROUTING:在进行数据包路由转发之后,对数据包里面源地址(IP)或者源端口进行转换
mangle表
可以专门用于改写数据包信息(此表用处较少,可以忽略不计)
raw表
可以去除一定的信息(此表用处较少,可以忽略不计)
防火墙配置命令
iptables -t 表信息 -p 链信息 具体规则信息
需求01:禁止某个服务不要被外网访问
```
iptables -t filter -A INPUT -p tcp --dport 80 -j DROP
```
需求02:禁止指定地址可以访问,其余地址不能访问
```
iptables -t filter -I INPUT -s 10.0.0.1 -p tcp --dport 80 -j DROP
需求03:如何对网段信息进行配置?
```
iptables -t filter -I INPUT -s 10.0.0.0/24 -p tcp --dport 80 -j DROP
```
需求04:只允许指定网段可连入;只允许10.0.0.0/24网段里面的主机可以访问
```
iptables -t filter -A INPUT ! -s 10.0.0.0/24 -p tcp --dport 23 -j DROP
```
需求05:多端口访问策略配置
- **连续多端口配置 22-80**
```
iptables -A INPUT -s 10.0.0.10 -p tcp --dport 22:80 -j ACCEPT
```
- **间隔多端口配置 22 24 26 80**
```
iptables -A INPUT -m multiport -s 10.0.0.10 -p tcp --dport 22,24,26,80 -j ACCEPT
```
需求06:实现访问测试禁ping功能
```
# 方式一: 对ICMP请求的流量进行阻止 实现禁ping
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
# 方式二: 对ICMP响应的流量进行阻止 实现禁ping
iptables -A OUTPUT -p icmp --icmp-type 0 -j DROP
# 简单配置方法:
iptables -A INPUT -p icmp --icmp-type any -j DROP
```
需求07:设置网络限制策略(限制数据传输频率)
-m limit
--limit n/(second/minute/hour) : 指定单位时间内可以接收或输出多少个数据包
--limit-burst n : 指定达到策略限制标准
```
iptables -I INPUT -s 10.0.0.7 -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT
iptables -I INPUT 2 -s 10.0.0.7 -p icmp --icmp-type 8 -j DROP
命令示例
第一个步骤:对内网主机设置内网网关
```
# tail -2 /etc/sysconfig/network-scripts/ifcfg-eth1
GATEWAY=172.16.1.61
DNS1=223.5.5.5
ifdown eth1 && ifup eth1
```
第二个步骤:在防火墙服务器上开启路由转发功能
```
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
```
第三个步骤:配置NAT地址映射功能
```shell
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.61
需求09:如何实现外网主机访问端口映射
A主机 --- (10.0.0.61)防火墙(172.16.1.61) ---- 内部服务器(172.16.1.8:22)
D:10.0.0.61:9000 --> 172.16.1.8:22
第一个步骤:在防火墙服务器上开启路由转发功能
```shell
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
```
第二个步骤:在防火墙服务器上设置端口或地址映射功能
```
iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.8:22
示例2
防火墙自定义链
iptables -N syn-flood
# 创建一个syn-flood自定义链
iptables -A INPUT -i eth0 -syn -j syn-flood
# 将INPUT链中抓取的syn数据流量都放入到syn-flood自定义链中
iptables -A syn-flood -m limit -limit 5000/s -limit-burst 200 -j RETURN
# 一旦获取到流量大于每秒5000,并发大于200时,就执行下一条规则
iptables -A syn-flood -j DROP
# 丢弃syn-flood链上的数据
说明:自定义链避免syn的泛洪攻击
什么是自定义链:
iptables -N port-info
iptables -A port-info -p tcp --dport 8080 -j ACCEPT
iptables -A INPUT -s 10.0.0.0/24 -j port-info
iptables -R INPUT -s 11.0.0.0/8 -j port-info
iptables -A INPUT -s 192.168.1.0/24 -j port-info