任务一、Linux防火墙Iptables基础
【任务描述】
本实验任务基于个人主机操作环境,主要完成以下内容:
了解Iptables的基本概念与相应基础知识,熟悉使用语法。
Iptables规则的增删改查的简单使用。
通过完成本实验任务,要求学生了解iptables的基础概念,掌握使用语法,会进行简单规则的增,删,改,查;为完成后续防火墙实验任务奠定坚实的基础。
【实验目标】
了解IPtables的基本概念与基础知识,熟悉使用语法。
会进行简单规则的增删查。
【实验工具】
- iptables
【操作步骤】
1、防火墙一些概念
从防火墙作用范围讲,防火墙可以大体分为主机防火墙和网络防火墙。
主机防火墙:作用于单个机算机系统,例如个人电脑上windows自带的防火墙,linux系统上的iptables。
网络防火墙:往往处于网络入口或边缘,对企业网络入口进行防护,服务范围为整个企业的内部网络。中小企业可以使用一台x86服务器运用linux的iptables搭建功能强大的网络防火墙。
网络防火墙和主机防火墙在企业网络架构中所处的网络位置不一样,它俩的结合能使企业网络更安全。
从产品形态讲,防火墙可以分为硬件防火墙和软件防火墙。
硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。
下面说说本实验的重点,Linux iptables。
iptables其实它并不是真正的防火墙,我们可以理解它为一个命令行工具,位于用户空间,我们用这个工具操作“安全框架”。netfilter是防火墙真正的安全框架(framework),netfilter位于内核空间。
netfilter/iptables(下文中简称为iptables)组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。
Netfilter是Linux操作系统内核的一个数据包处理模块,主要有如下功能:
网络地址转换(NAT)
数据包内容修改
包过滤防火墙
2、Iptables基础
Iptables有表、链、规则的概念,规则应用于链中, 链必须属于表,iptables默认的链可以属于多个表,每张表可以有多个链,可以在表中自定义链。
Iptables按照规则(rules)来处理数据包,规则其实就是预定义的条件。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、源端口、目的端口、协议等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
表的概念
iptables为我们提供了如下规则的分类,或者说,iptables为我们提供了如下“表”
filter表:负责包过滤功能,防火墙
nat表:网络地址转换功能
mangle表:拆解报文,做出修改,并重新封装数据包的功能
raw表:关闭nat表上启用的连接追踪机制
链的概念
iptables为我们提供了如下默认链
PREROUTING:路由前
INPUT:输入队列
FORWARD:转发队列
OUTPUT:输出队列
POSTROUTING:路由后 iptables为我们提供了如下默认链
PREROUTING:路由前
INPUT:输入队列
FORWARD:转发队列
OUTPUT:输出队列
POSTROUTING:路由后
表和链的对应关系:
raw表对应:PREROUTING, OUTPUT链
mangle表对应:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING链
nat表对应:PREROUTING, OUTPUT, POSTROUTING,INPUT链
filter表对应:INPUT, FORWARD, OUTPUT链
同一链在不同表中的执行优先级次序(由高而低):
raw --> mangle --> nat --> filter
数据包经过iptables防火墙的处理流程
3、Iptables使用语法
Centos7下可用firewalld和iptables两种防火墙管理方式,实验中使用iptables。
基本语法格式:
iptables [-t table] SUBCOMMAND chain [matches..] [target]
-t tables:指明表,默认为filter表, 包括raw, mangle, nat表等;
SUBCOMMAND:子命令
链管理:
iptables -N CHAIN-NAME 新增一条自定义链;
iptables -X CHAIN-NAME 删除自定义的空链,先清除规则,才能删除链;
iptables -E CHAIN-NAME CHAIN-NEW-NAME 重命名自定义链,但要求是未被引用的链;
iptables -P {PREROUTING | INPUT | FORWARD | OUTPUT | POSTROUTING} {DROP| ACCEPT | REJECT} 设置链的默认策略;
规则管理:
-A:追加规则,默认追加在最后一个;
-I:插入规则,默认插入为第一个;
-D:删除规则,两种格式:指定规则或指定规则的序列号;
- rule specification
- rule number
-R:替换指定的规则;
-F:清空规则表;
-Z:给iptables计数器置0;
iptables的每条规则,都有两个计数器
- 此规则匹配到的所有的packets次数;
- 此规则匹配到的所有packets大小之和;
-S:列出指定表上的规则,默认为所有表的规则,类似于iptables-save,可用于保存规则;
保存规则:
# iptables -S > /etc/sysconfig/iptables
或
# iptables-save > /etc/sysconfig/iptables
恢复规则:
# iptables-restore < /etc/sysconfig/iptables
规则查看:
-L:列出规则;
-n:以数字格式显示地址和端口;
-v:显示详细信息;支持-vv,-vvv更详细信息;
-x:显示精确值;
--line-numbers:显示链上的规则的编号;
常用组合:-nvL,但L要写在后面
4、登陆实验机
登陆帐号:root,登陆密码:Simplexue123
5、Iptables简单使用
使用man手册
# man iptables
查看filter表规则,iptables默认使用filter表
# iptables -t filter -nvL
添加规则,允许所有网络访问本机
# iptables -A INPUT -j ACCEPT
注意:在不指定源、目的地址,源、目的IP,协议的情况下为全部IP、端口、协议
为FORWARD链添加默认规则
# iptables -P FORWARD DROP
# iptables -P FORWARD ACCEPT
添加自定链test
# iptables -N test
删除自定链test
# iptables -X test
任务二、Iptables主机防火墙和审计
【任务描述】
本实验任务基于个人主机操作环境,主要完成以下内容:
iptables的常用语法的实际操作。
进行Iptables的特殊参数,自定义策略的的操作。
启用Iptables日志记录的功能,配置相应的策略,进行操作,验证。
通过完成本实验任务,要求学生掌握Iptables主机防火墙的常用配置已审计策略,具体包括:Iptables的常用语法,状态监测,特殊参数,自定义策略的使用,以及启用日志记录的功能进行相应的策略配置,具备更为夯石的防火墙配置使主机安全的能力。
【实验目标】
掌握Iptables工作中的常用策略。
掌握审计策略。
通过Iptables工作中的常用策略以及审计策略的学习和使用,具备丰富的主机安全防护的能力。
【实验工具】
- Iptables
【操作步骤】
1、常用语法
对于任何协议及协议的扩展,通用匹配都可以直接使用。
(1)匹配指定协议。
-p,–protocol
例: iptables -A INPUT -p tcp -j ACCEPT
说明匹配指定的协议,指定协议的形式有以下几种:
a、 名字不分大小写,但必须是在/etc/protocols中定义的;
b、 可以使用协议相应的整数值。例如,ICMP的值是1,TCP是6,UDP是17;
c、 不指定为ALL,相应数值是,要注意这只代表匹配TCP、UDP、ICMP,而不是/etc/protocols中定义的所有协议;
d、 可以是协议列表,以英文逗号为分隔符,如:udp,tcp;
e、 可以在协议前加英文的感叹号表示取反,注意有空格,如:--protocol ! tcp表示非TCP协议,也就是UDP和ICMP。可以看出这个取反的范围只是TCP、UDP和ICMP。
(2)以IP源地址匹配包。
-s,–src,–source
例: iptables -A INPUT -s 192.168.0.1 -j ACCEPT
说明以IP源地址匹配包。地址的形式如下:
a、 单个地址,如192.168.0.1,也可写成192.168.0.1/255.255.255.255或192.168.0.1/32;
b、 网络,如192.168.0.0/24,或192.168.0.0/255.255.255.0;
c、 在地址前加英文感叹号表示取反,注意空格,如--source ! 192.168.0.0/24表示除此地址外的所有地址;
d、 缺省是所有地址。
(3)以IP目的地址匹配包。
-d,–dst,–destination
例: iptables -A INPUT -d 192.168.0.1 -j ACCEPT
说明以IP目的地址匹配包。地址的形式和–source完全一样。
(4)以包进入本地使用的网络接口匹配包。
-i
例: iptables -A INPUT -i eth0 -j ACCEPT
说明以包进入本地所使用的网络接口来匹配包。要注意这个匹配操作只能用于INPUT,FORWARD和PREROUTING这三个链,用在其他任何地方会提示错误信息。指定接口有以下方法:
a、 指定接口名称,如:eth0、ppp0等;
b、 使用通配符,即英文加号,它代表字符数字串。若直接用一个加号,即iptables -A INPUT -i +表示匹配所有的包,而不考虑使用哪个接口。通配符还可以放在某一类接口的后面,如:eth+表示匹配所有从Ethernet接口进入的包;
c、 在接口前加英文感叹号表示取反,如:-i ! eth0意思是匹配来自除eth0外的所有包。
(5)以包离开本地所使用的网络接口来匹配包。
-o
例: iptables -A OUTPUT -o eth0 -j ACCEPT
说明以包离开本地所使用的网络接口来匹配包。要注意这个匹配操作只能用于OUTPUT,FORWARD和POSTROUTING这三个链,用在其他任何地方会提示错误信息。
(6)匹配通信源端口。
–source-port,–sport
例: iptables -A INPUT -p tcp --sport 1111
说明当通信协议为TCP或UDP时,可以指定匹配的源端口,但必须与匹配协议相结合使用。
(7)匹配通信源端口。
– destination-port,–dport
例: iptables -A INPUT -p tcp --dport 80
说明当通信协议为TCP或UDP时,可以指定匹配的目的端口,但必须与匹配协议相结合使用。
2、状态检测
-m state --state {NEW,ESTATBLISHED,INVALID,RELATED},指定检测那种状态
- (1)NEW: 该包想要建立一个新的连接(重新连接或连接重定向)。
- (2)RELATED: 该包是属于某个已经建立的连接所建立的新连接。
- (3)ESTABLISHED: 该包属于某个已经建立的连接。
- (4)INVALID: 该包不匹配于任何连接,通常这些包被DROP。
例: iptables -A INPUT -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
3、特殊参数
–icmp-type 指定ICMP的类型编号
例: iptables -A INPUT -p icmp --icmp-type 8
-m multiport 指定多端口号
- –sport
- –dport
- –ports
例: iptables -A INPUT -p tcp -m multiport --dport 22,53,80,110
-m iprange 指定IP段
- –src-range ip-ip
- –dst-range ip-ip
例: iptables -A INPUT -m iprange --src-range 192.168.1.2-192.168.1.7 -j DROP
-m connlimit 连接限定
–comlimit-above # 限定大连接个数
例: iptables -A INPUT -p tcp --syn --dport 22 -m connlimit --connlimit-above 100 -j REJECT
-m limit 现在连接速率,也就是限定匹配数据包的个数
- –limit # 指定速率
- –limit-burst # 峰值速率,最大限定
例: iptables -A INPUT -m limit --limit-burst 6
-m string 按字符串限定
–algo bm|kmp # 指定算法bm或kmp
–string “STRING” # 指定字符串本身
例: iptables -A OUTPUT -m string --string “tudou.com” --algo bm -j DROP
4、iptables常用的操作语法
功能 | 参数 | 语法 | 说明 |
---|---|---|---|
添加规则 | A | iptables -A INPUT -p tcp -j ACCEPT | 在INPUT链后加入允许所有TCP请求 |
删除规则 | -D | iptables -D INPUT -p tcp -j ACCEPT | 在INPUT链中删除对应规则 |
自定义链重命名 | -E | iptables -E A B | 将自定义链A重命名为B,原来的名字在前,新名字在后 |
清空规则 | -F | iptables -F INPUT | 清空INPUT链规则, 如果不加链名则是清除当前表所有规则 |
插入规则 | -I | iptables -I INPUT 1 -p tcp -j ACCEPT | 在INPUT链内的某个位置插入规则,如果序号为1或没有序号,规则会被插入到的头部 |
显示规则 | -L | iptables -L INPUT | 显示INPUT链的所有规则,如果没有指定链,则显示指定表中的所有链。精确输出可用-n和-v等参数 |
新建自定义链 | -N | iptables -N A | 在指定表新建链A,不可以同名 |
默认策略 | -P | iptables -P INPUT DROP | 指定INPUT链的默认策略为DROP, 可选策略ACCEPT、DROP、REJECT、REDIRECT |
替换规则 | -R | iptables -R INPUT 1 -p udp -j ACCETP | 替换INPUT链中的第1条策略 |
删除用户自定义链 | -X | iptables -X A | 删除指定表中的自定义链A |
计数器归零 | -Z | iptables -Z | 清空指定表下指定链(如未指定则认为所有链)的所有计数器归零 |
5、iptables日志记录
Linux下单独记录Iptables日志,编辑/etc/syslog.conf文件,加入一行
# echo “kern.warning /var/log/iptables.log” >>/etc/rsyslog.conf
重启rsyslog服务生效:
# systemctl restart rsyslog
例: 记录源为127.0.0.1为来的所有ICMP日志
(1) 配置iptables策略
# iptables -A INPUT -s 127.0.0.1 -p icmp -j LOG --log-prefix "iptables icmp-localhost"
(2) 验证规则
# ping -c 1 127.0.0.1
图中pkts有两个数据包匹配
(3) 查看日志
(4) 上例iptables日志字段解释(编号21后为未用到的字段)
Jan 12 18:24:05 [localhost] kernel: iptables icmp-localhost IN=lo OUT= MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 SRC=127.0.0.1 DST=127.0.0.1 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=8718 PROTO=ICMP TYPE=0 CODE=0 ID=9413 SEQ=1
编号 | 字段 | 说明 |
---|---|---|
1 | Jan 12 18:24:05 | 日期时间,由syslog生成 |
2 | localhost | 主机名称 |
3 | kernel | syslogd获取kernel产生的日志 |
4 | iptables icmp-localhost | 记录前缀,由用户指定—log-prefix “iptables icmp-localhost” |
5 | IN=lo | 数据包进入的接口,若为空表示本机产生 |
6 | OUT= | 数据包流出的接口,若为空表示本机产生 |
7 | MAC=00:00:00:00:00:00:00:00:00:00:00:00:08:00 | 前6段为源MAC, 后6段为目的MAC |
8 | 08:00 | 08:00 为上层协议代码,即表示IP协议 |
9 | SRC=127.0.0.1 | 源IP地址 |
10 | DST=127.0.0.1 | 目的IP地址 |
11 | LEN=84 | IP封包+承载数据的总长度(MTU) |
12 | TOS=0x00 | IP包头内的服务类型字段,能反应服务质量包括延迟、可靠性和拥塞等 |
13 | PREC=0x00 | 服务类型的优先级字段 |
14 | TTL=64 | IP数据包的生存时间 |
15 | ID=8718 | IP数据包标示 |
16 | PROTO=ICMP | 协议ICMP |
17 | TYPE=0 | ICMP类型 |
18 | CODE=0 | ICMP代码 |
19 | ID=9413 | ICMP ID |
20 | SEQ=1 | ICMP SEQ |
21 | DF | 表示不分段,此字段还可能为MF/FRAG |
22 | SPT | TCP或UDP中的源端口 |
23 | DPT | TCP或UDP中的目的端口 |
24 | LEN | 传输层协议头长度 |
25 | SEQ | TCP序列号 |
26 | ACK | TCP应答号 |
27 | WINDOWS | IP包头内的窗口大小 |
28 | RES | TCP-Flags中ECN bits的值 |
29 | CWR/ECE/URG/ACK/PSH/RST/SYN/FIN | TCP标志位 |
30 | URGP | 紧急指针起点 |
31 | OPT | IP或TCP选项 |
32 | INCOMPLETE | 不完整的数据包 |
33 | SPI | 当协议为AHESP时出现 |
34 | [ ] | 中括号出现在两个地方,在ICMP协议中作为协议头的递归使用;在数据包长度出现非法时用于指出数据实际长度 |
(5) 日志策略
a、 获取所有TCP日志
# iptables -A INPUT -p tcp -j LOG --log-prefix "iptables TCP"
b、 获取所有UDP日志
# iptables -A INPUT -p udp -j LOG --log-prefix "iptables UDP"
c、 获取ssh的日志
# iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "iptables SSH"
6、自定义策略
(1) 禁止ping 127.0.0.1
默认是通过的
# iptables -A INPUT -p icmp -j DROP
应用策略ping不通了,图中iptables规则也有流量匹配
(2) 状态为已连接的放行
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
(3) 只允许本机访问80
# iptables -A INPUT -p tcp --src 127.0.0.1 --dport 80 -j ACCEPT
应用策略后通过curl 127.0.0.1
匹配策略 (图中错误因为本机没有80服务)
(4) 利用扩展模块limit,可以实现DoS攻击防范
# iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
任务三、虚拟网络使用,SDN交换机Openvswitch与Linux namespace
【任务描述】
本实验在个人主机操作环境中虚拟网络的使用:openswitch与namespace,模拟多个网络设备,将不同类型的网络应用隔离。为下一任务搭建网络环境实验场景做环境准备。
通过完成本实验任务,要求学生掌握openswitch与namespace的使用,会构建虚拟网络环境。
【实验目标】
了解openswitch与namespace的概念。
掌控Linux虚拟网络设备的使用。
掌握SDN交换机openvswitch的安装与使用。
【实验工具】
- Openswitch
- ovs-vsctl(openvswitch软件提供)
- IP(包含ip link、ip netns、ip addr等)
- tcpdump
- ethtool
【操作步骤】
1、概述
(1)Open vSwitch
Open vSwitch(简称为 OVS)是由 Nicira Networks 主导的,运行在虚拟化平台(例如 KVM,Xen)上的虚拟交换机。在虚拟化平台上,OVS 可以为动态变化的端点提供 2 层交换功能,很好的控制虚拟网络中的访问策略、网络隔离、流量监控等等。
OVS 遵循 Apache 2.0 许可证, 能同时支持多种标准的管理接口和协议。OVS 也提供了对 OpenFlow 协议的支持,用户可以使用任何支持 OpenFlow 协议的控制器对 OVS 进行远程管理控制。
(2)网络名称空间netns
netns是在linux中提供网络虚拟化的一个项目,使用netns网络空间虚拟化可以在本地虚拟化出多个网络环境。netns可以让一台机器上模拟多个网络设备,是网络虚拟化的重要组成,将不同类型的网络应用隔离。
一个net namespace拥有独立的独立的网卡空间,路由表,ARP表,ip地址表,iptables等。
2、软件安装
(1)netns功能由系统网络配置工具iproute2提供,命令形式为ip netns
(2)openvswitch安装
# yum -y install openvswitch
(3) 启动openvswitch并设置自启
(4) 安装抓包工具tcpdump,网络配置工具bridge-utils
# yum -y install tcpdump bridge-utils
3、ip link使用
(1) 查看ip link帮助
# ip link help
(2) 新建网络接口
# ip link add link eth0 name eth0.10 type vlan id 10
# ip link add veth1 type veth peer name veth2
(3) 查看网络接口
# ip link show
# ip link show type veth
# ip link show type vlan
# ip -d link show type veth
# ip -d link show type vlan
# ethtool -S veth1
注: 实验中此处ID号可能不同
(4) 使接口UP
# ip link set eth0.10 up
# ip link set veth1 up
# ip link set veth2 up
(5) 删除接口
# ip link del dev eth0.10
# ip link del dev veth1
4、ip netns使用
(1) 查看ip netns帮助
# ip netns help
(2) 创建一个名为test的namespace
# ip netns add test
(3) 查看所有namespace
#ip netns list
或 ip netns
(4) 查看名为test的namespace
# ip netns exec test ip addr show
(5) 进入名为test的namespace,执行网络命令
# ip netns exec test bash
# route -n
# iptables -nvL
(6) 退出namespace
# exit
(7) 给test 添加接口tap1
# ip link add tap1 type dummy
# ip link set tap1 netns test
# ip netns exec test ip link show
(8) 启用tap1虚拟接口
# ip netns exec test ip link set tap1 up
(9) 给tap1虚拟接口配置IP
# ip netns exec test ip addr add dev tap1 192.168.0.1/24
(10) 删除test namespace
# ip netns del test
5、openvswitch使用
(1) 查看openvswitch安装的命令工具
(2) 添加网桥br0
# ovs-vsctl add-br br0
(3) 列出open vswitch中所有的网桥
# ovs-vsctl list-br
(4) 判断网桥是否存在
# ovs-vsctl br-exists br0
(5) 将网卡添加到网桥br0
# ip link add tap1 type dummy
# ovs-vsctl add-port br0 tap1
(6) 查看open vswitch的网络状态
# ovs-vsctl show
(7) 在网桥br0中新建openvswitch网口
# ovs-vsctl add-port br0 tap2 -- set interface tap2 type=internal
(8) 列出网桥br0中所有端口
# ovs-vsctl list-ports br0
(9) 列出所有连接到网卡tap2的网桥
# ovs-vsctl port-to-br tap2
(10) 删除网桥br0上的网口tap2
# ovs-vsctl del-port br0 tap2
(11) 设置网口tap1的vlan tag为10
# ovs-vsctl set port tap1 tag=10
(12) 查看网口tap1的属性
# ovs-vsctl list port tap1
(13) 从网桥br0删除网口tap1, 并从系统删除虚拟网口tap1
# ovs-vsctl del-port br0 tap1
# ip link del dev tap1
(14) 删除网桥br0
# ovs-vsctl del-br br0
任务四、搭建网络防火墙实验场景
【任务描述】
本实验任务在任务三操作完成的基础上,Linux下利用工具组搭建如网络拓扑所示的虚拟网络环境。
通过完成本实验任务,了解和掌握部分虚拟化网络软件的使用,利用虚拟交换机openvswitch和linux的netns(网络命名空间)模拟复杂的网络环境。
【实验目标】
掌握openswitch与netns的使用。
掌握利用openswitch与netns来模拟复杂网络环境。
【实验工具】
- ovs-vsctl(openvswitch软件提供)
- ip(包含ip link、ip netns、ip addr等)
- sysctl
【操作步骤】
1、实验网络拓扑
图4-1
2、环境搭建
利用openvswitch创建tag为10和11的两个接口,结全netns模拟内网1、内网2。
1、开启主机路由转发功能
\# echo “net.ipv4.ip_forward = ()” >> /etc/sysctl.conf
\# sysctl -p
\# sysctl -a | grep “ip_forward”
2、创建tag为10的内网1
\# ovs-vsctl add-br br0
\# ovs-vsctl () br0 tap1 tag=10 -- set interface tap1 type=internal
\# ip link show
\# ip netns add ns-tap1
\# ip link set dev tap1 netns ns-tap1
\# ip netns exec ns-tap1 ip link show
\# ip netns exec ns-tap1 ip link set dev lo up
\# ip netns exec ns-tap1 ip link set dev tap1 up
\# ip netns exec ns-tap1 ip addr add dev tap1 10.0.0.2/24
\# ip netns exec ns-tap1 ip route add default via 10.0.0.1
\# ip netns exec ns-tap1 ip addr show
\# ip netns exec ns-tap1 ip route show
3、创建tag为11的内网2,方法同上
4、查看网络内网1 与 内网2的连通性
\# ip netns
\# ovs-vsctl show
\# ip netns exec ns-tap1 ping -c 1 10.0.1.2
测试两个内网是不通的。
4、netns模拟器由器实现内网1与内网2互通
\# ovs-vsctl add-port br0 r1 tag=10 -- set interface r1 type=internal
\# ovs-vsctl add-port br0 r2 tag=11 -- set interface r2 type=internal
\# ip netns add router
\# ip link set dev r1 netns router
\# ip link set dev r2 netns router
\# ip netns exec router ip link set dev lo up
\# ip netns exec router ip link set dev r1 up
\# ip netns exec router ip link set dev r2 up
\# ip netns exec router ip addr add dev r1 10.0.0.1/24
\# ip netns exec router ip addr add dev r2 10.0.1.1/24
\# ip netns exec router ping -c 1 10.0.0.2
\# ip netns exec router ping -c 1 10.0.1.2
\# ip netns exec ns-tap1 ping -c 1 10.0.1.2
在路由器内ping两个内网都是通的,在内网1内ping内网2也是通的,实验环境搭建成功。
任务五 网络防火墙nat、防问控制实战
【任务描述】
本实验任务在任务四操作完成的基础上,主要完成以下内容:
了解iptables nat基础知识与常用配置,
进行网络防火墙访问控制的实战。
通过完成本实验任务,要求学生掌握企业中简单的iptables防火墙的应用。
【实验目标】
掌握iptables nat的基础知识与常用配置的操作。
掌握简单的网络防火墙的访问控制操作。
可以利用iptables加固企业网络。
【实验工具】
- iptables
- ip (包含ip link、ip netns、ip addr等)
【操作步骤】
1、iptables nat基础知识
nat表需要的三个链:
PREROUTING:在数据包到达防火墙时进行路由判断之前的规则,作用是是否改变目的地址或者目的端口;
POSTROUTING:在数据包离开防火墙时进行路由判断,是否要改变源地址、源端口等;
INPUT:改变访问目的为主机的数据包源地址;
OUTPUT:改变主机发出去的数据包目的地址;
动作选项:
REDIRECT: 将数据包重定向到其它或其它主机的某个端口;
SNAT: 源地址转换,改变数据包的源地址;
DNAT: 目的地址转换,改变数据包的目的地址;
MASQUERADE: ip智能伪装;
注意点:
PRERROUTING: DNAT、REDIRECT (路由之前)只支持-i,不支持-o。在作出路由之前,对目的地址进行修改;
POSTROUTING: SNAT、MASQUERADE (路由之后)只支持-o,不支持-i。在作出路由之后,对源地址进行修改;
OUTPUT: DNAT、REDIRECT (本机)DNAT和REDIRECT规则用来处理来自NAT主机的出站数据包;
INPUT: SNAT (本机)SNAT规则用来修改目的为本机的源地址;
2、nat常用配置
(1) 将源转换成路由器router的r2接口地址
\# ip netns exec router iptables -t nat -A POSTROUTING -o r2 -j MASQUERADE
\# ip netns exec ns-tap1 ping -c 1 10.0.1.2
\# ip netns exec router iptables -t nat -nvL
(2) 打开两个终端利用tcpdump抓包分析
a、# ip netns exec ns-tap1 ping -c 1 10.0.1.2
b、# ip netns exec ns-tap2 tcpdump -nei tap2
注意:b操作需要ctrl + alt + f2切换到新的视图操作,验证后ctrl + c中止抓包,按ctrl + alt + f1回到a视图继续下面的实验
(3) 配置SNAT
\# ip netns exec router iptables -t nat -F
\# ip netns exec router iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o r2 -j SNAT --to 10.0.1.1
\# ip netns exec ns-tap1 ping -c 1 10.0.1.2
\# ip netns exec router iptables -t nat -nvL
(4) 配置DNAT
\# ip netns exec router iptables -t nat -F
\# ip netns exec router iptables -t nat -I PREROUTING -i r1 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.2:80
\# ip netns exec ns-tap1 curl `http://10.0.1.1`
注: 因本实验机未安装80服务,所以curl
http://10.0.1.1
错误
(5) 重定向
\# ip netns exec router iptables -t nat -F
\# ip netns exec router iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 81
\# ip netns exec ns-tap1 curl `http://10.0.1.1`
3、网络防火墙
(1) 允许内网1访问内问2
\# ip netns exec router iptables -t nat -F
\# ip netns exec router iptables -F
\# ip netns exec router iptables -A FORWARD -s 10.0.0/24 -d 10.0.1.0/24 -j ACCEPT
\# ip netns exec router iptables -nvL
\# ip netns exec ns-tap1 ping -c 1 10.0.1.2
注:有数据包匹配说明规则生效
(2) 拒绝内网1访问内网2
\# ip netns exec router iptables -F
\# ip netns exec router iptables -A FORWARD -s 10.0.0/24 -d 10.0.1.0/24 -j DROP
\# ip netns exec ns-tap1 ping -c 1 10.0.1.2
(3) 拒绝内网1访问内网2的80服务
\# ip netns exec router iptables -F
\# ip netns exec router iptables -A FORWARD -s 10.0.0/24 -d 10.0.1.0/24 -p tcp --dport 80 -j DROP
注:上图中需要按ctrl+c结束
任务六、公有云中二层防火墙实现
【任务描述】
本实验任务在前五个实验掌握的基础上,主要完成以下内容:
利用前面学习到的虚拟化技术搭建复杂的网络实验场景;
进一步学习虚拟交换机openvwitch网络配置;
云计算中一种二层防火墙的实现;
利用ipset动态加载防火墙策略
巩固防火墙、虚拟网络知识
通过完成本实验任务,要求学生掌握企业公有云中二层防火墙实现的一种方法。可以控制同网段虚拟机间的通信,也可以防止用户随意修改IP或者MAC地址。
【实验目标】
利用虚拟化技术搭建复杂的网络实验场景
掌握云计算中一种二层防火墙的实验方法
进一步掌握iptables的使用
【实验工具】
- ovs-vsctl (openvswitch软件提供)
- IP (包含ip link、ip netns、ip addr等)
- brctl
- modprobe
- ipset
【操作步骤】
1、实验网络修改
(1) 实验拓扑
(2) 查看上个实验环境
# ovs-vsctl show
# ip netns
(3) 清空配置
# ovs-vsctl del-br br0
# ip netns del router
# ip netns del ns-tap1
# ip netns del ns-tap2
(4) 搭建实验环境
a、新建网桥br0
# ovs-vsctl add-br br0
b、配置内网1
# ip link add qvo-tap1 type veth peer name qvb-tap1
# ip link set qvb-tap1 up
# ip link set qvo-tap1 up
# brctl addbr qbr-tap1
# ip link set qbr-tap1 up
# brctl addif qbr-tap1 qvb-tap1
# ovs-vsctl add-port br0 qvo-tap1 tag=10
# ip link add tap1 type veth peer name tap11
# brctl addif qbr-tap1 tap11
# ip link set tap11 up
# ip netns add ns-tap1
# ip link set dev tap1 netns ns-tap1
# ip netns exec ns-tap1 ip link set dev lo up
# ip netns exec ns-tap1 ip link set dev tap1 up
# ip netns exec ns-tap1 ip addr add dev tap1 10.0.0.2/24
c、配置内网2
# ip link add qvo-tap2 type veth peer name qvb-tap2
# ip link set qvb-tap2 up
# ip link set qvo-tap2 up
# brctl addbr qbr-tap2
# ip link set qbr-tap2 up
# brctl addif qbr-tap2 qvb-tap2
# ovs-vsctl add-port br0 qvo-tap2 tag=10
# ip link add tap2 type veth peer name tap22
# brctl addif qbr-tap2 tap22
# ip link set tap22 up
# ip netns add ns-tap2
# ip link set dev tap2 netns ns-tap2
# ip netns exec ns-tap2 ip link set dev lo up
# ip netns exec ns-tap2 ip link set dev tap2 up
# ip netns exec ns-tap2 ip addr add dev tap2 10.0.0.3/24
d、测试二层同网段通信
# ip netns exec ns-tap1 ping -c 1 10.0.0.3
(5) 加载内核参数
# modprobe br_netfilter
# ls /proc/sys/net/bridge
# echo "net.bridge.bridge-nf-call-arptables = 1" >> /etc/sysctl.conf
# echo "net.bridge.bridge-nf-call-ip6tables = 1" >> /etc/sysctl.conf
# echo "net.bridge.bridge-nf-call-iptables = 1" >> /etc/sysctl.conf
# sysctl -p
# sysctl -a | egrep "bridge-nf-call-arptables|bridge-nf-call-iptables|bridge-nf-call-ip6tables"
(6) 二层防火墙配置
a、把FORWARD链所有流量导入自定义链
# iptables -N openvswitch-forward
# iptables -A FORWARD -j openvswitch-forward
b、添加内网1 in、out方向链表,将匹配到的physdev流量导入进出链表
# iptables -N openvswitch-i-tap1
# iptables -N openvswitch-o-tap1
# iptables -A openvswitch-forward -m physdev --physdev-out tap11 --physdev-is-bridged -j openvswitch-i-tap1
# iptables -A openvswitch-forward -m physdev --physdev-in tap11 --physdev-is-bridged -j openvswitch-o-tap1
c、添加内网1 in方向规则, 并将没有匹配的流量导入新链表,过滤源地址使用ipset管理
# iptables -N openvswitch-fallback
# ipset create ipv4-tap1 hash:net
# iptables -A openvswitch-i-tap1 -m set --match-set ipv4-tap1 src -j RETURN
# iptables -A openvswitch-i-tap1 -j openvswitch-fallback
d、添加内网1 out方向规则,将所有流量导入新的链过滤
# iptables -N openvswitch-s-tap1
# iptables -A openvswitch-o-tap1 -j openvswitch-s-tap1
# iptables -A openvswitch-o-tap1 -j RETURN
e、添加内网1安全规则
# tap1_ip=\`ip netns exec ns-tap1 ip -o -f inet addr show tap1 | awk -F'/' '{print $1}'|awk '{print $4}'\`
# tap1_mac=\`ip netns exec ns-tap1 ip link show tap1 | grep "link/ether"|awk '{print $2}'\`
# iptables -A openvswitch-s-tap1 -s $tap1_ip/32 -m mac --mac-source $tap1_mac -m comment --comment "Allow traffic from defined IP/MAC pairs." -j RETURN
# iptables -A openvswitch-s-tap1 -j DROP
f、拒绝未匹配的流量
# iptables -A openvswitch-fallback -m comment --comment "Default drop rule for unmatched traffic." -j DROP
g、测试内网1与内网2的网络连通性
# ip netns exec ns-tap1 ping -c 1 10.0.0.3
可以看到已经不通了,二层防火墙策略已经生效。
h、ipset添加源地址内网2,验证连通性
ipset是iptables的扩展,可以想像它是一个IP地址集合,可以动态的加载iptables规则的地址集, 有效提升iptables的查找效率。
i、验证内网1能否修改IP、MAC
# ip netns exec ns-tap1 ip addr del dev tap1 10.0.0.2/24
# ip netns exec ns-tap1 ip addr add dev tap1 10.0.0.4/24
# ip netns exec ns-tap1 ip addr del dev tap1 10.0.0.4/24
# ip netns exec ns-tap1 ip addr add dev tap1 10.0.0.2/24
# ip netns exec ns-tap1 ip link set dev tap1 address 16:f7:55:f5:d7:ac
注: 每次实验的MAC地址不一样, 请自行使用自己实验中的MAC
实验中的方式就是公有云中二层防火墙实现的一种方法。可以控制同网段虚拟机间的通信,也可以防止用户随意修改IP或者MAC地址。