firewall | iptables | 防火墙

防火墙

防火墙介绍

  • 防火墙:在计算机领域,防火墙是用于保护内网信息安全的设备,其会依照用户定义的规则,允许或限制数据的传输

  • 分类

    • 逻辑:

      • 主机防火墙:针对单个主机
      • 网络防火墙:针对网络进行防护,处于网络边缘,防火墙背后是局域网
    • 物理:

      • 硬件防火墙:在硬件级别实现防火墙,另一部分基于软件实现,性能高,成本高。常处于网络边缘

        • 如cisco(思科)ASA

        [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mRPd5vSY-1639297473097)(Firewall%E9%98%B2%E7%81%AB%E5%A2%99.assets/image-20211203162148285.png)]

      • 软件防火墙:单独使用 具备配置数据包通过规则 的软件来实现数据包过滤,其性能相较于硬件防火墙低,成本低,在一定程度上会影响到主机系统性能。对于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中我们把关口叫做链由很多规则组成

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bIrOExaJ-1639297473098)(Firewall%E9%98%B2%E7%81%AB%E5%A2%99.assets/image-20211203172443672.png)]

  • 如果客户端发到本机的报文中包含的服务器地址并不是本机,而是其他服务器,此时本机就应该能够进行转发(内核支持的IP_FORWARD功能),此时我们的主机类似于路由器,所以我们会看到在iptables中,所谓的关口并只有上面所提到的input及output这两个,应该还有“路由前”,“转发”,“路由后”,它们所对应的英文名称分别为“prerouting”, “forward”, “postrouting” 这就是我们说到的==5链==

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hXbPhoIM-1639297473099)(Firewall%E9%98%B2%E7%81%AB%E5%A2%99.assets/image-20211203173005680.png)]

  • 把不同的“规则链”组合成能够完成某一特定功能集合分类,而这个集合分类我们就称为

  • iptables中共有5张表

    • fifilter: 过滤功能,确定是否放行该数据包,属于真正防火墙,内核模块:iptables_fifilter
    • nat: 网络地址转换功能,修改数据包中的源、目标IP地址或端口;内核模块:iptable_nat
    • mangle: 对数据包进行重新封装功能,为数据包设置标记;内核模块:iptable_mangle
    • raw: 确定是否对数据包进行跟踪;内核模块:iptables_raw
    • security:是否定义强制访问控制规则(后来添加,我们常说的四表,不包括这个)
  • 我们在应用防火墙时是以操作入口的,只要在相应的表中的规则链上添加规则即可实现某一功能

  • 表中的链

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-icybwQ8Y-1639297473099)(Firewall%E9%98%B2%E7%81%AB%E5%A2%99.assets/image-20211206163234890.png)]

    • CentOS7中,nat表新增INPUT规则链
  • 表的优先级

    raw>mangle>nat>fifilter(由高至低)

  • 数据包流经iptables流程

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LvRxDokX-1639297473100)(Firewall%E9%98%B2%E7%81%AB%E5%A2%99.assets/image-20211206165810242.png)]

匹配规则分类

基本匹配

  • 无需加载扩展模块,可以匹配源地址,目标地址,源端口,目标端口等

  • 常用选项

    -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

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9hKILl10-1639297473100)(Firewall%E9%98%B2%E7%81%AB%E5%A2%99.assets/image-20211206193942710.png)]

  • 规则管理
-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
  • 常见端口及协议(空格的地方表示同上)
服务协议端口
ftpftp20/tcp :数据端口 21/tcp :控制端口
sshdssh22/tcp
telnettelnet23 /tcp
mailsmtp25/tcp
smtps465/tcp
pop3110/tcp
pop3s995/tcp
imap143/tcp
imaps993/tcp
dnsdomain53/tcp 53/udp
dhcpbootps67/udp
httpdhttp80/tcp
https443/tcp
nginxnginx80/tcp
ntpntp123/udp
smaba\137,138,139/tcp
rsyslogrsyslog514/udp
rsyncrsync873/tcp
nfsdnfs2049/tcp
mysqldmysql3306/tcp
redisredis6379/tcp
tomcattomcat8080访问web的端口,
8005tomcat本身自己的端口,
8009与http等服务器建立连接的端口
phpphp-fpm9000/tcp
zabbixzabbix-agent10050/tcp
zabbix-server10051/tcp
memcachedmemcached11211/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 

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-q0qw9NFQ-1639297473101)(Firewall%E9%98%B2%E7%81%AB%E5%A2%99.assets/image-20211207164130702.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l0czc3PB-1639297473101)(Firewall%E9%98%B2%E7%81%AB%E5%A2%99.assets/image-20211207164325800.png)]

  • 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网卡网关
1client192.168.1.1ens33192.168.1.2
2firewalld192.168.1.2
192.168.3.2
ens33
ens37
3web192.168.3.3ens33192.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
  • 抓包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wXltidxV-1639297473102)(Firewall%E9%98%B2%E7%81%AB%E5%A2%99.assets/image-20211209171439584.png)]

通过源地址转换,可以实现KVM虚拟机访问外部主机

原理:kvm_ip(192.168.139.0/24)—>192.168.139.2 virbr0(kvm虚拟机网关) 192.168.2.10 ens33—>192.168.2.20(外部主机)

目的地址转换(端口映射)

实现外网访问防火墙,获取内网服务器资源

序号主机IP网卡网关
1client192.168.1.1ens33192.168.1.2
2firewalld192.168.1.2
192.168.3.2
ens33
ens37
3server192.168.3.3ens33192.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
  • 抓包

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L8RGCMF5-1639297473102)(Firewall%E9%98%B2%E7%81%AB%E5%A2%99.assets/image-20211209175920175.png)]

firewalld

简介

  • firewalld动态防火墙,类似于iptables-services
  • firewalld是CentOS7用户空间中用于对netfilter内核模块进行管理的工具
  • firewalld底层使用iptables作为防火墙规则管理入口,调用iptables命令
  • firewalld使用比iptables简单的多,简化操作
  • 具体关系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zhui5dgu-1639297473103)(Firewall%E9%98%B2%E7%81%AB%E5%A2%99.assets/image-20211210153934693.png)]

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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值