firewalld

定义:基于firewalld服务的防火墙会查询每个网络数据包的头部。
依据头部中包含的信息,可以配置规则来过滤每个数据包。

澄清概念

(1)许多人觉得执行systemctl stop firewalld可以关闭防火墙功能,就认为firewalld 是防火墙,这个理解是错误的。执行systemctl stop firewalld,实际上是对底层包过滤规则清除(类似于nft flush ruleset 或iptables -F ,清除当前的ruleset)相当于关闭了防火墙。

(2)firewalld定义的防火墙规则要被内核的netfilter理解,中间的翻译任务由iptables或nftables进行,也就是firewalld后端需要iptables或nftables。

firewalld软件包提供了firewalld daemon和一系列工具如firewall-cmd、firewall-config、firewall-offline-cmd等。

firewalld由d-bus层和core层构成。d-bus层提供api,其它程序(如firewall-cmd、firewall-config、firewall-applet、甚至是你自己编写的程序或守护进程)通过调用api可定义防火墙规则或查询防火墙状态等等。core层为d-bus层提供服务,负责和后端交互。架构图如下:

image.png

firewalld像iptables、nftables等一样,本身并不是防火墙,只是防火墙管理工具,通过定义防火墙规则最终交由内核的netfilter进行包过滤实现防火墙功能。

备注:firewalld提供的firewall-offline-cmd不调用d-bus层,而是直接调用core层中的IO来修改防火墙规则。

区域

image.png

主要的区域

  • trusted:白名单
  • public:默认区域
  • drop:黑名单Copy to clipboardErrorCopied

常用命令

image.png

# 查看默认使用的区域
firewall-cmd --get-default-zone
public

# 查看区域的规则
firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0 eth1
  sources: 
  services: ssh dhcpv6-client
  ports: 80/tcp 80/udp
  protocols: 
  masquerade: no
  forward-ports: 
  source-ports: 
  icmp-blocks: 
  rich rules: 
 
# 指定查看区域规则
firewall-cmd --list-all --zone=public
public (active)                  #区域(活跃的)
  target: default                #状态:默认
  icmp-block-inversion: no       #ICMP块
  interfaces: eth0 eth1          #区域绑定的网卡
  sources:                       #允许流量的IP
  services: ssh dhcpv6-client    #允许流量的服务
  ports: 80/tcp 80/udp           #允许流量的端口
  protocols:                     #允许流量的协议  {'tcp'|'udp'|'sctp'|'dccp'}
  masquerade: no                 #ip 伪装
  forward-ports:                 #端口转发
  source-ports:                  #来源端口
  icmp-blocks:
  rich rules:                    #富规则
  


# 查询区域是否允许某服务
firewall-cmd --zone=public --query-service=ssh
no



# 重启防火墙(清理临时的设置)
firewall-cmd --reload 
successCopy to clipboardErrorCopied

防火墙区域配置策略

为了能正常使用firewalld服务和相关工具去管理防火墙,必须启动firewalld服务,同时关闭以前旧的防火墙相关服务需要注意firewalld的规则分为两种状态

  • Runtime 运行时:修改规则马上生效,但如果重启服务则失效,建议用户测试。
  • Permanent 持久配置:修改规则后需要 reload 重载服务才会生效,用于生产。

防火墙配置放行策略

放行服务

# 放行服务
firewalld-cmd --add-service=http

# 放行 http 和 https 服务
firewalld-cmd --add-service={http,https}

# 添加自己手动配置的服务(允许访问)
cp /usr/lib/firewalld/services/{http.xml,suibian.xml}
firewalld-cmd --add-service=suibina

端口放行

firewalld-cmd --add-port=80/tcp
firewalld-cmd --remove-port=80/tcp

网段放行

firewalld-cmd --add-source=10.0.0.0/24 --zone=trusted

firewall ip白名单设置

开启某个端口(指定IP可访问)

firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="10.1.1.14/32" port protocol="tcp" port="80" accept"

