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_hook, ipsec_decap_hook) 或已传输 ( (ip_fltr_out_hook)) 的 IP 包的 mbuf 链。 可以在三个挂钩函数中的任何一个中检查和/或更改 佩特 参数。 |
| arg | 是指向 空 的指针的地址,该指针在调用 ip_fltr_in_hook 和 ipsec_decap_hook 的函数中本地定义。 阿尔格 参数最初设置为 NULL ,但此指针的地址将传递给两个挂钩函数 ( ip_fltr_in_hook 和 ipsec_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_fw 和 outbound_fw 防火墙挂钩允许内核扩展在 IP 接收包的位置获取对这些包的控制。 如果设置了 inbound_fw ,那么 ipintr_noqueue, IP 输入例程,调用 inbound_fw ,然后退出。 否则, ipintr_noqueue 调用 ipintr_noqueue_post_fw ,然后退出。 如果 inbound_fw 挂钩例程希望将包传递到 IP 中,那么可以调用 ipintr_noqueue_post_fw。 inbound_fw 可以通过调用 inbound_fw_save_args来复制其 阿尔格斯 参数,并且可以通过调用 inbound_fw_free_args来释放其 阿尔格斯 参数的副本。
同样, ip_output 调用 outbound_fw (如果已设置) ,并调用 ip_output_post_fw (如果未设置)。 如果 outbound_fw 挂钩要发送包,那么它可以调用 ip_output_post_fw 。 outbound_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_hook, ipsec_decap_hook) 或传输 (ip_fltr_out_hook)。 |
| firewall_ok_notsec | 指示仅对 ipsec_decap_hook 函数有效的返回值。 这指示 佩特 根据过滤规则是可接受的,但未封装; 佩特 将由传输层进行处理,而不是作为已解码的 IP 包进行处理。 |