Linux - 防火墙

 

一、简介

  iptables 是 Linux 防火墙系统的重要组成部分。

  iptables 的主要功能是实现对网络数据包进出设备及转发的控制。

  当数据包需要进入设备、从设备中流出或者由该设备转发、路由时,都可以使用 iptables 进行控制。

  iptables 是集成在 Linux 内核中的包过滤防火墙系统。

  使用 iptables 可以添加删除具体的过滤规则,iptables 默认维护着 4 个表和 5 个链,所有的防火墙策略规则都被分别写入这些表与链中。

  "四表" 是指 iptables 的功能,默认的 iptable s规则表有 filter 表(过滤规则表)、nat 表(地址转换规则表)、mangle(修改数据标记位规则表)、raw(跟踪数据表规则表):

    ① filter 表:控制数据包是否允许进出及转发,可以控制的链路有 INPUT、FORWARD 和 OUTPUT。

    ② nat 表:控制数据包中地址转换,可以控制的链路有 PREROUTING、INPUT、OUTPUT 和 POSTROUTING。

    ③ mangle:修改数据包中的原数据,可以控制的链路有 PREROUTING、INPUT、OUTPUT、FORWARD 和 POSTROUTING。

    ④ raw:控制 nat 表中连接追踪机制的启用状况,可以控制的链路有 PREROUTING、OUTPUT。

  "五链" 是指内核中控制网络的 NetFilter 定义的 5 个规则链。每个规则表中包含多个数据链:

  ① INPUT(入站数据过滤)

  ② OUTPUT(出站数据过滤)

  ③ FORWARD(转发数据过滤)

  ④ PREROUTING(路由前过滤)

  ⑤ POSTROUTING(路由后过滤)

防火墙规则需要写入到这些具体的数据链中。

 

 

二、防火墙服务命令

 

2.1、CentOS6

1、查看防火墙状态:service iptables status/etc/init.d/iptables status

2、启/停/重启防火墙:service iptables start/stop/restart

3、查看防火墙是否开机启动:chkconfig iptables --list

4、设置防火墙开机自启/不自启:chkconfig iptables on/off

 

 

2.2、CentOS7

1、查看防火墙状态:systemctl status firewalld

2、启/停/重启防火墙:systemctl start/stop/restart firewalld.service

3、设置防火墙开机自启/不自启:systemctl enable/disable firewalld.service

4、开启端口:firewall-cmd --zone=public --add-port=80/tcp -permanent

 

 

三、示例场景

1、允许服务器 192.168.2.112 通过TCP端口 80 访问 192.168.2.111

iptables -A INPUT -p tcp -s 192.168.2.112/32 --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

参数含义如下:

  • -A INPUT:表示向 INPUT 链(处理进入系统的数据包)追加一条规则
  • -p tcp:指定协议为 TCP
  • -s 192.168.2.112/32:-s参数后跟源IP地址及其子网掩码长度。这里的 /32 表示的是点分十进制格式的完整32位IPv4地址,即精确匹配 192.168.2.112这个单一IP地址。
  • --dport 80:指定目标端口号为80,也就是允许通过HTTP服务端口的连接。
  • -m state --state NEW,ESTABLISHED:使用state模块匹配连接状态,NEW表示新的连接请求,ESTABLISHED表示已经建立的连接。这样确保不仅能接受新连接,还能接受响应已发起连接的数据包。
  • -j ACCEPT:-j参数后面跟着动作,此处是ACCEPT,意味着符合条件的数据包将被防火墙接受,即允许通过。

在配置完规则后,一般需要执行service iptable save来保存规则,并且根据需要调整防火墙的启动模式以确保规则在重启后依然生效。

在Centos6.x中,可以使用chkconfig iptables on来设置防火墙服务随系统启动。

 

 

 

 

 

设置防火墙策略指定IP端口进行访问

第一种修改防火墙的方式(命令版)
# 首先关闭所有对80端口的访问
iptables -I INPUT -p tcp --dport 80 -j DROP


# 开启某个IP对该电脑的某个端口进行访问
iptables -I INPUT -s xxx.xxx.x.x -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -s xxx.xxx.x.x -p tcp --dport 80 -j ACCEPT

# 首先把防火墙配置文件备份
cp /etc/sysconfig/iptables /var/tmp

# 对上面所有修改的配置进行保存
service iptables save

# 重启防火墙
service iptables restart
第二种修改防火墙的方式(修改配置文件)
# 首先把防火墙配置文件备份
cp /etc/sysconfig/iptables /var/tmp

# 进行编辑
vi /etc/sysconfig/iptables

