iptables——基础

安装iptables-services

yum install iptables-services -y

查看启动的内核模块

lsmod|egrep 'filter|nat|iptable'

加载需要的模块

modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state

检查

[root@oradb ~]# lsmod|egrep 'filter|nat|iptable'
nf_nat_ftp             12809  
nf_conntrack_ftp       18478  
iptable_nat            12875  
nf_nat_ipv4            14115  
nf_nat                 26583  
nf_conntrack           139264  
iptable_filter         12810  
ip_tables              27126  
libcrc32c              12644  

关闭防火墙,开启iptables

# 关闭防火墙
[root@controller ~]# systemctl stop firewalld
[root@controller ~]# systemctl disable firewalld

# 开启iptables
[root@controller ~]# systemctl start iptables.service 
[root@controller ~]# systemctl enable iptables.service 
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.

查询配置

[root@controller ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain neutron-filter-top (0 references)
target     prot opt source               destination         

Chain neutron-linuxbri-FORWARD (0 references)
target     prot opt source               destination         

Chain neutron-linuxbri-INPUT (0 references)
target     prot opt source               destination         

Chain neutron-linuxbri-OUTPUT (0 references)
target     prot opt source               destination         

Chain neutron-linuxbri-local (0 references)
target     prot opt source               destination         

Chain neutron-linuxbri-sg-chain (0 references)
target     prot opt source               destination         

Chain neutron-linuxbri-sg-fallback (0 references)
target     prot opt source               destination 

这个命令(iptables -nL)的输出确实可以看作是一个大致的过程描述,但它描述的是 iptables 防火墙的配置,而不是实际的流量处理过程。然而,通过查看这些配置,你可以对流量如何处理有一个大致的了解。

当你运行 iptables -nL 时,你看到的是 iptables 中各个链和规则的静态快照。这些链和规则定义了当特定类型的数据包到达时,iptables 应该采取什么行动。这些行动可能包括接受(ACCEPT)数据包、丢弃(DROP)数据包、拒绝(REJECT)数据包(通常向发送方发送一个错误消息),或者将数据包跳转到另一个链进行进一步处理。

要理解这个过程,你需要想象数据包是如何在 iptables 中流动的。当数据包到达网络接口时,iptables 会根据数据包的特性(如源地址、目的地址、协议类型等)来决定它应该进入哪个链。然后,iptables 会检查该链中的规则,看是否有任何规则与数据包匹配。

  • 如果找到匹配的规则,iptables 会根据规则指定的行动来处理数据包。
  • 如果没有找到匹配的规则,iptables 会根据链的默认策略来处理数据包。

这个过程是动态的,因为数据包是实时到达的,而 iptables 会根据当前的配置来实时处理它们。但是,iptables -nL 命令的输出是静态的,它只展示了 iptables 在你运行命令那一刻的配置。

因此,虽然 iptables -nL 的输出不是流量处理过程的实时描述,但它确实提供了一个关于 iptables 如何配置以及它可能会如何处理流量的有用快照。要理解实际的流量处理过程,你需要结合这个输出和你对 iptables 工作原理的理解。

iptables 输出中,我们看到了几个链(chains),这些链是 Linux 内核防火墙(iptables)用来过滤和处理网络数据包的一部分。每个链都有一组规则(rules),这些规则定义了如何处理经过该链的数据包。在这个例子中,我们主要关注的是默认的链(INPUT, FORWARD, OUTPUT)和与 Neutron(一个用于OpenStack的网络服务组件)相关的自定义链。

默认链

  1. INPUT 链:处理进入本机的数据包。
  2. FORWARD 链:处理经过本机转发的数据包(即不是发往本机也不是由本机发出的数据包)。
  3. OUTPUT 链:处理由本机发出的数据包。

在您的输出中,这些链的策略(policy)都被设置为 ACCEPT,意味着默认情况下,所有经过这些链的数据包都会被允许通过。

Neutron 相关的链

Neutron 在 OpenStack 中负责网络服务,它可能会配置一些自定义的 iptables 链来处理与虚拟网络相关的流量。这些链通常用于实现安全组(security groups)和其他网络策略。

  • neutron-filter-top:这个链可能是一个顶层链,用于在数据包进入其他 Neutron 特定的链之前进行预处理。在这个例子中,它是空的,没有规则。
  • neutron-linuxbri-*:这些链与 Neutron 的 Linux Bridge 插件相关。Linux Bridge 是 Neutron 用来连接虚拟机(VMs)和物理网络的一种方法。这些链可能包含用于实现安全组、网络隔离等功能的规则。
    • neutron-linuxbri-FORWARD:处理经过 Linux Bridge 转发的数据包。
    • neutron-linuxbri-INPUT:处理进入 Linux Bridge 的数据包(可能是从物理网络到虚拟机的数据包)。
    • neutron-linuxbri-OUTPUT:处理从 Linux Bridge 发出的数据包(可能是从虚拟机到物理网络的数据包)。
    • neutron-linuxbri-local:可能用于处理在本地主机上循环的数据包(即源地址和目的地址都在同一台主机上的数据包)。
    • neutron-linuxbri-sg-chainneutron-linuxbri-sg-fallback:这些链与安全组规则的实现相关。sg-chain 链可能包含根据安全组规则允许或拒绝数据包的规则,而 sg-fallback 链可能是在 sg-chain 链中没有找到匹配规则时的备选处理链。

举例子

假设我们有一个虚拟机(VM1)通过 Neutron 的 Linux Bridge 连接到物理网络。现在,有一个来自物理网络的数据包(来自 IP 地址 192.168.1.100)想要访问 VM1(IP 地址为 10.0.0.2)。

  1. 数据包首先会到达本机的 INPUT 链,但由于它是发往 VM1 的,不是发往本机的,所以 INPUT 链不会处理它(除非有特定的规则)。
  2. 数据包随后会被转发到 Linux Bridge(因为 Neutron 配置了相应的路由和桥接)。
  3. 在 Linux Bridge 上,数据包会进入 neutron-linuxbri-FORWARD 链。
  4. neutron-linuxbri-FORWARD 链可能会检查安全组规则(通过 neutron-linuxbri-sg-chain 链),以决定是否允许数据包继续转发到 VM1。
  5. 如果安全组规则允许数据包通过,数据包最终会被转发到 VM1。
  6. 如果 VM1 响应这个数据包,响应数据包会经过 neutron-linuxbri-OUTPUT 链,然后可能被发送到物理网络。

请注意,这个例子是为了解释而简化的,实际的流量处理过程可能更加复杂,具体取决于 Neutron 的配置和安全组规则。

清空访问规则

[root@controller ~]# iptables -F
# 清除所有规则,但不会清楚默认规则

禁止访问80端口

[root@hm-master ~]# iptables -A INPUT -p tcp --dport 80 -j DROP


# -A 添加一条规则,指定作用链
# -p tcp  指定端口还是ip(端口 要先指定协议[协议:tcp  udp  icmp all(所有)])
# 端口在网络中一般由两种情况,ip也是有两种情况,就是目标端口,源端口,目标ip,源ip    
# --dport 目标端口, -d 目标ip    --sport源端口
# 禁止访问80端口,也就是说 端口80 是目标端口,所以用-dport 80
# - j DROP 禁止访问 DROP要大写   ACCEPT、DROP、REJECT

–dport 选项

在 iptables 的帮助信息中,并没有直接列出 --dport 选项,这是因为 --dport 是作为 --match 或特定协议(如 TCP)的隐含选项存在的。当你指定 -p tcp(或 UDP 等其他协议)时,iptables 允许你使用与该协议相关的特定选项,如 --dport(目的端口)和 --sport(源端口)。

这些选项并不是 iptables 命令本身的直接参数,而是由协议匹配模块(如 tcp 模块)提供的。当你运行如 iptables -A INPUT -p tcp --dport 22 -j ACCEPT 这样的命令时,iptables 会解析 -p tcp 并知道 TCP 协议匹配模块支持 --dport 和 --sport 等选项。

因此,虽然帮助信息中没有直接列出 --dport,你仍然可以在使用 TCP 或 UDP 协议时指定它,因为 iptables 会根据上下文理解这些选项的含义。

iptables 命令中,--dport 80 用于指定目的端口号为80,通常用于允许或阻止HTTP流量。-d--destination 选项用于指定目的地址。除了这两个选项外,iptables 还支持许多其他选项和参数,用于构建更复杂的防火墙规则。

以下是一些可以与 --dport 80-d 一起使用的其他选项和参数的示例:

  1. 源地址 (-s--source):

    • 用于指定源IP地址或地址范围。
    • 示例:-s 192.168.1.0/24 表示允许来自192.168.1.0/24子网的流量。
  2. 协议 (-p):

    • 虽然你已经指定了TCP协议(通过 --dport 隐含指定),但也可以明确指定 -p tcp
    • 示例:-p tcp
  3. 网络接口 (-i--in-interface-o--out-interface):

    • 用于指定入站和出站网络接口。
    • 示例:-i eth0 表示流量必须通过eth0接口进入。
  4. 动作 (-j--jump):

    • 用于指定匹配规则后采取的动作,如ACCEPT、DROP、REJECT等。
    • 示例:-j ACCEPT 表示允许匹配的流量。
  5. 日志记录 (--log-prefix--log-level):

    • 用于记录匹配的流量到系统日志中。
    • 示例:--log-prefix "HTTP traffic: " --log-level 4
  6. 状态匹配 (-m state):

    • 用于基于连接状态(如NEW、ESTABLISHED、RELATED)进行匹配。
    • 示例:-m state --state NEW,ESTABLISHED
  7. 其他匹配模块:

    • iptables 支持许多其他匹配模块,如地址范围匹配(-m iprange)、MAC地址匹配(-m mac)、时间匹配(-m time)等。
    • 示例:使用地址范围匹配 -m iprange --src-range 192.168.1.10-192.168.1.20
  8. 扩展选项:

    • 某些匹配模块和动作可能支持额外的选项。
    • 示例:对于REJECT动作,可以使用 --reject-with 选项指定拒绝类型(如icmp-port-unreachable)。

请注意,以上选项和参数并不是全部,iptables 提供了非常灵活和强大的防火墙配置能力。在实际使用中,你需要根据具体的安全需求和网络环境来选择合适的选项和参数。

此外,构建 iptables 规则时,建议首先使用临时规则进行测试,确保它们按预期工作,然后再将它们保存到防火墙配置中。这可以通过不保存配置直接运行命令来实现,或者使用 --temporary 选项(如果可用)来添加临时规则。

删除规则

[root@hm-master ~]# iptables -nL --line-numbers 
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
6    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination         
[root@hm-master ~]# iptables -D INPUT 6
[root@hm-master ~]# iptables -nL --line-numbers 
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
2    ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
3    ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
5    REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
num  target     prot opt source               destination         
1    REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination  

禁止指定ip,访问本服务器指定端口

禁止指定ip,访问本服务器指定端口
禁止10.0.0.12 访问服务器的80端口

[root@hm-master ~]#  iptables -I INPUT -s 10.0.0.12 -p tcp --dport 80 -j DROP
[root@hm-master ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  10.0.0.12            0.0.0.0/0            tcp dpt:80
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   

这个 iptables 命令用于在 Linux 系统的防火墙规则中添加一条新的规则,以丢弃(DROP)来自特定源 IP 地址且目标端口为 80(HTTP)的 TCP 流量。下面是命令的详细解释:

  • iptables:这是用于配置 Linux 内核防火墙的工具。

  • -I INPUT-I--insert 的简写,表示将规则插入到指定的链中。在这里,INPUT 链用于处理进入本机的数据包。因此,这条规则将被添加到处理进入数据包的链中。

  • -s 10.0.0.12-s--source 的简写,用于指定源 IP 地址。在这个例子中,源 IP 地址被设置为 10.0.0.12。这意味着只有来自这个 IP 地址的数据包才会被这条规则匹配。

  • -p tcp-p--protocol 的简写,用于指定数据包所使用的协议。在这里,协议被设置为 tcp,表示这条规则仅适用于 TCP 协议的数据包。

  • --dport 80--dport 用于指定目的端口号。在这个例子中,目的端口号被设置为 80,这是 HTTP 服务的标准端口。因此,这条规则将匹配目标端口为 80 的 TCP 数据包。

  • -j DROP-j--jump 的简写,用于指定匹配规则后采取的动作。在这里,动作被设置为 DROP,表示丢弃匹配的数据包。这意味着来自 10.0.0.12 且目标端口为 80 的 TCP 数据包将被防火墙丢弃,不会到达本机上的任何服务。

综上所述,这条 iptables 命令的作用是:阻止来自 IP 地址 10.0.0.12 的设备通过 TCP 协议访问本机上的 HTTP 服务(端口 80)。这样的规则通常用于阻止不受信任的 IP 地址访问特定的服务。

指定只能某个网段访问本服务器

指定只能某个网段访问本服务器(不是指定网段都拒绝掉)

[root@hm-master ~]# iptables -I INPUT ! -s 10.0.0.0/24 -j DROP
# ! 取反
# 10.0.0.0/24 是一个 CIDR 表示法的 IP 地址范围,表示从 10.0.0.1 到 10.0.0.254 的所有 IP 地址(包括网络地址 10.0.0.0 和广播地址 10.0.0.255,但这两个地址在大多数情况下不会被用作源地址)。因此,! -s 10.0.0.0/24 的意思是“不是来自 10.0.0.0/24 子网的”

# j DROP 表示 丢弃 不给予回应 

使用iptables实现禁止ping功能

ping 使用的是icmp协议,ping命令使用了ICMP(Internet Control Message Protocol,互联网控制消息协议)中的echo-request类型消息。
ICMP是一种网络协议,用于在IP主机、路由器之间传递控制消息,这些消息包括网络是否通畅、主机是否可达等。ICMP消息被封装在IP数据包中进行传输。其中,echo-request和echo-reply是ICMP协议中用于测试网络连接可达性和延迟的两种消息类型。
当使用ping命令时,它会发送一个ICMP echo-request消息到目标主机,并等待目标主机的ICMP echo-reply消息作为回应。通过这个过程,源主机可以确定目标主机是否可达以及往返时间,这对于网络故障排除和性能监测非常有用。
因此,可以说ping命令是基于ICMP协议中的echo-request类型消息来实现的,但ping命令本身并不是一种协议,而是一种网络工具或命令。

[root@hm-master ~]# iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# 或者
[root@hm-master ~]# iptables -A INPUT -p icmp --icmp-type any -j DROP

这两个 iptables 命令都涉及到 ICMP(Internet Control Message Protocol,互联网控制消息协议)数据包的处理,但它们在防火墙规则的应用方式和目标上有所不同。

  1. iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

    • -A INPUT-A--append 的简写,表示将规则追加到 INPUT 链的末尾。
    • -p icmp:指定协议为 ICMP。
    • --icmp-type echo-request:指定 ICMP 消息类型为 echo-request,这通常对应于 ping 请求。
    • -j DROP:匹配的数据包将被丢弃。

    这条命令的作用是:丢弃所有进入本机的 ICMP echo-request 数据包,即阻止外部设备对本机进行 ping 操作。

  2. iptables -I INPUT -p icmp --icmp-type any -j DROP

    • -I INPUT-I--insert 的简写,表示将规则插入到 INPUT 链的开头。
    • -p icmp:同样指定协议为 ICMP。
    • --icmp-type any:指定 ICMP 消息类型为任意类型。
    • -j DROP:匹配的数据包也将被丢弃。

    这条命令的作用是:丢弃所有进入本机的 ICMP 数据包,无论其类型为何。这实际上会阻止所有 ICMP 相关的通信,包括但不限于 ping 请求、目的地不可达消息、时间超过消息等。

保存和恢复规则

iptables-save会保存当前防火请到配置文件中,加上重定向,可以将防火墙规则导入到指定文件中备份起来
iptables-save会把所有的打印出来
*后面显示表的名字
:后面是默认规则
再往下就是自己配置的规则

[root@hm-master ~]# iptables-save  > lll.txt
[root@hm-master ~]# vi lll.txt 

# Generated by iptables-save v1.4.21 on Wed Oct  9 07:33:39 2024
*nat
:PREROUTING ACCEPT [145:24560]
:INPUT ACCEPT [13:2324]
:OUTPUT ACCEPT [22:1759]
:POSTROUTING ACCEPT [22:1759]
COMMIT
# Completed on Wed Oct  9 07:33:39 2024
# Generated by iptables-save v1.4.21 on Wed Oct  9 07:33:39 2024
*filter
:INPUT ACCEPT [273:48037]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [75:6536]
-A INPUT -p icmp -m icmp --icmp-type any -j DROP
COMMIT
# Completed on Wed Oct  9 07:33:39 2024




# 实际保存的是如下文件
[root@hm-master ~]# cat /etc/sysconfig/iptables
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@hm-master ~]# iptables -F 
[root@hm-master ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@hm-master ~]# systemctl restart iptables
[root@hm-master ~]# iptables-restore < lll.txt 
[root@hm-master ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 255

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   




[root@hm-master ~]# # 这条命令会清空iptables的规则
[root@hm-master ~]# systemctl restart iptables.service
[root@hm-master ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination    

修改默认规则为drop,默认都不接受的做法

# 防止ssh掉了
[root@hm-master ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT

# 设置本地lo网卡 通讯规则

iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

#INPUT 链:
使用 -i 选项来指定数据包进入本机的网络接口。
#OUTPUT 链:
OUTPUT 链处理的是从本机发出的数据包。
对于 OUTPUT 链,你通常使用 -o 选项来指定数据包离开本机的网络接口,而不是 -i。


[root@hm-master ~]# iptables -I INPUT -p tcp --dport 20,21,22,80,443 -j ACCEPT
iptables v1.4.21: invalid port/service `20,21,22,80,443' specified
Try `iptables -h' or 'iptables --help' for more information.
[root@hm-master ~]# iptables -I INPUT -p tcp -m  --dport 20,21,22,80,443 -j ACCEPT
iptables v1.4.21: Couldn't load match `--dport':No such file or directory

Try `iptables -h' or 'iptables --help' for more information.
[root@hm-master ~]# iptables -I INPUT -p tcp -m multiport  --dport 20,21,22,80,443 -j ACCEPT

# 自定多个端口
# -m参数指定扩展模块,通过multiport参数就可以同时指定多个不连续的端口号


# 修改默认规则
[root@hm-master ~]# 
[root@hm-master ~]# iptables -P INPUT  DROP
[root@hm-master ~]# iptables -P FORWARD DROP 
[root@hm-master ~]# iptables -P OUTPUT ACCEPT
[root@hm-master ~]# iptables -nL
Chain INPUT (policy DROP) # 默认 DROP
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 20,21,22,80,443
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           

Chain FORWARD (policy DROP) # 默认 DROP
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)# 默认 ACCEPT
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0   

添加白名单

# 添加ip白名单
[root@hm-master ~]# iptables -A INPUT -s 192.168.0.0/24 -j ACCEPT




# 添加端口白名单 
[root@hm-master ~]# iptables -A INPUT -p tcp --dport 8080 -j ACCEPT


# 添加ip和端口白名单


限速limit

iptables -I INPUT -p tcp --dport 8080 -m limit --limit-burst=1000 -j ACCEPT

这条规则是:8080端口会对包的速率做匹配,也就是每秒只处理500个包,假如某一时刻进来700个包,只处理500个包,后面ACCEPT表示放行,也就是这500个包放行。
剩下的200个包不做处理,交给下一个规则处理。
初始的burst值是1000,表示刚开始1000个包不受500/s速率限制,当减为0时,就受500/s速率限制。

上面描述可能有问题,应该这样理解,这一条规则看作一个池子,里有1000个令牌,有数据流量进来先从池里取令牌,
取到令牌:根据后面的规则处理,由于是ACCEPT,所以放行允许数据包通过。
未取到令牌(数量为0):不做处理,下一条规则去处理。
假如池子里令牌数量减为0,就会触发–limit 500/s,以每秒500个令牌的速度像池里放令牌。

iptables -A INPUT -p tcp --dport 8080 -j DROP

这条规则是:这是对数据包进行丢弃
iptables -lINPUT -p tcp --dport 8080 -m limit --limit=500/s --imit-burst=1000 -jACCEPT这条规则是:8080端口会对包的速率做匹配,也就是每秒只处理500个包,假如某一时刻进来700个包,只处理500个包后面ACCEPT表示放行,也就是这500个包放行:剩下的200个包不做处理,交给下一个规则处理。
理解:
先限速 超过了就直接放,指定了要放行 那就是要去下一条链了 如果指定了拒绝 那就直接没了
–limit 500/s 表示每秒500次; 1/m 则为每分钟一次
–limit-burst 表示允许触发 limit 限制的最大次数 (预设5)

这里的--limit-burst=1000相当于说最开始我有1000的可以匹配的包去处理,然后我匹配的包的个数是根据--limit=500/s进行处理的,
也就是每秒限制500个数据包,多余的会被下面符合要求的DROP规则去处理,去进行丢弃,这样就实现了对数据包的限速问题。


通过对上面的数据分析,可以知道,利用iptables进行限速主要是利用率iptables的limit模块对数据包进行匹配处理,从而实现限速的;
--limit=match,这个是限定了匹配包的速率,
换句话说就是每秒可以转发多少个数据包,这是对iptables做限速的最主要的参数,通过制定它就基本可以确定要控制的限制速率是多少;
--limit-burst是允许触发 limit 限制的最大次数,默认预设是5;
也就是说最开始的5个包会被直接转发,这时burst就会减为0,再来的包就会丢给下一条规则去处理(这里设定是DROP),直到limit参数产生新的令牌,才会继续去匹配转发。

简单来说限速最主要的就是limit和burst,
burst是最初有多少令牌可以去转发包,后面limit会进行按速率匹配,相当于按时间补充令牌数,
第一条规则达到速率上限就会把剩下的包丢给下一条规则去处理,我们下一条和它对应的就是DROP,所以会把剩下的包丢弃,从而实现了限速。
上一篇:如何获取 uni-app 应用发布所需的证书、私钥与配置文件


下一篇:入门篇-1 数据结构简介