iptables, iptable_filter, ip_tables, xtalbe, nfnetlink의 상관관계

junee74의 이미지


Linux Kernel의 방화벽부분을 분석하면서 궁금한점이 있어 문의드립니다.

iptables 서비스를 시작하게 되면,
ip_tables_filter, ip_tables, x_table, nfnetlink의 모듈이 사용되는거 같습니다.

iptables는 보통 rule을 추가하거나 삭제하는 역활을 하는지는 알겠는데,
이 모듈들과 iptables과 어떻게 상관관계를 가지며, 동작하는지 궁금합니다.

고수님들의 답변 부탁드립니다.

mithrandir의 이미지

iptables 는 사실 '서비스'라고 불릴 만한 물건은 아닙니다.
아, 물론 관리자 입장에선 훌륭한 서비스겠군요. 아무튼 상관 없는 얘기는 관두고,

http://netfilter.org 를 정독;; 하시면 감을 잡으실 수 있겠지만 그 전에 질문에 대한 답을 간단히 써봅니다.

Netfilter
netfilter는 리눅스의 네트웍 filtering 관련 레이어 전체를 일컫습니다. 방화벽이라고만 하기엔 범주가 좀 많이 크죠.

netfilter를 사용하게 되면, 모든 패킷들은 netfilter 의 특정 루틴들 (CHAIN이라고 하죠)을 거치게 됩니다. PREROUTING, POSTROUTING, FORWARD, INPUT, OUTPUT 등이 있습니다. 얘네들은 패킷의 출발지와 목적지에 따라 분류가 됩니다. 자세한 것은 찾아보시고,

룰을 넣는다고 하는 것은 저 특정 위치에서 '어떤 일을 할'지를 정하는 것이 되겠습니다. 어떤 일이란, 차단/승인 한다거나(filter) 출발지/목적지 주소를 바꾼다거나 (nat), 그 밖의 정보를 수정(mangle) 하는 일이 되겠습니다. 괄호 안에 넣은 것들을 table 이라고 합니다.

IPtables
그렇다면 iptables란 무엇인가, 저 table들이 바로 iptables입니다. netfilter 라는 큰 네트웍 프레임웍 안에서 어떤 룰들을 적용하는것이 iptables입니다. iptables에서는 netfilter가 제공하는 각종 함수들 (특정 어딘가에 hook을 거는 짓)을 합니다. 예를들면 nat는 POSTROUTING/PREROUTING 에 훅을 겁니다. mangle은 모든 CHAIN에 걸고요. filter..는 아마 확실치 않지만 INPUT/OUTPUT/FORWARD 였던걸로 기억합니다.

그런데 이런 filtering/mangling 은 꼭 IP 레이어에서만 이루어지는 것은 아닙니다. link layer인 ARP에서도 이런걸 하고 싶을 수 있겠죠. 요게 arptables가 되겠습니다. 또 브릿지 네트웍을 구성했다면 여기서도 무언가를 하고 싶을 수 있습니다. 이게 ebtables입니다.

. 여기까지 추가해 놓고 보니 문제가 생깁니다. arptables, ebtables는 iptables와 하는게 거의 비슷하지만 iptables가 ip 레벨에서 사용되는 것을 전제로 만들어졌기 때문에 다른데서 그대로 가져다 쓸 수가 없어서 비슷한 것을 추가하는 식으로 구현이 되었습니다. 결국 비슷한 기능을 하는 코드가 여기저기 펼쳐진 꼴이 되었죠.

Xtables
여기서 xtable이 등장합니다. x=[arp, eb, ip] 정도라고 보면 되겠죠. 얘네들의 공통적인 로직을 빼서 xtable을 만들고, 각각의 arptables, ebtables, iptables는 이걸 가져다 래핑해서 쓰게 됩니다. xtables는 추상화 레이어, 혹은 라이브러리라고 보면 되겠습니다.

Netlink
이제 nfnetlink가 남았군요. ntfnetfilter 얘기를 하기전에 우선 netlink socket을 알아야 합니다. netlink는 리눅스에서 쓰는 IPC 입니다. user process <=> user process 에도 쓰지만, kernel <=> userspace 간의 통신에 쓰입니다. netlink socket이란 이름 답게 socket 인터페이스를 사용하지요. netlink에 대해서는 위키피디아 Netlink 페이지에 정리가 잘 되어있네요. 혹은 커널 소스의 generic_netlink 설명을 보셔도 좋습니다. 참고로 netlink를 이용하는 대표적인 유틸리티는 ip(8) 가 있습니다. 역시 자세한 것은 manpage를...

nfnetlink
그럼 nfnetlink는? netfilter에서 구현한 netlink 인터페이스 입니다. 넷필터의 동작들 - 주로 iptables 관련이 되겠죠 - 를 제어하기 위한 녀석입니다. NFQUEUE 도 netlink 인터페이스로 구현이 되어 있지요. nfnetlink 자체는 netfilter처럼 특별한 일을 하지 않고요. packet logging이나 방금 얘기한 queue, 혹은 conntrack 이벤트를 userspace daemon에서 받는 등의 용도로 사용합니다.

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

junee74의 이미지

아주 자세한 답변 감사드립니다.

답변해주신 내용중에...

IPtables
그렇다면 iptables란 무엇인가, 저 table들이 바로 iptables입니다. netfilter 라는 큰 네트웍 프레임웍 안에서 어떤 룰들을 적용하는것이 iptables입니다. iptables에서는 netfilter가 제공하는 각종 함수들 (특정 어딘가에 hook을 거는 짓)을 합니다. 예를들면 nat는 POSTROUTING/PREROUTING 에 훅을 겁니다. mangle은 모든 CHAIN에 걸고요. filter..는 아마 확실치 않지만 INPUT/OUTPUT/FORWARD 였던걸로 기억합니다.

실제 이 프로그램 자체가 HOOK을 걸거나 하지는 않는거 같습니다.
이 프로그램은 Table 자체를 수정하는 역활만 하는것이 아닌지요?

제가 소스를 더 보변서 각 프로그램과 모듈들의 역활을 유추해 보면 다음과 같아 보입니다.
이 부분이 제가 정확히 분석한게 맞는지 궁금합니다.
특히 filter 부분에 관심을 가지고 분석하고 있습니다.

iptables 유저영역에서 실행되며 실제 각 Table을 수정/삭제/추가 하는 역활
x_tables 실제 Library 역활을 하는 Module
iptable_filter 실제 Hook을 걸며, Hook 함수에서 packet이 Match되는지를 검사하는 루틴을 호출해 주는 Module
ip_tables 실제 Match가 되는지 확인하는 기능이 구현되어 있으며 실제 테이블을 저장하는 Module

처럼 보이고 있습니다.
이 부분을 제가 제대로 이해 하고 있는걸까요?

mithrandir의 이미지

한가지 빼먹은게 있군요. iptables는 커널코드이기도 하고 그걸 제어하는 설정 유틸리티의 이름이기도 합니다. 위에서 얘기한건 전부 커널코드 쪽 얘기입니다.

언제나 삽질 - http://tisphie.net/typo/
프로그래밍 언어 개발 - http://langdev.net

junee74의 이미지

자세한 답변 감사드립니다.

댓글 달기

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