# 删除策略
firewall-cmd --permanent --zone=public --remove-rich-rule="rule family="ipv4" source address="10.1.1.14/32" port protocol="tcp" port="80" accept"

firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens192
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  masquerade: yes
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
        rule family="ipv4" source address="10.0.0.0/8" accept
        rule family="ipv4" source address="172.16.0.0/12" accept
        rule family="ipv4" source address="192.168.0.0/16" accept
        rule family="ipv4" source address="120.53.106.213" accept

端口转发与伪装

伪装

# 查询是否已经开启了伪装 ip。开启伪装 ip 才具把原有请求转发到其他服务器上的能力
firewall-cmd --zone=public --query-masquerade	
# 开启伪装 ip
firewall-cmd --zone=external --add-masquerade	
# 禁用伪装 ip
firewall-cmd --zone=external --remove-masquerade	

转发

# 转发的规则列表
firewall-cmd --list-forward-ports

# 添加转发规则,注意:仅支持 IPV4,需要开启 firewalld 伪装 ip 功能	
firewall-cmd --add-forward-port=port=<portid>[-<portid>]:proto=<protocol>[:toport=<portid>[-<portid>]][:toaddr=<address>[/<mask>]]	

# 移除转发规则,仅支持 IPV4
firewall-cmd --remove-forward-port=port=<portid>[-<portid>]:proto=<protocol>[:toport=<portid>[-<portid>]][:toaddr=<address>[/<mask>]]	

# 查询转发规则,仅支持 IPV4
firewall-cmd --query-forward-port=port=<portid>[-<portid>]:proto=<protocol>[:toport=<portid>[-<portid>]][:toaddr=<address>[/<mask>]]	

实例

在同一台服务器中端口转发:
firewall-cmd --add-forward-port=port=源端口:proto=协议:toport=目的端口

# 192.168.80.101:8000 相当于访问192.168.80.101:80
firewall-cmd --add-forward-port=port=8000:proto=tcp:toport=80

在不同服务器上端口转发:
firewall-cmd --add-forward-port=port=源端口:proto=协议:toport=目的端口:toaddr=目标服务器IP地址

# 192.168.80.105:8000 相当于访问192.168.80.100:80
firewall-cmd --add-forward-port=port=8000:proto=tcp:toport=80:toaddr=192.168.80.100

富规则

操作指令

--add-rich-rule='<RULE>'        # 在指定的区域添加一条富语言规则
--remove-rich-rule='<RULE>'     # 在指定的区删除一条富语言规则
--query-rich-rule='<RULE>'      # 找到规则返回0,找不到返回1
--list-rich-rules               # 列出指定区里的所有富语言规则Copy to clipboardErrorCopied

字段

man firewalld.richlanguage
rule
[source]
[destination]
service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port
[log]
[audit]
[accept|reject|drop|mark]

rule [family="ipv4|ipv6"]
source address="address[/mask]" [invert="True"]
service name="service name"
port port="port value" protocol="tcp|udp"
protocol value="protocol value"
forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"
accept | reject [type="reject type"] | drop

rule

rule [family="ipv4|ipv6"]

  • 如果提供了规则系列,它可以是 ipv4 或者 ipv6 。规则系列把规则限定在 IPv4 或 IPv6 。
  • 如果没有提供规则系列, 将为 IPv4 和 IPv6 增加规则。如果源地址或者目标地址在一个规则中被使用,那么必须提供规则系列。端口转发也存在这种情况。

source

source [not] address="address[/mask]"|mac="mac-address"|ipset="ipset

一个源地址或者地址范围是一个为 IPv4 或者 IPv6 地址。不支持使用主机名。可以通过增加 invert="true" 或 invert="yes" 来颠倒源地址命令的意思。

destination

destination [not] address="address[/mask]"

指定目的地址,与 source 相似,在服务器为多网卡的前提下。

service

service name="service name"
服务名称是 firewalld 提供的其中一种服务。要获得被支持的服务的列表,输入以下命令: firewall-cmd --get-services。

port

port port="port value" protocol "tcp|udp"

