2015-12-30 11:07:16 -05:00
|
|
|
(* Copyright (C) 2015, Thomas Leonard <thomas.leonard@unikernel.com>
|
|
|
|
See the README file for details. *)
|
|
|
|
|
|
|
|
(** Put your firewall rules here. *)
|
|
|
|
|
|
|
|
open Packet
|
|
|
|
|
|
|
|
(* OCaml normally warns if you don't match all fields, but that's OK here. *)
|
|
|
|
[@@@ocaml.warning "-9"]
|
|
|
|
|
2016-01-01 06:32:57 -05:00
|
|
|
(** {2 Actions}
|
|
|
|
|
|
|
|
The possible actions are:
|
|
|
|
|
|
|
|
- [`Accept] : Send the packet to its destination.
|
|
|
|
|
|
|
|
- [`NAT] : Rewrite the packet's source field so packet appears to
|
|
|
|
have come from the firewall, via an unused port.
|
|
|
|
Also, add NAT rules so related packets will be translated accordingly.
|
|
|
|
|
|
|
|
- [`NAT_to (host, port)] :
|
|
|
|
As for [`NAT], but also rewrite the packet's destination fields so it
|
|
|
|
will be sent to [host:port].
|
|
|
|
|
|
|
|
- [`Drop reason] drop the packet and log the reason.
|
|
|
|
*)
|
|
|
|
|
2015-12-30 11:07:16 -05:00
|
|
|
(** Decide what to do with a packet from a client VM.
|
|
|
|
Note: If the packet matched an existing NAT rule then this isn't called. *)
|
|
|
|
let from_client = function
|
2016-01-01 06:32:57 -05:00
|
|
|
| { dst = (`External _ | `NetVM) } -> `NAT
|
|
|
|
| { dst = `Client_gateway; proto = `UDP { dport = 53 } } -> `NAT_to (`NetVM, 53)
|
2015-12-30 11:07:16 -05:00
|
|
|
| { dst = (`Client_gateway | `Firewall_uplink) } -> `Drop "packet addressed to firewall itself"
|
|
|
|
| { dst = `Client _ } -> `Drop "prevent communication between client VMs"
|
2015-12-31 04:56:58 -05:00
|
|
|
| { dst = `Unknown_client _ } -> `Drop "target client not running"
|
2015-12-30 11:07:16 -05:00
|
|
|
|
|
|
|
(** Decide what to do with a packet received from the outside world.
|
|
|
|
Note: If the packet matched an existing NAT rule then this isn't called. *)
|
|
|
|
let from_netvm = function
|
|
|
|
| _ -> `Drop "drop by default"
|