ip_fltr_in_hook , ip_fltr_out_hook , ipsec_decap_hook , inbound_fw 和 outbound_fw 内核服务

用途

包含用于 IP 过滤的挂钩。

语法

#define FIREWALL_OK         0  /* Accept IP packet                     */
#define FIREWALL_NOTOK      1  /* Drop IP packet                       */
#define FIREWALL_OK_NOTSEC  2  /* Accept non-encapsulated IP packet 
                                  (ipsec_decap_hook only)       */
#include <sys/mbuf.h>
#include <net/if.h>

int (*ip_fltr_in_hook)(struct mbuf **pkt, void **arg)

int (*ipsec_decap_hook)(struct mbuf **pkt, void **arg)

int (*ip_fltr_out_hook)(struct ifnet *ifp, struct mbuf **pkt, 
int flags)
#include <sys/types.h>

#include <sys/mbuf.h>

#include <netinet/ip_var.h>

void (*inbound_fw)(struct ifnet *ifp, struct mbuf *m, 
inbound_fw_args_t *args)

void ipintr_noqueue_post_fw(struct ifnet *ifp, struct mbuf *m, 
inbound_fw_args_t *args)

inbound_fw_args_t *inbound_fw_save_args(inbound_fw_args_t *args)

int (*outbound_fw)(struct ifnet *ifp, struct mbuf *
m0, outbound_fw_args_t *args)

int ip_output_post_fw( struct ifnet *ifp, struct mbuf *m0, 
outbound_fw_args_t *args)

outbound_fw_args_t *outbound_fw_save_args(outbound_fw_args_t *args)

参数

描述
佩特 指向包含要接收 (ip_fltr_in_hookipsec_decap_hook) 或已传输 ( (ip_fltr_out_hook)) 的 IP 包的 mbuf 链。 可以在三个挂钩函数中的任何一个中检查和/或更改 佩特 参数。
arg 是指向 的指针的地址,该指针在调用 ip_fltr_in_hookipsec_decap_hook 的函数中本地定义。 阿尔格 参数最初设置为 NULL ,但此指针的地址将传递给两个挂钩函数 ( ip_fltr_in_hookipsec_decap_hook)。 阿尔格 参数可以由这些函数中的任何一个设置,从而允许在它们之间共享空指针。
国际工人联合会 是将在其上为 ip_fltr_out_hook 功能传输 IP 包的出局接口。
标志 指示传输层协议传递的 ip_output 标志。 当前在 /usr/include/netinet/ip_var.h 文件中定义了有效标志。 请参阅下面的 "标志" 部分。

描述

这些例程提供用于 IP 包过滤的内核级别挂钩,使 IP 包能够在接收,传输和解包期间选择性地被接受,拒绝或修改。 这些挂钩最初为 NULL ,但由 netinet 内核扩展导出,如果指定了非 NULL 值,那么将调用这些挂钩。

ip_fltr_in_hook 例程用于对入局 IP 包进行过滤, ip_fltr_out_hook 例程用于对出局 IP 包进行过滤, ipsec_decap_hook 例程用于对入局封装的 IP 包进行过滤。

对于主机接收的每个 IP 包,都将调用 ip_fltr_in_hook 函数,无论是否直接寻址到该主机。 它是在验证 IP 包的完整性和一致性之后调用的。 该函数可用来检查或更改 IP 包 (佩特) 或与 ipsec_decap_hook (阿尔格) 共享的指针。 ip_fltr_in_hook 的返回值指示是应该接受还是删除 佩特 。 下面的 预期返回值 中描述了这些返回值。 如果接受 佩特 (返回值为 FIREWALL_OK) ,并且它直接发送给主机,那么接下来将调用 ipsec_decap_hook 函数。 如果接受 佩特 ,但未直接发送到主机,那么在启用 IP 转发时将转发该主机。 如果 ip_fltr_in_hook 指示应该删除 佩特 (返回值为 FIREWALL_NOTOK) ,那么既不会传递也不会转发该值。

