>  기사  >  운영 및 유지보수  >  Linux 방화벽 소프트웨어 IPtables를 사용하는 방법을 모릅니다! 당신은 어떤 운영 및 유지관리 담당자인가요?

Linux 방화벽 소프트웨어 IPtables를 사용하는 방법을 모릅니다! 당신은 어떤 운영 및 유지관리 담당자인가요?

Linux中文社区
Linux中文社区앞으로
2023-08-01 17:36:231357검색

Linux 방화벽 소프트웨어 IPtables를 사용하는 방법을 모릅니다! 당신은 어떤 운영 및 유지관리 담당자인가요?

연결 추적(conntrack)

연결 추적은 많은 웹 애플리케이션의 기초입니다. 예를 들어 Kubernetes Service, ServiceMesh 사이드카, 소프트웨어 4계층 로드 밸런서 LVS/IPVS, Docker 네트워크, OVS, iptables 호스트 방화벽 등은 모두 연결 추적 기능에 의존합니다.
Linux 방화벽 소프트웨어 IPtables를 사용하는 방법을 모릅니다! 당신은 어떤 운영 및 유지관리 담당자인가요?
연결 추적은 이름에서 알 수 있듯이 연결 상태를 추적(및 기록)하는 것입니다. 예를 들어, 그림 1.1은 IP 주소가 10.1.1.2인 Linux 시스템입니다. 이 시스템에는 세 가지 연결이 있음을 알 수 있습니다. 포트 80)
  • 외부 접속 기기에서 FTP 서비스로의 연결(대상 포트 21)
  • 기기에서 외부 DNS 서비스로의 연결(대상 포트 53)
  • 연결 추적이 수행하는 작업은 다음과 같은 연결 상태를 검색하고 추적하는 것입니다.
데이터 패킷에서 튜플 정보를 추출하고, 데이터 흐름(흐름)과 해당 연결(연결)을 식별합니다.
  • 연결 생성 시간, 전송된 패킷 수, 전송된 바이트 수 등과 같은 모든 연결에 대한 상태 데이터베이스(conntrack 테이블)를 유지 관리합니다.
  • 만료된 연결(GC)을 재활용합니다.
  • NAT 등 상위 기능을 위한 서비스를 제공합니다.
연결 추적의 "연결" 개념은 TCP/IP 프로토콜의 "연결 지향" 개념과 정확히 동일하지 않습니다. 간단히 말해서:
  • In TCP/IP 프로토콜에서 연결은 레이어 4 개념입니다. TCP는 연결 지향적이며 전송된 모든 패킷에는 피어의 응답(ACK)이 필요하며 재전송 메커니즘이 있습니다. UDP는 연결이 없으며 전송된 패킷에는 피어의 응답이 필요하지 않으며 재전송 메커니즘도 없습니다.
  • conntrack(CT)에서는 튜플(tuple)로 정의된 데이터 흐름(flow)이 연결(connection)을 나타낸다. UDP 및 ICMP와 같은 3계층 프로토콜도 CT에 연결 기록을 가지고 있지만 모든 프로토콜이 연결되는 것은 아니라는 점을 나중에 살펴보겠습니다.

Netfilter

Linux 방화벽 소프트웨어 IPtables를 사용하는 방법을 모릅니다! 당신은 어떤 운영 및 유지관리 담당자인가요?
Linux 연결 추적은 Netfilter에서 구현됩니다.
Netfilter는 데이터 패킷을 제어, 수정 및 필터링(조작 및 필터링)하기 위한 Linux 커널의 프레임워크입니다. 데이터 패킷을 가로채거나 필터링하거나 처리하기 위해 커널 프로토콜 스택에 여러 후크 지점을 설정합니다.
이제 연결 추적(conntrack)이 언급되면 Netfilter가 먼저 떠오를 수 있습니다. Netfilter는 Linux 커널의 연결 추적 구현일 뿐입니다. 즉, 후크 기능이 있고 호스트에 들어오고 나가는 모든 패킷을 가로챌 수 있는 한, 이를 기반으로 자체적으로 일련의 연결 추적을 구현할 수 있습니다.
Linux 방화벽 소프트웨어 IPtables를 사용하는 방법을 모릅니다! 당신은 어떤 운영 및 유지관리 담당자인가요?
클라우드 네이티브 네트워크 솔루션 Cilium은 버전 1.7.4 이상에서 독립적인 연결 추적 및 NAT 메커니즘을 구현했습니다(전체 기능에는 커널 4.19 이상이 필요함). 기본 원칙은 다음과 같습니다.
  • BPF Hook 기반 패킷 차단 기능 구현(netfilter의 Hook 메커니즘과 동일)
  • BPF Hook 기반으로 새로운 conntrack 및 NAT 세트 구현 따라서 Netfilter를 제거해도 Kubernetes ClusterIP, NodePort, ExternalIPs 및 LoadBalancer와 같은 기능에 대한 Cilium의 지원에는 영향을 미치지 않습니다. 이 연결 추적 메커니즘은 Netfilter와 독립적이므로 해당 conntrack 및 NAT 정보는 커널(즉, Netfilter의) conntrack 테이블 및 NAT 테이블에 저장되지 않습니다.따라서 일반 conntrack/netstats/ss/lsof 및 기타 도구는 볼 수 없습니다.
