ファイアウォールモジュールを実装しており、次のシステムがあります。
- 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)を見たいです。
ありがとう
編集:ログに表示されているポートがログにも表示されるため、解析の問題ではないことを明確にしたかったのprintk
ですdmesg
。