[완료]제가 생각하고 있는것이 맞는지 제발 확인 부탁드립니다.

kwonsu의 이미지

얼마전 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 인것으로 확인했습니다.
제가 무엇을 잊고 있는게 있는지, 아니면 제가 생각하는 부분이 틀린건지 해서 여쭤봅니다.

그럼 소중한 답변 기다리겠습니다. 감사합니다.

kwonsu의 이미지

라우팅이 꼬여서 발생된 문제였습니다.
역시 checksum은 전혀 상관없는 문제였습니다.
틀릴수도 있겠으나 혹시나 저같이 삽질하실 분들을 위해 몇자 적어본다면

1. 생각하고 있는 논리적 로직에 이상이 없는지 확인한다.
당연한 거지만 자신의 로직이 올바르다라고 생각하는 경향이 있으므로 주의해야 할 부분이다.
2. 프로그램 로직에 이상점이 없는지 확인한다.
pre/postrouting으로 dnat/snat을 하려고 할때 이상이 있을 경우 모두 중간에 있는 linux 박스,
클라이언트 pc에서 패킷덤프로 확인해봐야 한다.
또한 라우팅 부분에 신경을 써줘야 하는데 오고가는 패킷의 역추적을 위한 것이므로 프로그램에서
checksum등의 이상이 없다면 반드시 확인해야 할 부분이다.

이상입니다. 저처럼 삽질하시는 분들에게 조금이나마 도움이 됬으면 하는 바램입니다.
그럼 수고하십시요.

지식의 여인은 옷을 쉽게 벗지 않는다.
잡초인생. 잡초처럼 끈길기게....

지식의 여인은 옷을 쉽게 벗지 않는다.
잡초인생. 잡초처럼 끈길기게....

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.