[완료]libnet 사용시 질문드립니다. 답변 부탁드립니다.

kwonsu의 이미지

안녕하세요. 다름이 아니라 libpcap으로 패킷을 잡은 다음 libnet으로 패킷을 전송하는 프로그램을 만들어봤습니다.
인터넷에서 여기저기 떠돌아 다니다가 여러 소스를 보고 난 후 어찌어찌 하다 만들었는데 제가 하고 싶은 목적은 source ip를 수정해서 패킷을 전송하는 것입니다. source ip만 변경해서 보내봤습니다. 물론 tcpdump로 검사해보면 패킷이 날라가는것까진 확인했습니다.
문제는 libpcap으로 패킷을 잡고 libnet으로 패킷을 수정해서 패킷을 보내면 원래 패킷까지 같이 간다는 것입니다.
원래 패킷이 오면 이것을 가공하여 보낼때 제가 가공한 패킷만 보낼수 있는 방법은 없을까요?
다른 라이브러리가 있으면 어떤것인지 부탁드립니다.
또하나, 원하는 source 또는 destination ip가 올 경우 drop할 수 있는 방법은 무엇인지 궁금합니다.
참조할 수 있는 링크라도 부탁 드립니다.

참고로 ip를 drop할 때 이렇게 했습니다.

     IP_HEADER *lpIphdr=(IP_HEADER *)((char *)pkt+sizeof(ET_HEADER));
 
     memset(&addr,0,sizeof(struct in_addr));
     addr.s_addr=lpIphdr->m_sIP;
     memcpy(source_ip,(char *)inet_ntoa(addr),strlen((char *)inet_ntoa(addr)));
 
     memset(&addr,0,sizeof(struct in_addr));
     addr.s_addr=lpIphdr->m_dIP;
     memcpy(dest_ip,(char *)inet_ntoa(addr),strlen((char *)inet_ntoa(addr)));
 
     if ( ( strcmp ( source_ip, "2xx.xx0.xxx.x1x" ) == 0 ) ||
          ( strcmp ( source_ip, "2xx.xx1.xxx.x11" ) == 0 ) ) {
       printf( "ip drop : [%s]\n", source_ip );
       return;
     }
powerson의 이미지


libpcap은 패킷을 중간에 막는 역할을 하는 것이 아닙니다. 단순히 network를 지나는 packet들을 올려주는 역할만을 하는 것입니다. 만약 막는 역할까지 하실려면, iptables 등을 사용하셔야 합니다.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

kwonsu의 이미지

제가 했던 것은
libpcap으로 패킷을 잡은 후 이 패킷을 libnet으로 가공하여 패킷을 보냈습니다.
가공할때 source ip만 수정하여 패킷을 보냈지요
이때 원본 패킷까지 목적지로 전송이 되는것을 확인하였습니다.
예를 들어 source ip가 111.111.111.111인 패킷이 들어왔다면 source ip를 222.222.222.222로 바꿔서 목적지에 전송했습니다. 이때 111.111.111.111인 패킷까지 같이 들어온다는 것이지요.
이곳에서 관련 정보를 찾아보니 libnet을 사용하면 패킷을 전달하지 못하게 할수 있다고 하던데... libnet의 libnet_destory함수가 이런 기능을 한다고 하더군요.
libnet이 패킷만 가공하여 전송하는 것인가요? 그렇다면 iptables만을 이용해야 한다는것인데 이에 대한 예제소스나 혹은 참조할만한 곳이 있는지 알고 싶습니다. 여러 고수님들의 답변 꼭 부탁드립니다.

지식의 여인은 옷을 쉽게 벗지 않는다.
하지만 보고싶다. ㅡㅜ 아.. 통재라~~~.

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

powerson의 이미지

저도 libnet에 대해선 잘 몰라서 한번 찾아보았지만, libnet은 packet에 대한 construction 기능이 주인거 같습니다. 저도 자세하게 본것은 아니기 때문에 틀리다면, libnet에 대해서 잘 아시는 분이 지적해주실거라 생각됩니다. 또한 저 역시 libnet library를 설치해서 manpage로 libnet_destroy를 확인해보니 libnet_destroy는 packet을 destory 하는 것은 아닌 거 같습니다. manpage를 인용해 보면,

Shuts down the libnet session referenced by l. It closes the network interface and frees all internal memory structures associated with l.

라고 되어 있습니다.

단, iptables를 사용해서 패킷들을 막은 후에, libnet으로 서로 통신을 중간에서 조절을 할 수 있을 거 같습니다. 물론 좀 복잡하겠지만요..

그리고 iptables에 대한 내용은 웹이나 wiki.kldp.org 등에 충분히 많습니다. 이건 검색해보시면 될 거 같습니다.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

