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 指定模式为 randomnthrandom 模式下 --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