1 | firewall-cmd
|
2 | ===
|
3 |
|
4 | Linux上新用的防火墙软件,跟iptables差不多的工具
|
5 |
|
6 | ## 补充说明
|
7 |
|
8 | firewall-cmd 是 firewalld的字符界面管理工具,firewalld是centos7的一大特性,最大的好处有两个:支持动态更新,不用重启服务;第二个就是加入了防火墙的“zone”概念。
|
9 |
|
10 | firewalld跟iptables比起来至少有两大好处:
|
11 |
|
12 | 1. firewalld可以动态修改单条规则,而不需要像iptables那样,在修改了规则后必须得全部刷新才可以生效。
|
13 | 2. firewalld在使用上要比iptables人性化很多,即使不明白“五张表五条链”而且对TCP/IP协议也不理解也可以实现大部分功能。
|
14 |
|
15 | firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现,也就是说firewalld和 iptables一样,他们的作用都是用于维护规则,而真正使用规则干活的是内核的netfilter,只不过firewalld和iptables的结 构以及使用方法不一样罢了。
|
16 |
|
17 | **命令格式**
|
18 |
|
19 | ```shell
|
20 | firewall-cmd [选项 ... ]
|
21 | ```
|
22 |
|
23 | ### 选项
|
24 |
|
25 | 通用选项
|
26 |
|
27 | ```shell
|
28 | -h, --help # 显示帮助信息;
|
29 | -V, --version # 显示版本信息. (这个选项不能与其他选项组合);
|
30 | -q, --quiet # 不打印状态消息;
|
31 | ```
|
32 |
|
33 | 状态选项
|
34 |
|
35 | ```shell
|
36 | --state # 显示firewalld的状态;
|
37 | --reload # 不中断服务的重新加载;
|
38 | --complete-reload # 中断所有连接的重新加载;
|
39 | --runtime-to-permanent # 将当前防火墙的规则永久保存;
|
40 | --check-config # 检查配置正确性;
|
41 | ```
|
42 |
|
43 | 日志选项
|
44 |
|
45 | ```shell
|
46 | --get-log-denied # 获取记录被拒绝的日志;
|
47 | --set-log-denied=<value> # 设置记录被拒绝的日志,只能为 'all','unicast','broadcast','multicast','off' 其中的一个;
|
48 | ```
|
49 |
|
50 | ### 实例
|
51 |
|
52 | ```shell
|
53 | # 安装firewalld
|
54 | yum install firewalld firewall-config
|
55 |
|
56 | systemctl start firewalld # 启动
|
57 | systemctl stop firewalld # 停止
|
58 | systemctl enable firewalld # 启用自动启动
|
59 | systemctl disable firewalld # 禁用自动启动
|
60 | systemctl status firewalld # 或者 firewall-cmd --state 查看状态
|
61 |
|
62 | # 关闭服务的方法
|
63 | # 你也可以关闭目前还不熟悉的FirewallD防火墙,而使用iptables,命令如下:
|
64 |
|
65 | systemctl stop firewalld
|
66 | systemctl disable firewalld
|
67 | yum install iptables-services
|
68 | systemctl start iptables
|
69 | systemctl enable iptables
|
70 | ```
|
71 |
|
72 | 配置firewalld
|
73 |
|
74 | ```shell
|
75 | firewall-cmd --version # 查看版本
|
76 | firewall-cmd --help # 查看帮助
|
77 |
|
78 | # 查看设置:
|
79 | firewall-cmd --state # 显示状态
|
80 | firewall-cmd --get-active-zones # 查看区域信息
|
81 | firewall-cmd --get-zone-of-interface=eth0 # 查看指定接口所属区域
|
82 | firewall-cmd --panic-on # 拒绝所有包
|
83 | firewall-cmd --panic-off # 取消拒绝状态
|
84 | firewall-cmd --query-panic # 查看是否拒绝
|
85 |
|
86 | firewall-cmd --reload # 更新防火墙规则
|
87 | firewall-cmd --complete-reload
|
88 | # 两者的区别就是第一个无需断开连接,就是firewalld特性之一动态添加规则,第二个需要断开连接,类似重启服务
|
89 |
|
90 |
|
91 | # 将接口添加到区域,默认接口都在public
|
92 | firewall-cmd --zone=public --add-interface=eth0
|
93 | # 永久生效再加上 --permanent 然后reload防火墙
|
94 |
|
95 | # 设置默认接口区域,立即生效无需重启
|
96 | firewall-cmd --set-default-zone=public
|
97 |
|
98 | # 查看所有打开的端口:
|
99 | firewall-cmd --zone=dmz --list-ports
|
100 |
|
101 | # 加入一个端口到区域:
|
102 | firewall-cmd --zone=dmz --add-port=8080/tcp
|
103 | # 若要永久生效方法同上
|
104 |
|
105 | # 打开一个服务,类似于将端口可视化,服务需要在配置文件中添加,/etc/firewalld 目录下有services文件夹,这个不详细说了,详情参考文档
|
106 | firewall-cmd --zone=work --add-service=smtp
|
107 |
|
108 | # 移除服务
|
109 | firewall-cmd --zone=work --remove-service=smtp
|
110 |
|
111 | # 显示支持的区域列表
|
112 | firewall-cmd --get-zones
|
113 |
|
114 | # 设置为家庭区域
|
115 | firewall-cmd --set-default-zone=home
|
116 |
|
117 | # 查看当前区域
|
118 | firewall-cmd --get-active-zones
|
119 |
|
120 | # 设置当前区域的接口
|
121 | firewall-cmd --get-zone-of-interface=enp03s
|
122 |
|
123 | # 显示所有公共区域(public)
|
124 | firewall-cmd --zone=public --list-all
|
125 |
|
126 | # 临时修改网络接口(enp0s3)为内部区域(internal)
|
127 | firewall-cmd --zone=internal --change-interface=enp03s
|
128 |
|
129 | # 永久修改网络接口enp03s为内部区域(internal)
|
130 | firewall-cmd --permanent --zone=internal --change-interface=enp03s
|
131 | ```
|
132 |
|
133 | 服务管理
|
134 |
|
135 | ```shell
|
136 | # 显示服务列表
|
137 | Amanda, FTP, Samba和TFTP等最重要的服务已经被FirewallD提供相应的服务,可以使用如下命令查看:
|
138 |
|
139 | firewall-cmd --get-services
|
140 |
|
141 | # 允许SSH服务通过
|
142 | firewall-cmd --new-service=ssh
|
143 |
|
144 | # 禁止SSH服务通过
|
145 | firewall-cmd --delete-service=ssh
|
146 |
|
147 | # 打开TCP的8080端口
|
148 | firewall-cmd --enable ports=8080/tcp
|
149 |
|
150 | # 临时允许Samba服务通过600秒
|
151 | firewall-cmd --enable service=samba --timeout=600
|
152 |
|
153 | # 显示当前服务
|
154 | firewall-cmd --list-services
|
155 |
|
156 | # 添加HTTP服务到内部区域(internal)
|
157 | firewall-cmd --permanent --zone=internal --add-service=http
|
158 | firewall-cmd --reload # 在不改变状态的条件下重新加载防火墙
|
159 | ```
|
160 |
|
161 | 端口管理
|
162 |
|
163 | ```shell
|
164 | # 打开443/TCP端口
|
165 | firewall-cmd --add-port=443/tcp
|
166 |
|
167 | # 永久打开3690/TCP端口
|
168 | firewall-cmd --permanent --add-port=3690/tcp
|
169 |
|
170 | # 永久打开端口好像需要reload一下,临时打开好像不用,如果用了reload临时打开的端口就失效了
|
171 | # 其它服务也可能是这样的,这个没有测试
|
172 | firewall-cmd --reload
|
173 |
|
174 | # 查看防火墙,添加的端口也可以看到
|
175 | firewall-cmd --list-all
|
176 | ```
|
177 |
|
178 | 直接模式
|
179 |
|
180 | ```shell
|
181 | # FirewallD包括一种直接模式,使用它可以完成一些工作,例如打开TCP协议的9999端口
|
182 |
|
183 | firewall-cmd --direct -add-rule ipv4 filter INPUT 0 -p tcp --dport 9000 -j ACCEPT
|
184 | firewall-cmd --reload
|
185 | ```
|
186 |
|
187 | **自定义服务管理**
|
188 |
|
189 | 选项
|
190 |
|
191 | ```shell
|
192 | (末尾带有 [P only] 的话表示该选项除了与(--permanent)之外,不能与其他选项一同使用!)
|
193 | --new-service=<服务名> 新建一个自定义服务 [P only]
|
194 | --new-service-from-file=<文件名> [--name=<服务名>]
|
195 | 从文件中读取配置用以新建一个自定义服务 [P only]
|
196 | --delete-service=<服务名>
|
197 | 删除一个已存在的服务 [P only]
|
198 | --load-service-defaults=<服务名>
|
199 | Load icmptype default settings [P only]
|
200 | --info-service=<服务名>
|
201 | 显示该服务的相关信息
|
202 | --path-service=<服务名>
|
203 | 显示该服务的文件的相关路径 [P only]
|
204 | --service=<服务名> --set-description=<描述>
|
205 | 给该服务设置描述信息 [P only]
|
206 | --service=<服务名> --get-description
|
207 | 显示该服务的描述信息 [P only]
|
208 | --service=<服务名> --set-short=<描述>
|
209 | 给该服务设置一个简短的描述 [P only]
|
210 | --service=<服务名> --get-short
|
211 | 显示该服务的简短描述 [P only]
|
212 |
|
213 | --service=<服务名> --add-port=<端口号>[-<端口号>]/<protocol>
|
214 | 给该服务添加一个新的端口(端口段) [P only]
|
215 |
|
216 | --service=<服务名> --remove-port=<端口号>[-<端口号>]/<protocol>
|
217 | 从该服务上移除一个端口(端口段) [P only]
|
218 |
|
219 | --service=<服务名> --query-port=<端口号>[-<端口号>]/<protocol>
|
220 | 查询该服务是否添加了某个端口(端口段) [P only]
|
221 |
|
222 | --service=<服务名> --get-ports
|
223 | 显示该服务添加的所有端口 [P only]
|
224 |
|
225 | --service=<服务名> --add-protocol=<protocol>
|
226 | 为该服务添加一个协议 [P only]
|
227 |
|
228 | --service=<服务名> --remove-protocol=<protocol>
|
229 | 从该服务上移除一个协议 [P only]
|
230 |
|
231 | --service=<服务名> --query-protocol=<protocol>
|
232 | 查询该服务是否添加了某个协议 [P only]
|
233 |
|
234 | --service=<服务名> --get-protocols
|
235 | 显示该服务添加的所有协议 [P only]
|
236 |
|
237 | --service=<服务名> --add-source-port=<端口号>[-<端口号>]/<protocol>
|
238 | 添加新的源端口(端口段)到该服务 [P only]
|
239 |
|
240 | --service=<服务名> --remove-source-port=<端口号>[-<端口号>]/<protocol>
|
241 | 从该服务中删除源端口(端口段) [P only]
|
242 |
|
243 | --service=<服务名> --query-source-port=<端口号>[-<端口号>]/<protocol>
|
244 | 查询该服务是否添加了某个源端口(端口段) [P only]
|
245 |
|
246 | --service=<服务名> --get-source-ports
|
247 | 显示该服务所有源端口 [P only]
|
248 |
|
249 | --service=<服务名> --add-module=<module>
|
250 | 为该服务添加一个模块 [P only]
|
251 | --service=<服务名> --remove-module=<module>
|
252 | 为该服务移除一个模块 [P only]
|
253 | --service=<服务名> --query-module=<module>
|
254 | 查询该服务是否添加了某个模块 [P only]
|
255 | --service=<服务名> --get-modules
|
256 | 显示该服务添加的所有模块 [P only]
|
257 | --service=<服务名> --set-destination=<ipv>:<address>[/<mask>]
|
258 | Set destination for ipv to address in service [P only]
|
259 | --service=<服务名> --remove-destination=<ipv>
|
260 | Disable destination for ipv i service [P only]
|
261 | --service=<服务名> --query-destination=<ipv>:<address>[/<mask>]
|
262 | Return whether destination ipv is set for service [P only]
|
263 | --service=<服务名> --get-destinations
|
264 | List destinations in service [P only]
|
265 | ```
|
266 |
|
267 |
|
268 | **控制端口 / 服务**
|
269 |
|
270 | 可以通过两种方式控制端口的开放,一种是指定端口号另一种是指定服务名。虽然开放 http 服务就是开放了 80 端口,但是还是不能通过端口号来关闭,也就是说通过指定服务名开放的就要通过指定服务名关闭;通过指定端口号开放的就要通过指定端口号关闭。还有一个要注意的就是指定端口的时候一定要指定是什么协议,tcp 还是 udp。知道这个之后以后就不用每次先关防火墙了,可以让防火墙真正的生效。
|
271 |
|
272 | ```shell
|
273 | firewall-cmd --add-service=mysql # 开放mysql端口
|
274 | firewall-cmd --remove-service=http # 阻止http端口
|
275 | firewall-cmd --list-services # 查看开放的服务
|
276 | firewall-cmd --add-port=3306/tcp # 开放通过tcp访问3306
|
277 | firewall-cmd --remove-port=80tcp # 阻止通过tcp访问3306
|
278 | firewall-cmd --add-port=233/udp # 开放通过udp访问233
|
279 | firewall-cmd --list-ports # 查看开放的端口
|
280 | ```
|
281 |
|
282 | 伪装 IP
|
283 |
|
284 | ```shell
|
285 | firewall-cmd --query-masquerade # 检查是否允许伪装IP
|
286 | firewall-cmd --add-masquerade # 允许防火墙伪装IP
|
287 | firewall-cmd --remove-masquerade# 禁止防火墙伪装IP
|
288 | ```
|
289 |
|
290 | **端口转发**
|
291 |
|
292 | 端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。转发的目的如果不指定 ip 的话就默认为本机,如果指定了 ip 却没指定端口,则默认使用来源端口。
|
293 | 如果配置好端口转发之后不能用,可以检查下面两个问题:
|
294 | 1. 比如我将 80 端口转发至 8080 端口,首先检查本地的 80 端口和目标的 8080 端口是否开放监听了
|
295 | 2. 其次检查是否允许伪装 IP,没允许的话要开启伪装 IP
|
296 |
|
297 | ```shell
|
298 | firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080 # 将80端口的流量转发至8080
|
299 | firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1 # 将80端口的流量转发至192.168.0.1
|
300 | firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=192.168.0.1:toport=8080 # 将80端口的流量转发至192.168.0.1的8080端口
|
301 | ```
|
302 |
|
303 | 1. 当我们想把某个端口隐藏起来的时候,就可以在防火墙上阻止那个端口访问,然后再开一个不规则的端口,之后配置防火墙的端口转发,将流量转发过去。
|
304 | 2. 端口转发还可以做流量分发,一个防火墙拖着好多台运行着不同服务的机器,然后用防火墙将不同端口的流量转发至不同机器。
|