$ cilium bpf nat list$ cilium bpf ct list global

Iptables

Iptables는 Netfilter 필터링을 구성하기 위한 사용자 공간 도구입니다. 기능. Netfilter는 방화벽의 실제 보안 프레임워크이며, netfilter는 커널 공간에 위치합니다. iptables는 실제로 사용자 공간에 위치한 명령줄 도구입니다. 우리는 이 도구를 사용하여 실제 프레임워크를 작동합니다. Iptable은 수락, 거부, 삭제 등 규칙에 정의된 방법에 따라 데이터 패킷을 처리합니다.
예를 들어 클라이언트가 서버의 웹 서비스에 액세스하면 클라이언트는 네트워크 카드로 메시지를 보내고 tcp/ip 프로토콜 스택은 커널의 일부이므로 클라이언트의 정보가 사용자에게 전송됩니다. 웹 서비스에서 이때 클라이언트 메시지의 대상 끝점은 웹 서비스가 모니터링하는 소켓(IP:Port)입니다. 웹 서비스가 보낸 응답 메시지는 클라이언트이며, 이때 웹 서비스가 모니터링하는 IP와 포트가 원본이 됩니다. 따라서 이는 커널의 일부입니다. , 방화벽이 "화재 예방" 목적을 달성하려면 커널에 체크포인트를 설정해야 합니다. 모든 수신 및 발신 메시지는 검사 후 릴리스 조건을 충족하는 메시지만 이 체크포인트를 통과해야 합니다. 해제가 가능하며, 차단 조건에 맞는 것은 차단해야 합니다.
Linux 방화벽 소프트웨어 IPtables를 사용하는 방법을 모릅니다! 당신은 어떤 운영 및 유지관리 담당자인가요?
iptables에는 테이블 4개와 체인 5개가 있습니다. 테이블은 데이터 패킷에 대한 동작(필터링, NAT 등)에 따라 구분되며, 체인은 서로 다른 Hook 지점에 따라 구분됩니다. 테이블과 체인은 실제로 netfilter의 두 가지 차원입니다.
iptables의 4개 테이블은 filter, mangle, nat, raw입니다. 기본 테이블은 filter입니다.
  • 필터 테이블: 데이터 패킷을 필터링하는 데 사용됩니다. 특정 규칙 요구 사항에 따라 데이터 패킷 처리 방법이 결정됩니다.
  • nat 테이블: 주로 데이터 패킷의 IP 주소 및 포트 번호 정보를 수정하는 데 사용됩니다.
  • mangle 테이블: 주로 데이터 패킷의 서비스 유형 및 수명 주기 수정, 데이터 패킷의 태그 설정, 트래픽 셰이핑 구현, 정책 라우팅 등에 사용됩니다.
  • 원시 테이블: 주로 데이터 패킷에 대한 상태 추적을 수행할지 여부를 결정하는 데 사용됩니다.
iptables의 5개 체인은 PREROUTING, INPUT, FORWARD, OUTPUT 및 POSTROUTING입니다.
  • 입력 체인: 로컬 주소에 액세스하는 패킷이 수신되면 이 체인의 규칙이 적용됩니다.
  • 출력 체인: 기계가 패킷을 보낼 때 이 체인의 규칙이 적용됩니다.
  • 전달 체인: 다른 주소로 전달해야 하는 데이터 패킷을 수신할 때 이 체인의 규칙이 적용됩니다. 전달 전달을 구현해야 하는 경우 에서 ip_forward 기능을 활성화해야 합니다. 리눅스 커널.
  • 라우팅 전 체인: 이 체인의 규칙은 패킷을 라우팅하기 전에 적용됩니다.
  • 포스트라우팅 체인: 패킷을 라우팅한 후 이 체인의 규칙이 적용됩니다.
