firewall-cmd使用总结

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

firewall-cmd使⽤总结
firewalld的简要说明:
firewalld 、firewall-cmd 、firewall-offline-cmd它们Python脚本,通过定义的在/usr/lib/firewalld下⾯的xml配置信息, 在启动时⾃动载⼊默认iptables配置,并应⽤到系统中,当使⽤firewalld-cmd添加防⽕墙规则时,它实际是转换成
iptables规则后,在应⽤到系统中。

firewalld定义了⼏个概念:
zone: 它是安全域的范围,就类似于Window上的域⽹络,⼯作⽹络,家庭⽹络,Internet⽹络等,不同的安全作⽤域 其安全级别不同,安全程度不同,家庭zone的安全规则就是最宽松的。

service: 它是zone⾥⾯的定义⼀个规则集,它将iptables中单独根据⼊接⼝,出接⼝,源⽬端⼝,协议等定义单独规则 整合为⼀个规则集合,⽅便识别和管理。

protocol: 定义协议规则
port,source-port :基于端⼝定义规则,port我的理解:定义源和⽬标为指定端⼝的规则。

source:定义源地址规则
interface: 定义基于出⼊接⼝的规则。

direct: 直接定义原始iptables规则。

⽩名单控制谁能操作firewalld 对规则做增删改:
注: firewalld的⽩名单机制是控制,谁能操纵firewall-cmd来对现有规则进⾏增删改等操作。

此选项⽀持四种控制⽅式:
1. context : 根据SELinux的进程domain(域)的安全上下⽂类型来定义Whitelist(⽩名单)
2. command: 根据命令的绝对路径做Whitelist.
3. uid
4. user:可以使⽤⽤户名或 UID来做Whitelist
全局选项:
--state #显⽰当前firewalld服务的运⾏状态。

--runtime-to-permanent #将运⾏时配置保存为永久配置。

全局刷新配置:
--reload #重新加载防⽕墙permanent(永久的)的规则配置,覆盖当前运⾏时配置,
在运⾏时添加的⾮permanent规则,都将丢失。

--complete-reload #完全重新加载防⽕墙,甚⾄netfilter内核模块。

这很可能会终⽌活动连接,
因为状态信息会丢失。

此选项仅在出现严重防⽕墙问题时使⽤。

例如,如果存在状态信息问题,则⽆法使⽤正确的防⽕墙规则建⽴连接。

全局开启⽇志记录功能:
--get-log-denied #查看是否启⽤了在所有规则中启⽤拒绝⽇志记录。

--set-log-denied=[all |unicast |broadcast |multicast |off]
#设置启⽤或禁⽤在所有规则添加拒绝或删除⽇志记录功能。

在进⾏⼀下操作前需要知道:
增删查改:
增: --add- 或 --new- #注: add:新增⼦选项; new:新建新项⽬
删: --remove- 或 --delete-
查: --query-
改: --change-
查看修改前: firewall-cmd --reload
然后查看:
--info-[zone |service |ipset |icmptype |helper]=[zone |service |ipset |icmptype |helper]
--path-[zone |service | icmptype |helper |ipset]=[zone |service | icmptype |helper |ipset]
--list-[all-zones |services |ports |protocols |source-ports |icmp-blocks |forward-ports |interfaces |sources]
--get-[zones |services |icmptypes ]=[zones |services |icmptypes]
--get-zone-of-interface=⽹卡接⼝ #查看此⽹卡接⼝当前被附加到那个zone
--get-zone-of-source=<source>[/<mask>]|<MAC>|ipset:<ipset>
--get-[default-zone |active-zones |target |ipsets |ipset-types |descripton |short |helpers]
zone选项:
注:
zone可设置target,即iptables的动作,默认public的动作是仅允许icmp报⽂.
--set-default-zone=<zone> #设置默认zone, 默认为:public
创建zone有两种⽅法:
--new-zone=<zone> #直接指定zone名称创建.
--new-zone-from-file=<filename> [--name=<zone>]
#根据/etc/firewalld/zones/ 或 /usr/lib/firewalld/zones/下已有的zone.xml来创建.
例:
firewall-cmd --new-zone=test --permanent
firewall-cmd --reload #任何操作完成后,都必须刷新后,才能查看到。

