1.实验firewall目的
本实验是为了实现简单的带状态防火墙. 无状态防火墙依赖于静态的规则匹配,可以快速的过滤某些流量,然而无法满足更为复杂的需求.比如对于TCP连接而言,一个正常的连接应当由内部的主机向外部的服务器发起,而外部的终端不应当主动和内部的主机连接.因此如何区分主被动超出了无状态防火墙的能力.
note:对于一个交换机而言,其选择哪个P4程序是在其json文件的头部指定。
target: bmv2
p4info: build/firewall.p4.p4info.txt
bmv2_json: build/firewall.json
2.实验思路
根据实验文档,我们使用Mininet自带的iperf测试两个主机之间的带宽,由于使用的是TCP协议,所以存在一个主动连接的过程。那么对于有状态交换机而言,h1主动与h3发起的连接是可以通过带状态防火墙,而h3主动与h1发起的连接无法通过带状态防火墙,自然也无法获得带宽结果。那么就可以证明h3无法主动发起与内部主机的连接。
### 可能的难点
-
如何通过bloom filter实现带状态过滤?如果是我要实现带状态,也许是通过多个表?
作者提到使用两个hash函数判断外部网络的流量是否为已建立连接的流量或是发起连接的流量. 主动与外部建立连接的
想法
看完整个流程,对于有状态防火墙理解更加深刻. 如果由内部主机发起TCP连接,那么两个寄存器相应的hash位置为1,从外部到来的数据包如果是回应包,那么其对应的寄存器位置必然是1,则放行;反之,如果外部到来的数据包是发起连接的包,那么极大的概率不会出现两个寄存器都为1,丢弃.
3.代码修改
4.实验结果
- 测试h1与h2之间的带宽,结果如下图,大约为40Mbits/sec

- 测试h1->h3之间的带宽.结果如下图,大约为14.7Mbits/sec

- 测试h3->h1之间的带宽,始终无法显示结果

总结
本实验实现了简单的带状态防火墙,对于我而言,主要学习到了
-
hash函数的使用
-
交换机内部的寄存器使用,使用寄存器来保存状态