테이블과 체인 사이의 해당 관계는 아래 그림에 나와 있습니다.
몇 가지 일반적인 시나리오에서 메시지의 흐름을 상상할 수 있습니다. 로컬 머신: PREROUTING –>
  • 이 시스템에서 전달되는 메시지: PREROUTING –> FORWARD –>
  • 로컬 시스템의 프로세스에서 보낸 메시지(일반적으로 응답 메시지): OUTPUT –>
데이터 패킷이 방화벽을 통과하는 과정을 다음 그림과 같이 요약할 수 있습니다.

Query Rules

  • -t: 테이블 이름
  • -n: Do IP 주소를 확인하지 않음
  • -v: 카운터 정보, 패킷 수 및 크기를 표시합니다.
  • -x: 이 옵션은 카운터의 정확한 값을 표시함을 나타냅니다.
  • --line-numbers : 표시 규칙의 일련번호(--line으로 축약)
  • 또한, 공용 계정인 Linux를 검색할 때 "monkey"라고 답하는 방법을 익혀야 합니다. 깜짝 선물 패키지를 받기 위해 백그라운드에서.
  • -L:链名
#iptables -t filter -nvxL DOCKER  --lineChain DOCKER (1 references)num      pkts      bytes target     prot opt in     out     source               destination1        5076   321478 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.2           tcp dpt:84432       37233 54082508 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.2           tcp dpt:223        1712   255195 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.3           tcp dpt:90004           0        0 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.3           tcp dpt:80005       40224  6343104 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.4           tcp dpt:34436       21034  2227009 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.5           tcp dpt:33067          58     5459 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.6           tcp dpt:808         826    70081 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.6           tcp dpt:4439    10306905 1063612492 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.9           tcp dpt:330610     159775 12297727 ACCEPT     tcp  --  !docker0 docker0  0.0.0.0/0            172.17.0.7           tcp dpt:11111

增加规则

在指定表的指定链的尾部添加一条规则,-A 选项表示在对应链的末尾添加规则,省略 -t 选项时,表示默认操作 filter 表中的规则:
命令语法:iptables -t 表名 -A 链名 匹配条件 -j 动作示例:iptables -t filter -A INPUT -s 192.168.1.146 -j DROP
在指定表的指定链的首部添加一条规则,-I 选型表示在对应链的开头添加规则:
命令语法:iptables -t 表名 -I 链名 匹配条件 -j 动作示例:iptables -t filter -I INPUT -s 192.168.1.146 -j ACCEPT
在指定表的指定链的指定位置添加一条规则:
命令语法:iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作示例:iptables -t filter -I INPUT 5 -s 192.168.1.146 -j REJECT

删除规则

按照规则序号删除规则,删除指定表的指定链的指定规则,-D 选项表示删除对应链中的规则。示例表示删除filter表中INPUT链中序号为3的规则。:
命令语法:iptables -t 表名 -D 链名 规则序号示例:iptables -t filter -D INPUT 3
按照具体的匹配条件与动作删除规则,删除指定表的指定链的指定规则。示例表示删除filter表中INPUT链中源地址为192.168.1.146并且动作为DROP的规则。:
命令语法:iptables -t 表名 -D 链名 匹配条件 -j 动作示例:iptables -t filter -D INPUT -s 192.168.1.146 -j DROP
删除指定表的指定链中的所有规则,-F选项表示清空对应链中的规则:
命令语法:iptables -t 表名 -F 链名示例:iptables -t filter -F INPUT

修改规则

修改指定表中指定链的指定规则,-R 选项表示修改对应链中的规则,使用 -R 选项时要同时指定对应的链以及规则对应的序号,并且规则中原本的匹配条件不可省略。示例表示修改filter表中INPUT链的第3条规则,将这条规则的动作修改为ACCEPT, -s 192.168.1.146为这条规则中原本的匹配条件,如果省略此匹配条件,修改后的规则中的源地址可能会变为0.0.0.0/0:
命令语法:iptables -t 表名 -R 链名 规则序号 规则原本的匹配条件 -j 动作示例:iptables -t filter -R INPUT 3 -s 192.168.1.146 -j ACCEPT
设置指定表的指定链的默认策略(默认动作):
命令语法:iptables -t 表名 -P 链名 动作示例:iptables -t filter -P FORWARD ACCEPT

保存规则

方式一

