>  기사  >  운영 및 유지보수  >  Linux의 iptables 원리에 대한 자세한 그래픽 설명

Linux의 iptables 원리에 대한 자세한 그래픽 설명

黄舟
黄舟원래의
2017-07-26 16:00:092545검색

, netfilter 및 iptables


  (1) Netfilter는 Rusty Russell이 제안한 Linux 2.4 커널 방화벽 프레임워크로, 프레임워크는 간결하고 유연하며 패킷 필터링, 데이터 등 보안 정책 애플리케이션에서 많은 기능을 구현할 수 있습니다. 패킷 처리, 주소 위장, 투명 프록시, 동적 네트워크 주소 변환(NAT), 사용자 및 미디어 액세스 제어(MAC) 주소 기반 필터링, 상태 기반 필터링, 패킷 속도 제한, 등. Iptables/Netfilter의 이러한 규칙은 뛰어난 디자인 아이디어 덕분에 모든 측면을 포괄하는 많은 기능을 구성하기 위해 유연하게 결합될 수 있습니다.

 Netfilter는 Linux 운영 체제의 핵심 계층에 있는 패킷 처리 모듈입니다.

  • 네트워크 주소 변환

  • 패킷 콘텐츠 수정

  • 패킷 필터링 방화벽

  ( 2) Netfilter 플랫폼은 데이터 패킷을 위한 5개의 장착 지점(콜백 기능 지점으로 이해할 수 있는 후크 지점)을 공식화했습니다. 데이터 패킷이 이 위치에 도달하면 함수가 적극적으로 호출되어 방향을 변경할 수 있는 기회를 제공합니다. 데이터 패킷이 라우팅될 때 콘텐츠), 이 5개의 마운트 지점은 PRE_ROUTING, INPUT, OUTPUT, FORWARD, POST_ROUTING. PRE_ROUTINGINPUTOUTPUTFORWARDPOST_ROUTING

 

  (3)Netfilter 所设置的规则是存放在内核内存中的,而 iptables 是一个应用层的应用程序,它通过 Netfilter 放出的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables、链chains、规则rules组成,iptables在应用层负责修改这个规则文件。类似的应用程序还有 firewalld 。

   

 


 二、filter、nat、mangle等规则四表


 (1)table有 filter、nat、mangle等规则表;

  filter表

    主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter,包含三个规则链:

    • INPUT链:INPUT针对那些目的地是本地的包

    • FORWARD链:FORWARD过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的

    • OUTPUT链:OUTPUT是用来过滤所有本地生成的包    

  nat表

    主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过

  这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。表对应的内核模块为 iptable_nat,包含三个链

    • PREROUTING链:作用是在包刚刚到达防火墙时改变它的目的地址

    • OUTPUT链:改变本地产生的包的目的地址

    • POSTROUTING

   (3) Netfilter 설정 규칙은 다음과 같습니다. iptables는 커널 메모리에 저장되는 XXtables(Netfilter 구성 테이블)을 Netfilter에서 출시한 인터페이스를 통해 수정하는 응용 계층 응용 프로그램입니다. 이 XXtables는 tables 테이블, chains 규칙 및 rules 규칙으로 구성됩니다. iptables는 애플리케이션 계층에서 이 규칙 파일을 수정하는 일을 담당합니다. 유사한 응용 프로그램은 방화벽입니다.

 

2. 필터, nat, 맹글 및 기타 규칙의 4개 테이블

(1) 테이블에는 필터, nat, 맹글 및 기타 규칙 테이블(예: DROP, ACCEPT, REJECT, LOG)이 있습니다. 필터 테이블에 해당하는 커널 모듈은 iptable_filter이며, 여기에는 세 가지 규칙 체인이 포함되어 있습니다:

INPUT code>체인:

INPUT은 대상이 로컬

FORWARD체인:

FORWARD는 로컬에서 생성되지 않고 대상이 로컬이 아닌 모든 패킷을 필터링합니다(즉, , 로컬 시스템은 전달만 담당합니다)