ipsec_decap_hook 函数是在重新组装任何 IP 片段之后调用的 ( ip_fltr_in_hook 函数将检查每个 IP 片段) ,并且仅对直接寻址到主机的 IP 包进行调用。 ipsec_decap_hook 函数可用来检查或更改 IP 包 (佩特) 或与 ipsec_decap_hook (阿尔格) 共享的指针。 必要时,挂钩功能应该执行解算,返回到 佩特 并返回正确的状态,以便可以对 IP 包进行适当处理。 请参阅下面的 预期返回值 部分。 对于可接受的封装 IP 包 (返回值为 FIREWALL_OK) ,将通过跳至 IP 输入处理循环的开头来再次处理已解包的包。 因此, ip_fltr_in_hook 将首先检查已解包的 IP 包,如果将其发送给主机,那么 ipsec_decap_hook将检查该 IP 包。 对于可接受的非封装 IP 包 (返回值为 FIREWALL_OK_NOTSEC) , IP 包传递简单继续,并且 佩特 由传输层处理。 返回值 FIREWALL_NOTOK 指示应丢弃 佩特

如果出局 IP 包的目标 IP 地址不是 IP 多点广播地址,那么对于要传输的每个 IP 包都将调用 ip_fltr_out_hook 函数。 如果是,那么会立即发送该文件,绕过 ip_fltr_out_hook 函数。 在从上层协议层插入 IP 选项后,构造完整的 IP 头,并定位到目的地 IP 地址的路由后,调用此挂钩功能。 ip_fltr_out_hook 功能可能会修改出局 IP 包 (佩特) ,但接口和路由已分配完毕,可能无法更改。 来自 ip_fltr_out_hook 函数的返回值指示是应该传输还是删除 佩特 。 请参阅下面的 预期返回值 部分。 如果未删除 佩特 (FIREWALL_OK) ,那么将验证其源地址是否为本地地址,并且如果要广播 佩特 ,那么将确认能够进行广播。 此后, 佩特 将在接口 (国际工人联合会) 输出队列上排队。 如果删除 人民报(FIREWALL_NOTOK) ,那么不会传输该文件,并且会将 EACCES 返回到进程。

inbound_fwoutbound_fw 防火墙挂钩允许内核扩展在 IP 接收包的位置获取对这些包的控制。 如果设置了 inbound_fw ,那么 ipintr_noqueue, IP 输入例程,调用 inbound_fw ,然后退出。 否则, ipintr_noqueue 调用 ipintr_noqueue_post_fw ,然后退出。 如果 inbound_fw 挂钩例程希望将包传递到 IP 中,那么可以调用 ipintr_noqueue_post_fwinbound_fw 可以通过调用 inbound_fw_save_args来复制其 阿尔格斯 参数,并且可以通过调用 inbound_fw_free_args来释放其 阿尔格斯 参数的副本。

同样, ip_output 调用 outbound_fw (如果已设置) ,并调用 ip_output_post_fw (如果未设置)。 如果 outbound_fw 挂钩要发送包,那么它可以调用 ip_output_post_fwoutbound_fw 可以通过调用 outbound_fw_save_args来复制其 阿尔格斯 参数,然后通过调用 outbound_fw_free_args来释放其 阿尔格斯 参数的副本。

标志

描述
IP_FORWARDING 指示大部分 IP 头已存在。
IP_RAWOUTPUT 指示原始 IP 头已存在。
ip_multicast_opts 指示存在多点广播选项。
IP_ROUTETOIF 包含旁路路由表。
ip_allowbroadcast 提供发送广播包的功能。
IP_Broadcasts STOPTS 包含内部广播选项。
IP_PMTUOPTS 提供 PMTU 发现选项。
分组路由 包含组路由 Gidlist。

预期返回值

描述
FIREWALL_OK 指示 佩特 对于任何过滤功能都是可接受的。 该文件将酌情交付,转发或发送。
FIREWALL_NOTOK 表示应该删除 佩特 。 它将不会被接收 (ip_fltr_in_hookipsec_decap_hook) 或传输 (ip_fltr_out_hook)。
firewall_ok_notsec 指示仅对 ipsec_decap_hook 函数有效的返回值。 这指示 佩特 根据过滤规则是可接受的,但未封装; 佩特 将由传输层进行处理,而不是作为已解码的 IP 包进行处理。