当我们对规则进行了修改以后,如果想要修改永久生效,必须使用下面命令保存规则:
service iptables save
当然,如果你误操作了规则,但是并没有保存,那么使用 service iptables restart 命令重启 iptables 以后,规则会再次回到上次保存 /etc/sysconfig/iptables 文件时的模样。
centos7 中,已经不再使用 init 风格的脚本启动服务,而是使用 unit 文件,所以,在 centos7 中已经不能再使用类似 service iptables start 这样的命令了,所以 service iptables save 也无法执行,同时,在 centos7中,使用 firewall 替代了原来的 iptables service,不过不用担心,我们只要通过 yum 源安装 iptables与iptables-services 即可(iptables 一般会被默认安装,但是iptables-services 在 centos7 中一般不会被默认安装),在centos7 中安装完 iptables-services 后,即可像 centos6 中一样,通过 service iptables save 命令保存规则了,规则同样保存在 /etc/sysconfig/iptables 文件中。此处给出 centos7 中配置 iptables-service 的步骤:
#配置好yum源以后安装iptables-serviceyum install -y iptables-services#停止firewalldsystemctl stop firewalld#禁止firewalld自动启动systemctl disable firewalld#启动iptablessystemctl start iptables#将iptables设置为开机自动启动,以后即可通过iptables-service控制iptables服务systemctl enable iptables
上述配置过程只需一次,以后即可在 centos7 中使用 service iptables save 命令保存 iptables 规则了。

方式二

还可以使用另一种方法保存 iptables 规则,就是使用 iptables-save 命令。使用 iptables-save 并不能保存当前的 iptables 规则,但是可以将当前的 iptables 规则以”保存后的格式”输出到屏幕上。
所以,我们可以使用 iptables-save 命令,再配合重定向,将规则重定向到 /etc/sysconfig/iptables 文件中即可。
iptables-save > /etc/sysconfig/iptables

加载规则

我们也可以将 /etc/sysconfig/iptables 中的规则重新载入为当前的iptables 规则,但是注意,未保存入 /etc/sysconfig/iptables 文件中的修改将会丢失或者被覆盖。
使用 iptables-restore 命令可以从指定文件中重载规则,示例如下
iptables-restore < /etc/sysconfig/iptables

匹配条件

当规则中同时存在多个匹配条件时,多个条件之间默认存在”与”的关系,即报文必须同时满足所有条件,才能被规则匹配。
-s 用于匹配报文的源地址,可以同时指定多个源地址,每个IP之间用逗号隔开,也可以指定为一个网段。
#示例如下iptables -t filter -I INPUT -s 192.168.1.111,192.168.1.118 -j DROPiptables -t filter -I INPUT -s 192.168.1.0/24 -j ACCEPTiptables -t filter -I INPUT ! -s 192.168.1.0/24 -j ACCEPT
-d 用于匹配报文的目标地址,可以同时指定多个目标地址,每个 IP 之间用逗号隔开,也可以指定为一个网段。
#示例如下iptables -t filter -I OUTPUT -d 192.168.1.111,192.168.1.118 -j DROPiptables -t filter -I INPUT -d 192.168.1.0/24 -j ACCEPTiptables -t filter -I INPUT ! -d 192.168.1.0/24 -j ACCEPT
-p 用于匹配报文的协议类型,可以匹配的协议类型 tcp、udp、udplite、icmp、esp、ah、sctp 等(centos7 中还支持 icmpv6、mh)。
#示例如下iptables -t filter -I INPUT -p tcp -s 192.168.1.146 -j ACCEPTiptables -t filter -I INPUT ! -p udp -s 192.168.1.146 -j ACCEPT
-i 用于匹配报文是从哪个网卡接口流入本机的,由于匹配条件只是用于匹配报文流入的网卡,所以在 OUTPUT 链与 POSTROUTING 链中不能使用此选项。
#示例如下iptables -t filter -I INPUT -p icmp -i eth4 -j DROPiptables -t filter -I INPUT -p icmp ! -i eth4 -j DROP
-o 用于匹配报文将要从哪个网卡接口流出本机,于匹配条件只是用于匹配报文流出的网卡,所以在 INPUT 链与 PREROUTING 链中不能使用此选项。
#示例如下iptables -t filter -I OUTPUT -p icmp -o eth4 -j DROPiptables -t filter -I OUTPUT -p icmp ! -o eth4 -j DROP

扩展匹配条件

tcp扩展模块