🎜🎜🎜🎜OUTPUT 체인: 🎜OUTPUT은 로컬에서 생성된 모든 패킷을 필터링하는 데 사용됩니다 🎜🎜🎜🎜🎜🎜🎜 nat 테이블 🎜🎜🎜🎜🎜 주로 패킷 주소, 포트 번호 및 기타 정보(SNAT, DNAT, MASQUERADE, REDIRECT와 같은 네트워크 주소 변환)의 IP를 수정하는 데 사용됩니다. 흐름(패킷 크기 제한으로 인해 데이터가 여러 패킷으로 분할될 수 있음)에 속하는 패킷은 이 테이블을 한 번만 통과합니다. 첫 번째 패킷이 NAT 또는 Masqueraded가 허용되면 나머지 패킷은 자동으로 동일한 작업을 받게 됩니다. 즉, 나머지 패킷은 이 테이블을 통과하지 않습니다. 테이블에 해당하는 커널 모듈은 iptable_nat이며, 여기에는 세 개의 체인 🎜🎜
    🎜🎜🎜PREROUTING)이 포함되어 있습니다. > chains : 🎜패킷이 방화벽에 막 도달하면 패킷의 대상 주소를 변경하는 기능입니다🎜🎜🎜🎜🎜OUTPUT체인: 🎜로컬 생성된 패킷의 대상 주소 변경🎜🎜🎜🎜 🎜포스트아웃 코드>체인: 🎜패킷이 방화벽을 떠나기 전에 소스 주소를 변경하세요🎜🎜🎜🎜🎜🎜 🎜mangle table🎜🎜🎜🎜 주로 TOS(Type Of Service, Service Type)를 수정하는 데 사용됩니다. ), 데이터 패킷의 TTL(Time To) Live, lifecycle)은 Qos(Quality Of Service, Quality of Service) 조정 및 정책 라우팅 적용을 구현하기 위해 데이터 패킷에 대한 마크 표시를 설정하는 것을 의미하므로 해당 라우팅 장비 지원이 필요하므로, 널리 사용되지는 않습니다. PREROUTING, POSTROUTING, INPUT, OUTPUT, FORWARD의 5개 규칙 체인이 포함되어 있습니다. 🎜🎜 🎜🎜raw table🎜🎜🎜🎜  은 버전 1.2.9부터 iptables에 추가된 새로운 테이블입니다. 주로 데이터 패킷이 상태 추적 메커니즘에 의해 처리되는지 확인하는 데 사용됩니다. 데이터 패킷을 일치시킬 때 원시 테이블의 규칙이 다른 테이블보다 우선합니다. OUTPUT, PREROUTING🎜🎜🎜🎜🎜🎜이라는 두 개의 규칙 체인이 포함되어 있습니다.<p>(2) iptables의 4가지 <strong> 상태 및 </strong>4가지 추적 연결 <strong>: </strong></p> <ul class=" list-paddingleft-2"><ul class=" list-paddingleft-2" style="list-style-type: square;"> <li><p><strong><code>NEW: NEW:该包想要开始一个连接(重新连接或将连接重定向)

  • RELATED该包是属于某个已经建立的连接所建立的新连接。例如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。--icmp-type 0 ( ping 应答) 就是--icmp-type 8 (ping 请求)所RELATED出来的。

  • ESTABLISHED :只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包。

  • INVALID数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据。

 


三、INPUT、FORWARD等规则五链和规则 


 

(1)在处理各种数据包时,根据防火墙规则的不同介入时机,iptables供涉及5种默认规则链,从应用时间点的角度理解这些链:

    • INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。

    • OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。

    • FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则。

    • PREROUTING链:在对数据包作路由选择之前,应用此链中的规则,如DNAT。

    • POSTROUTING패키지가 연결을 시작하려고 합니다(재연결 또는 리디렉션) 연결)

    관련:
이 패키지는 이미 설정된 연결에 의해 설정된 새 연결입니다. 예: FTP 데이터 전송 연결은 제어 연결과 관련된 연결입니다. --icmp-type 0(ping 응답)은 --icmp-type 8(ping 요청)과 관련됩니다.

ESTABLISHED:

응답이 전송되고 수신되는 한 데이터 연결은 NEW에서 ESTABLISHED로 변경되며 이 상태는 이 연결의 후속 데이터 패킷과 계속 일치합니다.



INVALID:

데이터 패킷이 어느 연결에 속해 있는지 식별할 수 없거나 메모리 오버플로와 같은 상태가 없으며 속하지 않는 ICMP 오류 메시지가 수신됩니다. 일반적으로 이 상태의 모든 데이터는 삭제되어야 합니다.