端口既可以是一个独立端口数字,又或者端口范围,例如,5060-5062。协议可以指定为 tcp 或 udp 。

masquerade

开启规则伪装,如果在一个配置规则里开启转发服务的话。

forward-port

forward-port port="port value" protocol="tcp|udp" to-port="port value" to-addr="address"

从一个带有指定为 tcp 或 udp 协议的本地端口转发数据包到另一个本地端口,或另一台机器,或另一台机器上的另一个端口。 port 和 to-port 可以是一个单独的端口数字,或一个端口范围。而目的地址是一个简单的 IP 地址。forward-port 命令使用内部动作 accept(允许的)。

action

action|reject|drop|mark

accept: 允许指定规则。
reject: 拒绝指定规则,给与拒绝响应。
drop: 丢弃指定规则,不给任何响应。
mark: 所有数据都将在 mangle 表的 PREROUTING 链中标记,并且带哟偶标记和掩码组合。可以使用 limit 参数限流。

实例

# 允许任意 ip 访问指定的端口,反之把 accept 换成 reject 即可
firewall-cmd --add-rich-rule=“rule family=‘ipv4’ port protocol=’<protocol>’ port=’<port>’ accept”

# 允许任意 ip 访问指定的服务对应的端口(获取所有预设支持的服务信息:firewall-cmd --get-services),反之把 accept 换成 reject 即可	
firewall-cmd --add-rich-rule=“rule family=‘ipv4’ service name=’<service name>’ accept”	

# 允许指定的源 ip 访问指定的端口,反之把 accept 换成 reject 即可
firewall-cmd --add-rich-rule=“rule family=‘ipv4’ source address=’<ip>’ port protocol=’<protocol>’ port=’<port>’ accept”	

# 允许指定的源 ip 访问指定 ip 的指定端口,反之把 accept 换成 reject 即可
firewall-cmd --add-rich-rule=“rule family=‘ipv4’ source address=’<ip>’ destination address=’<ip>’ port protocol=’<protocol>’ port=’<port>’ accept”	
firewall-cmd --add-rich-rule=“rule family=‘ipv4’ forward-port port=’<port>’ protocol=’<protocol>’ to-port=’<port>’ to-addr=’<ip>”	

# 拒绝某种协议服务,如:icmp
firewall-cmd --permanent --add-rich-rule=‘rule protocol value=’<protocol>’ reject’

#允许10.0.0.1主机能够访问http服务
firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1 service name=http accept'

#允许172.16.1.0/24能访问10050端口
firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 port port=111 protocol=tcp accept'

# 允许public区域所有访问ssh,拒绝172.16.1.0/24网段连接
firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 service name=ssh reject'

# 允许public区域所有访问ssh,拒绝172.16.1.0/24网段连接
firewall-cmd --add-rich-rule='rule family=ipv4 source address=172.16.1.0/24 service name=ssh drop'

# drop 直接丢弃,不返回任何内容
# reject拒绝,返回拒绝的内容

# 例题:当用户来源IP地址是10.0.0.1主机,则将用户请求的5555端口转发至后端172.16.1.7的22端口
# 端口转发
firewall-cmd --add-rich-rule='rule family=ipv4 source address=10.0.0.1 forward-port port=5555 protocol=tcp to-port=22 to-addr=172.16.1.7'
success

firewall-cmd --add-masquerade 
success

# 禁止 ping
firewall-cmd --add-rich-rule='rule family=ipv4 protocol value=icmp drop'

#富规则的设置(rich rules)

# 允许192.168.2.208主机的所有流量
firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.208" accept"
 
# 允许192.168.2.208主机的icmp协议,即允许192.168.2.208主机ping
firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.2.208" protocol value="icmp" accept"
 
# 取消允许192.168.2.208主机的所有流量
firewall-cmd --zone=drop --remove-rich-rule="rule family="ipv4" source address="192.168.2.208" accept"
 
# 允许192.168.2.208主机访问ssh服务
firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.208" service name="ssh" accept"