常用的扩展匹配条件如下:
  • –sport:用于匹配 tcp 协议报文的源端口,可以使用冒号指定一个连续的端口范围。
  • –dport:用于匹配 tcp 协议报文的目标端口,可以使用冒号指定一个连续的端口范围。
  • –tcp-flags:用于匹配报文的tcp头的标志位。
  • –syn:用于匹配 tcp 新建连接的请求报文,相当于使用 <span style="outline: 0px;font-size: 17px;">–tcp-flags SYN,RST,ACK,FIN SYN</span>
注意,-p tcp与 -m tcp 并不冲突,-p 用于匹配报文的协议,-m 用于指定扩展模块的名称,正好,这个扩展模块也叫 tcp。
#示例如下iptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp --sport 22 -j REJECTiptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 22:25 -j REJECTiptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport :22 -j REJECTiptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m tcp --dport 80: -j REJECTiptables -t filter -I OUTPUT -d 192.168.1.146 -p tcp -m tcp ! --sport 22 -j ACCEPTiptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECTiptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN,ACK -j REJECTiptables -t filter -I INPUT -p tcp -m tcp --dport 22 --tcp-flags ALL SYN -j REJECTiptables -t filter -I OUTPUT -p tcp -m tcp --sport 22 --tcp-flags ALL SYN,ACK -j REJECTiptables -t filter -I INPUT -p tcp -m tcp --dport 22 --syn -j REJECT

udp 扩展模块

常用的扩展匹配条件:
  • –sport:匹配udp报文的源地址。
  • –dport:匹配udp报文的目标地址。
#示例iptables -t filter -I INPUT -p udp -m udp --dport 137 -j ACCEPTiptables -t filter -I INPUT -p udp -m udp --dport 137:157 -j ACCEPT

icmp 扩展模块

常用的扩展匹配条件:
  • –icmp-type:匹配icmp报文的具体类型。
#示例iptables -t filter -I INPUT -p icmp -m icmp --icmp-type 8/0 -j REJECTiptables -t filter -I INPUT -p icmp --icmp-type 8 -j REJECTiptables -t filter -I OUTPUT -p icmp -m icmp --icmp-type 0/0 -j REJECTiptables -t filter -I OUTPUT -p icmp --icmp-type 0 -j REJECTiptables -t filter -I INPUT -p icmp --icmp-type "echo-request" -j REJECT

multiport 扩展模块

常用的扩展匹配条件如下:
  • -p tcp -m multiport –sports 用于匹配报文的源端口,可以指定离散的多个端口号,端口之间用”逗号”隔开。
  • -p udp -m multiport –dports 用于匹配报文的目标端口,可以指定离散的多个端口号,端口之间用”逗号”隔开。
#示例如下iptables -t filter -I OUTPUT -d 192.168.1.146 -p udp -m multiport --sports 137,138 -j REJECTiptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80 -j REJECTiptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport ! --dports 22,80 -j REJECTiptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 80:88 -j REJECTiptables -t filter -I INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,80:88 -j REJECT

iprange 模块

包含的扩展匹配条件如下:
  • –src-range:指定连续的源地址范围。
  • –dst-range:指定连续的目标地址范围。
#示例iptables -t filter -I INPUT -m iprange --src-range 192.168.1.127-192.168.1.146 -j DROPiptables -t filter -I OUTPUT -m iprange --dst-range 192.168.1.127-192.168.1.146 -j DROPiptables -t filter -I INPUT -m iprange ! --src-range 192.168.1.127-192.168.1.146 -j DROP
牛逼啊!接私活必备的 N 个开源项目!赶快收藏

string 模块

常用扩展匹配条件如下:
  • –algo:指定对应的匹配算法,可用算法为bm、kmp,此选项为必需选项。
  • –string:指定需要匹配的字符串
我们想要达到的目的是,如果报文中包含”OOXX”字符,我们就拒绝报文进入本机:
#示例
iptables -t filter -I INPUT -m string --algo bm --string "OOXX" -j REJECT

time 模块

常用扩展匹配条件如下:
  • –timestart:用于指定时间范围的开始时间,不可取反。
  • –timestop:用于指定时间范围的结束时间,不可取反。
  • –weekdays:用于指定”星期几”,可取反。
  • –monthdays:用于指定”几号”,可取反。
  • –datestart:用于指定日期范围的开始日期,不可取反。
  • –datestop:用于指定日期范围的结束时间,不可取反。
