LAN 상에서 netfilter 목적지 MAC주소 필터링

declspec의 이미지

netfilter 를 이용해서 공유기의
PRE ROUTING 체인에 후킹을 걸었는데요

목적지 MAC 주소가 공유기(라우터)가 아닌 다른 호스트로
한번에 되있는 경우는 후킹을 걸어도 후킹체인에 패킷이 안걸리네요...
따라서 전체 드롭을 해도 패킷이 쏙쏙 잘 빠져나갑니다 ㅡㅡ;;

목적지 MAC 주소를 가지고 필터링하는 방화벽을 만드려고 하는데
이거 쉽게 해결할수 있는 방법 없을까요?

iptables 툴 사용으론 안되고
실시간 처리가 필요하기때문에 반드시 커널모듈로 만들어야합니다
netfilter 로 되는것인지... ㅠㅠ

익명 사용자의 이미지

기본적인 내용입니다만 쉽게 설명을 못드리겠네요

이더넷은 TCP/IP 의 물리로 실제 정의는 IEEE 802.x 의 OSI 1계층과 2 계층이지요
반면 커널은 이보다 1단계 높습니다.
그럼 모든 넷트웍 장비든 시스템이든 커널이란 것은 이더넷(랜카드라 합시다) 장치가 커널버퍼로 복사해 주었을 때 비로소 볼 수 있고 취급할 수 있습니다.

스위칭환경에서는 전자 플러딩이 일어나지 않으므로
이더넷 목적지주소가
자신이거나
멀티캐스트거나
브로드캐스트이거나
이상 3가지가 아니면 랜카드는 패킷을 볼 수 없습니다.스니핑이 안되지요
무작위모드와 무관하게 맥스푸핑을 하지 않는 한 다른 타겟의 패킷을 볼 수 없습니다.
랜카드가 못보는 패킷이 커널에 복사될리 만무하므로

딱 한 가지 볼 수 있는 방법은 스위칭 장비내의 메모리를 보는 것인데
그 말은 모든 프레임이 스위치 커널로 올라와서 엑세스리스트를 보고 처리를 한 후 다시 목적지 이더넷으로 보낸다는 말인데 이게 쉽게 말해 IP 레벨 방화벽입니다.
모든 싸구려 스위치는 이런 것 없고 당연히 공유기도 이런 것 없겠지요?

모든 물리계층 프레임을 일단 커널로 올리는 것은 수천만원짜리 장비에서도 대단히 조심해서
사용해야 할 만큼 큰 부하를 유발합니다.

그 공유기는 그냥 일반 시스템처럼 '자기자신' 일 경우와 멀티/브로드캐스트일 경우를
커널로 올리는 모양입니다.
따라서 불가합니다.

익명 사용자의 이미지

답변 감사합니다..! 말씀하신 것처럼
이더넷 목적지주소가 자신이거나, 멀티캐스트거나, 브로드캐스트
3가지 경우가 아니라면 랜카드는 커널로 패킷을 안올려주죠
그런데 공유기에서는 목적지 주소가 자신이 아닌 패킷을 받았을때
드랍을 하지는 않았습니다.(자기 자신이 아닌 목적지 맥주소가 쓰여진 패킷을 받으면
결국 해당 목적지 맥주소를 가진 컴퓨터에게 전달이 됩니다)

상황을 예로 든다면
컴퓨터 A, B 가 있고 공유기 C 가 있다고 할때(A, B 는 공유기C 의 무선랜에 접속되어있음)
컴퓨터 A 가 공유기 C 의 무선랜카드로 패킷을 보냈는데, 목적지 MAC 주소는 B 의 것이었습니다.
C 가 이것을 커널로 올렸는지 어쨋는지는 모르겠지만 아무튼 B 는 패킷을 받았습니다.

그럼 공유기의 무선랜카드가 커널로 패킷을 안올렸다고 해도
누군가 패킷을 전달해주긴 해줬다는 것이죠.
이걸 누가해준 건가요?
무선랜카드 내부의 펌웨어가 스스로 해준건가요?
이부분이 궁금합니다.

익명 사용자의 이미지

맞습니다.

랜카드 드라이버는 랜카드가 패킷을 송/수신 할때, 특별히 인터럽트를 날리면 커널로 올리고,
그렇지 않으면 랜카드 자체 하드웨어 기능으로 전달을 실시합니다.

그래서 promisc 모드로 하면 모두 커널로 올릴 수 있다는겁니다..

예로 tcpdump를 실행하면 암묵적으로 promisc 모드로 만들죠. 그렇게 안하고 싶다면 다른 옵션이 있습니다.

아래 ebtables 기능 제안한 익명입니다.