注: 实际上firewalld也采⽤了多层结构来管理iptables规则,--permanent实际上是将当前在内存
中的修改刷写到磁盘的配置⽂件中,这个配置⽂件就是默认zone的配置⽂件,默认在
/etc/firewalld/zone/public.xml
--reload则是将内存中的数据同步到运⾏时的firewalld管理的runtime数据结构中。

在默认zone 或指定zone下可做的操作:
--add-port=<portid>[-<portid>]/<protocol>
--add-source-port=<portid>[-<portid>]/<protocol>
--add-protocol=<protocol>
--add-service=<service>
注:
service就相当于port,source-port,protocol的集合,可将这些单独的元素,打包成⼀个服务来通过
调⽤它,⼀并创建port,source-port,protocol规则。

创建服务和创建zone⼀样,也是两种⽅式:
--new-service=<service> #指定服务名称来创建
--new-service-from-file=<filename> [--name=<service>] #根据已有xml⽂件来创建
在服务下可做的操作:
--service=<service> --add-port=<portid>[-<portid>]/<protocol>
--service=<service> --add-source-port=<portid>[-<portid>]/<protocol>
注:
port 和 source-port都可以定义多个,但是测试发现,定义多个后,仅第⼀个会在iptables中的filter表中
创建允许规则。

若需要定义多个⾃定义端⼝,最好使⽤范围来创建允许⼀个端⼝范围的规则。

--service=<service> --add-protocol=<protocol> #它可以被创建为单独的⼀条运⾏某协议的iptables规则.
--service=<service> --add-module=<module> #不知道如何使⽤
--service=<service> --set-description=<description> #定义⼀个具体功能描述说明
--service=<service> --set-short=<description> #定义⼀个简短描述名
--service=<service> --set-destination=<ipv>:<address>[/<mask>] #定义⽬标地址. 因为对于服务来说,它的源只能是⾃⼰。

例:
#创建服务的⽰例:
firewall-cmd --new-service=test --permanent
firewall-cmd --service=test --add-port=9090/tcp --permanent
firewall-cmd --service=test --add-source-port=10001-10003/tcp --permanent
firewall-cmd --service=test --add-protocol=udp --permanent
firewall-cmd --service=test --set-description='This is a test service !' --permanent
cat /etc/firewalld/services/test.xml
firewall-cmd --add-service=test --premanent #这样就执⾏创建iptables规则了。

firewall-cmd --reload
iptables -n -v -L
 在默认zone 或指定zone下,添加⽹卡接⼝和源地址规则:
--add-interface=<interface>
注:
将指定物理⽹卡的接⼝添加到zone中.默认是添加到public zone中.
firewalld执⾏此操作后,会在INPUT链和 FORWARD链中添加⼊站和转发规则。

firewall-cmd --add-interface=eth1 --permanent
firewall-cmd --reload
iptables -v -n -L |grep -C3 'eth1‘
--add-source=<source>[/<mask>]|<MAC>|ipset:<ipset>
注:
将指定源地址添加到指定zone中,默认:public.
firewalld 执⾏此操作后, 会在INPUT链和 FORWARD链中添加⼊站和转发规则.
firewall-cmd --add-source=10.0.0.0/24 --permanent
firewall-cmd --reload
iptables -v -n -L |grep -B3 ‘10.0.0.0/24’
ICMP相关的规则:
--add-icmp-block=<icmptype>
--add-icmp-block-inversion
在默认zone 或指定zone下启⽤NAT功能:
注:
它⽀持DNAT(端⼝转发) 和 SNAT(源地址转换)
--add-forward-port=port=<portid>[-<portid>]:proto=<protocol>[:toport=<portid>[-<portid>]][:toaddr=<address>[/<mask>]] 例:
firewall-cmd --add-forward-port=port=10003:proto=tcp:toport=22:toaddr=192.168.0.12
注:
添加⼀条临时规则,若--reload将被删除.
此规则创建⼀个DNAT规则,将访问防⽕墙10003端⼝的报⽂转发给192.168.0.12的22号端⼝上。

firewall-cmd执⾏此命令,实现DNAT的步骤如下:
1.在mangle中添加⼀条规则去匹配⽬标端⼝是10003的报⽂,然后将其打上标记。

2.在nat条中添加⼀条DNAT规则,通过匹配标记,将其源地址修改为192.168.0.12后,从转发filter表.
3.在filter表中添加⼀条转发规则,只要匹配指定标记,就直接转发。

4.开启系统的转发功能。

