summaryrefslogtreecommitdiffstats
path: root/content/posts/home-server-part-4
diff options
context:
space:
mode:
authorJan Tuomi <jan@jantuomi.fi>2026-01-05 21:15:44 +0200
committerJan Tuomi <jan@jantuomi.fi>2026-01-05 21:39:06 +0200
commit09e410b21358e1475261499ccf6a75fac2da12d4 (patch)
tree26bde85dbe6be7502d1eca29263e404e92633f94 /content/posts/home-server-part-4
parentb2b9388f789c58a5b6ee1cbf9edfe88013d3fc63 (diff)
Refactor and colocate assets
Diffstat (limited to 'content/posts/home-server-part-4')
-rw-r--r--content/posts/home-server-part-4/index.md124
-rw-r--r--content/posts/home-server-part-4/pursotin_network.svg1
2 files changed, 125 insertions, 0 deletions
diff --git a/content/posts/home-server-part-4/index.md b/content/posts/home-server-part-4/index.md
new file mode 100644
index 0000000..bb44702
--- /dev/null
+++ b/content/posts/home-server-part-4/index.md
@@ -0,0 +1,124 @@
+---
+title: "A home server journey, part 4: Networking"
+date: 2025-12-24
+description: |
+ This is the fourth episode in a series where I set up a FreeBSD home server, explaining all the steps, problems and solutions along the way. This time we're looking at networking.
+extra:
+ kind: note
+---
+
+This is the fourth episode in a series where I set up a FreeBSD home server, explaining all the steps, problems and solutions along the way. This time we're looking at networking.
+
+Check out episodes [1](/posts/home-server-part-1), [2](/posts/home-server-part-2), [3](/posts/home-server-part-3).
+
+{{ toc() }}
+
+## Dual interfaces
+
+I already have a private network (`192.168.0.0/16`) that uses my pfSense router as its gateway. The FreeBSD server will connect to this network through ethernet interface number one (`lan0`). Packets to and from local devices go through this interface.
+
+The host will also be connected directly to the ISP's network using its second interface (`wan0`). This interface will get its IP using DHCP. Packets to the internet, as well as packets to public services running on the FreeBSD host go through this interface.
+
+{{ fig(src="pursotin_network.svg", alt="A simplified diagram showing the two interfaces") }}
+
+A dual interface set up like this is simple in theory, but there are important nuances, e.g. regarding return traffic routing and DNS.
+
+## Routing
+
+If we send a packet out through `eth0`, we should expect return traffic to arrive on `eth0` (and vice versa). However, it is rather easy to misconfigure the system.
+
+Assume we have a public service, such as an `nginx` web server, which listens on the public interface. If we set up `rc.conf` naively like this:
+
+```sh
+defaultrouter=192.168.0.1
+```
+
+...the request might arrive through the public interface, but the response from the web server leaves through the private interface since we have configured the private gateway as the default. This is called _asymmetric routing_.
+
+This might work! Both routes lead to the internet. From the perspective of the ISP, it doesn't really matter whether the packet went through the home router or not, in this case.
+
+Sometimes however, this setup leads to the most vexing of networking issues. Figuring out what's wrong taught me a bunch about DHCP and layer 3 routing.
+
+### Routing issue \#1: ISP DHCP server and MAC addresses
+
+A DHCP server can keep track of clients using their MAC address. Separate physical interfaces have separate MAC addresses, so there is an obvious problem here. If an initial DHCP request broadcast leaves through one interface, and following DHCP requests (non-broadcast) leave through another interface, the DHCP server might see this as a forged packet.
+
+This happened to me because of the `defaultrouter` setting:
+
+1. The initial broadcast leaves through the `wan0` interface correctly. An IP is received.
+2. When the lease is about to expire, a targeted request is sent to the now known DHCP server address. This is routed through `lan0` and `192.168.0.1`, since it's the `defaultrouter`.
+3. The DHCP server sees the FreeBSD WAN MAC on first contact, and the home router MAC address on second contact. The lease is not renewed.
+4. The lease expires, repeat from step 1.
+
+My solution? Just don't use `defaultrouter`. As part of the routine DHCP song and dance, `dhclient` adds a valid default route to the system routing table. Just use that for all internet-bound traffic. You can see the routes with `netstat -rn`:
+
+```sh
+# netstat -rn
+Routing tables
+
+Internet:
+Destination Gateway Flags Netif Expire
+default 87.92.64.1 UGS wan0
+87.92.64.0/18 link#36 U wan0
+192.168.0.0/16 link#25 U lan0
+127.0.0.1 link#57 UH lo0
+...
+```
+
+The `default` route was added by DHCP.
+
+### Routing issue \#2: DNS-level ad blocker in my router
+
+I run [pfBlockerNG](https://docs.netgate.com/pfsense/en/latest/packages/pfblocker.html) on my router to block ads on a DNS level (think Pi-hole). If I route traffic through the router, the return traffic is processed by this extra firewall. Some packets got dropped by pfBlockerNG and never arrived at the destination.
+
+This was very annoying to debug! At least I had logging on, so I could confirm what's happening pretty quickly.
+
+## DNS
+
+Nameservers are defined on a whole system basis in `/etc/resolv.conf`, and not per interface or per IP. I have a basic DNS resolver running on my home server, so I simply configured my `resolv.conf` as:
+
+```sh
+nameserver 192.168.0.1
+```
+
+### Split horizon
+
+Which IP should be returned from the DNS server if I query `some-public-service.jan.systems`? The private address from `192.168.0.0/16`, or a public IP reachable from the internet?
+
+This is called **split horizon** DNS. One approach is to configure the DNS server to respond differently based on the address of the querying host. A private network host gets the private IP, etc.
+
+I decided to not worry about this, and just use a separate domain, `local.jan.systems` for local addresses. This is a bit inconvenient, but I don't mind. The fewer DNS problems the better.
+
+### DHCP and `resolv.conf`
+
+By default, `dhclient` has a hook that overwrites `resolv.conf` with the DHCP-provided nameserver information. I want to always use my router as the DNS server, so I had to disable this functionality.
+
+On FreeBSD, there are two simple solutions:
+
+1. `resolvconf.conf`: a meta-config that configures the `resolvconf` tool, which is used internally by `dhclient`
+
+To disable `resolvconf` altogether, add this to `/etc/resolvconf.conf`:
+
+```sh
+resolvconf=NO
+```
+
+Now, `resolvconf`, and transitively `dhclient`, won't overwrite your changes anymore.
+
+2. making `/etc/resolv.conf` immutable with a flag
+
+As root, you can set the file as immutable with `chflags`. Then, nothing can edit the file before the flag is removed.
+
+```sh
+chflags schg /etc/resolv.conf
+```
+
+Note that if you have a non-default [`securelevel`](https://man.freebsd.org/cgi/man.cgi?securelevel), you might not be able to remove this flag.
+
+## Dual stack?
+
+For now, I'm building everything on IPv4. My ISP has no support for SLAAC which makes IPv6 somewhat non-trivial. I will most likely add IPv6 at some point, but it's not a priority.
+
+## To be continued
+
+In the next part(s) we will be looking at provisioning with Ansible.
diff --git a/content/posts/home-server-part-4/pursotin_network.svg b/content/posts/home-server-part-4/pursotin_network.svg
new file mode 100644
index 0000000..79d1dea
--- /dev/null
+++ b/content/posts/home-server-part-4/pursotin_network.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:lucid="lucid" width="975" height="327"><g transform="translate(-872 -724)" lucid:page-tab-id="jJFWJm6nolyj"><path d="M500 0h1500v1500H500z" fill="#fff"/><path d="M900 786a6 6 0 0 1 6-6h88a6 6 0 0 1 6 6v208a6 6 0 0 1-6 6h-88a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#fff"/><use xlink:href="#a" transform="matrix(1,0,0,1,905,785) translate(-0.5864197530864175 96.11111111111111)"/><use xlink:href="#b" transform="matrix(1,0,0,1,905,785) translate(24.012345679012345 122.7777777777778)"/><path d="M1000 786a6 6 0 0 1 6-6h58a6 6 0 0 1 6 6v48a6 6 0 0 1-6 6h-58a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#f2f3f5"/><use xlink:href="#c" transform="matrix(1,0,0,1,1005,785) translate(9.043209876543212 30.27777777777778)"/><path d="M1000 946a6 6 0 0 1 6-6h58a6 6 0 0 1 6 6v48a6 6 0 0 1-6 6h-58a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#f2f3f5"/><use xlink:href="#d" transform="matrix(1,0,0,1,1005,945) translate(3.487654320987655 30.27777777777778)"/><path d="M1330 784.67a6 6 0 0 1 6-6h98a6 6 0 0 1 6 6v50.66a6 6 0 0 1-6 6h-98a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#fff"/><use xlink:href="#e" transform="matrix(1,0,0,1,1335,783.6666666666667) translate(16.728395061728392 31.02777777777778)"/><path d="M1540 784.67a6 6 0 0 1 6-6h68a6 6 0 0 1 6 6v208a6 6 0 0 1-6 6h-68a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#f2f3f5"/><use xlink:href="#f" transform="matrix(1,0,0,1,1545,783.6666666666667) translate(17.598765432098766 109.65277777777777)"/><path d="M1780 848.67c22.1 0 40 17.9 40 40s-17.9 40-40 40h-80c-22.1 0-40-17.9-40-40s17.9-40 40-40z" stroke="#282c33" stroke-width="2" fill="#fff"/><use xlink:href="#g" transform="matrix(1,0,0,1,1665,853.6666666666667) translate(38.0246913580247 39.65277777777778)"/><path d="M1621.5 888.67h37" stroke="#3a414a" fill="none"/><path d="M1621.5 889.14h-.5v-.95h.5zM1659 888.65l.02.5h-.53v-.96h.53z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M1441.5 810h97" stroke="#3a414a" fill="none"/><path d="M1441.5 810.48h-.5v-.96h.5zM1539 810.48h-.5v-.96h.5z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M1145 784.67a6 6 0 0 1 6-6h98a6 6 0 0 1 6 6v50.66a6 6 0 0 1-6 6h-98a6 6 0 0 1-6-6z" stroke="#282c33" stroke-width="2" fill="#fff"/><use xlink:href="#h" transform="matrix(1,0,0,1,1150,783.6666666666667) translate(28.425925925925927 21.09027777777778)"/><use xlink:href="#i" transform="matrix(1,0,0,1,1150,783.6666666666667) translate(19.197530864197528 47.75694444444444)"/><path d="M1256.5 810h72" stroke="#3a414a" fill="none"/><path d="M1256.5 810.48h-.5v-.96h.5zM1329 810.48h-.5v-.96h.5z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M1143.5 810h-72" stroke="#3a414a" fill="none"/><path d="M1144 810.48h-.5v-.96h.5zM1071.5 810.48h-.5v-.96h.5z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M1071.5 970h467" stroke="#3a414a" fill="none"/><path d="M1071.5 970.48h-.5v-.96h.5zM1539 970.48h-.5v-.96h.5z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M1200 842.83v16.67" stroke="#3a414a" fill="none"/><path d="M1200.47 842.85h-.94v-.52h.94zM1200.47 860h-.94v-.5h.94z" stroke="#3a414a" stroke-width=".05" fill="#3a414a"/><path d="M1135.74 866a6 6 0 0 1 6-6h116.52a6 6 0 0 1 6 6v40.68a6 6 0 0 1-6 6h-116.52a6 6 0 0 1-6-6z" fill="none"/><use xlink:href="#j" transform="matrix(1,0,0,1,1140.7357407407408,865) translate(0 14.388888888888888)"/><use xlink:href="#k" transform="matrix(1,0,0,1,1140.7357407407408,865) translate(45.38271604938272 14.388888888888888)"/><use xlink:href="#l" transform="matrix(1,0,0,1,1140.7357407407408,865) translate(92.79012345679013 14.388888888888888)"/><use xlink:href="#m" transform="matrix(1,0,0,1,1140.7357407407408,865) translate(0 35.72222222222222)"/><path d="M1072.2 986a6 6 0 0 1 6-6h48.24a6 6 0 0 1 6 6v19.34a6 6 0 0 1-6 6h-48.23a6 6 0 0 1-6-6z" fill="none"/><use xlink:href="#n" transform="matrix(1,0,0,1,1077.2122222222222,985) translate(0 14.555555555555555)"/><path d="M1000.5 754.66a6 6 0 0 1 6-6h101.72a6 6 0 0 1 6 6V774a6 6 0 0 1-6 6h-101.7a6 6 0 0 1-6-6z" fill="none"/><use xlink:href="#o" transform="matrix(1,0,0,1,1005.5096913580246,753.6566666666666) translate(0 14.555555555555555)"/><path d="M1440 823.32a6 6 0 0 1 6-6h48.23a6 6 0 0 1 6 6v19.35a6 6 0 0 1-6 6H1446a6 6 0 0 1-6-6z" fill="none"/><g><use xlink:href="#n" transform="matrix(1,0,0,1,1445,822.3233333333334) translate(0 14.555555555555555)"/></g><path d="M1266.16 754.66a6 6 0 0 1 6-6H1364a6 6 0 0 1 6 6V774a6 6 0 0 1-6 6h-91.84a6 6 0 0 1-6-6z" fill="none"/><g><use xlink:href="#p" transform="matrix(1,0,0,1,1271.1628395061728,753.6566666666666) translate(0 14.555555555555555)"/></g><defs><path fill="#3a414a" d="M63-220v92h138v28H63V0H30v-248h175v28H63" id="q"/><path fill="#3a414a" d="M114-163C36-179 61-72 57 0H25l-1-190h30c1 12-1 29 2 39 6-27 23-49 58-41v29" id="r"/><path fill="#3a414a" d="M100-194c63 0 86 42 84 106H49c0 40 14 67 53 68 26 1 43-12 49-29l28 8c-11 28-37 45-77 45C44 4 14-33 15-96c1-61 26-98 85-98zm52 81c6-60-76-77-97-28-3 7-6 17-6 28h103" id="s"/><path fill="#3a414a" d="M160-131c35 5 61 23 61 61C221 17 115-2 30 0v-248c76 3 177-17 177 60 0 33-19 50-47 57zm-97-11c50-1 110 9 110-42 0-47-63-36-110-37v79zm0 115c55-2 124 14 124-45 0-56-70-42-124-44v89" id="t"/><path fill="#3a414a" d="M185-189c-5-48-123-54-124 2 14 75 158 14 163 119 3 78-121 87-175 55-17-10-28-26-33-46l33-7c5 56 141 63 141-1 0-78-155-14-162-118-5-82 145-84 179-34 5 7 8 16 11 25" id="u"/><path fill="#3a414a" d="M30-248c118-7 216 8 213 122C240-48 200 0 122 0H30v-248zM63-27c89 8 146-16 146-99s-60-101-146-95v194" id="v"/><g id="a"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#q"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,13.518518518518517,0)" xlink:href="#r"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,20.864197530864196,0)" xlink:href="#s"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,33.20987654320987,0)" xlink:href="#s"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,45.55555555555555,0)" xlink:href="#t"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,60.37037037037037,0)" xlink:href="#u"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,75.18518518518518,0)" xlink:href="#v"/></g><path fill="#3a414a" d="M106-169C34-169 62-67 57 0H25v-261h32l-1 103c12-21 28-36 61-36 89 0 53 116 60 194h-32v-121c2-32-8-49-39-48" id="w"/><path fill="#3a414a" d="M100-194c62-1 85 37 85 99 1 63-27 99-86 99S16-35 15-95c0-66 28-99 85-99zM99-20c44 1 53-31 53-75 0-43-8-75-51-75s-53 32-53 75 10 74 51 75" id="x"/><path fill="#3a414a" d="M135-143c-3-34-86-38-87 0 15 53 115 12 119 90S17 21 10-45l28-5c4 36 97 45 98 0-10-56-113-15-118-90-4-57 82-63 122-42 12 7 21 19 24 35" id="y"/><path fill="#3a414a" d="M59-47c-2 24 18 29 38 22v24C64 9 27 4 27-40v-127H5v-23h24l9-43h21v43h35v23H59v120" id="z"/><g id="b"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#w"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,24.691358024691358,0)" xlink:href="#y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.80246913580247,0)" xlink:href="#z"/></g><path fill="#3a414a" d="M24 0v-261h32V0H24" id="A"/><path fill="#3a414a" d="M141-36C126-15 110 5 73 4 37 3 15-17 15-53c-1-64 63-63 125-63 3-35-9-54-41-54-24 1-41 7-42 31l-33-3c5-37 33-52 76-52 45 0 72 20 72 64v82c-1 20 7 32 28 27v20c-31 9-61-2-59-35zM48-53c0 20 12 33 32 33 41-3 63-29 60-74-43 2-92-5-92 41" id="B"/><path fill="#3a414a" d="M117-194c89-4 53 116 60 194h-32v-121c0-31-8-49-39-48C34-167 62-67 57 0H25l-1-190h30c1 10-1 24 2 32 11-22 29-35 61-36" id="C"/><path fill="#3a414a" d="M101-251c68 0 85 55 85 127S166 4 100 4C33 4 14-52 14-124c0-73 17-127 87-127zm-1 229c47 0 54-49 54-102s-4-102-53-102c-51 0-55 48-55 102 0 53 5 102 54 102" id="D"/><g id="c"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#A"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,4.876543209876543,0)" xlink:href="#B"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,17.22222222222222,0)" xlink:href="#C"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,29.5679012345679,0)" xlink:href="#D"/></g><path fill="#3a414a" d="M206 0h-36l-40-164L89 0H53L-1-190h32L70-26l43-164h34l41 164 42-164h31" id="E"/><g id="d"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#B"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#C"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#D"/></g><path fill="#3a414a" d="M233-177c-1 41-23 64-60 70L243 0h-38l-65-103H63V0H30v-248c88 3 205-21 203 71zM63-129c60-2 137 13 137-47 0-61-80-42-137-45v92" id="F"/><path fill="#3a414a" d="M84 4C-5 8 30-112 23-190h32v120c0 31 7 50 39 49 72-2 45-101 50-169h31l1 190h-30c-1-10 1-25-2-33-11 22-28 36-60 37" id="G"/><g id="e"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#F"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,15.987654320987653,0)" xlink:href="#x"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,28.333333333333332,0)" xlink:href="#G"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,40.67901234567901,0)" xlink:href="#z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,46.851851851851855,0)" xlink:href="#s"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,59.19753086419753,0)" xlink:href="#r"/></g><path fill="#3a414a" d="M33 0v-248h34V0H33" id="H"/><path fill="#3a414a" d="M30-248c87 1 191-15 191 75 0 78-77 80-158 76V0H30v-248zm33 125c57 0 124 11 124-50 0-59-68-47-124-48v98" id="I"/><g id="f"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#H"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,6.172839506172839,0)" xlink:href="#u"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,20.98765432098765,0)" xlink:href="#I"/></g><path fill="#3a414a" d="M24-231v-30h32v30H24zM24 0v-190h32V0H24" id="J"/><g id="g"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#J"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,4.876543209876543,0)" xlink:href="#C"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,17.22222222222222,0)" xlink:href="#z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,23.39506172839506,0)" xlink:href="#s"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,35.74074074074074,0)" xlink:href="#r"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,43.08641975308642,0)" xlink:href="#C"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,55.432098765432094,0)" xlink:href="#s"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,67.77777777777777,0)" xlink:href="#z"/></g><path fill="#3a414a" d="M30 0v-248h33v221h125V0H30" id="K"/><path fill="#3a414a" d="M205 0l-28-72H64L36 0H1l101-248h38L239 0h-34zm-38-99l-47-123c-12 45-31 82-46 123h93" id="L"/><path fill="#3a414a" d="M190 0L58-211 59 0H30v-248h39L202-35l-2-213h31V0h-41" id="M"/><g id="h"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#K"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,12.345679012345679,0)" xlink:href="#L"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.160493827160494,0)" xlink:href="#M"/></g><path fill="#3a414a" d="M96-169c-40 0-48 33-48 73s9 75 48 75c24 0 41-14 43-38l32 2c-6 37-31 61-74 61-59 0-76-41-82-99-10-93 101-131 147-64 4 7 5 14 7 22l-32 3c-4-21-16-35-41-35" id="N"/><g id="i"><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,0,0)" xlink:href="#y"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,11.11111111111111,0)" xlink:href="#E"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,27.098765432098766,0)" xlink:href="#J"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,31.975308641975307,0)" xlink:href="#z"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,38.14814814814815,0)" xlink:href="#N"/><use transform="matrix(0.06172839506172839,0,0,0.06172839506172839,49.25925925925927,0)" xlink:href="#w"/></g><path fill="#635dff" d="M100-194c62-1 85 37 85 99 1 63-27 99-86 99S16-35 15-95c0-66 28-99 85-99zM99-20c44 1 53-31 53-75 0-43-8-75-51-75s-53 32-53 75 10 74 51 75" id="O"/><path fill="#635dff" d="M59-47c-2 24 18 29 38 22v24C64 9 27 4 27-40v-127H5v-23h24l9-43h21v43h35v23H59v120" id="P"/><path fill="#635dff" d="M106-169C34-169 62-67 57 0H25v-261h32l-1 103c12-21 28-36 61-36 89 0 53 116 60 194h-32v-121c2-32-8-49-39-48" id="Q"/><path fill="#635dff" d="M100-194c63 0 86 42 84 106H49c0 40 14 67 53 68 26 1 43-12 49-29l28 8c-11 28-37 45-77 45C44 4 14-33 15-96c1-61 26-98 85-98zm52 81c6-60-76-77-97-28-3 7-6 17-6 28h103" id="R"/><path fill="#635dff" d="M114-163C36-179 61-72 57 0H25l-1-190h30c1 12-1 29 2 39 6-27 23-49 58-41v29" id="S"/><g id="j"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#O"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,9.876543209876544,0)" xlink:href="#P"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,14.814814814814817,0)" xlink:href="#Q"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,24.69135802469136,0)" xlink:href="#R"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,34.567901234567906,0)" xlink:href="#S"/></g><path fill="#635dff" d="M135-143c-3-34-86-38-87 0 15 53 115 12 119 90S17 21 10-45l28-5c4 36 97 45 98 0-10-56-113-15-118-90-4-57 82-63 122-42 12 7 21 19 24 35" id="T"/><g id="k"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#Q"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,9.876543209876544,0)" xlink:href="#O"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,19.75308641975309,0)" xlink:href="#T"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,28.641975308641978,0)" xlink:href="#P"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,33.580246913580254,0)" xlink:href="#T"/></g><path fill="#635dff" d="M24-231v-30h32v30H24zM24 0v-190h32V0H24" id="U"/><path fill="#635dff" d="M117-194c89-4 53 116 60 194h-32v-121c0-31-8-49-39-48C34-167 62-67 57 0H25l-1-190h30c1 10-1 24 2 32 11-22 29-35 61-36" id="V"/><g id="l"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#U"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,3.901234567901235,0)" xlink:href="#V"/></g><path fill="#635dff" d="M27 0v-27h64v-190l-56 39v-29l58-41h29v221h61V0H27" id="W"/><path fill="#635dff" d="M99-251c64 0 84 50 84 122C183-37 130 33 47-8c-14-7-20-23-25-40l30-5c6 39 69 39 84 7 9-19 16-44 16-74-10 22-31 35-62 35-49 0-73-33-73-83 0-54 28-83 82-83zm-1 141c31-1 51-18 51-49 0-36-14-67-51-67-34 0-49 23-49 58 0 34 15 58 49 58" id="X"/><path fill="#635dff" d="M101-251c82-7 93 87 43 132L82-64C71-53 59-42 53-27h129V0H18c2-99 128-94 128-182 0-28-16-43-45-43s-46 15-49 41l-32-3c6-41 34-60 81-64" id="Y"/><path fill="#635dff" d="M33 0v-38h34V0H33" id="Z"/><path fill="#635dff" d="M110-160c48 1 74 30 74 79 0 53-28 85-80 85-65 0-83-55-86-122-5-90 50-162 133-122 14 7 22 21 27 39l-31 6c-5-40-67-38-82-6-9 19-15 44-15 74 11-20 30-34 60-33zm-7 138c34 0 49-23 49-58s-16-56-50-56c-29 0-50 16-49 49 1 36 15 65 50 65" id="aa"/><path fill="#635dff" d="M134-131c28 9 52 24 51 62-1 50-34 73-85 73S17-19 16-69c0-36 21-54 49-61-75-25-45-126 34-121 46 3 78 18 79 63 0 33-17 51-44 57zm-34-11c31 1 46-15 46-44 0-28-17-43-47-42-29 0-46 13-45 42 1 28 16 44 46 44zm1 122c35 0 51-18 51-52 0-30-18-46-53-46-33 0-51 17-51 47 0 34 19 51 53 51" id="ab"/><path fill="#635dff" d="M101-251c68 0 85 55 85 127S166 4 100 4C33 4 14-52 14-124c0-73 17-127 87-127zm-1 229c47 0 54-49 54-102s-4-102-53-102c-51 0-55 48-55 102 0 53 5 102 54 102" id="ac"/><path fill="#635dff" d="M0 4l72-265h28L28 4H0" id="ad"/><g id="m"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#W"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,9.876543209876544,0)" xlink:href="#X"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,19.75308641975309,0)" xlink:href="#Y"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,29.629629629629633,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,34.567901234567906,0)" xlink:href="#W"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,44.44444444444445,0)" xlink:href="#aa"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,54.320987654320994,0)" xlink:href="#ab"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,64.19753086419755,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,69.13580246913583,0)" xlink:href="#ac"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,79.01234567901237,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,83.95061728395063,0)" xlink:href="#ac"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,93.82716049382718,0)" xlink:href="#ad"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,98.76543209876544,0)" xlink:href="#W"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,108.64197530864199,0)" xlink:href="#aa"/></g><path fill="#e81313" d="M30-248c118-7 216 8 213 122C240-48 200 0 122 0H30v-248zM63-27c89 8 146-16 146-99s-60-101-146-95v194" id="ae"/><path fill="#e81313" d="M197 0v-115H63V0H30v-248h33v105h134v-105h34V0h-34" id="af"/><path fill="#e81313" d="M212-179c-10-28-35-45-73-45-59 0-87 40-87 99 0 60 29 101 89 101 43 0 62-24 78-52l27 14C228-24 195 4 139 4 59 4 22-46 18-125c-6-104 99-153 187-111 19 9 31 26 39 46" id="ag"/><path fill="#e81313" d="M30-248c87 1 191-15 191 75 0 78-77 80-158 76V0H30v-248zm33 125c57 0 124 11 124-50 0-59-68-47-124-48v98" id="ah"/><g id="n"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#ae"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,12.790123456790125,0)" xlink:href="#af"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,25.58024691358025,0)" xlink:href="#ag"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,38.370370370370374,0)" xlink:href="#ah"/></g><g id="o"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#W"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,9.876543209876544,0)" xlink:href="#X"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,19.75308641975309,0)" xlink:href="#Y"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,29.629629629629633,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,34.567901234567906,0)" xlink:href="#W"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,44.44444444444445,0)" xlink:href="#aa"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,54.320987654320994,0)" xlink:href="#ab"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,64.19753086419755,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,69.13580246913583,0)" xlink:href="#ac"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,79.01234567901237,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,83.95061728395063,0)" xlink:href="#W"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,93.82716049382718,0)" xlink:href="#ac"/></g><g id="p"><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,0,0)" xlink:href="#W"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,9.876543209876544,0)" xlink:href="#X"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,19.75308641975309,0)" xlink:href="#Y"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,29.629629629629633,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,34.567901234567906,0)" xlink:href="#W"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,44.44444444444445,0)" xlink:href="#aa"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,54.320987654320994,0)" xlink:href="#ab"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,64.19753086419755,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,69.13580246913583,0)" xlink:href="#ac"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,79.01234567901237,0)" xlink:href="#Z"/><use transform="matrix(0.04938271604938272,0,0,0.04938271604938272,83.95061728395063,0)" xlink:href="#W"/></g></defs></g></svg> \ No newline at end of file