# 禁止192.168.2.208访问https服务,并返回错误信息
firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.208" service name="https" reject"
# 注:如果是drop的话是直接丢弃,会返回timeout(连接超时)

# 允许192.168.2.0/24网段的主机访问22端口
firewall-cmd --zone=drop --add-rich-rule="rule family="ipv4" source address="192.168.2.0/24" port protocol="tcp" port="22" accept"

# 每分钟允许2个新连接访问ftp服务
firewall-cmd --add-rich-rule="rule service name=ftp limit value=2/m accept"

# 允许新的ipv4和ipv6连接ftp,并使用日志和审核,每分钟允许访问一次
firewall-cmd --add-rich-rule="rule service name=ftp log limit value="1/m" audit accept"

# 拒绝来自192.168.2.0/24网段的连接,10秒后自动取消
firewall-cmd --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 reject" --timeout=10

# 允许ipv6地址为2001:db8::/64子网的主机访问dns服务,并且每小时审核一次,300秒后自动取消
firewall-cmd --add-rich-rule="rule family=ipv6 source address="2001:db8::/64" service name="dns" audit limit value="1/h" reject" --timeout=300

# 将来自192.168.2.0/24网段访问本机80端口的流量转发到本机的22端口
firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 forward-port port=80 protocol=tcp to-port=22"

# 将来自192.168.2.0/24网段访问本地80端口的流量转发到192.168.2.208主机的22端口
firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 forward-port port=80 protocol=tcp to-port=22 to-addr=192.168.2.208"

# 伪装,将来自局域网192.168.2.0/24网段访问外网的流量映射为网络出口公网IP,即修改源IP地址
firewall-cmd --zone=drop --add-masquerade
firewall-cmd --zone=drop --add-rich-rule="rule family=ipv4 source address=192.168.2.0/24 masquerade"

其他配置

# 重新加载配置,不会中断用户连接,不会丢失状态
firewall-cmd --reload	

# 重新加载配置,会中断用户连接,会丢失状态(只是在重启的时候丢失状态、中断用户连接,之后恢复正常)。通常在防火墙出现严重问题时,这个命令才会被使用。比如,防火墙规则是正确的,但却出现状态信息问题和无法建立连接。
firewall-cmd --complete-reload	

# 终止所有输入和输出的数据包
firewall-cmd --panic-on	

# 开启你所有输入和输出的数据包
firewall-cmd --panic-off	

# 查询 panic 是否开启。yes:开启,no:未开启
firewall-cmd --query-panic	

timeout

在原有设置规则的基础上,最后还可以在加上这个参数,意指:这特规则在指定时间之后过期。

timeval 是一个数字(默认:秒)或在数字后跟一个字符 s(秒)、m(分钟)、h(小时)的数字,例如 20m 或 1h。

–timeout=<timeval>

配置备份

防火墙的配置,永久生效后会保存在/etc/firewalld/zones/这个目录下,所以如果进行服务器集群扩展,或者配置相同防火墙时,只需要把该文件拿过来启动防火墙即可

备份即备份右边目录即可: /etc/firewalld/zones/
备份文件一定是在永久生效后才会在目录下多生成一个文件

内部共享上网

在指定的带有公网IP的实例上启动Firewalld防火墙的NAT地址转换,以此达到内部主机上网。

在公司里面,服务器上没有外网的,除非使用路由器,或者使用防火墙实现内部共享上网

# 开启 IP 地址伪装
firewall-cmd --add-masquerade 
success
firewall-cmd --add-masquerade --permanent 
success

# 开启内核转发
# 如果使用iptables必须手动开启,firewalld不需要手动开启

#配置内核转发
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1

sysctl -p

# 查看内核转发是否开启
sysctl -a|grep net.ipv4.ip_forward
net.ipv4.ip_forward = 1
 
# 配置网关地址(客户端)
vim /etc/sysconfig/network-scripts/ifcfg-eth1   #添加网关
GATEWAY=172.16.1.8
DNS1=223.5.5.5

ifdown eth1 && ifup eth1

Kubernetes集群开启Firewall