# 把下面命令放到文件中即可
-I INPUT -p tcp --dport 80 -j DROP
-I INPUT -s 192.168.1.1 -p tcp --dport 80 -j ACCEPT
-I INPUT -s 192.168.1.2 -p tcp --dport 80 -j ACCEPT

# 然后退出编辑(按ESC)、保存(英文状态下 Shift + z(两下z))

 

注意:一定不要把命令放到 COMMIT 后面

/etc/sysconfig/iptables
# Generated by iptables-save v1.4.7 on Fri Aug 19 10:54:44 2022
*filter
:INPUT ACCEPT [4550:591530]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [3365:312047]
-A INPUT -s 192.168.1.1/32 -p tcp -m tcp --dport 2181 -j ACCEPT
-A INPUT -s 192.168.1.1/32 -p tcp -m tcp --dport 2181 -j ACCEPT
-A INPUT -s 192.168.1.1/32 -p tcp -m tcp --dport 2181 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 2181 -j DROP
COMMIT
# Completed on Fri Aug 19 10:54:44 2022
~
~
~
~

 

更多……
/sbin/iptables --delete-chain
/sbin/iptables --flush
/sbin/iptables -P INPUT DROP #1
/sbin/iptables -P FORWARD DROP#1
/sbin/iptables -P OUTPUT DROP #1
/sbin/iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #2
/sbin/iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT #3
/sbin/iptables -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT #3
/sbin/iptables -A INPUT -p tcp -m tcp --dport 21 -j ACCEPT#3
/sbin/iptables -A INPUT -p tcp -m tcp --dport 873 -j ACCEPT #3
/sbin/iptables -A INPUT -i lo -j ACCEPT #4
/sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT#5
/sbin/iptables -A INPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT #5
/sbin/iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #6
/sbin/iptables -A OUTPUT -p udp -m udp --dport 53 -j ACCEPT #7
/sbin/iptables -A OUTPUT -o lo -j ACCEPT #4
/sbin/iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT #8
/sbin/iptables -A OUTPUT -p tcp -m tcp --dport 25 -j ACCEPT #9
/sbin/iptables -A OUTPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT#10
/sbin/iptables -A OUTPUT -p icmp -m icmp --icmp-type 11 -j ACCEPT #10

 

解释:
#1、设置INPUT,FORWARD,OUTPUT链默认target为DROP,也就是外部与服务器不能通信。
#2、设置当连接状态为RELATED和ESTABLISHED时,允许数据进入服务器。
#3、设置外部客户端连接服务器端口80,22,21,873。
#4、允许内部数据循回。
#5、允许外部ping服务器。
#6、设置状态为RELATED和ESTABLISHED的数据可以从服务器发送到外部。
#7、允许服务器使用外部dns解析域名。
#8、设置服务器连接外部服务器端口80。
#9、允许服务器发送邮件。
#10、允许从服务器ping外部。
iptables保存:iptables-save
iptables还原:iptables-restore

 

 

 

 

 

防火墙开放端口(TCP&UDP协议)

 

防火墙开放端口(tcp协议)

p=$1
firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="172.168.56.110/32" port port="$p" protocol="tcp" accept"
firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="172.168.56.111/32" port port="$p" protocol="tcp" accept"
firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="172.168.56.112/32" port port="$p" protocol="tcp" accept"
firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="172.168.56.113/32" port port="$p" protocol="tcp" accept"
firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="172.168.56.114/32" port port="$p" protocol="tcp" accept"
firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="172.168.56.115/32" port port="$p" protocol="tcp" accept"

echo "Firewalld add port successfully!"

 

防火墙开放端口(udp协议)

p=$1
firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="172.168.56.110/32" port port="$p" protocol="udp" accept"
firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="172.168.56.111/32" port port="$p" protocol="udp" accept"
firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="172.168.56.112/32" port port="$p" protocol="udp" accept"
firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="172.168.56.113/32" port port="$p" protocol="udp" accept"
firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="172.168.56.114/32" port port="$p" protocol="udp" accept"
firewall-cmd --zone=public --permanent --add-rich-rule="rule family="ipv4" source address="172.168.56.115/32" port port="$p" protocol="udp" accept"

echo "Firewalld add port successfully!"

 

进行tcp/udp端口开放之后,需要执行 firewall-cmd --reload重新加载一下

可以过滤下刚刚开放的端口 firewall-cmd --list-all|grep [portNum]

 

 

— 要养成终生学习的习惯 —

 

posted @ 2022-08-22 17:48  HOUHUILIN  阅读(64)  评论(0)    收藏  举报