#启⽤IPv4的动态IP伪装(即动态SNAT),它仅在POST_public_allow 链中添加了⼀条出接⼝⾮环回⼝的SNAT规则.
--add-masquerade
direct选项:
注:
此选项⽀持直接编写iptables规则.
--add-chain {ipv4|ipv6|eb} <table> <chain>
--add-rule {ipv4|ipv6|eb} <table> <chain> <priority> <arg>...
注:
priority: 就是规则插⼊的⾏号,越靠前越优先。

arg: iptables相关规则选项。

Whitelist选项:
firewall-cmd --lockdown-on #先开启功能,在设置谁能操纵firewall-cmd.
firewall-cmd --add-lockdown-whitelist-command=<command>
--add-lockdown-whitelist-context=<context>
--add-lockdown-whitelist-uid=<uid>
--add-lockdown-whitelist-user=<user>
rich富语⾔选项⽤法:
firewall-cmd [--zone=zone] [--add|--list|--query|--remove]-rich-rule='rule' [--timeout=seconds]
注:
--timeout: 设置规则超时时间,若超时则⾃动删除,单位:秒
rule:简略版
[source]
[destination]
service|port|protocol|icmp-block|masquerade|forward-port
[log]
[audit]
[accept|reject|drop]
rule:详细版
[family="ipv4|ipv6"]
[source |destination] address="address[/mask]" [invert="True|yes"]
[[service name="service name" ]| [port port="number_or_range" protocol="tcp|udp"] | [protocol value="协议名"] ] [ icmp-block name="icmptype name" ]
[masquerade]
[forward-port port="number_or_range" protocol="tcp|udp" to-port="number_or_range" to-addr="address"]
[log [prefix=prefix text] [level=log level] limit value=rate/duration]
[audit]
[accept | reject [type="reject type"] | drop]
masquerade:创建动态SNAT
【即:⾃动判断⽤户要去的⽹络,查询路由后,将SNAT⽤户的源地址转换为可去往该⽹络的IP】
创建SNAT:
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=192.168.0.0/24 masquerade accept"
注:
更简单的动态SNAT配置:
firewall-cmd --permanent --add-masquerade
firewall-cmd --permanent --query-masquerade #可查看是否启动成功.
若内部有多个⽹段时,它可⾃动识别不同⽹段,并完成SNAT.
跟它类似的SNAT配置为:
firewall-cmd --permanent --add-rich-rule="rule family=ipv4 source address=1.1.1.0/24 invert=yes"
注:
invert=yes: 表⽰反转的意思,即只要不是1.1.1.0/24⽹络的都做SNAT.和直接写--add-masquerade类似.
验证:
#查看⾃动配置的转发规则,即SNAT回来的数据包,给予转发放⾏.
iptables -vnL |grep -C5 192.168.0.0/24
#查看⾃动配置的NAT表中的POSTROUTING链的的转化记录.
iptables -vnL -t nat |grep -C5 192.168.0.0/24
客户端:
#客户端与SNAT服务器之间是192.168.0.0/24⽹络,SNAT端连接Internet.
#注意添加默认路由时,⼀定要指明是global,或使⽤via关键字,指明下⼀跳.
#否则创建的路由将是link类型的,系统将认为,我们其实是在⼀个⽹络中.于是
#当我们ping 1.1.1.2时,系统将认为,客户端和1.1.1.0/24在⼀个局域⽹中,
#于是发⽣ARP查询,这样肯定是查不到1.1.1.2的MAC的,就导致不通!
ip route default via 192.168.0.1 dev eth0
ping 1.1.1.2
端⼝转发:
#将源地址是172.24.8.0/24⽹络的,访问我的5432端⼝,则将其转发到我的22号端⼝.并记录⽇志,⽇志前缀为[ADMIN LOGIN] #⽽且限制每分钟只记录⼀条⽇志.
firewall-cmd --add-rich-rule="rule family=ipv4 source address=172.24.8.0/24 forward-port port=5432 \
protocol=tcp to-port=22 log prefix='[ADMIN LOGIN]' limit value=1/m accept"
简单的允许对任意源做端⼝转发:
firewall-cmd --add-forward-port=port=5432:proto=tcp:toport=22 --timeout=100
注:
格式:
[--permanent] [--zone=zone] \
--add-forward-port=port=portid[-portid]:proto=protocol[:toport=portid[-portid]][:toaddr=address[/mask]] \ [--timeout=seconds]。

相关文档
最新文档