Use regular expressions (regex) in LuLu to ‘allow’ IP address subnets

LuLu by Objective-See is a macOS firewall for outbound connections. While the built-in Apple product will protect you from network attacks from the networks around you, LuLu will give the user control over the network connections a running software on the Mac may want to open itself, e.g. to the Internet. LuLu can act as a freeware replacement for the firewall part in LittleSnitch, the other well-known security tool for the Mac. If you want to know more about LuLu, follow the link above.

In the “user-guided” mode LuLu will give the choice to create rules for a specific process with:

  • either a single URL / IP and a sigle port (“Remote Endpoint”)
  • or all URL’s / IP’s and all ports (“Process”)

… with the choice of allowing or blocking traffic

If you are like me, you might want to tweak those rules. And that’s where the “regex” checkbox comes into play. You can use it, for example, to allow access to all the machines in your home network.

However, the LuLu user documentation currently does a bad job to describe the regex syntax that’s expected by LuLu. Is it 192.168.1.* as the asterisk in the “allow all” suggests? There are many variations of regular expressions, so an example would certainly be appreciated.

LuLu’s regex syntax

LuLu uses Objective-C’s NSExpression class. You can find that documentation here. The most important elements for creating LuLu rules are:

\“escape” special characters like
* ? + [ ( ) { } ^ $ | \ . /
in order to treat them as literals
.placeholder for any character – exactly _one_ character!192\.168\.1\....
characters, numbers, symbols are treated as themselveshuf\.org
[pattern]match any one character from the pattern[aeiou]
important regex expressions. See the Apple doc link above for more

In addition to the Expressions above there are modifiers, so you can tell LuLu to expect more than one “any character”. You place the modifier after the expression it applies to:

*Match 0 or more times. Match as many times as possible.
+Match 1 or more times. Match as many times as possible.
?Match 0 or 1 times. Prefers 1 times
*?Match 0 or more times. Match as few times as possible.
+?Match 0 or more times. Match as few times as possible.
{n}?Match exactly n times.
{n,}?Match at least n times, but no more than required for an overall pattern match.
{n,m}?Match between n and m times. Match as few times as possible, but not less than n.
Important regex modifiers. See the Apple doc link above for more

Some regexamples

ExpressionWhat it meansIt Matches…
192\.168\.1\..*any IP address starting with 192.168.1. regardless what’s in the last octet, or whatever comes after the last dot. Note that there is a \. escaping the last dot and then the .* matching vor any amount of any character after that dot.
192\.168\.1\.[0-9]{1,3}?This is the safer version of the one above, as it only matches numbers in the last octet.
192\.168\.123\.[0-9]{1,3}?any IP address starting with 192.168.123. regardless what’s in the last octet.
… more to come
some examples

So, if your home network is (e.g. using a netmask of, the example below will tell LuLu to allow the Brave Browser to access any machine in your home network (on any port):

What’s next?

I plan to amend this blog post in a while: I think LuLu’s documentation is lacking a good explanation of basic regex and I volunteered to create something on the public Lulu Git.

I will add more examples (like URL regex-es) as I go ahead with that docu.

Chrome on Mac: solving the “this browser is managed by your organization” message.

The other day i had this message in my chrome settings: “your browser is managed by your organization”. well, it was actually in german language, so it’s more like this one:

starting with chrome version 73 this warning comes up if one or more of chromes built-in policies differ from the default settings.

so you google the problem and you may find some solutions … for windows! (gasp) — or you come across the ‘solution’ to simply suppress the message without fixing the real problem…

most of us are not part of a browser-managing organization. therefore it would be nice to see which policy elements are set. you can see them with the browser-internal url:


this should bring up something like this:

here we go again… wasn’t it months ago when you were fed up with that chrome cloud printing dialog?

you wanted apples’ standard dialog window with chrome! you wanted back control!! you wanted reven… – whatever!

so you updated the policy above (DisablePrintPreview=true) and lived happily ever after since… until now: “your browser is being managed by someone else!” – you want to get rid of that message, for zarquon’s sake!

the thing is, when you set the policy element back to “false”, this still counts as a modified policy.

you can set the propery back with this command in a terminal window and restarting chrome:

defaults write DisablePrintPreview -bool false

…and guess what shows:


ok, so setting the property to “false” obviously leads nowhere. the trick is, to delete the property like this:

defaults delete DisablePrintPreview

et abracadabra: after a chrome restart your browser belongs to you again. no evil corp controlling whatever sleazy (or not) policies are set.

jokes aside: this method is a good way to see if this policy you deleted is actually the reason for the nefarious message. if the message persists after deleting the policy, there’s still another policy active.

assistant? migrate!

migrating a mac user account from one machine to another is no problem at all – usually.

tonight i tried this between a mac mini running snow leopard (10.6.8) and an imac running lion (10.7.x) via ethernet cable

the migration never ran due to the sl mini stating that it wasn’t able to find he lion imac.

migrating using firewire was out of the way: the imac supports 800mb fw only and i didn’t have a 400/800 data cable (yes – this always happens in the middle of the night when all the shops are closed…)

solution: despite the fact that the snow leo’s system software was up to par, the migration assistant needed an update.

you can find it here: