iptables 封禁 ip 方法

iptables是Linux中功能最为强大的防火墙软件之一,使用灵活,可以对流入和流出服务器的数据包进行很精细的控制。

iptables的使用

在 iptables 中,规则是按照从上到下的顺序匹配的,一旦匹配到某条规则,后续的规则将不再检查。

命令说明

iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作

# 说明
[-t 表名]为可选参数,-t用来指定具体操作那张表,不指定的话默认是Filter表

COMMAND 说明

命令选项用于指定iptables的执行方式,包括插入规则,删除规则和添加规则,常用的命令选项如下:

-A:在规则列表的最后增加1条规则 #简写(一个横杠)和全称(两个横杠),敲对了使用那个都可以,推荐使用简写不容易犯错

-D:从规则列表中删除1条规则

-F:删除表中所有规则

-I {number}:在指定的位置插入1条规则, 默认是开头

-L:查看iptables规则列表

-P:定义默认策略

-R:替换规则列表中的某条规则

-X:删除自定义链

-Z:将表中数据包计数器和流量计数器归零

匹配条件

匹配条件用来实现更为精细和具体的条件,如网络接口名称,协议名称,源目的端口号等,高频匹配条件如下:

-i:网卡名称 匹配从这块网卡流入的数据

-m:匹配的模块 #指定数据包规则所使用的过滤模块

-o:网络接口名称 #指定数据包从哪个网络接口输出

-p:协议名称 #指定数据包匹配的协议,如TCP、UDP和ICMP等

-s:源地址或子网地址 #指定数据包匹配的源地址,加叹号"!"表示除这个IP外。

-d  匹配目标地址

-state:数据包当前状态 #指定ESTABLISHED,RELATED等

-sport:源端口号 #指定数据包匹配的源端口号

-dport:目的端口号 #指定数据包匹配的目的端口号iptables规则的动作

相应操作

对于符合过滤规则或条件的数据包,需要进行相应的操作,如下:

-ACCEPT:接受数据包

-DNAT:目标地址转换,即改变数据包的目的地址。例如:将的广域网IP(222.101.98.54/24) ==> 局域网的IP(.1/24),且在NAT表的PREROUTING链上进行该动作

-DROP:丢弃数据包

-LOG:日志功能,将符合规则的数据包的相关信息记录在日志中,便于分析和排错

-MASQUERADE:IP伪装,改写数据包来源IP为防火墙的IP及端口,和SNAT不同的是,当进行IP伪装时,不需指定要伪装成哪个IP,IP会从网卡直接读取

-EDIRECT:与DROP基本一样,区别在于它除了阻塞包之外,还向发送者返回错误信息

-SNAT:源地址转换,即改变数据包的源地址

iptables 命令实例

查看所有规则

sudo iptables -L

# iptables -L 默认会尝试将 IP 地址解析为主机名,并将端口号解析为服务名称。
# 如果系统配置了 DNS 服务器,但 DNS 查询较慢或无法访问,会导致命令输出卡顿。
# 可以通过添加 -n 选项来禁用 DNS 解析,直接显示 IP 地址和端口号,从而加快输出速度。

sudo iptables -L -n

允许外部访问指定端口

允许外部访问指定端口(3306)

sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT

只允许指定 IP 访问指定端口

需要注意的是,使用iptables时,规则添加的顺序至关重要。

# 只允许指定ip(192.168.1.123、192.168.1.124)访问指定端口(50079)
# 第一步:在tcp协议中,禁止所有的ip访问本机的50070端口。
iptables -A INPUT -p tcp --dport 50070 -j DROP

# 第二步:允许192.168.1.123访问本机的50070端口
iptables -A INPUT -s 192.168.1.123 -p tcp --dport 50070 -j ACCEPT

# 第三步:允许192.168.1.124访问本机的50070端口
iptables -A INPUT -s 192.168.1.124 -p tcp --dport 50070 -j ACCEPT

# 注意以上3条命令的顺序不能错。

禁止其他主机Ping 服务器

通常服务器不允许其他主机ping自己,实现方法如下:

sudo iptables -A INPUT -p icmp -j DROP

封杀指定IP

可使用iptables封杀指定IP,关键操作如下:

sudo iptables -A INPUT -s 192.168.1.4 -j DROP  #DROP掉来自192.168.1.4的所有数据包

封杀指定网段

要添加IP段到封停列表中,使用下面的命令:

sudo iptables -A INPUT -s 192.168.1.0/24 -j DROP  #DROP掉所有来自192.168.1.0网段的数据包

sudo iptables -A INPUT -s 123.0.0.0/8 -j DROP      #封整个段即从123.0.0.1到123.255.255.254的数据包
sudo iptables -A INPUT -s 124.45.0.0/16 -j DROP    #封IP段即从123.45.0.1到123.45.255.254的数据包
sudo iptables -A INPUT -s 123.45.6.0/24 -j DROP    #封IP段即从123.45.6.1到123.45.6.254的数据包

封杀指定端口

可使用iptables封杀指定IP端口,关键操作如下:

sudo iptables -A INPUT -p tcp --dport 1234 -j DROP  #封杀1234端口

如果要放行某些IP的1234端口,可以进行如下操作:

sudo iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 1234 -j ACCEPT  #放行源地址来自192.168.1.0网段1234端口的所有数据包

允许SSH服务

服务器大多需要SSH服务,iptables需要开启SSH端口,具体操作如下:

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

允许Web服务

服务器大多需要访问Web服务的,可用如下规则打开Web服务访问:

sudo iptables -A INPUT  -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT  -p tcp --dport 443 -j ACCEPT

允许Email服务

对于电子邮件的发送和接收比较麻烦,这里采用默认和安全两种方式,关键操作如下:

SMTP
sudo iptables -A INPUT -i ens33 -p tcp --dport 25 -j ACCEPT
sudo iptables -A INPUT -i ens33 -p tcp --dport 465 -j ACCEPT

POP3
sudo iptables -A INPUT -i ens33 -p tcp --dport 110 -j ACCEPT
sudo iptables -A INPUT -i ens33 -p tcp --dport 995 -j ACCEPT

IMAP
sudo iptables -A INPUT -i ens33 -p tcp --dport 143 -j ACCEPT
sudo iptables -A INPUT -i ens33 -p tcp --dport 993 -j ACCEPT

如果是上述之外的服务,如MySQL或Postgre等,请用相应端口替换即可。

拒绝其它数据包

需要的端口和协议都开启了,最后就需要iptables绝对拒绝上面规则之外的数据包内容,参考操作如下:

sudo iptables -A INPUT -j REJECT
sudo iptables -A FORWARD -j REJECT
sudo iptables -A OUTPUT -j REJECT

iptables 解封ip


# 展示带编号的所有iptables规则
sudo iptables -L -n --line-number

# 对指定编号规则进行删除

sudo iptables -D INPUT {num}

# 比如要删除INPUT里序号为8的规则,执行:

sudo iptables -D INPUT 8

或直接

iptables -D INPUT -s ***.***.***.*** -j DROP

永久有效设置

在Ubuntu中

你可以使用iptables-persistent软件包来实现iptables规则在开机时自动加载。

以下是设置iptables自定义规则开机自动加载的步骤:

  1. 安装iptables-persistent软件包:
   sudo apt update
   sudo apt install iptables-persistent
  1. 在加载iptables规则前,先配置好iptables,并保存到文件中,例如/etc/iptables/rules.v4/etc/iptables/rules.v6是IPv4和IPv6的规则文件,你可以根据需要选择其一或两者都配置。例如,使用以下命令备份iptables规则到IPv4规则文件:
    sudo su
    iptables-save >/etc/iptables/rules.v4
  1. 启用iptables规则的自动加载:

    sudo systemctl enable netfilter-persistent
  2. 重启系统以验证规则是否成功自动加载:

    sudo reboot

在系统重新启动后,iptables规则应该会自动加载。可以使用以下命令来检查规则是否加载成功:

sudo iptables -L
sudo ip6tables -L

注意:在使用iptables-persistent时,避免直接使用iptablesip6tables命令来修改规则,以免在下次系统启动时丢失自定义规则。可以通过编辑规则文件/etc/iptables/rules.v4/etc/iptables/rules.v6来进行规则的修改。

在CentOS中

你可以使用iptables服务来实现iptables规则在开机时自动加载。

以下是设置iptables自定义规则开机自动加载的步骤:

  1. 配置iptables规则:

    • 编辑/etc/sysconfig/iptables文件,该文件保存了IPv4的iptables规则。

      sudo vi /etc/sysconfig/iptables
    • 在文件中添加自定义规则。例如,允许SSH连接的规则:

      -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
  2. 保存并关闭文件。

  3. 启用iptables服务:

    sudo systemctl enable iptables
  4. 重启系统以验证规则是否成功自动加载:

    sudo reboot

在系统重新启动后,iptables规则应该会自动加载。可以使用以下命令来检查规则是否加载成功:

sudo iptables -L

如果你使用的是IPv6规则,可以编辑/etc/sysconfig/ip6tables文件,并执行类似的步骤来配置和启用IPv6的iptables规则。

注意:在使用iptables服务时,避免直接使用iptables命令来修改规则,以免在下次系统启动时丢失自定义规则。建议通过编辑规则文件/etc/sysconfig/iptables/etc/sysconfig/ip6tables来进行规则的修改。