Three, INPUT, FORWARD 및 기타 규칙 5개의 체인 및 규칙

    (1) 다양한 데이터 패킷을 처리할 때 방화벽 규칙의 다양한 개입 타이밍에 따라 iptables는 5개의 기본 규칙 체인을 제공합니다. 애플리케이션 시점의 관점에서 이러한 체인을 이해합니다:
    • INPUT 체인:
    • 방화벽의 기본 주소에서 데이터를 수신할 때 패킷이 전송(인바운드)되면 이 체인의 규칙이 적용됩니다.

      🎜🎜🎜🎜🎜OUTPUT 체인: 🎜🎜이 체인은 방화벽이 기본적으로 규칙에서 패킷 아웃바운드(아웃바운드)를 보낼 때 적용됩니다. . 🎜🎜🎜🎜🎜🎜🎜🎜🎜FORWARD 체인: 🎜🎜방화벽을 통해 다른 주소로 보내야 하는 패킷이 수신되었을 때(전달됨) ), 이 체인에 규칙을 적용합니다. 🎜🎜🎜🎜🎜🎜🎜🎜🎜PREROUTING 체인: 🎜🎜패킷을 라우팅하기 전에 DNAT와 같은 이 체인의 규칙을 적용하세요. 🎜🎜🎜🎜🎜🎜🎜🎜🎜POSTROUTING 체인: 🎜🎜패킷을 라우팅한 후 이 체인에 SNAT와 같은 규칙을 적용합니다. 🎜🎜🎜🎜🎜🎜🎜🎜 🎜🎜 (2) 그중 INPUT 및 OUTPUT 체인은 주로 서버 자체에 들어오고 나가는 데이터의 보안 제어를 위해 "호스트 방화벽"에서 더 일반적으로 사용됩니다. FORWARD, PREROUTING 및 POSTROUTING 체인이 더 많습니다. "네트워크 방화벽"에서 널리 사용되며, 특히 방화벽 서버가 게이트웨이로 사용될 때 더욱 그렇습니다. 🎜🎜🎜 4. 리눅스 패킷 라우팅의 원리 🎜🎜🎜 🎜🎜                                                        − in을 통한 패킷 라우팅의 역할은 무엇입니까? 🎜🎜  작업 흐름: 네트워크 포트 데이터 패킷은 기본 네트워크 카드 NIC에서 수신되며 데이터 링크 계층에서 압축을 푼 후(데이터 링크 프레임 헤더 제거) TCP/IP 프로토콜 스택에 들어갑니다(기본적으로 네트워크 데이터 패킷). 커널 드라이버 처리) 및 Netfilter 혼합 패킷 처리 흐름을 보여줍니다. 데이터 패킷을 수신, 처리 및 전달하는 프로세스는 유한 상태 벡터 머신을 구성하며 일련의 커널 처리 기능과 Netfilter Hook 포인트를 거친 후 최종적으로 이 상위 계층 애플리케이션에 의해 전달되거나 소화됩니다. 🎜🎜그림에 표시된 대로: 🎜🎜🎜🎜🎜위 그림에서 다음 규칙을 요약할 수 있습니다. 🎜🎜🎜🎜🎜데이터 패킷이 네트워크 카드에 들어갈 때 데이터 패킷은 먼저 🎜PREROUTING 체인🎜에 들어갑니다. PREROUTING 체인에서는 데이터 패킷의 DestIP(대상 IP)를 수정할 수 있는 기회가 있으며, 커널의 "라우팅 모듈"은 "데이터 패킷 대상 IP"와 "라우팅 테이블"을 기반으로 이를 전달해야 하는지 여부를 결정합니다. "(데이터 패킷의 DestIP는 당사에 의해 수정되었을 수 있습니다.)🎜🎜🎜🎜데이터 패킷이 로컬 시스템에 들어가는 경우(즉, 데이터 패킷의 대상 IP는 커널의 네트워크 포트 IP입니다.) 로컬 머신), 데이터 패킷은 다이어그램을 따라 아래로 이동하여 🎜INPUT 체인🎜에 도달합니다. 패킷이 INPUT 체인에 도달하면 모든 프로세스가 이를 수신하게 됩니다 🎜
    • 이 컴퓨터에서 실행되는 프로그램은 데이터 패킷을 보낼 수도 있습니다. 이러한 데이터 패킷은 OUTPUT 체인을 통과한 다음 그런 다음 POSTROTING 체인 출력에 도착합니다(데이터 패킷의 SrcIP는 당사에 의해 수정되었을 수 있습니다). 이때)

    • 데이터 패킷이 전달되어야 하고(즉, 대상 IP 주소가 현재 서브넷에 더 이상 존재하지 않음) 커널이 전달을 허용하는 경우 데이터 패킷은 오른쪽으로 이동하여 통과합니다. FORWARD 체인을 거쳐 POSTROUTING 체인 출력에 도달합니다(서브넷에 해당하는 네트워크 포트를 선택하여 전송합니다)

 iptables 규칙을 작성할 때 항상 이 라우팅 시퀀스 다이어그램을 염두에 두고 유연하게 다양한 Hook 포인트에 따라 규칙 구성