参考:
https://www.cnblogs.com/Dev0ps/p/11401530.html

k8s master需要开启以下端口

firewall-cmd --permanent --add-port=6443/tcp
firewall-cmd --permanent --add-port=2379-2380/tcp
firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10251/tcp
firewall-cmd --permanent --add-port=10252/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --permanent --add-port=53/udp
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --permanent --add-port=9153/tcp
firewall-cmd --add-masquerade --permanent
# only if you want NodePorts exposed on control plane IP as well
firewall-cmd --permanent --add-port=30000-32767/tcp
systemctl restart firewalld

k8s node需要开启以下端口

firewall-cmd --permanent --add-port=10250/tcp
firewall-cmd --permanent --add-port=10255/tcp
firewall-cmd --permanent --add-port=8472/udp
firewall-cmd --permanent --add-port=443/udp
firewall-cmd --permanent --add-port=30000-32767/tcp
firewall-cmd --permanent --add-port=53/udp
firewall-cmd --permanent --add-port=53/tcp
firewall-cmd --permanent --add-port=9153/tcp
firewall-cmd --add-masquerade --permanent
systemctl restart firewalld  

以下几点需要特别注意:

8472/udp为flannel的通信端口
443/tcp 为Kubernetes server端口
注意一点:一定要执行以下命令打开NAT,默认是关闭状态,这里踩过坑!!

firewall-cmd --add-masquerade --permanent
# 检查是否允许NAT转发
firewall-cmd --query-masquerade
# 关闭NAT转发
firewall-cmd --remove-masquerade

如果你使用了istio还有把istio-pilot的端口加到防火墙里:
firewall-cmd --permanent --add-port=15010-15014/tcp

否则会出现以下报错:
Envoy proxy is NOT ready

用于私网的IP地址段

10.0.0.0/8: 10.0.0.0~10.255.255.255
172.16.0.0/12: 172.16.0.0~172.31.255.255
192.168.0.0/16: 192.168.0.0~192.168.255.255

屏蔽指定IP

屏蔽指定IP地址

firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.100' reject"

屏蔽IP地址段

firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.0/24' reject"

iptables

规则链

1.在进行路由选择前处理数据包(PREROUTING)
2.处理流入的数据包(INPUT)
3.处理流出的数据包 (OUTPUT)
4.处理转发的数据包(FORWARD)
5.在进行路由选择后处理数据包(POSTROUTING)

基本命令

iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION

  • -t:指定需要维护的防火墙规则表 filter、nat、mangle或raw。在不使用 -t 时则默认使用 filter 表。
  • COMMAND:子命令,定义对规则的管理。
  • chain:指明链表。
  • CRETIRIA:匹配参数。
  • ACTION:触发动作。

iptables 命令常用的选项及各自的功能

-A 添加防火墙规则
-D 删除防火墙规则
-I 插入防火墙规则
-F 清空防火墙规则
-L 列出添加防火墙规则
-R 替换防火墙规则
-Z 清空防火墙数据表统计信息
-P 设置链默认规则

iptables 命令常用匹配参数及各自的功能

-s 匹配来源地址IP/MASK,加叹号“!”表示除这个IP外
-d 匹配目标地址
-i 网卡名称 匹配这块网卡的流入的数据
-o 网卡名称 匹配者块网卡的流出的数据
-p 匹配协议,如TCP、UDP、ICMP
--dport num 匹配目标端口号
--sport num 匹配来源端口号
--src-range 匹配源地址范围
--dst-range 匹配目标地址范围
--limit 四配数据表速率
--mac-source 匹配源MAC地址
--stste 匹配状态(INVALID、ESTABLISHED、NEW、RELATED)
--string 匹配应用层字串

iptables 命令触发动作及各自的功能

ACCEPT(允许流量通过)
REJECT(拒绝流量通过)
LOG(记录日志信息)
DROP(拒绝流量通过,拒绝且不响应)
DNAT (目标地址转换)
SNAT(源地址转换)
MASQUERADE (地址欺骗)
REDIRECT(重定向)

实例

