방화벽 모듈을 구현 중이며 다음과 같은 시스템이 있습니다.
- 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
.