# firewall simulator
**Repository Path**: lucca9102/firewall-simulator
## Basic Information
- **Project Name**: firewall simulator
- **Description**: Just for fun and practice!
simulate a firewall
- **Primary Language**: C
- **License**: Not specified
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 0
- **Forks**: 0
- **Created**: 2021-04-04
- **Last Updated**: 2021-04-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# A firewall simulator
> author: Lucca9102
>
> mail: luccachina@163.com
>
> environment: Visual Studio 2019 Community
## 前言
这个程序是上课无聊突发奇想做的,到今天为止刚好花了一周时间。
程序的作用是模拟一个防火墙,有以下几种功能
- 根据收到的数据包信息添加 IP 或 端口 的配置
- 直接输入 IP 进行配置
- 直接输入 端口 进行配置
- 根据传输协议配置
- 根据网卡接口配置
- 列出所有配置内容
- 根据以上配置检查并拦截或放行数据包(在第一点体现)
- 退出程序
## 一些技术性的内容
### 文件结构
`main` 是主程序,每个 `.c` 文件都有对应的 `.h` 头文件。
`main.h` 主要负责声明大家都要用的类型和全局变量,以及各种各样的宏。
`main.c` 主要进行流程控制,几个全局变量的空间分配,没有太多实质性的内容。
`wallinit.*` 负责初始化防火墙。第一次使用时会创建一个叫 `.wallinit` 的初始化文件,根据用户的选择创建配置文件。以后使用时会读取初始化文件,找到配置文件的地址,读取已经存储的配置,并为各种全局变量赋值。
`pkgFlow.*` (名字瞎起的hhh)负责获取随机生成的数据包,包内容有源 IP : port,目的 IP : port,协议和通过的网卡接口。
`firewallHint.*` 负责一些提示信息,不过在后面的开发中显得不太重要了,可以考虑删掉。
`firewallConfig.*` 本程序最重要的一个模块。包含了所有配置内容。
### IP 和 Port 配置文件中的 `Hash` 值
(因为想不到合适的词就随便捡了 `Hash` 写上的)
IP 的 `Hash` 值由以下部分组成:
- 8 位十六进制数,表示 IP
- 10 位时间戳(本来 `time_t` 是 16 位的,我算了一下,10 位就够用 2000 多年,就留了 10 位)
- 最后一位标识 IP 是作为源还是目的时将被拦截。`s` 代表源;`d` 代表目的
类似地,port 的 `Hash` 前四位代表端口号,后面一样。
### 关于 `fseek`
在配置部分用到了各种各样的 `fseek` 函数。有一些操作可能比较迷惑:为什么跳一行要用 `LEN + 1` 呢?
我使用的是 Windows 系统,不知道是不是系统的原因(CRLF 和 LF),我的 `'\n'` 要占两个字节。如果用 `fseek` 跳 `LEN` 长度,在读取的时候仍然会读到 `'\n'`。这个不是一开始就发现的。为了不影响之前的程序,就使用了这样的迷惑操作。
### 代码行数统计
| FILENAME | lines |
| :--------------: | :---: |
| main.h | 58 |
| main.c | 220 |
| wallinit.h | 9 |
| wallinit.c | 271 |
| pkgFlow.h | 9 |
| pkgFlow.c | 63 |
| firewallHint.h | 20 |
| firewallHint.c | 55 |
| firewallConfig.h | 27 |
| firewallConfig.c | 623 |
| 合计 | 1355 |
## 后记
这个项目是我写的第一个 C 语言项目(之前都是单个文件的)。由于时间仓促,技术也及其有限,注释写得很少(好吧也是因为懒 XD)。反正我也不是计算机专业的,写这个就图一乐
What's more, due to my poor poor English, there may be many grammar mistakes in the project. If you found any of them, please send me a pull request if you'd like or just email me!
这个项目大概率是没有后续更新的,如果有什么问题或高见,欢迎给我发邮件,希望大家能够不吝赐教!