iptables中规则的关系——以只允许某些IP段访问为例

最简单的命令是:

iptables -A INPUT -s 192.168.31.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

基本命令

永久打开转发功能:
方法一:(centos6和7)
echo 1 > /proc/sys/net/ipv4/ip_forward
方法二:(centos7)
vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p //生效

# 让内网通过外网卡上网
# 方法一:
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens37 -j SNAT --to 192.168.90.100
# 方法二:
iptables -t nat -A POSTROUTING -s 192.168.80.100 -o ens37 -j SNAT --to 192.168.90.100

# 注:
# 192.168.80.100是内网卡ip地址
# 192.168.90.100是外网卡ip地址
# 客户端和内网服务器必须都要指定网关,否则无效

# 当外部客户端访问外部地址(90.100)时,服务器将请求转发给内网服务器(80.102)
iptables -t nat -A PREROUTING -i ens33 -d 192.168.90.100 -p tcp --dport 80 -j DNAT --to 192.168.80.102

# 注:同样客户端和内网服务器都需要网关

# iptables策略,访问192.168.90.100的时候,访问的是192.168.80.101
iptables -t nat -A PREROUTING -i ens32 -d 192.168.90.100 -j DNAT --to-destination 192.168.80.101

# 备份保存:iptables-save > /opt/a.txt
# 还原:iptables-restore < /opt/a.txt

# 请求或禁止来自 10.0.0.188 ip 地址访问 80 端口的请求
iptables -A INPUT -s 10.0.0.188 -p tcp --dport 80 -j DROP/ACCEPT

# 实现把访问 10.0.0.8:80 的请求转到 172.16.1.17:80
iptables -t nat -A PREROUTING -i ens32 -d 10.0.0.8 -p tcp --dport 80 -j DNAT --to-destination 172.16.1.17:80

# 实现 192.168.80.0/24 段所有主机通过 10.0.0.8 外网 IP 共享上网。
iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens32 -j SNAT --to 10.0.0.8

# 禁止ping本机,但是本机可以ping通其它主机
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
iptables -A INPUT -p icmp -j DROP

# iptables防火墙规则:当一个公网主机去访问 服务器的外网口公网地址(80.182)的时候,服务器把请求转发给内网真正提供服务的内网服务器(90.181)。
iptables -t nat -A PREROUTING -i ens33 -d 192.168.80.182 -j DNAT --to 192.168.90.181 

# 实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网。
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o ens32 -j SNAT --to 124.32.54.26

# 将来自192.168.10.0/24的数据,其源地址转换为192.168.90.100
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o ens34 -j SNAT --to-source 192.168.90.100

# iptables策略,访问192.168.90.100的时候,访问的是192.168.80.101
iptables -t nat -A PREROUTING -i ens32 -d 192.168.90.100 -j DNAT --to-destination 192.168.80.101

# iptables防火墙规则: 拒绝转发源地址是80网段的,目的地址是192.168.90.100,且协议是TCP21端口的数据包。
iptables -A INPUT -s 192.168.80.0/24 -d 192.168.90.100 -p tcp --dport 21 -j REJECT

# 拒绝192.168.0.0/24网段的1024-65534的源端口访问SSH
iptables -A INPUT -p tcp -s 192.168.0.0/24 --sport 1024-65534 --dport ssh -j REJECT

# 写一个防火墙配置脚本,只允许远程主机访问本机的80端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -P INPUT DROP

# 拒绝源地址是80网段的,目的地址是90网段的,且协议是TCP的21端口的数据包。
iptables -I FORWARD -s 192.168.80.0/24 -d 192.168.90.0/24 -p tcp --dport 21 -j DROP/REJECT

# 禁止转发源IP地址位于192.168.80.21与192.168.80.28之间的TCP数据包。
iptables -A FORWARD -m iprange --src-range 192.168.80.21-192.168.80.28 -p tcp -j DROP/REJECT

# 允许192.168.80.20到192.168.80.100的ip地址主机的ICMP流量能够访问本服务器
iptables -A INPUT -p icmp -m iprange --src-range 192.168.80.20-192.168.80.100 -j ACCEPT 

