Linux 防火墙(Firewall/Iptables)
简介:CentOS7.0版本及以上使用Firewall防火墙,CentOS7.0以下使用Iptablesl防火墙,如果CentOS7.0以上需要安装Iptables防火墙,请先关闭Firewall防火墙。Firewalld和Iptables一样自身并不具备防火墙的功能,需要通过内核netfilter来实现,二者只不过使用方法不一样,其中firewalld的底层是使用iptables进行数据过滤,建立在iptables之上。firewalld默认是拒绝的,需要设置以后才能放行,而iptables默认是允许的,需要拒绝的才去限制。要想端口隐藏,不被nmap扫描到,哪怕close等都不出现,就需要开启firewalld。
一、Firewalld与Iptables
1. 不同点
A. firewalld是基于区域(zone),根据不同的区域来设置不同的规则,而iptables主要是基于接口来设置规则;
2. 表和链对应关系
3. 内核中数据包传输过程
二、Firewall
0. 注意:防火墙规则保存在/etc/firewalld/zones/XXX.xml文件中,所以当添加规则但不方便执行firewall-cmd --reload命令时,可以直接在文件中添加;
1. 区域:firewalld共定义了 9个区域
A. public(公共区域):允许与ssh或dhcp6-client预定义服务匹配的传入流量,其余均拒绝,是新添加网络接口的默认区域;
B. trusted(信任区域):所有网络连接都接收;
2. 自定义规则链:firewalld自动为配置了规则的区域创建自定义规则链;
A. IN_区域名_log:存放日志语句规则;
B. IN_区域名_deny:存放拒绝语句规则,优先与"IN_区域名_allow"的规则;
C. IN_区域名_allow:存放允许语句规则。
1. 查看防火墙的状态
systemctl status firewalld 或 firewall-cmd --state
其中:Active: active (running) 高量显示 则表示开启状态;
Active: inactive (dead) 灰色显示 则表示关闭状态
2. 开启防火墙
systemctl start firewalld 或 service firewalld start
3. 关闭防火墙
systemctl stop firewalld 或 service firewalld stop
4. 重启防火墙
systemctl restart firewalld 或 service firewalld restart
5. firewalld几个名词解释
A. target:目标,有四个可选值:default、ACCEPT、REJECT、DROP;
B. interfaces:对应网卡;
C. sources:源地址,可以是IP或IP段;
D. services:表示一个服务,最终也是体现为端口,如ssh、mysql、http;
E. ports:端口,使用port可以不通过services而直接对端口设置;
F. protocols:协议,例如tcp、udp、icmp、vrrp,可以通过vi /etc/protocols查看支持的协议;
G. masquerade:ip 地址伪装,也就是按照源网卡地址进行 NAT 转发;firewall-cmd --permanent --zone=public --add-masquerade # 允许防火墙伪装IP firewall-cmd --permanent --zone=public --remove-masquerade # 禁止防火墙伪装IP
H. forward-ports:转发端口;
I. icmp-blocks:icmp 报文阻塞,可以按照 icmp 类型进行设置;
J. rich rules:自定义规则。
6. 查看开放的端口
firewall-cmd --zone=public --list-ports
7. 开启端口(修改后需要firewall-cmd --reload)
firewall-cmd --zone=public --add-port=8080/tcp --permanent
其中:
firewall-cmd:操作firewall的工具;
--zone=public:表示作用域;
--add-port:标识添加的端口和访问类型;
--permanent:表示设置为永久生效,否则机器重启就失效;
8. 关闭端口
firewall-cmd --zone=public --remove-port=8080/tcp --permanent
9. 设置开机启动
systemctl enable firewalld
10. 禁用开机启动
systemctl disable firewalld
11. 配置rich-rule实现IP端口限制访问
A. 删除原有的3306端口访问规则:firewall-cmd --permanent --remove-port=3306/tcp;
B. 添加规则:firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="172.17.0.0/16" port protocol="tcp" port="3306" accept";
C. 生效规则:firewall-cmd --reload;
D. 查看结果:firewall-cmd --list-all;
E. 剔除规则:firewall-cmd --permanent --zone=public --remove-rich-rule="rule family="ipv4" source address="172.17.0.0/16" port protocol="tcp" port="3306" accept";注意有的系统--remove-rich-rule=中等号需要去掉
F. 比如上面字母B的Rich规则会被内化为iptables的filter表 —> INPUT链 —> INPUT_ZONES链 —> IN_public链 —> IN_public_allow内的一条iptables规则;
三、Iptables
0.注意:直接使用iptables命令修改防火墙配置的时候,防火墙规则只是保存在内存中,机器重启后就会失效,持久化方式如下:
service iptables save 或者iptables-save > /etc/sysconfig/iptables,最终都是保存到iptables文件下;
1. 语法
iptables -t 表名 <-A/I/D/R> 规则链名 [规则号] <-i/o 网卡名> -p 协议名 <-s 源IP/源子网> --sport 源端口 <-d 目标IP/目标子网> --dport 目标端口 -j 动作;
-t参数不指定时,就会显示默认的filter表,若要查NAT,需要带上-t nat;
iptables -A INPUT -s 127.0.0.1 -p tcp --dport 3306 -j ACCEPT
iptables -A INPUT -d 172.17.0.1 -p tcp -m multiport --dports 6801,3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j DROP
iptables -D INPUT -p tcp --dport 3300 -j DROP
iptables -A INPUT -m iprange --src-range 10.15.119.115-0.15.119.123 -p tcp -m multiport --dports 9801,9802,9803 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --dports 9801,9802,9803 -j DROP
iptables是按照顺序执行的,如果第一条命中,后面的规则都将失效。
2. iptables中四表
A. filter:控制数据包是否允许进出及转发,可以控制的链路有input, forward, output,用于防火墙规则;
B. nat:控制数据包中地址转换,可以控制的链路有prerouting, input, output, postrouting,用于网关路由器;
C. mangle:修改数据包中的原数据,可以控制的链路有prerouting, input, forward, output, postrouting;
D. raw:控制nat表中连接追踪机制的启用状况,可以控制的链路有prerouting, output;
3. iptables中五链
A. PREROUTING:路由前;
B. INPUT:处理来自外部的数据包;
C. FORWARD:将数据转发到本机的其他网卡设备上,如Docker0;
D. OUTPUT:处理向外发送的数据包;
E. POSTROUTING:路由后;
4. 链管理
A. -N, --new-chain chain:新建一个自定义的规则链,比如docker链;
B. -X:删除指定的用户自定义链;
C. -F:删除指定链或所有链的规则;
5. 规则管理
A. -A:在指定链的尾部追加新规则;
B. -I:在指定链的指定位置插入新规则,默认为首部;
C. -D:根据规则编号删除规则。
6. 动作
A. ACCEPT:允许数据包通过;
B. DROP:丢弃数据包,且不给任何回应信息;
C. REJECT:拒绝数据包,并且给对方一个响应;
7. 匹配条件
(1) 通用匹配条件
A. -p:指定规则的协议,如tcp、udp等;
B. -s:指定数据包的原地址,如果不指定-s参数,就代表所有地址,如:192.168.0.1;
C. -j:执行目标,即指定与规则匹配时如何处理数据包;
(2) 扩展匹配条件
A. --dport:目的端口,针对-p参数的
(3)显示扩展匹配条件
A. -m multiport --dports port[,port|,port:port]...:指定多个目标端口;
B. -m iprange --src-range from[-to]:以连续地址块的方式来指定多IP;
8. 查看防火墙的状态
systemctl status iptables.service 或 service iptables status
9. 开启防火墙
systemctl start iptables.service 或 service iptables start
10. 关闭防火墙
systemctl stop iptables.service 或 service iptables stop
11. 重启防火墙
service iptables restart
12. 设置开机启动
systemctl enable iptables.service
13. 禁用开机启动
systemctl disable iptables.service
14. 查看当前iptables规则:iptables -vnL,v表示显示详细信息、n以数字格式显示ip和prot、L表示列出当前的规则;
字段 | 含义 | ||||||||||
pkts | 发送的包数量 | ||||||||||
bytes | 发送的包总共的大小 | ||||||||||
target | 目标,对它进行drop、accept
|
||||||||||
prot | 协议 | ||||||||||
in | 进来通过哪个网卡 | ||||||||||
out | 出去通过哪个网卡 | ||||||||||
source | 源IP地址 | ||||||||||
destination | 目的IP地址 |
15. IPTABLES调试
A. 使用-j LOG目标记录匹配的数据包,如:iptables -I INPUT -j LOG --log-level info --log-prefix "IPT INPUT: "
B. 日志查看:tail -f /var/log/messages。
可参考:iptables基础知识详解