익명 사용자의 이미지

브릿지 형식이면 ebtables가 대안인데..

익명 사용자의 이미지

윗 익명인데요.

어차피 공유기를 거쳐서 모두 지나가면, promisc 모드로 하고, 패킷을 이더넷 레벨로 올려서 보는 모듈을 만들어서 처리 하는 건 어떨까욤.

근데 대부분 dhcp 일텐데.. 강제로 다른 곳으로 목적지를 정한다는건 GW와 IP 를 정해서 쓴다는건가요?

공유기 레벨에서 지정된 SRC IP에서만 통신이 되도록 인증기능을 넣는게 더 나을듯... (DHCP 기능이랑 비슷한거고..)

익명 사용자의 이미지

목적지 맥주소가 강제로 다른곳으로 지정 하는 것은
직접 할 수도 있지만
ARP 테이블상에 맥주소가 존재하면 그렇게 됩니다.
원래는 어떠한 패킷이든 목적지 맥주소가 디폴트 게이트웨이의 것이 되어서
패킷을 게이트웨이(여기선 공유기) 로 보내지만
ARP 테이블에 직접 원하는 목적지의 맥주소가 나와있다면
공유기의 맥주소를 목적지로 하는 패킷을 보내지 않고
직접 목적지 맥주소를 지정해서 보냅니다.

그런데 어쨋든 전기신호는 공유기에게 가니까
공유기의 랜카드가 이 패킷을 받을텐데
이 경우 목적지 맥주소가 자기자신이 아닌게 되는거죠

그런데 아무튼 패킷 전달은 잘 됩니다
결국 어떤식으로든 패킷 전달이 된건데
누가 어떻게 어느단계에서 전달을 한건지를 모르겠습니다

익명 사용자의 이미지

해당 랜카드가 전송하는게 맞습니다.
다만 커널로 올리지 않고 처리하는건 카더라 통신에 의하면 랜카드 하드웨어 루틴에 의할걸로 예상됩니다. 이 부분은 랜카드 하드웨어 관련 종사자분이 답글을 기대해야될 것으로 사료됩니다.

그래서 promisc 로 랜카드의 모드를 변경하면 인터럽트가 와서 드라이버단에서 커널로 쏴줍니다.
비로소 이렇게 되어야지만 내 맥주소가 아니더라도 전부 볼 수 있죠.

이렇게 하면 netfilter로 처리할 수 있을 것 입니다.
단, iptables론 안될듯. ip_rcv 에 보면 내 목적지가 아닌 MAC 주소 패킷은 드랍처리 합니다. (routing 을 하지 않는다는 소리)

쓰고보니 헛소리넹...

너바나의 이미지

윗글에도 언급이 있었지만 일반 공유기라고 해도 실 회선 속도의 패킷을 처리하려면 일반 CPU로는 어림도 없기 때문에 대부분의 패킷은 공유기의 하드웨어를 통해 자동으로 처리되고 특정 패킷들만 CPU로 올려서 처리합니다.

따라서 MAC 을 가지고 차단하려면 공유기 하드웨어에서 지원하는 기능을 사용해야 합니다.

그 기능이 없다면 모든 패킷을 CPU로 올리도록 해서 처리할수 있겠지만 초당 처리할수 있는 패킷수가 작아서 간단한 시험용으로만 쓸수 있을뿐 소비자가 사용할 수 있는 제품으로 사용할 수 없을 것 같습니다.

익명 사용자의 이미지

첫 리플을 단 익명사용자입니다....

위 공유기가 스위치와 같은 원리라고 가정하고(제가 뜯어본게 아니니까요)



시스템 자신 = 커널이 구현된 시스템이라야 의미있는 말 = MAC 이 구현되어 있다는 말.

설명을 쉽게 하기 힘들기 때문에 몇가지 역발상 질문을 해 보겠습니다.

1번 포트에서 2번 포트로 가는 패킷은?
=> 스위치 메모리에 버퍼링 되고 프로세서가 물리헤더를 분석하기 시작합니다.
ARP 테이블 같은 경우 MAC 이 있다는 전제에 있는 것과 같이 커널이 구현되지 않은 완전 구닥다리 스위칭 장비도
포트번호 : 맥어드레스
테이블을 가지고 있습니다.
여기서 맥어드레스가 자기자신이 아니면 메모리의 커널영역에 복사되지 않고 2번 포트 스위칭 fabric 회로를 on 한 후 전기를 흘려 보냅니다.
완전히 버퍼를 비우면 끝이죠.
I/O 버퍼에 들어왔다 나가긴 하지만 '커널영역' 에 복사되지 않습니다.즉 I/O 버퍼를 장비라 치면 커널은 사용자 UI 인데 이게 볼 수 없습니다. 따라서 랜카드가 무작위모드든 뭐 어떤 수단을 써도 커널에서 볼 수 없습니다.