#示例
iptables -t filter -I OUTPUT -p tcp --dport 80 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 443 -m time --timestart 09:00:00 --timestop 19:00:00 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --weekdays 6,7 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --monthdays 22,23 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time ! --monthdays 22,23 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --timestart 09:00:00 --timestop 18:00:00 --weekdays 6,7 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --weekdays 5 --monthdays 22,23,24,25,26,27,28 -j REJECT
iptables -t filter -I OUTPUT -p tcp --dport 80  -m time --datestart 2017-12-24 --datestop 2017-12-27 -j REJECT

connlimit 模块

常用的扩展匹配条件如下:
  • –connlimit-above:单独使用此选项时,表示限制每个IP的链接数量。
  • –connlimit-mask:此选项不能单独使用,在使用–connlimit-above选项时,配合此选项,则可以针对”某类IP段内的一定数量的IP”进行连接数量的限制,如果不明白可以参考上文的详细解释。
#示例
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 20 --connlimit-mask 24 -j REJECT
iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 27 -j REJECT

limit 模块

connlimit 模块是对连接数量进行限制的,limit 模块是对”报文到达速率”进行限制的。用大白话说就是,如果我想要限制单位时间内流入的包的数量,就能用 limit 模块。我们可以以秒为单位进行限制,也可以以分钟、小时、天作为单位进行限制。常用的扩展匹配条件如下:
  • –limit-burst:类比”令牌桶”算法,此选项用于指定令牌桶中令牌的最大数量。
  • –limit:类比”令牌桶”算法,此选项用于指定令牌桶中生成新令牌的频率,可用时间单位有second、minute 、hour、day。
示例表示限制外部主机对本机进行ping操作时,本机最多每6秒中放行一个ping包
#示例,注意,如下两条规则需配合使用
#令牌桶中最多能存放3个令牌,每分钟生成10个令牌(即6秒钟生成一个令牌)。
iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
#默认将icmp包丢弃
iptables -t filter -A INPUT -p icmp -j REJECT

state 扩展模块

当我们通过 http 的 url 访问某个网站的网页时,客户端向服务端的 80 端口发起请求,服务端再通过 80 端口响应我们的请求,于是,作为客户端,我们似乎应该理所应当的放行 80 端口,以便服务端回应我们的报文可以进入客户端主机,于是,我们在客户端放行了 80 端口,同理,当我们通过 ssh 工具远程连接到某台服务器时,客户端向服务端的 22 号端口发起请求,服务端再通过 22 号端口响应我们的请求,于是我们理所应当的放行了所有 22 号端口,以便远程主机的响应请求能够通过防火墙,但是,作为客户端,如果我们并没有主动向 80 端口发起请求,也没有主动向 22 号端口发起请求,那么其他主机通过 80 端口或者 22 号端口向我们发送数据时,我们可以接收到吗?应该是可以的,因为我们为了收到 http 与 ssh 的响应报文,已经放行了 80 端口与 22 号端口,所以,不管是”响应”我们的报文,还是”主动发送”给我们的报文,应该都是可以通过这两个端口的,那么仔细想想,这样是不是不太安全呢?此时 state 扩展模块就派上用场了。
상태 모듈 연결의 경우 "연결"의 메시지는 5가지 상태로 나눌 수 있습니다.
  • NEW: 연결의 첫 번째 패킷, 상태는 NEW입니다. 새로운 연결의 첫 번째 패킷 상태는 NEW인 것으로 이해될 수 있다.
  • ESTABLISHED: NEW 상태 패킷이 연결이 설정되었음을 나타내는 ESTABLISHED 이후의 패킷 상태를 이해할 수 있습니다.
  • 관련: RELATED는 문자 그대로 관계로 번역되지만 여전히 이해하기 쉽지 않습니다. 예를 들어, FTP 서비스에서 FTP 서버는 명령 프로세스 하나와 데이터 프로세스 하나, 두 개의 프로세스를 생성합니다. 명령 프로세스는 서버와 클라이언트 간의 명령 전송을 담당합니다(이 전송 프로세스를 소위 "연결" 상태로 이해할 수 있으며 일시적으로 "명령 연결"이라고 함). 데이터 프로세스는 서버와 클라이언트 간의 데이터 전송을 담당합니다(일시적으로 이 프로세스를 "데이터 연결"이라고 함). 그러나 전송될 특정 데이터는 명령에 의해 제어됩니다. 따라서 "데이터 연결"의 메시지는 "명령 연결"과 "관련"됩니다. 그러면 "데이터 연결"의 패킷은 "명령 연결"의 패킷과 관련되어 있으므로 RELATED 상태일 수 있습니다. (참고: FTP에 대한 연결 추적을 수행하려면 해당 커널 모듈 nf_conntrack_ftp를 별도로 로드해야 합니다. 자동으로 로드하려면 /etc/sysconfig/iptables-config 파일을 구성하면 됩니다)
  • INVALID: 패키지를 식별할 방법이 없거나 패킷에 상태가 없으면 이 패킷의 상태는 INVALID 상태의 패킷을 적극적으로 차단할 수 있습니다.
  • UNTRACKED: 패킷 상태가 추적되지 않은 경우 패킷이 추적되지 않았음을 의미합니다. 패킷 상태가 추적되지 않은 경우 일반적으로 해당 연결을 찾을 수 없음을 의미합니다.
