SEEDLab Network
文章目录
SEED Labs 2.0 - Network Security
Firewall
使用 NetFilter 自制防火墙 LKM
Netfilter 是 Linux 内核中一个用于管理网络数据包的软件框架,可以使用它自制 Linux Kernel Module,实现简易的防火墙。
Task1 只是练习如何编译内核模块,即在 module_init(fn)
, module_exit(fn)
处初始化及退出。
使用 Netfilter 搭建防火墙的步骤:
- 定义 nf_hook_ops 结构体,给 hook(hook函数) 和 hooknum(hook点类型) 赋值
struct nf_hook_ops {
/* User fills in from here down. */
nf_hookfn *hook;
struct net_device *dev;
void *priv;
u8 pf;
enum nf_hook_ops_type hook_ops_type:8;
unsigned int hooknum;
/* Hooks are ordered in ascending priority. */
int priority;
};
-
模块加载时
nf_register_net_hook(&init_net, &hook1)
,卸载时nf_unregister_net_hook(&init_net, &hook1)
-
nf_hookfn
函数签名如下,实验中只需ip_hdr(skb)
获得 iphdr 结构体(类似有 tcphdr/udphdr),再从 iph 获得协议类型、源/目标地址,从 tcph/udph 获得端口号,比较决定是否 DROP 即可。
typedef unsigned int nf_hookfn(void *priv,
struct sk_buff *skb,
const struct nf_hook_state *state);
- 注意每个结构体只能赋值一个
hooknum
,想在多个点上 hook 需定义多个nf_hook_ops
,分别设置不同的 hooknum,枚举类型如下:
enum nf_inet_hooks {
NF_INET_PRE_ROUTING,
NF_INET_LOCAL_IN,
NF_INET_FORWARD,
NF_INET_LOCAL_OUT,
NF_INET_POST_ROUTING,
NF_INET_NUMHOOKS,
NF_INET_INGRESS = NF_INET_NUMHOOKS,
};
使用 iptables
基本命令 iptables -A {chain} -j {rule}
,-i/o {dev}
指定入/出接口,-s/d
指定源/目标地址,-sport/dport
指定源/目标端口
对于 TCP 连接,使用 conntrack
模块搭建有状态防火墙,只允许已经建立的 TCP 连接和内部发起新连接
限流使用 limit
模块,--limit
指定设置最大频率(即如10次/分钟),--limit-burst
指定最大连续次数
负载均衡使用 statistic
模块,--mode
指定模式为 random
或 nth
,random
模式下 --probability
指定概率,nth
模式下 --every n
指定轮转周期,--packet p
指定初始计数值(即从[0,n-1]中某处开始计数),一般配合 -j DNAT --to-destination {ip:port}
使用
VPN_Tunnel
实验基于 TUN/TAP 技术,TUN 模拟网络层设备,TAP 模拟数据链路层设备,用户程序和操作系统可以通过 TUN/TAP 接口互相传递数据包。
Client Program send(ip) ->
Client TUN read(ip) ->
Client Socket send(udp/ip) ->
Server Socket recv(udp/ip) ->
Server TUN write(ip) ->
...
route to dst then got reply routed back
...
Server TUN read(ip) ->
Server Socket send(udp/ip) ->
Client Socket recv(udp/ip) ->
Client TUN write(ip) ->
Client Program recv(ip)
评论正在加载中...如果评论较长时间无法加载,你可以 搜索对应的 issue 或者 新建一个 issue 。