diff --git a/user/security-in-qubes/firewall.md b/user/security-in-qubes/firewall.md index da8a58bf..eb1b330c 100644 --- a/user/security-in-qubes/firewall.md +++ b/user/security-in-qubes/firewall.md @@ -16,7 +16,8 @@ The Qubes Firewall Understanding firewalling in Qubes ---------------------------------- -Every qube in Qubes is connected to the network via a FirewallVM, which is used to enforce network-level policies. By default there is one default FirewallVM, but the user is free to create more, if needed. +Every qube in Qubes is connected to the network via a FirewallVM, which is used to enforce network-level policies. +By default there is one default FirewallVM, but the user is free to create more, if needed. For more information, see the following: @@ -31,11 +32,15 @@ In order to edit rules for a given qube, select it in the Qubes Manager and pres ![r2b1-manager-firewall.png](/attachment/wiki/QubesFirewall/r2b1-manager-firewall.png) -*R4.0 note:* ICMP and DNS are no longer accessible in the GUI, but can be changed via `qvm-firewall` described below. Connections to Updates Proxy are no longer made over network so can not be allowed or blocked with firewall rules (see [R4.0 Updates proxy](https://www.qubes-os.org/doc/software-update-vm/) for more detail. +*R4.0 note:* ICMP and DNS are no longer accessible in the GUI, but can be changed via `qvm-firewall` described below. +Connections to Updates Proxy are no longer made over network so can not be allowed or blocked with firewall rules (see [R4.0 Updates proxy](https://www.qubes-os.org/doc/software-update-vm/) for more detail. -Note that if you specify a rule by DNS name it will be resolved to IP(s) *at the moment of applying the rules*, and not on the fly for each new connection. This means it will not work for servers using load balancing. More on this in the message quoted below. +Note that if you specify a rule by DNS name it will be resolved to IP(s) *at the moment of applying the rules*, and not on the fly for each new connection. +This means it will not work for servers using load balancing. +More on this in the message quoted below. -Alternatively, one can use the `qvm-firewall` command from Dom0 to edit the firewall rules by hand. The firewall rules for each VM are saved in an XML file in that VM's directory in dom0: +Alternatively, one can use the `qvm-firewall` command from Dom0 to edit the firewall rules by hand. +The firewall rules for each VM are saved in an XML file in that VM's directory in dom0: /var/lib/qubes/appvms//firewall.xml @@ -44,17 +49,22 @@ This equates to somewhere between 35 and 39 rules. If this limit is exceeded, the qube will not start. The limit was removed in R4.0. -It is possible to work around this limit by enforcing the rules on the qube itself by putting appropriate rules in `/rw/config`. See [Where to put firewall rules](#where-to-put-firewall-rules). In complex cases, it might be appropriate to load a ruleset using `iptables-restore` called from `/rw/config/rc.local`. +It is possible to work around this limit by enforcing the rules on the qube itself by putting appropriate rules in `/rw/config`. +See [Where to put firewall rules](#where-to-put-firewall-rules). +In complex cases, it might be appropriate to load a ruleset using `iptables-restore` called from `/rw/config/rc.local`. Reconnecting VMs after a NetVM reboot ------------------------------------- -Normally Qubes doesn't let the user stop a NetVM if there are other qubes running which use it as their own NetVM. But in case the NetVM stops for whatever reason (e.g. it crashes, or the user forces its shutdown via qvm-kill via terminal in Dom0), Qubes R4.0 will often automatically repair the connection. If it does not, then there is an easy way to restore the connection to the NetVM by issuing: +Normally Qubes doesn't let the user stop a NetVM if there are other qubes running which use it as their own NetVM. +But in case the NetVM stops for whatever reason (e.g. it crashes, or the user forces its shutdown via qvm-kill via terminal in Dom0), Qubes R4.0 will often automatically repair the connection. +If it does not, then there is an easy way to restore the connection to the NetVM by issuing: ` qvm-prefs netvm ` -Normally qubes do not connect directly to the actual NetVM which has networking devices, but rather to the default sys-firewall first, and in most cases it would be the NetVM that will crash, e.g. in response to S3 sleep/restore or other issues with WiFi drivers. In that case it is only necessary to issue the above command once, for the sys-firewall (this assumes default VM-naming used by the default Qubes installation): +Normally qubes do not connect directly to the actual NetVM which has networking devices, but rather to the default sys-firewall first, and in most cases it would be the NetVM that will crash, e.g. in response to S3 sleep/restore or other issues with WiFi drivers. +In that case it is only necessary to issue the above command once, for the sys-firewall (this assumes default VM-naming used by the default Qubes installation): ` qvm-prefs sys-firewall netvm sys-net ` @@ -62,7 +72,8 @@ Normally qubes do not connect directly to the actual NetVM which has networking Network service qubes --------------------- -Qubes does not support running any networking services (e.g. VPN, local DNS server, IPS, ...) directly in a qube that is used to run the Qubes firewall service (usually sys-firewall) for good reasons. In particular, if one wants to ensure proper functioning of the Qubes firewall, one should not tinker with iptables or nftables rules in such qubes. +Qubes does not support running any networking services (e.g. VPN, local DNS server, IPS, ...) directly in a qube that is used to run the Qubes firewall service (usually sys-firewall) for good reasons. +In particular, if one wants to ensure proper functioning of the Qubes firewall, one should not tinker with iptables or nftables rules in such qubes. Instead, one should deploy a network infrastructure such as ~~~ @@ -80,12 +91,15 @@ For the VPN service please also look at the [VPN documentation](/doc/vpn). Enabling networking between two qubes ------------------------------------- -Normally any networking traffic between qubes is prohibited for security reasons. However, in special situations, one might want to selectively allow specific qubes to establish networking connectivity between each other. For example, this might be useful in some development work, when one wants to test networking code, or to allow file exchange between HVM domains (which do not have Qubes tools installed) via SMB/scp/NFS protocols. +Normally any networking traffic between qubes is prohibited for security reasons. +However, in special situations, one might want to selectively allow specific qubes to establish networking connectivity between each other. +For example, this might be useful in some development work, when one wants to test networking code, or to allow file exchange between HVM domains (which do not have Qubes tools installed) via SMB/scp/NFS protocols. In order to allow networking between qubes A and B follow these steps: * Make sure both A and B are connected to the same firewall vm (by default all VMs use the same firewall VM). -* Note the Qubes IP addresses assigned to both qubes. This can be done using the `qvm-ls -n` command, or via the Qubes Manager preferences pane for each qube. +* Note the Qubes IP addresses assigned to both qubes. + This can be done using the `qvm-ls -n` command, or via the Qubes Manager preferences pane for each qube. * Start both qubes, and also open a terminal in the firewall VM * In the firewall VM's terminal enter the following iptables rule: @@ -99,8 +113,12 @@ sudo iptables -I FORWARD 2 -s -d -j ACCEPT sudo iptables -I INPUT -s -j ACCEPT ~~~ -* Now you should be able to reach B from A -- test it using e.g. ping issued from A. Note however, that this doesn't allow you to reach A from B -- for this you would need two more rules, with A and B swapped. -* If everything works as expected, then the above iptables rules should be written into firewallVM's `qubes-firewall-user-script` script which is run on every firewall update, and A and B's `rc.local` script which is run when the qube is launched. The `qubes-firewall-user-script` is necessary because Qubes orders every firewallVM to update all the rules whenever a new connected qube is started. If we didn't enter our rules into this "hook" script, then shortly our custom rules would disappear and inter-VM networking would stop working. Here's an example how to update the script (note that, by default, there is no script file present, so we will probably be creating it, unless we had some other custom rules defined earlier in this firewallVM): +* Now you should be able to reach B from A -- test it using e.g. ping issued from A. + Note however, that this doesn't allow you to reach A from B -- for this you would need two more rules, with A and B swapped. +* If everything works as expected, then the above iptables rules should be written into firewallVM's `qubes-firewall-user-script` script which is run on every firewall update, and A and B's `rc.local` script which is run when the qube is launched. + The `qubes-firewall-user-script` is necessary because Qubes orders every firewallVM to update all the rules whenever a new connected qube is started. + If we didn't enter our rules into this "hook" script, then shortly our custom rules would disappear and inter-VM networking would stop working. + Here's an example how to update the script (note that, by default, there is no script file present, so we will probably be creating it, unless we had some other custom rules defined earlier in this firewallVM): ~~~ [user@sys-firewall ~]$ sudo bash @@ -334,7 +352,8 @@ sudo chmod +x /rw/config/qubes-firewall-user-script **3. Allow packets into the qube to reach the service** -Here no routing is required, only filtering. Proceed in the same way as above but store the filtering rule in the `/rw/config/rc.local` script. +Here no routing is required, only filtering. +Proceed in the same way as above but store the filtering rule in the `/rw/config/rc.local` script. ` sudo name /rw/config/rc.local ` @@ -365,5 +384,6 @@ This time testing should allow connectivity to the service as long as the servic Where to put firewall rules --------------------------- -Implicit in the above example [scripts](/doc/config-files/), but worth calling attention to: for all qubes *except* AppVMs supplying networking, iptables commands should be added to the `/rw/config/rc.local` script. For AppVMs supplying networking (`sys-firewall` inclusive), iptables commands should be added to `/rw/config/qubes-firewall-user-script`. +Implicit in the above example [scripts](/doc/config-files/), but worth calling attention to: for all qubes *except* AppVMs supplying networking, iptables commands should be added to the `/rw/config/rc.local` script. +For AppVMs supplying networking (`sys-firewall` inclusive), iptables commands should be added to `/rw/config/qubes-firewall-user-script`.