]> git.proxmox.com Git - pve-docs.git/blame_incremental - pve-firewall.adoc
pvesr.adoc: add dummy man page for storage replication tool
[pve-docs.git] / pve-firewall.adoc
... / ...
CommitLineData
1[[chapter_pve_firewall]]
2ifdef::manvolnum[]
3pve-firewall(8)
4===============
5:pve-toplevel:
6
7NAME
8----
9
10pve-firewall - PVE Firewall Daemon
11
12
13SYNOPSIS
14--------
15
16include::pve-firewall.8-synopsis.adoc[]
17
18
19DESCRIPTION
20-----------
21endif::manvolnum[]
22ifndef::manvolnum[]
23{pve} Firewall
24==============
25:pve-toplevel:
26endif::manvolnum[]
27ifdef::wiki[]
28:title: Firewall
29endif::wiki[]
30
31{pve} Firewall provides an easy way to protect your IT
32infrastructure. You can setup firewall rules for all hosts
33inside a cluster, or define rules for virtual machines and
34containers. Features like firewall macros, security groups, IP sets
35and aliases help to make that task easier.
36
37While all configuration is stored on the cluster file system, the
38`iptables`-based firewall runs on each cluster node, and thus provides
39full isolation between virtual machines. The distributed nature of
40this system also provides much higher bandwidth than a central
41firewall solution.
42
43The firewall has full support for IPv4 and IPv6. IPv6 support is fully
44transparent, and we filter traffic for both protocols by default. So
45there is no need to maintain a different set of rules for IPv6.
46
47
48Zones
49-----
50
51The Proxmox VE firewall groups the network into the following logical zones:
52
53Host::
54
55Traffic from/to a cluster node
56
57VM::
58
59Traffic from/to a specific VM
60
61For each zone, you can define firewall rules for incoming and/or
62outgoing traffic.
63
64
65Configuration Files
66-------------------
67
68All firewall related configuration is stored on the proxmox cluster
69file system. So those files are automatically distributed to all
70cluster nodes, and the `pve-firewall` service updates the underlying
71`iptables` rules automatically on changes.
72
73You can configure anything using the GUI (i.e. *Datacenter* -> *Firewall*,
74or on a *Node* -> *Firewall*), or you can edit the configuration files
75directly using your preferred editor.
76
77Firewall configuration files contains sections of key-value
78pairs. Lines beginning with a `#` and blank lines are considered
79comments. Sections starts with a header line containing the section
80name enclosed in `[` and `]`.
81
82
83[[pve_firewall_cluster_wide_setup]]
84Cluster Wide Setup
85~~~~~~~~~~~~~~~~~~
86
87The cluster wide firewall configuration is stored at:
88
89 /etc/pve/firewall/cluster.fw
90
91The configuration can contain the following sections:
92
93`[OPTIONS]`::
94
95This is used to set cluster wide firewall options.
96
97include::pve-firewall-cluster-opts.adoc[]
98
99`[RULES]`::
100
101This sections contains cluster wide firewall rules for all nodes.
102
103`[IPSET <name>]`::
104
105Cluster wide IP set definitions.
106
107`[GROUP <name>]`::
108
109Cluster wide security group definitions.
110
111`[ALIASES]`::
112
113Cluster wide Alias definitions.
114
115
116Enabling the Firewall
117^^^^^^^^^^^^^^^^^^^^^
118
119The firewall is completely disabled by default, so you need to
120set the enable option here:
121
122----
123[OPTIONS]
124# enable firewall (cluster wide setting, default is disabled)
125enable: 1
126----
127
128IMPORTANT: If you enable the firewall, traffic to all hosts is blocked by
129default. Only exceptions is WebGUI(8006) and ssh(22) from your local
130network.
131
132If you want to administrate your {pve} hosts from remote, you
133need to create rules to allow traffic from those remote IPs to the web
134GUI (port 8006). You may also want to allow ssh (port 22), and maybe
135SPICE (port 3128).
136
137TIP: Please open a SSH connection to one of your {PVE} hosts before
138enabling the firewall. That way you still have access to the host if
139something goes wrong .
140
141To simplify that task, you can instead create an IPSet called
142``management'', and add all remote IPs there. This creates all required
143firewall rules to access the GUI from remote.
144
145
146[[pve_firewall_host_specific_configuration]]
147Host Specific Configuration
148~~~~~~~~~~~~~~~~~~~~~~~~~~~
149
150Host related configuration is read from:
151
152 /etc/pve/nodes/<nodename>/host.fw
153
154This is useful if you want to overwrite rules from `cluster.fw`
155config. You can also increase log verbosity, and set netfilter related
156options. The configuration can contain the following sections:
157
158`[OPTIONS]`::
159
160This is used to set host related firewall options.
161
162include::pve-firewall-host-opts.adoc[]
163
164`[RULES]`::
165
166This sections contains host specific firewall rules.
167
168[[pve_firewall_vm_container_configuration]]
169VM/Container Configuration
170~~~~~~~~~~~~~~~~~~~~~~~~~~
171
172VM firewall configuration is read from:
173
174 /etc/pve/firewall/<VMID>.fw
175
176and contains the following data:
177
178`[OPTIONS]`::
179
180This is used to set VM/Container related firewall options.
181
182include::pve-firewall-vm-opts.adoc[]
183
184`[RULES]`::
185
186This sections contains VM/Container firewall rules.
187
188`[IPSET <name>]`::
189
190IP set definitions.
191
192`[ALIASES]`::
193
194IP Alias definitions.
195
196
197Enabling the Firewall for VMs and Containers
198^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
199
200Each virtual network device has its own firewall enable flag. So you
201can selectively enable the firewall for each interface. This is
202required in addition to the general firewall `enable` option.
203
204The firewall requires a special network device setup, so you need to
205restart the VM/container after enabling the firewall on a network
206interface.
207
208
209Firewall Rules
210--------------
211
212Firewall rules consists of a direction (`IN` or `OUT`) and an
213action (`ACCEPT`, `DENY`, `REJECT`). You can also specify a macro
214name. Macros contain predefined sets of rules and options. Rules can be
215disabled by prefixing them with `|`.
216
217.Firewall rules syntax
218----
219[RULES]
220
221DIRECTION ACTION [OPTIONS]
222|DIRECTION ACTION [OPTIONS] # disabled rule
223
224DIRECTION MACRO(ACTION) [OPTIONS] # use predefined macro
225----
226
227The following options can be used to refine rule matches.
228
229include::pve-firewall-rules-opts.adoc[]
230
231Here are some examples:
232
233----
234[RULES]
235IN SSH(ACCEPT) -i net0
236IN SSH(ACCEPT) -i net0 # a comment
237IN SSH(ACCEPT) -i net0 -source 192.168.2.192 # only allow SSH from 192.168.2.192
238IN SSH(ACCEPT) -i net0 -source 10.0.0.1-10.0.0.10 # accept SSH for ip range
239IN SSH(ACCEPT) -i net0 -source 10.0.0.1,10.0.0.2,10.0.0.3 #accept ssh for ip list
240IN SSH(ACCEPT) -i net0 -source +mynetgroup # accept ssh for ipset mynetgroup
241IN SSH(ACCEPT) -i net0 -source myserveralias #accept ssh for alias myserveralias
242
243|IN SSH(ACCEPT) -i net0 # disabled rule
244
245IN DROP # drop all incoming packages
246OUT ACCEPT # accept all outgoing packages
247----
248
249
250[[pve_firewall_security_groups]]
251Security Groups
252---------------
253
254A security group is a collection of rules, defined at cluster level, which
255can be used in all VMs' rules. For example you can define a group named
256``webserver'' with rules to open the 'http' and 'https' ports.
257
258----
259# /etc/pve/firewall/cluster.fw
260
261[group webserver]
262IN ACCEPT -p tcp -dport 80
263IN ACCEPT -p tcp -dport 443
264----
265
266Then, you can add this group to a VM's firewall
267
268----
269# /etc/pve/firewall/<VMID>.fw
270
271[RULES]
272GROUP webserver
273----
274
275[[pve_firewall_ip_aliases]]
276IP Aliases
277----------
278
279IP Aliases allow you to associate IP addresses of networks with a
280name. You can then refer to those names:
281
282* inside IP set definitions
283* in `source` and `dest` properties of firewall rules
284
285
286Standard IP Alias `local_network`
287~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
288
289This alias is automatically defined. Please use the following command
290to see assigned values:
291
292----
293# pve-firewall localnet
294local hostname: example
295local IP address: 192.168.2.100
296network auto detect: 192.168.0.0/20
297using detected local_network: 192.168.0.0/20
298----
299
300The firewall automatically sets up rules to allow everything needed
301for cluster communication (corosync, API, SSH) using this alias.
302
303The user can overwrite these values in the `cluster.fw` alias
304section. If you use a single host on a public network, it is better to
305explicitly assign the local IP address
306
307----
308# /etc/pve/firewall/cluster.fw
309[ALIASES]
310local_network 1.2.3.4 # use the single ip address
311----
312
313[[pve_firewall_ip_sets]]
314IP Sets
315-------
316
317IP sets can be used to define groups of networks and hosts. You can
318refer to them with `+name` in the firewall rules' `source` and `dest`
319properties.
320
321The following example allows HTTP traffic from the `management` IP
322set.
323
324 IN HTTP(ACCEPT) -source +management
325
326
327Standard IP set `management`
328~~~~~~~~~~~~~~~~~~~~~~~~~~~~
329
330This IP set applies only to host firewalls (not VM firewalls). Those
331IPs are allowed to do normal management tasks (PVE GUI, VNC, SPICE,
332SSH).
333
334The local cluster network is automatically added to this IP set (alias
335`cluster_network`), to enable inter-host cluster
336communication. (multicast,ssh,...)
337
338----
339# /etc/pve/firewall/cluster.fw
340
341[IPSET management]
342192.168.2.10
343192.168.2.10/24
344----
345
346
347Standard IP set `blacklist`
348~~~~~~~~~~~~~~~~~~~~~~~~~~~
349
350Traffic from these IPs is dropped by every host's and VM's firewall.
351
352----
353# /etc/pve/firewall/cluster.fw
354
355[IPSET blacklist]
35677.240.159.182
357213.87.123.0/24
358----
359
360
361[[pve_firewall_ipfilter_section]]
362Standard IP set `ipfilter-net*`
363~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
364
365These filters belong to a VM's network interface and are mainly used to prevent
366IP spoofing. If such a set exists for an interface then any outgoing traffic
367with a source IP not matching its interface's corresponding ipfilter set will
368be dropped.
369
370For containers with configured IP addresses these sets, if they exist (or are
371activated via the general `IP Filter` option in the VM's firewall's *options*
372tab), implicitly contain the associated IP addresses.
373
374For both virtual machines and containers they also implicitly contain the
375standard MAC-derived IPv6 link-local address in order to allow the neighbor
376discovery protocol to work.
377
378----
379/etc/pve/firewall/<VMID>.fw
380
381[IPSET ipfilter-net0] # only allow specified IPs on net0
382192.168.2.10
383----
384
385
386Services and Commands
387---------------------
388
389The firewall runs two service daemons on each node:
390
391* pvefw-logger: NFLOG daemon (ulogd replacement).
392* pve-firewall: updates iptables rules
393
394There is also a CLI command named `pve-firewall`, which can be used to
395start and stop the firewall service:
396
397 # pve-firewall start
398 # pve-firewall stop
399
400To get the status use:
401
402 # pve-firewall status
403
404The above command reads and compiles all firewall rules, so you will
405see warnings if your firewall configuration contains any errors.
406
407If you want to see the generated iptables rules you can use:
408
409 # iptables-save
410
411
412Tips and Tricks
413---------------
414
415How to allow FTP
416~~~~~~~~~~~~~~~~
417
418FTP is an old style protocol which uses port 21 and several other dynamic ports. So you
419need a rule to accept port 21. In addition, you need to load the `ip_conntrack_ftp` module.
420So please run:
421
422 modprobe ip_conntrack_ftp
423
424and add `ip_conntrack_ftp` to `/etc/modules` (so that it works after a reboot).
425
426
427Suricata IPS integration
428~~~~~~~~~~~~~~~~~~~~~~~~
429
430If you want to use the http://suricata-ids.org/[Suricata IPS]
431(Intrusion Prevention System), it's possible.
432
433Packets will be forwarded to the IPS only after the firewall ACCEPTed
434them.
435
436Rejected/Dropped firewall packets don't go to the IPS.
437
438Install suricata on proxmox host:
439
440----
441# apt-get install suricata
442# modprobe nfnetlink_queue
443----
444
445Don't forget to add `nfnetlink_queue` to `/etc/modules` for next reboot.
446
447Then, enable IPS for a specific VM with:
448
449----
450# /etc/pve/firewall/<VMID>.fw
451
452[OPTIONS]
453ips: 1
454ips_queues: 0
455----
456
457`ips_queues` will bind a specific cpu queue for this VM.
458
459Available queues are defined in
460
461----
462# /etc/default/suricata
463NFQUEUE=0
464----
465
466
467Notes on IPv6
468-------------
469
470The firewall contains a few IPv6 specific options. One thing to note is that
471IPv6 does not use the ARP protocol anymore, and instead uses NDP (Neighbor
472Discovery Protocol) which works on IP level and thus needs IP addresses to
473succeed. For this purpose link-local addresses derived from the interface's MAC
474address are used. By default the `NDP` option is enabled on both host and VM
475level to allow neighbor discovery (NDP) packets to be sent and received.
476
477Beside neighbor discovery NDP is also used for a couple of other things, like
478autoconfiguration and advertising routers.
479
480By default VMs are allowed to send out router solicitation messages (to query
481for a router), and to receive router advertisement packets. This allows them to
482use stateless auto configuration. On the other hand VMs cannot advertise
483themselves as routers unless the ``Allow Router Advertisement'' (`radv: 1`) option
484is set.
485
486As for the link local addresses required for NDP, there's also an ``IP Filter''
487(`ipfilter: 1`) option which can be enabled which has the same effect as adding
488an `ipfilter-net*` ipset for each of the VM's network interfaces containing the
489corresponding link local addresses. (See the
490<<pve_firewall_ipfilter_section,Standard IP set `ipfilter-net*`>> section for details.)
491
492
493Ports used by {pve}
494-------------------
495
496* Web interface: 8006
497* VNC Web console: 5900-5999
498* SPICE proxy: 3128
499* sshd (used for cluster actions): 22
500* rpcbind: 111
501* corosync multicast (if you run a cluster): 5404, 5405 UDP
502
503
504ifdef::manvolnum[]
505
506Macro Definitions
507-----------------
508
509include::pve-firewall-macros.adoc[]
510
511
512include::pve-copyright.adoc[]
513
514endif::manvolnum[]