Я рекомендую использовать таблицы ip, но так как вы спрашиваете также о взломе ядра, вот объяснение того, как вы могли бы это сделать (я использую ядро 4.1.20 в качестве ссылки):
Когдапакет получен (sk_buff), обработчик протокола IP отправит его на зарегистрированный сетевой протокол:
static int ip_local_deliver_finish(struct sock *sk, struct sk_buff *skb)
{
...
ipprot = rcu_dereference(inet_protos[protocol]);
if (ipprot) {
...
ret = ipprot->handler(skb);
Если предполагается, что протокол TCP, обработчик tcp_v4_rcv:
static const struct net_protocol tcp_protocol = {
.early_demux = tcp_v4_early_demux,
.handler = tcp_v4_rcv,
.err_handler = tcp_v4_err,
.no_policy = 1,
.netns_ok = 1,
.icmp_strict_tag_validation = 1,
};
Так называется tcp_v4_cv.Он попытается найти сокет для полученного skb, и если он этого не сделает, он отправит сброс:
int tcp_v4_rcv(struct sk_buff *skb)
{
sk = __inet_lookup_skb(&tcp_hashinfo, skb, th->source, th->dest);
if (!sk)
goto no_tcp_socket;
no_tcp_socket:
if (!xfrm4_policy_check(NULL, XFRM_POLICY_IN, skb))
goto discard_it;
tcp_v4_send_reset(NULL, skb);
...
Существует множество различных способов взломать это.Вы можете перейти к функции xfrm4_policy_check и взломать / изменить политику для AF_INET.Или вы можете просто закомментировать строку, которая вызывает xfrm4_policy_check, так что код всегда будет идти в discard_it, или вы можете просто закомментировать строку, которая вызывает tcp_v4_send_reset (что будет иметь больше последствий).
Надеюсь, это поможет.