16포트 스위칭허브는 몇 번 포트가 자기자신인가?
=>포트에 따른 자기자신 은 없습니다.
'자신' 이란 스위치 자신의 커널 넷트웍 계층을 의미하며 동시에 UI 를 통해 타인과 대화할 수 있단 뜻이죠.
매우 중요하게도
'자신' 이 없는 스위칭허브도 있을 수 있고 뚜껑열고 점퍼설정하거나 RS-232 와 같은 시리얼연결만 지원하는 예전의 모델들은 실제 여기에 속합니다.
이런 장비는 커널이 없거나 있어도 IEEE802.3 + TCP/IP 형태가 아닌
OSI 물리 + OSI 응용 만으로 구현되었기 때문에 당현히 이더넷도 필요없고 당연히 MAC 도 없습니다.

16포트 스위칭허브는 MAC 어드레스가 몇개인가?
=>아주 특별한 고가의 장비가 아닌 한 1개이며 '자기자신' 을 의미하죠.
즉 포트에 부여된 MAC 가 아니라 장비 프로세서에 이더넷 칩로직이 포함되어 있고 거기에 맥이 심어져 있습니다.

다시 1번 포트에서 이 MAC 주소로 프레임이 오면 어케 되는가?
=>I/O 버퍼에 있는 넘을 장비의 커널 이더넷 드라이버로 복사합니다.
커널로 복사되었기 때문에 모든 해킹과 조작을 통해 패킷제어가 가능합니다.....생략

다시 1번 포트에서 다른 MAC 주소로 프레임이 오면?
=>맥주소가 자기자신이 아닙니다.
포트 : 맥어드레스 테이블 (ARP 아님) 검색합니다.
일치하는 것이 없으면 원칙적으로 드랍됩니다. 즉 이 말은 1번 포트를 두드린 넘이 사전에 정확한 맥어드레스를
적어서 보낼 것을 요구합니다.
그 말을 바꾸면 1번포트 두드리기 전에 ARP 를 통했든 어쨌든 유효한 맥어드레스를 적어 넣어야 한다는 말이죠.
(그럴 수 없을 때 FF FF FF FF FF FF FF 라는 이더넷 브로드캐스트가 준비되어 있는데 이것 또한 '자기자신'
과 똑같이 취급됩니다.)
여기서 또 하나 고려할 것은 스위치 스스로 포트 : 맥테이블을 관리하는 도구가 필요한데
이게 802.1D 브릿지 프로토콜입니다.
스위치 한개라면 연결된 시스템과는 부팅시/랜카드 교체시/기타 리눅스 등으로 브릿지 프로토콜 때릴 때 등...
이게 자동으로 동작하고
스위치를 여럿 연결하면
포트1 : 맥1,맥2,맥3,맥4....
와 같은 형식이 생깁니다.보통 스위치에 버퍼가 포트수보다 훨씬 큰 이유가 여기에 있습니다.
이건 자동으로 구현되어 있습니다.
다시 말하지만 여기까지라면 802.3 + 802.2 형태가 아닌 802.1D 이므로 MAC 어드레스는 필요없습니다.



랜카드 또는 장비를 무작위모드로 셋팅한다는 말은
예전 더미허브시절엔 의미 있는 말이었지만 지금은 의미가 없습니다. (무선은 근본적으로 더미입니다.)

결론적으로
스위칭 프로세서의 MAC 이상 계층이 무작위든 어쨌든 온갖 방법을 구현하더라도
포트 : 맥어드레스
검색에 일치하는 패킷과 일치를 찾을 수 없는데 자신이 아닌 패킷은 절대로 장비 커널단에서 볼 수 없습니다.
볼 수 있게 되어 있다면 이는 스위칭 프로세서가
모든 I/O 맵 ==== 커널 이더넷 드라이버 맵
으로 취급한다는 소리이므로 버그이거나 특수 목적이거나
대형 장비에서 넷트웍계층 ACL 을 모든 패킷에 적용가능한 로직에 해당하는 말입니다.

모지리의 이미지

1. L2/L3 개념으로 접근을 해보시구요.
2. MAC을 가지고 필터링 거는것은 좀 넌센스일겁니다. (부정확)
3. IPTABLES(NETFILTER) 자체가 커널 모듈입니다. iptables 프로그램은 그냥 명령어 해석기 정도.
4. 리얼텍에서 만든 ARM 계열 CPU들이 CPU에 NETFILTER기능을 탑재하고 있습니다. 무지 훌륭한 기능.

댓글 달기

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