刚才举例中的问题即可使用 state 扩展模块解决,我们只要放行状态为 ESTABLISHED 的报文即可,因为如果报文的状态为 ESTABLISHED,那么报文肯定是之前发出的报文的回应,这样,就表示只有回应我们的报文能够通过防火墙,如果是别人主动发送过来的新的报文,则无法通过防火墙:
iptables -t filter -I INPUT -m state --state ESTABLISHED -j ACCEPT

mangle 表

mangle 表的主要功能是根据规则修改数据包的一些标志位,以便其他规则或程序可以利用这种标志对数据包进行过滤或策略路由。mangle 表主要有以下 3 种操作:
  • TOS:用来设置或改变数据包的服务类型域。这常用来设置网络上的数据包如何被路由等策略。注意这个操作并不完善,有时得不所愿。它在Internet 上还不能使用,而且很多路由器不会注意到这个域值。换句话说,不要设置发往 Internet 的包,除非你打算依靠 TOS 来路由,比如用 iproute2。
  • TTL:用来改变数据包的生存时间域,我们可以让所有数据包只有一个特殊的 TTL。它的存在有 一个很好的理由,那就是我们可以欺骗一些ISP。为什么要欺骗他们呢?因为他们不愿意让我们共享一个连接。那些 ISP 会查找一台单独的计算机是否使用不同的 TTL,并且以此作为判断连接是否被共享的标志。
  • MARK 用来给包设置特殊的标记。iproute 2能识别这些标记,并根据不同的标记(或没有标记) 决定不同的路由。用这些标记我们可以做带宽限制和基于请求的分类。
例如内网的客户端通过 Linux 主机连入 Internet,而 Linux 主机与Internet 连接时有两条线路,它们的网关如图所示。现要求对内网进行策略路由,所有通过 TCP 协议访问 80 端口的数据包都从 ChinaNet 线路出去,而所有访问 UDP 协议 53 号端口的数据包都从 Cernet 线路出去。
Linux 방화벽 소프트웨어 IPtables를 사용하는 방법을 모릅니다! 당신은 어떤 운영 및 유지관리 담당자인가요?
这是一个策略路由的问题,为了达到目的,在对数据包进行路由前,要先根据数据包的协议和目的端口给数据包做上一种标志,然后再指定相应规则,根据数据包的标志进行策略路由。为了给特定的数据包做上标志,需要使用mangle 表,mangle 表共有 5 条链,由于需要在路由选择前做标志,因此应该使用 PREROUTING 链,下面是具体的命令:
iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 80 -j MARK --set-mark 1;
iptables -t mangle -A PREROUTING -i eth0 -p udp --dprot 53 -j MARK --set-mark 2;
数据包经过 PREROUTING 链后,将要进入路由选择模块,为了对其进行策略路由,执行以下两条命令,添加相应的规则:
ip rule add from all fwmark 1 table 10
ip rule add from all fwmark 2 table 20
以上两条命令表示所有标志是1的数据包使用路由表 10 进行路由,而所有标志是 2 的数据包使用路由表 20 进行路由。路由表 10 和 20 分别使用了 ChinaNet 和 Cernet 线路上的网关作为默认网关,具体设置命令如下所示:
ip route add default via 10.10.1.1 dev eth1 table 10
ip route add default via 10.10.2.1 dev eth2 table 20
以上两条命令在路由表 10 和 20 上分别指定了 10.10.1.1 和 10.10.2.1 作为默认网关,它们分别位于 ChinaNet 和 Cernet 线路上。于是,使用路由表 10 的数据包将通过 ChinaNet 线路出去,而使用路由表20的数据包将通过 Cernet 线路出去。

커스텀 체인