# iptables的匹配类型:
通用匹配:协议-p,-s,-d,-i,-o
隐含匹配:--sport,--dport,TCP协议标记,icmp类型
显式匹配:多端口,mac地址,ip地址范围,数据包状态

# iptables控制类型有哪些:
ACCEPT  允许
REJECT  拒绝
DROP    丢弃
LOG     记录日志

# iptables中规则、规则链、规则表的关系:
多条规则组成规则链,规则链在规则表中,规则链中设置默认策略。

# 将nat的默认策略设置为drop:
iptables -t nat -P INPUT DROP

# 删除nat表OUTPUT链中的第5条策略:
iptables -t nat -D OUTPUT 5
iptables -t nat -F OUTPUT

常用问题总结

iptables -P INPUT DROP后无法联网

有一些时候 我们需要将iptables 的INPUT链写死,那么我们可以用iptables -P INPUT DROP来全部关掉input链路。

但是随之产生了一个很严重的问题,那么服务器本身发送的数据请求返回的数据同样被iptables拒之门外,一个通俗的解释就是外部数据无法访问本地服务,本地服务器也无法正常上网。

解决的办法如下:

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

这两条策略会使iptables允许由服务器本身请求的数据通过。

RELATED 是个比较麻烦的状态。当一个连接和某个已处于 ESTABLISHED 状态的连接有关系时,就被认为是 RELATE的 了。换句话说,一个连接要想是 RELATED 的,首先要有一个 ESTABLISHED 的连接。这个 ESTABLISHED 连接再产生一个主连接之外的连接,这个新的连接就是 RELATED 的了,当然前提是 conntrack 模块要能理解 RELATED

ftp是个很好的例子,FTP-data 连接就是和FTP-control有RELATED的。还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。

清除防火墙规则

iptables -F
(flush 清除所有的已定规则)

iptables -X
(delete 删除所有用户“自定义”的链(tables))

iptables -Z
(zero 将所有的chain的计数与流量统计都归零)

firewall 和 iptables 区别

配置文件

firewalldiptables
配置文件/usr/lib/firewalld/ 和 /etc/firewalld//etc/sysconfig/iptables
对规则的修改不需要全部刷新策略,不丢失现行连接需要全部刷新策略,丢失连接
防火墙类型动态防火墙静态防火墙

firewalld、iptables和nftables关系

在centos7及之前版本中,iptables也提供了类似firewalld的daemon,用户可以选择iptables或firewalld daemon其一。centos8已弃用iptables,只用nftables。

nftables和iptables负责的应该属于数据包过滤框架。nftables是从linux内核3.13开始出现,旨在替代现存的 {ip,ip6,arp,eb}_tables(本文统称为iptables)。

image.png

firewalld zone、network interface、connection关系

firewalld易用特点就是使用zone、service简化防火墙配置任务,另外一个优势就是动态管理。

zone是firewalld一切的基础,在zone中可配置各种规则,比如根据service/port(经常使用)、source等定义,或定义rich rule(富规则),所以说zone是预先定义的一组规则集。这样zone就实现了对网络可信等级的划分。firewalld缺省定义了9个zone(当然可以对其可修改,也可以自己创建额外的zone)。

通过对网卡(实际上是connection,即网卡配置文件。虽然一个网卡可有多个配置文件,但同时只能有一个活动的配置文件,可以在配置文件中使用zone=来定义connection所属zone)切换zone,可快速将网络置于不同的可信等级。

此外,firewalld zone也提供了类似路由器一些功能,如端口转发、ip地址伪装等。

对于一个接受到的请求具体使用哪个zone,firewalld是通过三种方法来判断的:

  • source,也就是源地址
  • interface,接收请求的网卡
  • firewalld.conf 中配置的默认zone

这三个的优先级按顺序依次降低,也就是说如果按照source可以找到就不会再按interface去查找,如果前两个都找不到才会使用第三个,也就是firewalld.conf中配置的默认zone。

image.png