防火墙
防火墙介绍
-
防火墙:在计算机领域,防火墙是用于保护内网信息安全的设备,其会依照用户定义的规则,允许或限制数据的传输
-
分类
-
逻辑:
- 主机防火墙:针对单个主机
- 网络防火墙:针对网络进行防护,处于网络边缘,防火墙背后是局域网
-
物理:
-
硬件防火墙:在硬件级别实现防火墙,另一部分基于软件实现,性能高,成本高。常处于网络边缘
- 如cisco(思科)ASA
-
软件防火墙:单独使用 具备配置数据包通过规则 的软件来实现数据包过滤,其性能相较于硬件防火墙低,成本低,在一定程度上会影响到主机系统性能。对于Linux系统已自带,直接使用即可。多见于单主机系统,个人计算机或网络安全组
-
-
web应用防火墙(WAF):Web应用防火墙是对web防护(网页保护)的安全防护设备(软件),主要用于截获所有HTTP数据或仅仅满足某些规则的会话,多见于云平台中。
-
-
防火墙性能指标:
- 吞吐量:在没有帧丢失的情况下,设备能接受并转发的最大数据速率,与防火墙的网卡速率,背板(主板)转发能力有关
- 并发连接数:越大越好
- 新建连接数:适宜
- 时延:越小越好
- 抖动:抖动会影响防火墙正常工作
iptables介绍
介绍
- iptables不是防火墙,是防火墙用户代理,用于把用户的安全设置添加到“安全框架”中
- “安全框架”是防火墙,名称为netfifilter
- netfifilter位于内核空间中,是Linux操作系统核心层内部的一个数据包处理模块
- iptables是用于在用户空间对内核空间的netfifilter进行操作的命令行工具
功能
- netfifilter/iptables可简称为iptables,为Linux平台下的包过滤防火墙。作用在OSI七层参考模型的第三层,可过滤源IP,目的IP,相关传输协议(TCP,UDP等)
- 具体功能
- 数据包过滤(防火墙)
- 数据包重定向(转发)
- 网络地址转换(NAT)
规则(rules)
-
规则是iptables的工作依据
-
iptables是按照运维人员所定义的条件(规则rules)来工作的
-
规则存储在内核空间的数据包过滤表中,这些规则分别指定了源地址、目的地址,传输协议(TCP、UDP、ICMP)和服务类型(HTTP、FTP)等
-
当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,比如放行(ACCEPT)、拒绝(REJECT)、丢弃(DROP)等
-
配置防火墙主要工作就是对iptables规则进行增删改
链
-
当客户端访问服务器端的web服务时,客户端发送访问请求报文至网卡,而tcp/ip协议栈是属于内核的一部分,所以,客户端的请求报文会通过内核的TCP协议传输到用户空间的web服务,而客户端报文的目标地址为web服务器所监听的套接字(ip:port)上,当web服务器响应客户端请求时,web服务所回应的响应报文的目标地址为客户端地址,我们说过,netfifilter才是真正的防火墙,属于内核的一部分,所以,我们要想让netfifilter起到作用,我们就需要在内核中设置“关口”,所有进出的数据报文都要通过这些关口,经检查,符合放行条件的准允放行,符合阻拦条件的则被阻止,于是就出现了input和output关口,在iptables中我们把关口叫做链(链由很多规则组成)
-
如果客户端发到本机的报文中包含的服务器地址并不是本机,而是其他服务器,此时本机就应该能够进行转发(内核支持的IP_FORWARD功能),此时我们的主机类似于路由器,所以我们会看到在iptables中,所谓的关口并只有上面所提到的input及output这两个,应该还有“路由前”,“转发”,“路由后”,它们所对应的英文名称分别为“prerouting”, “forward”, “postrouting” 这就是我们说到的==5链==
表
-
把不同的“规则链”组合成能够完成某一特定功能集合分类,而这个集合分类我们就称为表
-
iptables中共有5张表
- fifilter: 过滤功能,确定是否放行该数据包,属于真正防火墙,内核模块:iptables_fifilter
- nat: 网络地址转换功能,修改数据包中的源、目标IP地址或端口;内核模块:iptable_nat
- mangle: 对数据包进行重新封装功能,为数据包设置标记;内核模块:iptable_mangle
- raw: 确定是否对数据包进行跟踪;内核模块:iptables_raw
- security:是否定义强制访问控制规则(后来添加,我们常说的四表,不包括这个)
-
我们在应用防火墙时是以表为操作入口的,只要在相应的表中的规则链上添加规则即可实现某一功能
-
表中的链
- CentOS7中,nat表新增INPUT规则链
-
表的优先级
raw>mangle>nat>fifilter(由高至低)
-
数据包流经iptables流程
匹配规则分类
基本匹配
-
无需加载扩展模块,可以匹配源地址,目标地址,源端口,目标端口等
-
常用选项
-p 指定规则协议,tcp|udp|icmp|all -s 指定数据包的源地址,ip|hostname -d 指定目的地址 -i 输入接口 -o 输出接口 ! 取反
扩展匹配
-
需要加载扩展模块,匹配规则才能生效。分为显示匹配和隐式匹配
-
显示匹配:必须使用**-m选项指明要调用的扩展模块的扩展机制以及需要手动**加载扩展模块
常用选项
- multiport:多端口
iptables -I INPUT -d 192.168.139.20 -p tcp -m multiport --dports 22,80 -j ACCEPT #在INPUT链中开放 目标地址 192.168.139.20的 tcp 22,tcp80 端口 iptables -I OUTPUT -s 192.168.139.20 -p tcp -m multiport --sports 22,80 -j ACCEPT #在OUTPUT链中开放 源地址 192.168.139.20的 tcp 22,tcp80 端口
- iprange:多ip地址
iptables -A INPUT -d 192.168.139.20 -p tcp --dport 23 -m iprange --src-range 192.168.139.10-192.168.139.20 -j ACCEPT iptables -A OUTPUT -s 192.168.139.20 -p tcp --sport 23 -m iprange --dst-range 192.168.139.10-192.168.139.20 -j ACCEPT
- time:指定访问时间
iptables -A INPUT -d 192.168.139.20 -p tcp --dport 888 -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 17:00:00 -j ACCEPT
- string:字符串,对报文中的应用层数据做字符串模式匹配检测(通过算法实现)
--algo {bm|kmp} 字符匹配查找时使用算法 --string "STRING" 要查找的字符串 --hex-string "HEX-STRING" 要查找的字符,先编码成16进制格式
- connlimit:连接限制
--connlimit-upto n 连接数小于等于n时匹配 --connlimit-above n 连接数大于n时匹配
- state:追踪本机上的请求和响应之间的数据报文的状态
--state state NEW 新连接请求 ESTABLISHED 已建立的连接(连接态) INVALID 无法识别的连接(无效态) RELATED 相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接(衍生态) UNTRACKED 未追踪的连接
-
对于进入的状态为ESTABLISHED都应该放行
-
对于出去的状态为ESTABLISHED都应该放行
-
严格检查进入的状态为NEW的连接
-
所有状态为INVALIED都应该拒绝
-
隐式匹配:使用**-p**选项指明协议时,无需再同时使用-m选项指明扩展模块以及不需要手动加载扩展模块
常用选项
-
-p tcp --sport 匹配报文源端口(可以是多个连续范围的端口) --dport 匹配报文目标端口(可以是多个连续范围的端口) --tcp-flags mask|comp 匹配报文中的tcp协议的标志位 -p udp --sport 匹配报文源端口(可以是多个连续范围的端口) --dport 匹配报文目标端口(可以是多个连续范围的端口) --icmp-type 0/0:echo reply 允许其他主机ping 8/0:echo request 允许ping其他主机
-
动作(target)
-
ACCEPT:允许数据包通过
-
DROP:直接丢弃数据包,不回应信息
-
REJECT:拒绝数据包通过,回应信息给客户端
-
SNAT:源地址转换
-
修改数据包源地址,当内网数据包到达防火墙后,防火墙会使用外部地址替换掉数据包的源IP地址(目的IP地址不变),使网络内部主机能够与网络外部主机通信
-
iptables -t nat -A POSTROUTING -s 192.168.139.20 -o eth1 -j SNAT --to-source 202.12.10.100
-
-
DNAT:目标地址转换
-
修改数据包目的地址,当防火墙收到来自外网的数据包后,会将该数据包的目的IP地址进行替换(源IP地址不变),重新转发到内网的主机
-
iptables -t nat -A PREROUTING -d 202.12.10.100 -p tcp --dport 80 -j DNAT --to- destination 192.168.139.20
-
-
MASQUERADE:伪装。类似于SNAT,适用于动态的、临时会变的ip地址上,例如:家庭使用的宽带。用发送数据的网卡上的IP来替换源IP,对于IP地址不固定场合使用
-
REDIRECT:在本机做端口映射
-
LOG:在/var/log/message文件中记录日志信息,然后将数据包传递给下一条规则
制定规则策略
-
黑名单:没有被拒绝的流量都可以通过,这种策略下管理员必须针对每一种新出现的攻击,制定新的规则(不推荐)
-
白名单:没有被允许的流量都要拒绝,根据需要,将主机逐渐开放,目前一般都采用白名单策略(推荐)
-
制定iptables规则的思路
选表,此表决定了数据报文处理的方式
选链,此链决定了数据报文流经哪些位置
制定匹配条件
制定合适的动作,也就是相应的防火墙规则
语法结构
iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作]
表名:不指定表名时,默认filter表
管理选项:如A表示追加
链名:不指定链名时,默认表示该表内所有链,除非设置规则链的默认策略
条件匹配:如匹配源地址:-s 192.168.139.20
目标动作:如-j ACCEPT表允许数据包通过
# 案例:
iptables -t nat -A POSTROUTING -s 192.168.139.20 -o eth1 -j SNAT --to-source 202.12.10.100
- 规则管理
-A|--append chain 追加新规则于指定链的尾部
-I|--insert chain [rulenum] 插入新规则于指定链的指定位置,默认为首部
-D|--delete chain rulenum 根据规则编号删除规则
- 链管理
-N|--new chain 新建一个自定义的规则链
-X|--delete chain 删除用户自定义的引用计数为0的空链
-F|--flush [chain] 清空指定的规则链上的规则
-E|--rename-chain old-chain new-chain 重命名链
-P|--policy chain target 制定链表的默认策略(ACCEPT|DROP|REJECT),不建议更改!
- 规则显示
-L|--list [chain [rulenum]] 列出规则
-v|--verbose 详细信息(常与L连用:-vL)
-n|--numeric 数字格式显示主机地址和端口号(常与L连用:-nL)
--line-numbers 列出规则时,显示其在链上的相应的编号
-S|--list-rules [chain [rulenum]] 显示指定链的所有规则
- 查看端口
/etc/services文件记录了所有端口信息
[root@server2 ~]# cat /etc/services |grep ssh
ssh 22/tcp # The Secure Shell (SSH) Protocol
ssh 22/udp # The Secure Shell (SSH) Protocol
x11-ssh-offset 6010/tcp # SSH X11 forwarding offset
ssh 22/sctp # SSH
sshell 614/tcp # SSLshell
sshell 614/udp # SSLshell
netconf-ssh 830/tcp # NETCONF over SSH
netconf-ssh 830/udp # NETCONF over SSH
sdo-ssh 3897/tcp # Simple Distributed Objects over SSH
sdo-ssh 3897/udp # Simple Distributed Objects over SSH
snmpssh 5161/tcp # SNMP over SSH Transport Model
snmpssh-trap 5162/tcp # SNMP Notification over SSH Transport Model
tl1-ssh 6252/tcp # TL1 over SSH
tl1-ssh 6252/udp # TL1 over SSH
ssh-mgmt 17235/tcp # SSH Tectia Manager
ssh-mgmt 17235/udp # SSH Tectia Manager
- 常见端口及协议(空格的地方表示同上)
服务 | 协议 | 端口 |
---|---|---|
ftp | ftp | 20/tcp :数据端口 21/tcp :控制端口 |
sshd | ssh | 22/tcp |
telnet | telnet | 23 /tcp |
smtp | 25/tcp | |
smtps | 465/tcp | |
pop3 | 110/tcp | |
pop3s | 995/tcp | |
imap | 143/tcp | |
imaps | 993/tcp | |
dns | domain | 53/tcp 53/udp |
dhcp | bootps | 67/udp |
httpd | http | 80/tcp |
https | 443/tcp | |
nginx | nginx | 80/tcp |
ntp | ntp | 123/udp |
smaba | \ | 137,138,139/tcp |
rsyslog | rsyslog | 514/udp |
rsync | rsync | 873/tcp |
nfsd | nfs | 2049/tcp |
mysqld | mysql | 3306/tcp |
redis | redis | 6379/tcp |
tomcat | tomcat | 8080访问web的端口, 8005tomcat本身自己的端口, 8009与http等服务器建立连接的端口 |
php | php-fpm | 9000/tcp |
zabbix | zabbix-agent | 10050/tcp |
zabbix-server | 10051/tcp | |
memcached | memcached | 11211/tcp |
iptables应用
iptables-services
centos7系统中默认存在iptables命令,但此命令仅为简单查询及操作命令,不包含配置文件,安装iptables-services后,将直接生成配置文件,便于配置与保存
为防止firewalld影响,建议先关闭firewalld
在云平台,非必要时,不建议安装iptables-services。云平台自带安全组,安装iptables-services会降低性能
- 安装
[root@server2 ~]# yum install -y iptables-services.x86_64
[root@server2 ~]# rpm -ql iptables-services
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables
/usr/lib/systemd/system/ip6tables.service
/usr/lib/systemd/system/iptables.service
/usr/libexec/initscripts/legacy-actions/ip6tables
/usr/libexec/initscripts/legacy-actions/ip6tables/panic
/usr/libexec/initscripts/legacy-actions/ip6tables/save
/usr/libexec/initscripts/legacy-actions/iptables
/usr/libexec/initscripts/legacy-actions/iptables/panic
/usr/libexec/initscripts/legacy-actions/iptables/save
/usr/libexec/iptables
/usr/libexec/iptables/ip6tables.init
/usr/libexec/iptables/iptables.init
[root@server2 ~]# systemctl start iptables.service
[root@server2 ~]# systemctl enable iptables.service
filter表:过滤
基本使用
- 允许80端口通过防火墙
查看filter表的规则
[root@server2 ~]# 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
允许80端口通过防火墙
[root@server2 ~]# iptables -t filter -A INPUT -p tcp --dport 80 -j ACCEPT
[root@server2 ~]# systemctl start httpd.service
[root@server2 ~]# echo 111 >> /var/www/html/index.html
测试
[root@server3 ~]# curl 192.168.139.20
curl: (7) Failed connect to 192.168.139.20:80; 没有到主机的路由
[root@server2 ~]# iptables -t filter -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 拒绝所有
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 新建的规则
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
#这里,我选择了A追加模式,规则被放到INPUT链的最后,但是INPUT链倒数第二条拒绝了所有,所以规则未生效
删除未生效的规则,将规则添加到首行
[root@server2 ~]# iptables -t filter -D INPUT -p tcp --dport 80 -j ACCEPT
[root@server2 ~]# iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
再次测试
[root@server3 ~]# curl 192.168.139.20
111
- 将更改后的规则保存到规则的配置文件中**/etc/sysconfig/iptables**
/etc/sysconfig/iptables-config 为iptables的配置文件
/etc/sysconfig/iptables 为iptables的规则的配置文件
[root@server2 ~]# 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@server2 ~]# iptables-save > /etc/sysconfig/iptables
[root@server2 ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Sun Aug 22 15:01:18 2021
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [311:32110]
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT 新增规则
-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
# Completed on Sun Aug 22 15:01:18 2021
- 不小心将规则清空,也可同步配置文件,重载规则
清空
[root@server2 ~]# iptables -F
[root@server2 ~]# iptables -t filter -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@server2 ~]# iptables-restore < /etc/sysconfig/iptables
[root@server2 ~]# iptables -t filter -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 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
- 白名单
[root@server2 ~]# iptables -t filter -F
[root@server2 ~]# iptables -P INPUT DROP
[root@server2 ~]#
Socket error Event: 32 Error: 10053.
Connection closing...Socket close.
Connection closed by foreign host.
Disconnected from remote host(192.168.139.20:22) at 22:13:51.
Type `help' to learn how to use Xshell prompt.
[D:\~]$
加入白名单
[root@server2 ~]# iptables -t filter -I INPUT -p tcp --dport 22 -j ACCEPT
[root@server2 ~]# iptables -t filter -I INPUT -p tcp --dport 80 -j ACCEPT
- 黑名单(不推荐)
[root@server2 ~]# iptables -P INPUT ACCEPT
[root@server2 ~]# iptables -F
[root@server2 ~]# 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@server2 ~]# iptables -t filter -A INPUT -s 192.168.139.30/24 -p tcp --dport 80 -j DROP
测试
[root@server3 ~]# curl 192.168.139.20
^C
- 通过回环网卡访问本机数据
[root@server2 ~]# iptables -I INPUT -d 127.0.0.1 -p tcp -i lo -j ACCEPT
[root@server2 ~]# iptables -nL INPUT
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 127.0.0.1
ACCEPT tcp -- 0.0.0.0/0 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
案例:FTP正常使用
安装FTP服务端软件
[root@server2 ~]# yum install -y vsftpd
[root@server2 ~]# systemctl start vsftpd
配置防火墙规则
[root@server2 ~]# iptables -t filter -F
[root@server2 ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT
[root@server2 ~]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
[root@server2 ~]# iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT
[root@server2 ~]# iptables -A INPUT -j REJECT
[root@server2 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:20:21
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
- 访问本机失败
[root@server2 ~]# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
^C
--- 127.0.0.1 ping statistics ---
14 packets transmitted, 0 received, 100% packet loss, time 13112ms
解决
[root@server2 ~]# iptables -I INPUT -i lo -j ACCEPT
[root@server2 ~]# ping 127.0.0.1
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.020 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.031 ms
^C
--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1013ms
rtt min/avg/max/mdev = 0.020/0.025/0.031/0.007 ms
- 本机访问其他主机失败
[root@server2 ~]# ssh 192.168.139.30
^C
解决
[root@server2 ~]# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@server2 ~]# ssh 192.168.139.30
The authenticity of host '192.168.139.30 (192.168.139.30)' can't be established.
ECDSA key fingerprint is SHA256:+RvxL8ZDWnyO030Z5rOfjBuJaOG1yFvD9ieOY9uzWBA.
ECDSA key fingerprint is MD5:d2:a2:8c:c6:60:15:46:9b:09:75:ce:3f:e1:ea:6e:aa.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.139.30' (ECDSA) to the list of known hosts.
root@192.168.139.30's password:
Last login: Sat Oct 30 11:37:03 2021 from 192.168.139.1
[root@server3 ~]# exit
登出
Connection to 192.168.139.30 closed.
- FTP下载失败
准备文件,用于下载
[root@server2 ~]# cd /var/ftp/pub/
[root@server2 pub]# echo 111 >> 1.txt
[root@server2 pub]# ls
1.txt
下载
[root@server3 ~]# yum install -y ftp.x86_64
[root@server3 ~]# ftp 192.168.139.20
Connected to 192.168.139.20 (192.168.139.20).
220 (vsFTPd 3.0.2)
Name (192.168.139.20:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,139,20,150,90).
ftp: connect: 拒绝连接
解决:连接追踪模块
[root@server2 pub]# modprobe nf_conntrack_ftp
[root@server2 pub]# lsmod |grep ftp
nf_conntrack_ftp 18478 0
nf_conntrack 139264 3 xt_conntrack,nf_conntrack_ftp,nf_conntrack_ipv4
[root@server3 ~]# ftp 192.168.139.20
Connected to 192.168.139.20 (192.168.139.20).
220 (vsFTPd 3.0.2)
Name (192.168.139.20:root): ftp
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> ls
227 Entering Passive Mode (192,168,139,20,121,51).
150 Here comes the directory listing.
drwxr-xr-x 2 0 0 19 Aug 22 08:45 pub
226 Directory send OK.
永久添加模块
[root@server2 pub]# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp"
标准流程
[root@server2 ~]# iptables -F
[root@server2 ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@server2 ~]# iptables -A INPUT -i lo -j ACCEPT
[root@server2 ~]# iptables -A INPUT -s 192.168.139.0/24 -j ACCEPT
[root@server2 ~]# iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT
[root@server2 ~]# iptables -A INPUT -p tcp --syn --dport 80 -j ACCEPT
[root@server2 ~]# iptables -A INPUT -p tcp --syn --dport 20:21 -j ACCEPT
[root@server2 ~]# iptables -A INPUT -j REJECT
[root@server2 ~]# iptables -nL INPUT
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 all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 192.168.139.0/24 0.0.0.0/0
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x17/0x02
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 flags:0x17/0x02
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:20:21 flags:0x17/0x02
REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
[root@server2 ~]# modprobe nf_conntrack_ftp
[root@server2 ~]# cp /etc/sysconfig/iptables{,.bak}
[root@server2 ~]# iptables-save > /etc/sysconfig/iptables
[root@server2 ~]# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp"
扩展匹配
- icmp
[root@server2 ~]# iptables -F
[root@server2 ~]# iptables -A INPUT -j REJECT
允许ping回应(本机IP:192.168.139.20):本机可以ping其他主机,其他主机ping不通本机
[root@server2 ~]# iptables -t filter -I INPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT
- iprange
拒绝192.168.139.25-192.168.139.35网段访问本机
[root@server2 ~]# iptables -t filter -I INPUT -m iprange --src-range 192.168.139.25-192.168.139.35 -j REJECT
[root@server3 ~]# ssh 192.168.139.20
ssh: connect to host 192.168.139.20 port 22: Connection refused
- multiport
一次性开放多个端口
[root@server2 ~]# iptables -t filter -I INPUT -p tcp -m multiport --dports 8005,8009,8080 -j ACCEPT
- comment
备注规则
[root@server2 ~]# iptables -A INPUT -s 192.168.139.250 -m comment --comment "自定义描述" -j REJECT
[root@server2 ~]# iptables -nL INPUT|grep '描述'
REJECT all -- 192.168.139.250 0.0.0.0/0 /* 自定义描述 */ reject-with icmp-port-unreachable
扩展动作
- LOG:日志记录
修改日志配置文件
[root@server2 ~]# vim /etc/rsyslog.conf
[root@server2 ~]# cat /etc/rsyslog.conf |grep -Ev '^#|^$' |grep 'kern.*'
kern.* /var/log/kernel.log
[root@server2 ~]# systemctl restart rsyslog.service
配置规则
[root@server2 ~]# iptables -F
# 一定要加上--syn,否则会一直记录,造成系统卡顿
[root@server2 ~]# iptables -A INPUT -p tcp --syn --dport 22 -j LOG --log-prefix "ssh_log"
[root@server2 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
[root@server2 ~]# iptables -A INPUT -j REJECT
查看日志
[root@server2 ~]# tail -f /var/log/kernel.log
Aug 23 01:16:52 server2 kernel: hrtimer: interrupt took 4755034 ns
Aug 23 01:51:15 server2 kernel: e1000: ens33 NIC Link is Down
Aug 23 01:51:21 server2 kernel: e1000: ens33 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: None
Aug 23 02:38:34 server2 kernel: ssh_logIN=ens33 OUT= MAC=00:0c:29:60:de:7a:00:0c:29:88:04:4c:08:00 SRC=192.168.139.30 DST=192.168.139.20 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=45240 DF PROTO=TCP SPT=35482 DPT=22 WINDOW=29200 RES=0x00 SYN URGP=0
- MARK
需要提前在mangle表中打标记,才能在filter表中使用标记
标记
[root@server2 ~]# iptables -t mangle -A PREROUTING -s 192.168.139.30 -j MARK --set-mark 1
[root@server2 ~]# iptables -t mangle -nL PREROUTING
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
MARK all -- 192.168.139.30 0.0.0.0/0 MARK set 0x1
使用标记,创建规则
[root@server2 ~]# iptables -t filter -A INPUT -m mark --mark 1 -j ACCEPT
[root@server2 ~]# iptables -nL |grep mark
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 mark match 0x1
nat表
介绍
- nat表作用:导流
- 常用方式:适用于KVM或OpenStack中虚拟机或云主机与外部通信 | Docker管理的容器与外部通信
- nat表中动作对应的链
动作 | 作用 | 链 |
---|---|---|
SNAT | 源地址转换 | POSTROUTING |
MASQUERADE | 源地址转换 | POSTROUTING |
DNAT | 目标地址转换 | PREROUTING |
REDIRECT | 端口重定向 | PREROUTING |
开启路由转发
临时开启(重启会失效)
# 1为开启;0为关闭
[root@server2 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@server2 ~]# cat /proc/sys/net/ipv4/ip_forward
1
永久开启
[root@server2 ~]# vim /etc/sysctl.conf
[root@server2 ~]# tail -1 /etc/sysctl.conf
net.ipv4.ip_forward = 1
刷新,使之生效
[root@server2 ~]# sysctl -p
net.ipv4.ip_forward = 1
查看
[root@server2 ~]# sysctl -a|grep ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_use_pmtu = 0
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
源地址转换
实现内网主机上网
序号 | 主机 | IP | 网卡 | 网关 |
---|---|---|---|---|
1 | client | 192.168.1.1 | ens33 | 192.168.1.2 |
2 | firewalld | 192.168.1.2 192.168.3.2 | ens33 ens37 | |
3 | web | 192.168.3.3 | ens33 | 192.168.3.2 |
- client网卡配置
[root@client ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="79065771-0af6-41b9-9112-1dd5b373f8ed"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.1.1
GATEWAY=192.168.1.2
NETMASK=255.255.255.0
DNS1=114.114.114.114
[root@client ~]# systemctl restart network
- firewalld网卡配置
安装iptables-services(需要提前安装)
[root@firewalld ~]# yum install -y iptables-services
[root@firewalld ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="79065771-0af6-41b9-9112-1dd5b373f8ed"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.1.2
NETMASK=255.255.255.0
[root@firewalld ~]# cp /etc/sysconfig/network-scripts/ifcfg-ens3{3,7}
[root@firewalld ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens37
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens37"
DEVICE="ens37"
ONBOOT="yes"
IPADDR=192.168.3.2
NETMASK=255.255.255.0
DNS1=114.114.114.114
[root@firewalld ~]# systemctl restart network
- web网卡配置
[root@web ~]# cat /etc/sysconfig/network-scripts/ifcfg-ens33
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="79065771-0af6-41b9-9112-1dd5b373f8ed"
DEVICE="ens33"
ONBOOT="yes"
IPADDR=192.168.3.3
GATEWAY=192.168.3.2
NETMASK=255.255.255.0
DNS1=114.114.114.114
DNS2=8.8.8.8
[root@web ~]# systemctl restart network
- 确保网关与主机间可以互相ping通
[root@client ~]# ping 192.168.1.2
[root@firewalld ~]# ping 192.168.1.1
[root@web ~]# ping 192.168.3.2
[root@firewalld ~]# ping 192.168.3.3
- 配置web端
[root@web ~]# yum -y install httpd wireshark*
[root@web ~]# echo "this is a test" >> /var/www/html/index.html
[root@web ~]# systemctl start httpd
[root@web ~]# curl 127.0.0.1
this is a test
[root@firewalld ~]# curl 192.168.3.3
this is a test
- 配置firewalld
开启路由转发
# 临时生效
[root@firewalld ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@firewalld ~]# cat /proc/sys/net/ipv4/ip_forward
1
# 重启后永久生效
[root@firewalld ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
[root@firewalld ~]# tail -1 /etc/sysctl.conf
net.ipv4.ip_forward = 1
[root@firewalld ~]# sysctl -p
net.ipv4.ip_forward = 1
[root@firewalld ~]# sysctl -a |grep ip_forward
net.ipv4.ip_forward = 1
net.ipv4.ip_forward_use_pmtu = 0
sysctl: reading key "net.ipv6.conf.all.stable_secret"
sysctl: reading key "net.ipv6.conf.default.stable_secret"
sysctl: reading key "net.ipv6.conf.ens33.stable_secret"
sysctl: reading key "net.ipv6.conf.ens37.stable_secret"
sysctl: reading key "net.ipv6.conf.lo.stable_secret"
打开防火墙
[root@firewalld ~]# systemctl start iptables.service
[root@firewalld ~]# systemctl enable iptables.service
配置规则
[root@firewalld ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens37 -j SNAT --to-source 192.168.3.2
[root@firewalld ~]# iptables -t nat -nL POSTROUTING
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SNAT all -- 192.168.1.0/24 0.0.0.0/0 to:192.168.3.2
或
[root@firewalld ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ens37 -j MASQUERADE
[root@firewalld ~]# iptables -t nat -nL POSTROUTING
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 192.168.1.0/24 0.0.0.0/0
注释filter表中不允许路由转发的规则
[root@firewalld ~]# iptables -t filter -nL FORWARD
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
[root@firewalld ~]# vim /etc/sysconfig/iptables
[root@firewalld ~]# cat /etc/sysconfig/iptables |grep '^#'|grep FORWARD
#-A FORWARD -j REJECT --reject-with icmp-host-prohibited
重载
[root@firewalld ~]# iptables-restore < /etc/sysconfig/iptables
[root@firewalld ~]# iptables -t filter -nL FORWARD
Chain FORWARD (policy ACCEPT)
target prot opt source destination
- 验证
[root@client ~]# curl 192.168.3.3
this is a test
- 抓包
通过源地址转换,可以实现KVM虚拟机访问外部主机
原理:kvm_ip(192.168.139.0/24)—>192.168.139.2 virbr0(kvm虚拟机网关) 192.168.2.10 ens33—>192.168.2.20(外部主机)
目的地址转换(端口映射)
实现外网访问防火墙,获取内网服务器资源
序号 | 主机 | IP | 网卡 | 网关 |
---|---|---|---|---|
1 | client | 192.168.1.1 | ens33 | 192.168.1.2 |
2 | firewalld | 192.168.1.2 192.168.3.2 | ens33 ens37 | |
3 | server | 192.168.3.3 | ens33 | 192.168.3.2 |
-
网卡配置同上(略)
-
server服务器配置
[root@server ~]# yum -y install httpd wireshark*
[root@server ~]# echo "this is a dnet test" > /var/www/html/index.html
[root@server ~]# systemctl start httpd
[root@server ~]# curl 127.0.0.1
this is a dnet test
- 防火墙配置(注意开启路由转发)
[root@firewalld ~]# iptables -t nat -F POSTROUTING
[root@firewalld ~]# iptables -t nat -A PREROUTING -d 192.168.1.2 -p tcp --dport 80 -j DNAT --to-destination 192.168.3.3
[root@firewalld ~]# iptables -t nat -nL PREROUTING
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 192.168.1.2 tcp dpt:80 to:192.168.3.3
- 验证
[root@client ~]# curl 192.168.1.1
this is a dnet test
- 抓包
firewalld
简介
- firewalld动态防火墙,类似于iptables-services
- firewalld是CentOS7用户空间中用于对netfilter内核模块进行管理的工具
- firewalld底层使用iptables作为防火墙规则管理入口,调用iptables命令
- firewalld使用比iptables简单的多,简化操作
- 具体关系
zone
-
区域(zone):是firewalld预先准备好的防火墙策略集合,即策略模板,可以根据不同的应用场景进行切换。
-
firewalld的9大zone:
- block(拒绝)
- dmz(非军事化)
- drop(丢弃)
- external(外网)
- home(家庭)
- internal(局域网)
- public(公开) Firewalld默认区域
- trusted(信任)
- work(工作区)
-
相关配置文件
-
区域配置文件
[root@server1 ~]# cd /usr/lib/firewalld/zones/ [root@server1 zones]# ls block.xml dmz.xml drop.xml external.xml home.xml internal.xml public.xml trusted.xml work.xml
-
默认区域配置(public)文件
[root@server1 ~]# cd /etc/firewalld/zones/ [root@server1 zones]# ls public.xml public.xml.old
-
默认服务:firewalld默认定义了很多种服务,可以直接使用
[root@server1 ~]# cd /usr/lib/firewalld/services/ [root@server1 services]# ll |wc -l 155 例如 [root@server1 services]# ls |grep http https.xml http.xml wbem-https.xml wbem-http.xml
-
firewalld使用
语法
firewall-cmd [--zone=zone] 动作 [--permanent]
说明
--zone:不指定。默认为当前所在区域
--permanent:将改动写入到区域配置文件中(永久保存),建议使用
基本使用
打开防火墙
[root@server1 ~]# systemctl start firewalld.service
[root@server1 ~]# systemctl enable firewalld.service
查看状态
[root@server1 ~]# systemctl status firewalld.service
[root@server1 ~]# firewall-cmd --state
running
重载
[root@server1 ~]# firewall-cmd --reload
success
查看默认zone
[root@server1 ~]# firewall-cmd --get-default-zone
public
查看默认zone(public)的所有配置
[root@server1 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
查看get | list
查看所有zone
[root@server1 ~]# firewall-cmd --get-zones
block dmz drop external home internal public trusted work
查看所有区的默认配置
[root@server1 ~]# firewall-cmd --list-all-zones
block
target: %%REJECT%% 拒绝
dmz
target: default
drop
target: DROP 丢弃
external
target: default
masquerade: yes 允许上外网
home
target: default
services: dhcpv6-client mdns samba-client ssh
internal
target: default
services: dhcpv6-client mdns samba-client ssh
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
trusted
target: ACCEPT 接收
work
target: default
services: dhcpv6-client ssh
查看默认zone
[root@server1 ~]# firewall-cmd --get-default-zone
public
查看默认zone(public)的所有配置
[root@server1 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
查看当前活跃的zone
[root@server1 ~]# firewall-cmd --get-active-zones
public
interfaces: ens33
查看当前区域支持的服务
[root@server1 ~]# firewall-cmd --get-services
RH-Satellite-6 RH-Satellite-6-capsule amanda-client amanda-k5-client amqp amqps apcupsd audit bacula bacula-client bgp bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client distcc dns docker-registry docker-swarm dropbox-lansync elasticsearch etcd-client etcd-server finger freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master git gre high-availability http https imap imaps ipp ipp-client ipsec irc ircs iscsi-target isns jenkins kadmin kerberos kibana klogin kpasswd kprop kshell ldap ldaps libvirt libvirt-tls lightning-network llmnr managesieve matrix mdns minidlna mongodb mosh mountd mqtt mqtt-tls ms-wbt mssql murmur mysql nfs nfs3 nmea-0183 nrpe ntp nut openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole plex pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius redis rpc-bind rsh rsyncd rtsp salt-master samba samba-client samba-dc sane sip sips slp smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh steam-streaming svdrp svn syncthing syncthing-gui synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client upnp-client vdsm vnc-server wbem-http wbem-https wsman wsmans xdmcp xmpp-bosh xmpp-client xmpp-local xmpp-server zabbix-agent zabbix-server
查看当前区域开放的服务
[root@server1 ~]# firewall-cmd --list-services
dhcpv6-client ssh
查看指定zone开放的服务
[root@server1 ~]# firewall-cmd --list-services --zone=home
dhcpv6-client mdns samba-client ssh
增add | 删remove
增加网络接口
[root@server1 ~]# firewall-cmd --add-interface=eth0 --permanent
success
[root@server1 ~]# firewall-cmd --reload
success
[root@server1 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33 eth0
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
删除网络接口
[root@server1 ~]# firewall-cmd --remove-interface=eth0 --zone=public --permanent
success
[root@server1 ~]# firewall-cmd --reload
success
增加端口
[root@server1 ~]# yum install -y httpd
[root@server1 ~]# systemctl start httpd
[root@server1 ~]# echo "test" >> /var/www/html/index.html
[root@server2 ~]# curl 192.168.139.10
curl: (7) Failed connect to 192.168.139.10:80; 没有到主机的路由
[root@server1 ~]# firewall-cmd --add-port=80/tcp --permanent
success
[root@server1 ~]# firewall-cmd --reload
success
[root@server2 ~]# curl 192.168.139.10
test
删除端口
[root@server1 ~]# firewall-cmd --remove-port=80/tcp --permanent
success
[root@server1 ~]# firewall-cmd --reload
success
[root@server2 ~]# curl 192.168.139.10
curl: (7) Failed connect to 192.168.139.10:80; 没有到主机的路由
增加多个端口
[root@server1 ~]# firewall-cmd --add-port=20-21/tcp --permanent
success
[root@server1 ~]# firewall-cmd --reload
success
删除多个端口
[root@server1 ~]# firewall-cmd --remove-port=20-21/tcp --permanent
success
[root@server1 ~]# firewall-cmd --reload
success
增加协议
[root@server1 ~]# firewall-cmd --add-service=http --permanent
success
[root@server1 ~]# firewall-cmd --reload
success
[root@server2 ~]# curl 192.168.139.10
test
删除协议
[root@server1 ~]# firewall-cmd --remove-service=http --permanent
success
[root@server1 ~]# firewall-cmd --reload
success
[root@server2 ~]# curl 192.168.139.10
curl: (7) Failed connect to 192.168.139.10:80; 没有到主机的路由
增加源地址段
[root@server1 ~]# firewall-cmd --add-source=192.168.139.20 --permanent
success
[root@server1 ~]# firewall-cmd --reload
success
删除源地址段
[root@server1 ~]# firewall-cmd --remove-source=192.168.139.20 --permanent
success
[root@server1 ~]# firewall-cmd --reload
success
开启SNAT(原地址转换)
[root@server1 ~]# firewall-cmd --add-masquerade --permanent
success
[root@server1 ~]# firewall-cmd --reload
success
关闭SNAT(源地址转换)
[root@server1 ~]# firewall-cmd --remove-masquerade --permanent
success
[root@server1 ~]# firewall-cmd --reload
success
改change | set
更改默认zone
[root@server1 ~]# firewall-cmd --set-default-zone=work
success
改变指定接口到其他区域
[root@server1 ~]# firewall-cmd --add-interface=eth0 --permanent
success
[root@server1 ~]# firewall-cmd --reload
success
[root@server1 ~]# firewall-cmd --change-interface=eth0 --zone=work
success
[root@server1 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
[root@server1 ~]# firewall-cmd --list-all --zone=work
work (active)
target: default
icmp-block-inversion: no
interfaces: eth0
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
查询query
查看服务是否开放
[root@server1 ~]# firewall-cmd --query-service=http --zone=public
no
查询SNAT的状态
[root@server1 ~]# firewall-cmd --query-masquerade --zone=external
yes
端口转发
端口转发:在指定地址访问指定的端口时,将流量转发至指定地址的指定端口上。
不指定ip,默认为本机
不指定端口,默认使用来源端口
将本机80端口的流量转发到本机8080端口 firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 将本机80端口的流量转发到192.168.139.30的80端口 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.139.30 将本机80端口的流量转发到192.168.139.30的8080端口 firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.139.30:toport=8080
清空public上的规则
[root@server1 ~]# vim /etc/firewalld/zones/public.xml
[root@server1 ~]# cat /etc/firewalld/zones/public.xml
<?xml version="1.0" encoding="utf-8"?>
<zone>
<short>Public</short>
<description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
<service name="dhcpv6-client"/>
</zone>
重载
[root@server1 ~]# firewall-cmd --reload
success
开启SNAT
[root@server1 ~]# firewall-cmd --add-masquerade --permanent
success
[root@server1 ~]# firewall-cmd --reload
success
[root@server1 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
端口转发(将访问本机(IP为192.168.139.10)80端口的流量转发到192.168.139.30的80端口上)
[root@server1 ~]# firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.139.30
success
在192.168.139.30添加测试文件
[root@server3 ~]# yum install -y httpd
[root@server3 ~]# echo test >> /var/www/html/index.html
[root@server3 ~]# systemctl start httpd.service
[root@server3 ~]# curl 127.0.0.1
test
验证
[root@client ~]# curl 192.168.139.10
test
Rich规则
-
当基本firewalld语法规则不能满足配置要求时,可以使用rich规则来完成更加复杂的功能
-
帮助信息
[root@server1 ~]# man 5 firewalld.richlanguage
- 基本选项
--add-rich-rule='rule' 新建rich规则
--remove-rich-rule='rule' 删除rich规则
--query-rich-rule='rule' 查看单条rich规则
--list-rich-rules 查看rich规则列表
- 常用案例
拒绝某主机访问
# 注意子网掩码是32;如果子网掩码是24,会拒绝一个网段
[root@server1 ~]# firewall-cmd --add-rich-rule='rule family=ipv4 source address=192.168.139.20/32 reject' --permanent
success
[root@server1 ~]# firewall-cmd --reload
success
[root@server1 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: dhcpv6-client
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="192.168.139.20/32" reject
[root@client ~]# curl 192.168.139.10
curl: (7) Failed connect to 192.168.139.10:80; 拒绝连接
丢弃icmp协议所有数据包
[root@server1 ~]# firewall-cmd --add-rich-rule='rule protocol value=icmp drop' --permanent
success
[root@server1 ~]# firewall-cmd --reload
success
[root@client ~]# ping 192.168.139.10
PING 192.168.139.10 (192.168.139.10) 56(84) bytes of data.
^C
--- 192.168.139.10 ping statistics ---
6 packets transmitted, 0 received, 100% packet loss, time 5006ms
允许某一网段一段端口通过
firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.139.0/24 port port=8005-8080 protocol=tcp accept' success
firewall-cmd --reload
开启SNAT
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.139.0/24 masquerade'
firewall-cmd --reload
端口转发
firewall-cmd --add-masquerade --permanent
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.139.10/24 forward-port port=80 protocol=tcp to-port=8080 to- addr=192.168.139.20'
firewall-cmd --reload