kwonsu의 이미지

음... 아무래도 이 방법은 아닌것 같습니다. 이곳에서 어떤 분이 libnet을 거론하셔서 해볼려고 했더니 안되네요.
제가 잘 몰라서 그런건지 모르지만 말이죠. 제 생각으론 이미 패킷이 흘러간 상태이기 때문에 중간에 iptables로 막는다고 해서 이미 흘러간 원본 패킷에는 영향이 안갈 것 같다는 생각이 드는군요.
netfilter 소스 관련 사항을 찾아보려 했는데 역시 정보가 부족하네요. iptables 룰이나 설정방법이야 많지만 말이죠.
혹시 제가 하고 싶은 작업에 관한 netfiler 소스 관련 사항에 대한 링크 사이트나 문서 있으시면 추천하여주십니다.
답변을 주신 분께 진심으로 감사드립니다.

지식의 여인은 옷을 쉽게 벗지 않는다.
하지만 보고싶다. ㅡㅜ 아.. 통재라~~~.

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

powerson의 이미지

kwonsu wrote:

원래 패킷이 오면 이것을 가공하여 보낼때 제가 가공한 패킷만 보낼수 있는 방법은 없을까요?

이 거에 대한 답변을 전 다 드렸다고 생각되는데요? 원래 패킷을 잡을 수 있도록 iptables를 설정하시고, 해당 패킷이 오면, libnet으로 패킷을 보내시면 되는데, 원본이 이미 갔기 때문에 막지 못한다는 또 무슨 말씀이신가요?

또한, netfilter 기능을 말씀 하셨는데요. netfilter에 대한 어떤 기능을 말씀하시는지요? iptables가 netfilter의 기능 중에 하나입니다. 물론 그 외에 여러 기능이 있지만요. 어떠한 기능을 원하시는 지 모르겠지만, netfilter에 대한 사항을 아실려면,

http://www.netfilter.org/

이곳 또는 kernel source에서 net/netfilter 혹은 net/ipv4/netfilter 이쪽들의 소스를 보시면 됩니다. 물론 ipv6를 원하시면 net/ipv6/netfilter로 가시면 됩니다.
------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

------------------------------------------------------
아직은 젊다. 모든 것을 할 수 있는 나이란 말이지.

kwonsu의 이미지

답변하신 분의 관심에 먼저 감사드립니다.

A : Client ----------------> B : 전달 Server -----------------> C : Server
111.111.111.111 222.222.222.222 333.333.333.333
( 바꿀 출발 ip: 444.444.444.444) input 패킷 결과
( 목적 포트 : 555 ) ( 출발 ip : 444.444.444.444 )

555포트를 쓰는 데몬 구동중 555포트를 쓰는 데몬 구동중

패킷 캡쳐/수정/전송. 이 과정을 하기 전에 어떤 특정 서비스를 수행하고 있다는 전재로 그림을 참조하여 말씀드리겠습니다.
A 컴퓨터가 B서버의 555포트에 접속하여 데이터를 보냅니다. A 컴퓨터에서 들어온 패킷을 B서버가 받는 경우가 되겠지요.

B, C서버는 모두 555포트를 쓰는 데몬을 사용하고 있습니다. 참고로 그냥 전달을 하려고 하는건 아닙니다.
B서버와 C서버는 데몬은 같은걸 사용하지만 하는 행동은 다릅니다. B서버는 555포트를 쓰는 데몬으로 일련의 작업을 하고 C서버로 처리한 내용을 보냅니다. 이때 패킷으로 보내질 것이고 여기서 보낼 output패킷이 원본 패킷이 되겠지요. 이 패킷을 가지고 출발 ip만 444.444.444.444로 변경하여 C 서버에 보내게 하려고 했던 것입니다.
그럼 B서버는 출발 ip가 222.222.222.222 인 패킷을 C서버에는 보내지 말아야 한다는 것입니다.

또하나, B서버에서 output 패킷중에 출발 ip가 222.222.222.222이고 목적 포트가 555인 패킷을 막고 ( iptables 룰 적용 ) 하면 물론 222.222.222.222 패킷은 나가지 않습니다. 그러나 출발 ip가 444.444.444.444 인 패킷이 ouput되는 것도 못본다고 보입니다. 왜냐면 이미 netfilter에서 막혔기 때문에 output되는 패킷도 없는 것이고 이에 따라 바꿀 패킷이 없어서 출발 ip를 444.444.444.444로 바꾸지 못한다는 것으로 압니다. 출발 ip가 222.222.222.222인 output패킷이 여기서는 원본 패킷이 되겠지요.

iptables는 netfilter의 기능 중에 하나는 아닌걸로 알고 있습니다. netfilter는 netfilter이고 iptables는 netfilter에 쉽게 룰을 적용하기 위한 하나의 도구라고 알고 있습니다.

