What I did?
I tried to add a small piece of my own data to the PSH tcp payload, and it can be seen that the transmission was successful and the server was able to respond to the ACK message. However, the Linux kernel seems to have dropped this reply ACK message and continued to send the message I modified before.
send successfully

retransmitted

Soure Code
intpacket_callback(structnfq_q_handle*qh, structnfgenmsg*nfmsg,
structnfq_data*nfa, void*data)
{
structnfqnl_msg_packet_hdr*ph;
unsigned char*raw;
intnfp_len, status;
structpkt_buff*pktbuf;
structiphdr*iph;
structtcphdr*tcph;
uint16_tseq;
unsigned char*payload;
intplen;
uint32_tverdict=NF_ACCEPT;
uint8_tlocal_out=0;
ph=nfq_get_msg_packet_hdr(nfa);
if (!ph)
{
printf("error: cannot get nf message packet hdr\n");
returnNF_ACCEPT;
}
nfp_len=nfq_get_payload(nfa, &raw);
if (nfp_len<0)
{
printf("error: invalid payload length %d\n", nfp_len);
returnNF_ACCEPT;
}
pktbuf=pktb_alloc(AF_INET, raw, nfp_len, 0x1000);
if (!pktbuf)
{
printf("error: cannot allocate pkt buff\n");
returnNF_ACCEPT;
}
iph=nfq_ip_get_hdr(pktbuf);
if (iph->protocol!=IPPROTO_TCP)
{
pktb_free(pktbuf);
returnNF_ACCEPT;
}
status=nfq_ip_set_transport_header(pktbuf, iph);
if (status<0)
{
printf("error: cannot set transport header to pkt buff\n");
pktb_free(pktbuf);
returnNF_ACCEPT;
}
tcph=nfq_tcp_get_hdr(pktbuf);
if (!tcph)
{
printf("error: cannot get tcp hdr\n");
pktb_free(pktbuf);
returnNF_ACCEPT;
}
payload=nfq_tcp_get_payload(tcph, pktbuf);
plen=nfq_get_payload(nfa, &payload);
constchar*rep="hello server\n";
if ((local_out=nfq_get_outdev(nfa)))
{
uint32_ttcp_plen=get_tcp_payload_len(iph, tcph);
if (tcph->ack&&tcph->psh&& !tcph->fin&& !tcph->rst&&!injected)
{
printf("injected\n");
nfq_tcp_mangle_ipv4(pktbuf, 0, 0, rep, strlen(rep));
injected= true;
}
}
_print_conn_info(iph, tcph);
nfq_ip_set_checksum(iph);
returnnfq_set_verdict(qh, ntohl(ph->packet_id), verdict, pktb_len(pktbuf),
pktb_data(pktbuf));
}
What I did?
I tried to add a small piece of my own data to the PSH tcp payload, and it can be seen that the transmission was successful and the server was able to respond to the ACK message. However, the Linux kernel seems to have dropped this reply ACK message and continued to send the message I modified before.
send successfully
retransmitted
Soure Code