Five , iptables writing rule


명령 형식:

예:

 

1 iptables -I NPUT -s 0/0 -d 192.168.42.153 -p tcp -m multiport --dports 22, 80,3306 -j ACCEPT

  

1 iptables -t filter -I INPUT -d 192.168.42.153 -p tcp --dport 80 -j ACCEPT

 <p>1.[-t 테이블 이름]<code>  <strong>1.[-t 表名]</strong>:该规则所操作的哪个表,可以使用filter、nat等,如果没有指定则默认为filter

    • -A:新增一条规则,到该规则链列表的最后一行

    • -I:插入一条规则,原本该位置上的规则会往后顺序移动,没有指定编号则为1

    • -D:从规则链中删除一条规则,要么输入完整的规则,或者指定规则编号加以删除

    • -R:替换某条规则,规则替换不会改变顺序,而且必须指定编号。

    • -P:设置某条规则链的默认动作

    • -nL-L-n,查看当前运行的防火墙规则列表

  2.chain名:指定规则表的哪个链,如INPUT、OUPUT、FORWARD、PREROUTING等

    • [规则编号]:插入、删除、替换规则时用,--line-numbers显示号码

    • [-i|o 网卡名称]:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出

    • [-p 协议类型]:可以指定规则应用的协议,包含tcp、udp和icmp等

    • [-s 源IP地址]:源主机的IP地址或子网地址

    • [--sport 源端口号]:数据包的IP的源端口号

    • [-d目标IP地址]:目标主机的IP地址或子网地址

    • [--dport目标端口号]:数据包的IP的目标端口号

  <strong>3.-m</strong>:extend matches,这个选项用于提供更多的匹配参数,如:


    • -m state --state ESTABLISHED,RELATED

    • -m tcp --dport 22

    • -m multiport --dports 80,8080

    • -m icmp --icmp-type 8

  <strong>4.<-j 动作></strong>:处理数据包的动作,包括ACCEPT、DROP、REJECT等


    • ACCEPT允许数据包通过

    • DROP直接丢弃数据包,不给任何回应信息

    • REJECT拒绝数据包通过,必要时会给数据发送端一个响应的信息。

    • SNAT源地址转换。在进入路由层面的route之后,出本地的网络栈之前,改写源地址,目标地址不变,并在本机建立NAT表项,当数据返回时,根据NAT表将目的地址数据改写为数据发送出去时候的源地址,并发送给主机。解决内网用户用同一个公网地址上网的问题。
      MASQUERADE

      : 이 규칙이 작동하는 테이블은 filter, nat 등을 사용할 수 있으며 지정하지 않으면 기본값은 filter🎜🎜
          🎜🎜-A: 새 규칙 추가 규칙 체인 목록의 마지막 줄에🎜🎜🎜🎜-I: 규칙을 삽입하세요. 이 위치의 규칙은 순차적으로 이동됩니다. 숫자가 지정되지 않으면 1🎜🎜🎜이 됩니다. 🎜<code>-D: 규칙 체인에서 규칙을 삭제하거나 전체 규칙을 입력하거나 규칙 번호를 지정하여 삭제합니다🎜🎜🎜🎜-R: 규칙을 교체합니다. 규칙 교체는 순서를 변경하지 않으며, 번호를 지정해야 합니다. 🎜🎜🎜🎜-P: 특정 규칙 체인의 기본 동작 설정🎜🎜🎜🎜-nL: -L, - n, 현재 실행 중인 방화벽 규칙 목록 보기🎜🎜🎜🎜🎜 🎜2.체인 이름: INPUT, OUPUT, FORWARD, PREROUTING과 같은 규칙 테이블의 체인을 지정합니다. 등🎜🎜
            🎜🎜[규칙 번호] : 삽입 규칙을 삭제하거나 교체할 때 --line-numbers를 사용하여 숫자를 표시합니다 🎜🎜🎜🎜[-i|o 네트워크 카드 이름]: i 데이터 패킷이 네트워크 카드 항목에서 나오는 블록을 지정합니다. o 데이터 패킷이 출력되는 네트워크 카드를 지정합니다🎜🎜🎜🎜[-p 프로토콜 유형]: 규칙 적용을 위한 프로토콜을 지정할 수 있습니다. tcp, udp 및 icmp 등을 포함합니다.🎜🎜🎜🎜[-s 소스 IP 주소]
          : 소스 호스트의 IP 주소 또는 서브넷 주소🎜🎜🎜🎜[--sport source port number]: 데이터 패킷 번호의 IP의 소스 포트 🎜🎜🎜🎜[-d 대상 IP 주소]: 대상 호스트의 IP 주소 또는 서브넷 주소 🎜🎜 🎜🎜[--dport 대상 포트 번호]: data 패킷 IP의 대상 포트 번호 🎜🎜🎜🎜🎜 🎜3.-m🎜🎜: 일치 확장, 이 옵션은 다음과 같은 추가 일치 매개변수를 제공하는 데 사용됩니다. 🎜🎜
            🎜🎜
            🎜🎜
              🎜🎜-m 상태 --state ESTABLISHED, RELATED --M TCP-DPORT 22🎜🎜🎜🎜-M Multiport-Dports 80,8080🎜🎜🎜🎜-M ICMP-ICMP-TYPE 8🎜🎜🎜🎜🎜 🎜4. & Lt; -j Action>🎜🎜: ACCEPT, DROP, REJECT 등을 포함한 데이터 패킷 처리 작업.🎜🎜
                🎜🎜
                🎜🎜
                  🎜🎜🎜수락: 🎜 패킷 통과 허용🎜🎜🎜🎜🎜DROP: 🎜응답 정보 제공 없이 데이터 패킷을 직접 삭제🎜🎜🎜🎜🎜REJECT: 🎜데이터 패킷 통과 거부 , 필요한 경우 데이터 송신 측에 응답 정보를 제공합니다. 🎜🎜🎜🎜🎜SNAT: 🎜원본 주소 번역. 라우팅 수준에서 경로를 입력한 후 로컬 네트워크 스택을 종료하기 전에 소스 주소가 다시 작성되고 대상 주소는 변경되지 않고 NAT 테이블 항목이 로컬 시스템에 설정됩니다. 데이터가 반환되면 대상 주소 데이터가 생성됩니다. NAT 테이블에 따라 데이터로 다시 작성되어 호스트로 전송됩니다. 인트라넷 사용자가 동일한 공용 네트워크 주소를 사용하여 인터넷에 액세스하는 문제를 해결합니다.
                  MASQUERADE는 SNAT의 특별한 형태로, Adsl처럼 일시적으로 변경되는 IP 주소에 적합합니다🎜
    • DNAT: 대상 주소 변환. SNAT와 달리 IP 패킷이 경로를 통과하기 전에 대상 주소가 다시 수정되고 소스 주소는 변경되지 않은 상태로 유지됩니다. 데이터가 반환되면 소스 주소가 변경되지 않습니다. 데이터가 원격 호스트로 전송될 때 NAT 테이블의 대상 주소로 동시에 전송됩니다. 백엔드 서버의 실제 주소는 숨겨질 수 있습니다. (이 곳이 SNAT으로 거꾸로 쓰여졌다는 점을 지적해주신 네티즌에게 감사드립니다)
      REDIRECT: 네트워크 패킷을 타겟에 관계없이 로컬 호스트로 전달하는 특별한 형태의 DNAT입니다. IP 헤더에 지정됨) 주소는 무엇입니까) 이 시스템에서 포트 전달을 용이하게 합니다. DNAT:目标地址转换。和SNAT相反,IP包经过route之前,重新修改目标地址,源地址不变,在本机建立NAT表项,当数据返回时,根据NAT表将源地址修改为数据发送过来时的目标地址,并发给远程主机。可以隐藏后端服务器的真实地址。(感谢网友提出之前这个地方与SNAT写反了)
      REDIRECT:是DNAT的一种特殊形式,将网络包转发到本地host上(不管IP头部指定的目标地址是啥),方便在本机做端口转发。

    • LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则

     除去最后一个LOG

🎜LOG: /var/log/messages 파일에 로그 정보를 기록한 후 패킷을 다음 규칙으로 전달합니다🎜🎜 🎜   마지막 LOG를 제외하고 처음 세 개의 규칙이 패킷과 일치하면 해당 패킷은 더 이상 일치하지 않으므로 작성된 규칙의 순서가 매우 중요합니다. 🎜🎜🎜

위 내용은 Linux의 iptables 원리에 대한 자세한 그래픽 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.