이 모든 일련의 작업을 모듈로 띄우고 이 모듈은 netfilter를 사용하게 하고 싶은데 시작도 못하고 있습니다. ㅡㅡ;
만들었다는 사람도 없고 어렵군요.

답변 감사합니다.

지식의 여인은 옷을 쉽게 벗지 않는다.
하지만 보고싶다. ㅡㅜ 아.. 통재라~~~.

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

lbsg98의 이미지

질문의 내용을 보면 TCP를 사용중인지 UDP를 사용중인지 구분이 안가네요...
만약 TCP라면 B SERVER 이미 444.444.444.444라는 가상 IP로 C SERVER에 접속을 해 놓은
상태일것 같은데 아닌가요 ?

그럼 B server에서 받아서 처리한 내용을 C SERVER로 보낸다면 간단할 듯 한데요.
제가 잘못 아는 가요 ?
아님 이미 연결된 또다름 B(t)의 메세지인 것 처럼 가장을 하고 싶으신가요 ?
만약 (tcp packet 하이제킹에 해당) 가장을 하고 싶다면 B Server의 커널쪽에 작업하는 방법과
low mode socket을 사용하여 처리하는 방법이 있을 수 있습니다.
위의 경우가 아니라 단순히 업무상
A: 111.111.111.111 <----> B: 222.222.222.222
B: 444.444.444.444 <-----> C: 333.333.333.333
과 같은 업무 flow를 구성하려 한다면 단순히 system route table의 조정으로 해결이 가능할 듯 합니다.

질문의 요지를 이해를 못해서 답변도 허접입니다.

익명 사용자의 이미지

transparent proxy를 검색해보시고,

만일, 넷필터없이 pcap, libnet을 이용하여 한다면,
게이트웨이(필터? 프록시?) 단에서 이더넷카드 2장 (각각 인바운드 아웃바운드) 하고, forward을 수동으로 하고(커널 파라메터 ip에서)
이더넷 1에서 읽은(libpcap) 패킷을 이더넷2 로 보내고(libnet), 이더넷 2에서 읽은 패킷을 이더넷 1로 보내고 하면 일단 통신이 수립되는데,
이때, 읽은 패킷을 조건 비교하고, 조작(?)해서 보내면 원하시는 결과로 나오리라고 봅니다.
즉, 패킷의 흐름을 인위적으로 한다는.....

다른 방법으로는 libnet, libpcap대신, netfilter의 프로그래밍 인터페이스를 사용해서 하는 방법이 있습니다.

위와 원리는 비슷하지만, 조금 ... 다르지요.

ip 수준이 아닌 링크(이더넷) 수준에서 작업하기위해 ebtables를 검토하는것도 방법이리라고 보입니다.

kwonsu의 이미지

A : Client ----------------> B : 전달 Server -----------------> C : Server

A 컴퓨터들의 ip가 C 서버에서는 src ip로 되도록 하는것이 목적이였습니다.
즉 B서버에서 처리후 C서버에서 패킷을 받으면 src ip는 B 서버가 되는것인데 이걸 A 컴퓨터들의 ip로 바꿀려고 한 것입니다.
방식은 transparent proxy 방식이나 tcp proxy 방식 비슷하겠지만 목적은 좀 다르죠. B서버는 브릿지 모드이며 모두 tcp 통신 입니다.
해서 libpcap, libnet으로 시도하였으나 허접삽을 들고 삽질 끝에 삽을 놓을 수 밖에 없었습니다.
그래서 찾은 방법이 libipq를 사용하는 것이였습니다. ip_queue 모듈을 올리고 iptables로 나가는 tcp 프로토콜에 원하는 목적지 포트를 지정하고 queue에 넣어두게 했습니다. 그런 다음 B서버에서 libipq을 이용하여 만든 프로그램으로 기존 패킷에서 src ip만 바꿔서 보낸후 C 서버에서 받아지는지 태스트 해봤습니다. 결과은 안되더군요. checksum같은 것도 처리 하고 있는데 왜 안되는지 이유를 모르겠습니다.
제가 생각하기에 libpcap, libnet보다 libipq를 사용하는것이 더 간편한것 같았습니다.

이런 류의 프로그램을 만들어보신 경험이 있으신 여러고수님들께서 제가 허접삽을 들고 삽질을 할 수 있도록 셈플파일이라도 하나 주신다면 열심히 삽질하겠습니다. 참고로 제 메일은 kwonsu@empal.com 입니다. 메일로도 도움 부탁드립니다.

지식의 여인은 옷을 쉽게 벗지 않는다.
하지만 보고싶다. ㅡㅜ 아.. 통재라~~~.

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

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.