[완료]제가 생각하고 있는것이 맞는지 제발 확인 부탁드립니다.
얼마전 netfilter를 이용한 기본적인 nat 을 만들어봤는데요 postrouting 으로 hooking하여 마스커레이딩처럼 되는것을 확인하였고 prerouting hooking하여 목적 ip가 변경되어 접속되는것도 확인했습니다.
참고로 테스트 환경은
윈도우 PC(10.0.0.2) ------ linux(222.xxx.xxx.xxx) --------------- 외부 PC
이렇게 했으며 prerouting 으로 hooking하여 목적지 ip 변경되는것은 http접속으로 확인했습니다.
그런데 prerouting으로 hooking하여 목적지 포트를 변경만 하면 정상적인 동작을 하지 않는 현상이
나타났습니다.
prerouting
소스 부분은 기본적인 테스트는 된 상태였으며 패킷덤프를 떠도 같은 결과가 나왔습니다.
tcp의 핸드쉐이킹이 안되는것으로 보여졌습니다.
소스에 문제가 있다면 ip만 변경해서 할때에도 문제가 있어야 하는데 찾아볼수가 없었습니다.
이러한 현상이 왜 일어나는지 원인을 찾을 수 없어 이렇게 질문드립니다.
제가 한 방법은
iph->check = 0; iph->daddr = newip; ip_send_check(iph); ... tcph->dest = newport; tcph->check = 0; sb->csum = skb_checksum( sb, tcpOffset, sb->len - tcpOffset, 0 ); tcph->check = csum_tcpudp_magic( iph->saddr, iph->daddr, sb->len - tcpOffset, iph->protocol, sb->csum ); sb->ip_summed = CHECKSUM_UNNECESSARY;
이런식으로 했습니다.
checksum 부분은 다른님의 말씀을 듣고 커널 소스도 보고 하여 사용했습니다.
그리고 패킷을 수정하기 전 sb->ip_summed 값은 CHECKSUM_NONE 인것으로 확인했습니다.
제가 무엇을 잊고 있는게 있는지, 아니면 제가 생각하는 부분이 틀린건지 해서 여쭤봅니다.
그럼 소중한 답변 기다리겠습니다. 감사합니다.
자답이 됬네요. ^^;
라우팅이 꼬여서 발생된 문제였습니다.
역시 checksum은 전혀 상관없는 문제였습니다.
틀릴수도 있겠으나 혹시나 저같이 삽질하실 분들을 위해 몇자 적어본다면
1. 생각하고 있는 논리적 로직에 이상이 없는지 확인한다.
당연한 거지만 자신의 로직이 올바르다라고 생각하는 경향이 있으므로 주의해야 할 부분이다.
2. 프로그램 로직에 이상점이 없는지 확인한다.
pre/postrouting으로 dnat/snat을 하려고 할때 이상이 있을 경우 모두 중간에 있는 linux 박스,
클라이언트 pc에서 패킷덤프로 확인해봐야 한다.
또한 라우팅 부분에 신경을 써줘야 하는데 오고가는 패킷의 역추적을 위한 것이므로 프로그램에서
checksum등의 이상이 없다면 반드시 확인해야 할 부분이다.
이상입니다. 저처럼 삽질하시는 분들에게 조금이나마 도움이 됬으면 하는 바램입니다.
그럼 수고하십시요.
지식의 여인은 옷을 쉽게 벗지 않는다.
잡초인생. 잡초처럼 끈길기게....
지식의 여인은 옷을 쉽게 벗지 않는다.
잡초인생. 잡초처럼 끈길기게....
댓글 달기