iptables防火墙概述介绍
概念: 防火墙将不安全的网络流量信息进行隔离
实现: 硬件(思科 华为) 软件(iptable firewalld)
准备:
1) 网络知识 OSI (2(mac) 3(IP) 4(port))
2) 名词概念 什么是容器 iptables防护墙服务组成
防火墙服务(容器) --- 表概念
防火墙服务表(容器) --- 链概念
防火墙链(容器) --- 规则
配置防火墙: 开启防护墙服务 --- 指定表 --- 指定链 --- 指定规则
表的概念 4张表 filter(过滤) NAT(映射/转发) mangle(流量数据包进行标记)
raw(取消标记)
链的概念 5个链 INPUT FORWARD OUTPUT PREROUTING POSTROUTING OUTPUT INPUT FORWARD OUTPUT PREROUTING POSTROUTING
PREROUTING OUTPUT
vlan 虚拟局域网
sw 01 - 10 vlan10 hostA data数据包 --> 01 sw vlan10 --> data数据包+tag:10
sw 11 - 21 vlan20
iptables防火墙工作原理
基础工作原理:
1. 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
2. 如果匹配上规则,即明确表示是阻止还是通过,数据包就不再向下匹配新的规则。
3. 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
4. 防火墙的默认规则是所有规则执行完才执行的。
iptables表和链关系详细说明
filter表: 真正起到防火墙功能
INPUT链: 流量在进入时进行访问控制
OUTPUT链: 流量在出去是进行访问控制
forward链: 流量是否可以经过防火墙
nat表: 实现访问映射/流量转发 实现内网访问外网/外网访问映射到指定内网主机
准备工作:
01. 安装部署iptables服务
yum install -y iptables-services
02. 查看一些默认iptables配置策略
iptables -L -n
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
[root@firewall-server ~]# iptables -nL -v
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
860 1379K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
2 104 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
4 381 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 754 packets, 108K bytes)
pkts bytes target prot opt in out source destination
03. iptable初始化操作: 清除操作
iptables -F
iptables -X
iptables -Z
练习01:
阻止任意用户访问22端口 -- INPUT
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP
阻止任意用户访问22端口 -- OUTPUT
iptables -t filter -A OUTPUT -p tcp --sport 22 -j DROP
练习02:
允许10.0.0.1主机访问22端口,其他网段,其他主机不能访问 -- INPUT
iptables -A INPUT -s 10.0.0.1 -d 10.0.0.81 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
允许10.0.0.1主机访问22端口,其他网段,其他主机不能访问 -- OUTPUT
iptables -A OUTPUT -d 10.0.0.1 -s 10.0.0.81 -p tcp --sport 22 -j ACCEPT
iptables -A OUTPUT -d 10.0.0.0/24 -p tcp --sport 22 -j DROP
练习03:
允许所有通过eth0流量访问22端口, 拒绝通过eth1接口访问22端口 --INPUT链
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth1 -p tcp --dport 22 -j DROP
允许所有通过eth0流量访问22端口, 拒绝通过eth1接口访问22端口 --OUTPUT链
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -j ACCEPT
iptables -A OUTPUT -o eth1 -p tcp --sport 22 -j DROP
练习04:
除了10.0.0.1这个地址可以访问22端口,其余所有地址都不能通过eth0端口访问22端口 ---INPUT
方法一: 做取反操作 --- 默认策略是允许
iptables -A INPUT ! -s 10.0.0.1 -i eth0 -p tcp --dport 22 -j DROP
方法二: 修改默认策略
iptables -A INPUT -s 10.0.0.1 -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP
iptables -t 表 -P 链 动作
插入指定规则信息
iptables -I INPUT 3 -s 10.0.0.0/24 -i eth0 -p tcp --dport 24 -j ACCEPT
显示规则序号信息
iptables -nL --line-number
删除指定规则信息:
iptables -D INPUT 2
修改指定规则信息
iptables -R INPUT 2 -s 10.0.0.0/24 -i eth0 -p tcp --dport 24
练习题: 05
如何阻止用户访问防火墙服务器的多个端口
连续的多个端口 22-80
iptables -A INPUT -s 10.0.0.100 -p tcp --dport 22:80 -j DROP
不连续的多个端口 22,80,3306
iptables -A INPUT -s 10.0.0.100 -m multiport -p tcp --dport 23,25,27,80 -j DROP -
练习题: 06
实现主机访问禁ping
icmp协议: icmp数据包分类
type 8: 表示ping包请求流量
type 0: 表示ping包响应流量
别人访问防火墙服务器
主机X -icmp type 8-> 阻止 防火墙服务器
iptables -I INPUT -s 10.0.0.31 -p icmp --icmp-type 8 -j DROP icmp请求流量做阻止
主机x -icmp type 0-> 阻止 防火墙服务器
iptables -I OUTPUT -d 10.0.0.31 -p icmp --icmp-type 0 -j DROP icmp响应流量做阻止
防火墙服务器不能ping其他主机
防火墙 -icmp type 8-> 其他主机
iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP
防火墙 <-icmp type 0- 其他主机
iptables -A INPUT -p icmp --icmp-type 0 -j DROP
在一个INPUT 阻止进入 0 和 8 流量
iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP
练习题:07
利用防火墙限制数据包数量 == 网络流量限速
-m limit --limit n/{second/minute/hour} 一定时间内可以产生传输多少个数据包
--limit-burst [n] 到达阈值之后进行限速
iptables -A INPUT -s 10.0.0.31 -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT
iptables -P INPUT DROP
企业实际配置过程
第一个里程: 确认filter表中所有链默认策略
链上默认规则为允许: 配置了黑名单功能 逛公园(谁不能进公园)
连上默认规则为阻止: 配置了白名单功能 看电影(买票) *
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
第二个里程: 按照流程配置防火墙规则信息(INPUT链配置)
iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j ACCEPT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
设置换回接口可以进行通讯
逻辑接口: loopback
01. 系统中作用: 可以自己ping自己网卡地址
02. 在网络环境: 可以作为管理接口进行远程连接使用
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT 不用配置
允许访问的白名单主机地址信息
iptables -A INPUT -s 124.43.62.96/27 -p all -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
第三个里程: 保存配置信息
防火墙配置说明:
iptable命令配置防火墙策略信息时, 是临时配置, 防火墙服务重启或者系统重启, 所有配置失效
如何永久保留配置信息:
方法一: centos6
/etc/init.d/iptables save
方法二:
iptables-save > /etc/sysconfig/iptables
方法三:
直接编写配置文件
/etc/sysconfig/iptables
防火墙NAT表配置方法
prerouting: 可以实现外网用户访问内网主机 跳板机+vpn
postrouting: 可以实现内网主机访问外网
实践: 实现内网主机访问外网
第一个里程: 修改内网网卡网关信息
cat /etc/sysconfig/network-scripts/ifcfg-eth1
GATEWAY=172.16.1.81
DNS1=223.5.5.5
确保防火墙可以允许内网主机ping网关测试
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
第二个里程: 开启服务器路由转发功能 ???
echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf
sysctl -p /etc/sysctl.conf
第三个里程: 配置防火墙postrouting链 == 完成了地址转换功能 将私网地址转换为公网地址 NAT
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.81
命令 表 链 要映射源地址 在哪做映射 做什么映射 映射什么地址
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE --- 外网接口地址不固定时
第四个里程: 配置FORWARD链信息
iptables -A FORWARD -i eth1 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth0 -s 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -i eth0 -d 172.16.1.0/24 -j ACCEPT
iptables -A FORWARD -o eth1 -d 172.16.1.0/24 -j ACCEPT
实践: 实现外网主机访问内网服务器
配置防火墙nat中prerouting链规则
iptables -t nat -A PREROUTING -d 10.0.0.81 -i eth0 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.31:22
A 服务器 <-01- 主机01(肉鸡)
<-02- 主机02(肉鸡) 攻击者A DDOS
<-03- 主机03(肉鸡)
iptables防火墙自定义链配置 == 变量功能
iptables -N syn-flood --- 创建自定义链 == 创建一个变量 syn-flood
iptables -A syn-flood -m limit -limit 5000/s -limit-burst 200 -j RETURN --- 创建自定义链规则 === 设置变量的值
iptables -A syn-flood -j DROP
iptables -A INPUT -i eth0 -syn -j syn-flood --- 调用自定义链 == 调用变量
iptables -A INPUT -i eth0 -syn -m limit -limit 5000/s -limit-burst 200 -j RETURN
iptables -A INPUT -i eth0 -syn -j DROP
网络: 控制syn泛洪攻击
A 攻击者 --01 syn01 --> B(服务器)
<-02 syn ack--
03 不发出 syn_rcvd
--01 syn02 -->
<-02 syn ack--
03 不发出 syn_rcvd
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链上的数据
自定义链实际作用:
防火墙服务器: 8080:8090
允许 172.16.1.0/24 网段访问 iptables -A INPUT -s 172.16.1.0/24 -p tcp --dport 8080 -j ACCEPT
允许 172.17.1.0/24 网段访问 iptables -A INPUT -s 172.17.1.0/24 -p tcp --dport 8080 -j ACCEPT
允许 172.18.1.0/24 网段访问 iptables -A INPUT -s 172.18.1.0/24 -p tcp --dport 8080 -j ACCEPT
...
允许 172.100.1.0/24 网段访问
创建自定义链:
iptables -N oldboy
设置自定义链规则:
iptables -A oldboy -p tcp --dport 8080 -j ACCEPT
调整自定义链规则
iptables -R oldboy 1 -p tcp --dport 8080:8090 -j ACCEPT
调用自定义链:
iptables -A INPUT -s 172.16.1.0/24 -j oldboy
iptables -A INPUT -s 172.17.1.0/24 -j oldboy
iptables -A INPUT -s 172.18.1.0/24 -j oldboy
iptables命令常用参数说明
查询参数
--list -L [chain [rulenum]] List the rules in a chain or all chains
列出链上规则配置信息(默认查看filter表上信息)
--table -t table table to manipulate (default: `filter')
指定操作处理哪张表 默认处理 filter表
--verbose -v verbose mode
显示详细规则配置信息
--numeric -n numeric output of addresses and ports
查询信息中 地址和端口以数字形式显示
--line-numbers print line numbers when listing
输出规则行号信息
清除参数:
--flush -F [chain] Delete all rules in chain or all chains
清除链上所有规则信息
--zero -Z [chain [rulenum]] Zero counters in chain or all chains
清除计数器信息(排查)
pkts: 匹配了几个包 5个包 每个包1500字节
bytes: 匹配数据包总共尺寸/访问流量 5*1500字节
-X [chain] Delete a user-defined chain
删除用户自定义链 ???
添加规则参数:
--append -A chain Append to chain
指定规则添加到哪个链上
--insert -I chain [rulenum] Insert in chain as rulenum (default 1=first)
在指定链上插入规则(默认插入到第一条规则之上)
--protocol -p proto protocol: by number or name, eg. `tcp'
指定规则匹配的协议: tcp udp icmp ???
--dport 端口 规则匹配的目标端口信息
--sport 端口 规则匹配的源端口信息
--source -s address[/mask][...] source specification
指定规则匹配的源地址信息
--destination -d address[/mask][...] destination specification
指定规则匹配的目标地址信息
--in-interface -i input name[+] network interface name ([+] for wildcard)
根据进入流量,在网卡进行规则配置
--out-interface -o output name[+] network interface name ([+] for wildcard)
根据流出流量,在网卡进行规则配置
--jump -j target target for rule (may load target extension)
指定处理策略动作: ACCEPT * DROP * REJECT
删除指定规则:
--delete -D chain Delete matching rule from chain
删除指定规则信息
修改默认策略:
--policy -P chain target Change policy on chain to target
修改指定链上默认策略
修改指定策略:
--replace -R chain rulenum Replace rule rulenum (1 = first) in chain
修改指定规则策略
扩展参数信息
--match -m match extended match (may load extension)
可以加上扩展匹配信息
策略处理方法:
ACCEPT 允许接收
DROP 丢弃 * 更安全
REJECT 拒绝