기본 체인에 규칙이 너무 많으면 관리가 불편합니다. INPUT 체인에 200개의 규칙이 저장되어 있다고 상상해 보세요. 이 200개의 규칙 중 일부는 httpd 서비스용이고 일부는 개인 네트워크 IP용이고 일부는 공용 네트워크 IP용입니다. httpd 서비스와 관련된 규칙 중 어떤 규칙이 httpd에 특정한지 알아내기 위해 처음부터 이 200개의 규칙을 읽어야 합니까? 이것은 분명히 불합리합니다.
그래서 iptables에서는 체인을 커스터마이징할 수 있는데, 체인을 커스터마이징하면 위의 문제를 해결할 수 있습니다. IN_WEB이라는 체인을 사용자 정의한다고 가정해 보겠습니다. 포트 80에 대한 모든 인바운드 규칙을 이 사용자 정의 체인에 작성할 수 있습니다. 나중에 웹 서비스에 대한 인바운드 규칙을 수정하려면 IN_WEB 체인의 규칙을 직접 수정하면 됩니다. 기본 체인에 더 많은 규칙이 있어도 두려워하지 않을 것입니다. 포트 80에 대한 모든 인바운드 규칙이 IN_WEB 체인에 저장되어 있다는 것을 알고 있기 때문입니다.

创建自定义链

#在filter表中创建IN_WEB自定义链
iptables -t filter -N IN_WEB

引用自定义链

#在INPUT链中引用刚才创建的自定义链
iptables -t filter -I INPUT -p tcp --dport 80 -j IN_WEB

重命名自定义链

#将IN_WEB自定义链重命名为WEB
iptables -E IN_WEB WEB

删除自定义链

删除自定义链需要满足两个条件:
  • 1、自定义链没有被引用。
  • 2、自定义链中没有任何规则。
#第一步:清除自定义链中的规则
iptables -t filter -F WEB
#第二步:删除自定义链
iptables -t filter -X WEB

LOG 动作

LOG 动作默认会将报文的相关信息记录在/var/log/message文件中,当然,我们也可以将相关信息记录在指定的文件中,以防止 iptables 的相关信息与其他日志信息相混淆,修改 /etc/rsyslog.conf 文件(或者 /etc/syslog.conf),在 rsyslog 配置文件中添加如下配置即可:
kern.warning /var/log/iptables.log
完成上述配置后,重启rsyslog服务(或者syslogd):
service rsyslog restart
LOG 动作也有自己的选项,常用选项如下:
  • –log-level 选项可以指定记录日志的日志级别,可用级别有 emerg,alert,crit,error,warning,notice,info,debug。
  • –log-prefix 选项可以给记录到的相关信息添加”标签”之类的信息,以便区分各种记录到的报文信息,方便在分析时进行过滤。–log-prefix 对应的值不能超过 29 个字符。
比如,我想要将主动连接22号端口的报文的相关信息都记录到日志中,并且把这类记录命名为”want-in-from-port-22″,则可以使用如下命令:
iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "want-in-from-port-22"
完成上述配置后,我在IP地址为 192.168.1.98 的客户端机上,尝试使用 ssh 工具连接上例中的主机,然后查看对应的日志文件(已经将日志文件设置为 /var/log/iptables.log):
Linux 방화벽 소프트웨어 IPtables를 사용하는 방법을 모릅니다! 당신은 어떤 운영 및 유지관리 담당자인가요?
如上图所示,ssh 连接操作的报文的相关信息已经被记录到了 iptables.log 日志文件中,而且这条日志中包含”标签”:want-in-from-port-22,如果有很多日志记录,我们就能通过这个”标签”进行筛选了,这样方便我们查看日志,同时,从上述记录中还能够得知报文的源IP与目标IP,源端口与目标端口等信息,从上述日志我们能够看出,192.168.1.98 这个 IP 想要在 14点11分 连接到 192.168.1.139(当前主机的 IP)的22号端口,报文由eth4网卡进入,eth4 网卡的 MAC 地址为 00:0c:29:b7:f4:d1,客户端网卡的 MAC 地址为 f4:8e:38:82:b1:29。

参考链接

  • https://www.zsythink.net/archives/category/%e8%bf%90%e7%bb%b4%e7%9b%b8%e5%85%b3 /iptables/
  • https://my.oschina.net/mojiewhy/blog/3039897
  • https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial- cn-1.1.19.html#MARKTARGET
  • https://mp.weixin.qq.com/s/NOxY4ZC7Cay4LCWlMkVx8A

위 내용은 Linux 방화벽 소프트웨어 IPtables를 사용하는 방법을 모릅니다! 당신은 어떤 운영 및 유지관리 담당자인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 Linux中文社区에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제