我正在实现一个防火墙模块,并且我有以下系统:
- ip 10.1.1.1 的“客户端”
- 防火墙
- ip 为 10.1.2.2 的“服务器
该系统中的网络是通过防火墙实现客户端和服务器之间的连接的。要允许此操作,请在防火墙上启用 IP 转发 ( sysctl -w net.ipv4.ip_forward=1
)
我的数据包捕获和过滤逻辑总结在 netfilter 前向钩子中。我们只考虑以下部分:
unsigned int forward_hook_fn (void *priv,
struct sk_buff *skb,
const struct nf_hook_state *state)
{
/* some variable declarations */
ip = (struct iphdr*)skb_network_header(skb);
dip = ntohl(ip->daddr);
sip = ntohl(ip->saddr);
protocol = ip->protocol;
if (protocol == PROT_TCP){
tcp = (struct tcphdr*)skb_network_header(skb);
printk("src:%hu dst:%hu, seq:%u\n",ntohs(tcp->source),ntohs(tcp->dest),ntohs(tcp->seq));
}
...
/* irrelevant logic */
...
}
我的问题:看起来我没有获得数据包的正确源端口和目标端口。
说明: 对于这样的命令:
ssh -p 555 10.1.1.1
curl 10.1.1.1
ssh -p 4784 10.1.1
nc 10.1.2.2 1234
.... #and so on.. it doesn't matter what are the specific numbers of course
我得到以下日志:
timestamp src_ip dst_ip src_port dst_port protocol action reason count
26/10/22 05:27:52 10.1.2.2 10.1.1.1 37296 582 TCP drop 254 1
26/10/22 05:30:10 10.1.2.2 10.1.1.1 69 15360 TCP drop 254 8
26/10/22 05:30:26 10.1.1.1 10.1.2.2 37296 582 TCP drop 254 1
26/10/22 05:30:43 10.1.1.1 10.1.2.2 69 15360 TCP drop 254 4
这很奇怪,因为我没有看到我在命令中使用的端口+没有足够类型的端口,这让我认为我的端口转发的某些内容没有按照我期望的方式运行(如果我的解释不好) :我希望在日志中看到端口 555,80(curl?),4784,1234)
谢谢
编辑:我想澄清一下,我在日志中看到的端口也在 in 中看到printk
,dmesg
所以这不是解析问题