diff options
Diffstat (limited to '')
-rw-r--r-- | content/blog/miscellaneous/wireguard-routing-2.md | 176 | ||||
-rw-r--r-- | content/blog/miscellaneous/wireguard-routing.md | 2 | ||||
-rw-r--r-- | static/static/wireguard-routing-2.drawio.svg | 4 |
3 files changed, 181 insertions, 1 deletions
diff --git a/content/blog/miscellaneous/wireguard-routing-2.md b/content/blog/miscellaneous/wireguard-routing-2.md new file mode 100644 index 0000000..e5af9b5 --- /dev/null +++ b/content/blog/miscellaneous/wireguard-routing-2.md @@ -0,0 +1,176 @@ +--- +title: Wireguard routing part two +description: An advanced example +date: 2023-02-23 +tage: +- vpn +- wireguard +--- + +## Introduction + +Now that we learned how routing depends on the allowed IPs in the configuration of an host is what populate its routing table and the consequences of it, let's look at a more complex setup with two hosts on a home network and three servers somewhere in the cloud. The servers will all be connected together in a full mesh, but only one of the cloud server will behave like a hub and centralise the home clients' connections. + +## Schematic + +![Advanced setup](/static/wireguard-routing-2.drawio.svg) + +## Home network + +Adolin and Baon are how two clients on a home network. They only connect to Elend but will need to be able to reach Cody and Dalinar. + +Adolin's configuration: +```cfg +[Interface] +PrivateKey = <adolin-private-key> +ListenPort = 342 +Address = 10.1.2.10/32 + +[Peer] +PublicKey = <elend-public-key> +Endpoint = 168.119.114.183:342 +AllowedIPs = 10.1.2.0/24 +PersistentKeepalive = 60 +``` + +Baon's configuration: +```cfg +[Interface] +PrivateKey = <baon-private-key> +ListenPort = 343 +Address = 10.1.2.20/32 + +[Peer] +PublicKey = <elend-public-key> +Endpoint = 168.119.114.183:342 +AllowedIPs = 10.1.2.0/24 +PersistentKeepalive = 60 +``` + +The first important thing to note is that I did not use the same ListenPort for my two hosts. This is because cheap routing firewall at home often do not nat outgoing udp traffic well with long live sessions and I had issues in the past because of this. You can use the same port for both your hosts, but being cautious with udp outgoing traffic is a habbit on I took on years ago. + +Also I am using an AllowedIPs with a `/24` netmask in order to be able to reach every host in the network. If I wanted for the clients to only be able to reach the servers, I could have either listed all `/32` IPs or used another netmask like `10.1.2.0/29` (`sipcalc` is your friend). Another option would be to use different addressing schemes entirely. + +Finally you might have noticed the `Persistentkeepalive`, this is to maintain connectivity with Elend even in the absence of traffic. It is a good thing for hosts behind NAT or road warriors. + +## Cloud servers + +Cody and Dalinar are two cloud servers in a full mesh with Elend. + +Cody's configuration: +```cfg +[Interface] +PrivateKey = <cody-private-key> +ListenPort = 342 +Address = 10.1.2.2/32 + +[Peer] +PublicKey = <elend-public-key> +Endpoint = 168.119.114.183:342 +AllowedIPs = 10.1.2.0/24 + +[Peer] +PublicKey = <dalinar-public-key> +Endpoint = 141.148.230.102:342 +AllowedIPs = 10.1.2.3/32 +``` + +Dalinar's configuration: +```cfg +[Interface] +PrivateKey = <dalinar-private-key> +ListenPort = 342 +Address = 10.1.2.3/32 + +[Peer] +PublicKey = <elend-public-key> +Endpoint = 168.119.114.183:342 +AllowedIPs = 10.1.2.0/24 + +[Peer] +PublicKey = <cody-public-key> +Endpoint = 51.77.159.16:342 +AllowedIPs = 10.1.2.2/32 +``` + +Here the netmasks can get confusing but it is crucial to get it right. Since we want to be both reachable and able to reach all hosts we need to either give elend a big AllowedIPs netmask or list them all. But since we want to be able to reach the other server, we need to give it its `/32` to have a most specific route in the routing table. + +If we wanted to restrict which host can talk to another, listing the wireguard IPs would work perfectly. + +Also between servers with fixed endpoints we do not need keepalives. + +## Hub's configuration + +Here is Elend's configuration: +```cfg +[Interface] +PrivateKey = <elend-private-key> +ListenPort = 342 +Address = 10.1.2.1/32 + +[Peer] +PublicKey = <adolin-public-key> +AllowedIPs = 10.1.2.10/32 + +[Peer] +PublicKey = <baon-public-key> +AllowedIPs = 10.1.2.20/32 + +[Peer] +PublicKey = <cody-public-key> +Endpoint = 51.77.159.16:342 +AllowedIPs = 10.1.2.2/32 + +[Peer] +PublicKey = <dalinar-public-key> +Endpoint = 141.148.230.102:342 +AllowedIPs = 10.1.2.3/32 +``` + +You might have feared this would be the most complicated configuration but it is the simplest: every peer has a `/32` netmask. The only thing to note is that we do not specify an endpoint for Adolin and Baon since they are behind a home network's NAT. + +The only additional thing we need is to enable routing on Elend so that it can forward traffic (firewalling is the subject of the next article). This can be done by setting the right sysctl value depending on your operating system: +- FreeBSD: set `gateway_enable="YES"` in your `/etc/rc.conf` +- Linux: set `net.ipv4.ip_forward=1` in your `/etc/sysctl.conf` +- OpenBSD: set `net.inet.ip.forwarding=1` in your `/etc/sysctl.conf` + +## Routing tables + +With this setup if Adolin was running Linux, its routing table would look like this with `ip -4 r`: +``` +default via 192.168.1.1 dev eth0 proto static metric 600 +10.1.2.0/24 dev wg0 scope link +192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10 metric 600 +``` + +Baon's would look very similar: +``` +default via 192.168.1.1 dev eth0 proto static metric 600 +10.1.2.0/24 dev wg0 scope link +192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.20 metric 600 +``` + +Cody's would be a little more complex with overlapping routes: +``` +default via XXX +10.1.2.0/24 dev wg0 scope link +10.1.2.3 dev wg0 scope link +``` + +Dalinar's would look very similar: +``` +default via YYY +10.1.2.0/24 dev wg0 scope link +10.1.2.2 dev wg0 scope link +``` + +Elend's would be longer but simple: +``` +default via ZZZ +10.1.2.2 dev wg0 scope link +10.1.2.3 dev wg0 scope link +10.1.2.10 dev wg0 scope link +10.1.2.20 dev wg0 scope link +``` + +With this setup, every host can contact every other one using wireguard.
\ No newline at end of file diff --git a/content/blog/miscellaneous/wireguard-routing.md b/content/blog/miscellaneous/wireguard-routing.md index 46343b7..446555d 100644 --- a/content/blog/miscellaneous/wireguard-routing.md +++ b/content/blog/miscellaneous/wireguard-routing.md @@ -79,7 +79,7 @@ A key takeaway is this: Even though with other vpn solutions (or traditional net ## Routing tables -With this setup if Dalinar was a Linux, its routing table would looks like this with `ip -4 r`: +With this setup if Dalinar was a Linux, its routing table would look like this with `ip -4 r`: ``` 10.1.2.2 dev wg0 scope link 192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.10 metric 600 diff --git a/static/static/wireguard-routing-2.drawio.svg b/static/static/wireguard-routing-2.drawio.svg new file mode 100644 index 0000000..10cb04c --- /dev/null +++ b/static/static/wireguard-routing-2.drawio.svg @@ -0,0 +1,4 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- Do not edit this file with editors other than diagrams.net --> +<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> +<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" width="482px" height="301px" viewBox="-0.5 -0.5 482 301" content="<mxfile host="app.diagrams.net" modified="2023-02-23T21:43:11.763Z" agent="5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36" etag="oqMs_UuxJ0a__Yesgnns" version="20.8.23"><diagram id="-8aDvL2Yv33GjBWb1LGq" name="Page-1">7VzbbqM6FP2aPB6EMdfHNm2nGp2RKvXhzDzS4AQ0BEfEaZJ+/TFgE3xJQyiEVK2iGcUbYztea9+8rU7gdLn7kYer+BeOUDqxzGg3gXcTy/KAQ/8vBPtKYDuwEizyJKpE4CB4Tt4QE5pMukkitBY6EoxTkqxE4QxnGZoRQRbmOd6K3eY4FWddhQukCJ5nYapK/0siEldS3zEP8keULGI+MzDZk5dw9neR403G5ptYEPjFp3q8DPlYrP86DiO8bYjg/QROc4xJ9W25m6K02Fq+bdV7D0ee1uvOUUbavHAT4Z9Pb2/xjzjbPP76uX98W6z/AW41zGuYbhD/HeVqyZ7vEMqim2KjaSvDGRXexmSZ0hagX8sNQMUUJm2hXUJ+F98Nl/Kiav8p27x1t2t0vduzxpqEOZEmmeOMTHGK83IV0H4Ipg/3Zd8c/0W6J2n4gtLbGpZGFwYMnTUj+f43W3vZ+NNsHFZXtvaNtT6hPFkignImq7YJRQq7Dngw0Rpv8hl6BwTGGLoHC0TeAwvWtKHaiDBdTr6nL24PvOW0jRuU5bIcpSFJXsX1hkx9FvVw9QxPOKG/xDKZpgOPjcMU3bEDwxEHqX4pe69JRWko6EhD8TYfqNoKZSD6pfHDD6KS6eewXiE97ZYmmUJ9kd3bOCHoeRWWYG6pNRRV4RXlJKGG5SZNFhmVLZMoKgaqePmE1wlJcPFgRhlS8Kh+41+pQ/1myIaq35gnacp5zfRE0YeXoPioGnQbFJ+ausXkaPc+eVWu8RdcEUGbW8UGF4GlIaNtHuedAPO5mEIF09sQfyPaGVHXHhtRW0H0PqW+6BvStpDavmRmrbEhdRRIpzjafyPaGlHz2syuGj/e0d3Lwvwb1K6gjm95fQVUEFgGcH0DGHTOB8tW0KWj0oyt3MM4XBXCWYo30WmkpY29d70HGx4P5hlQ1VOcRyiXnjRRbUb+CrR9Qlhns9zS6vQSaiD0h4KQL6inxK5FglYjp+z0KUy1CRpLGc9J0arXLDHxtN7PPK8ltdPT6zKZXX1EwdkLJVa2zessd+S8Tk3sPkL6A6cESn30JKN3RYHCYYZp+Kd0pWgNSHrYkvT+mKTv8ThjdNqruW/pq0FA/9kG8KGiBdTVEZH6Ihk1zpSJeBiVV4gokdoLJgQvj/h9Ub/kE755MJujnmIq2SED1SF7GnLJlq8/f6xmswZf00VwIXjVBRTkevPSJPURJcnZiybQ1cW5w4Gi5qOGdUlQuivLkLi4GmW5LC7eQH7cF0JD3rqWmoQU8h4c91VXJdwxvTi0T7jetj7cDkb24WrO3RPlRc6fSIdGJ/0nKcU5o5LetUWuenZH0ksxsHtp0gcK6R1geJ4BHBq6ugM44hTNewyOeo1Y5YqaJji6aMTKPX4zq7CBAWzfoJPS4FU1UIPhcyVJhVwiGzupsDqdd0ThOi63C+iw4pdgLM0ZoGTvPfPWhlDd81quv23RsPgnDvOA4Lre91w9OgH3MzgBV4p8XLdj5APhEcNzwglQVoX7RrdV0WF9/oKPrUvub4v3m+iXagW9eiSuQA2N2i7UjPCsWlabOtNJVWoRUvVh4aQo2NZYOF0ZwxrMwnUKi49ZuN7smWnAg2A4m6Za5A8d3Y5WX/D1mnx+vOoHRhAIY7XN0861Vko+CC5gfaAacl0F289N0D7O889G6c7eV7mjIw80cAoGew0hezSw3tlnYSrrvKFo1yKIrPZxNH7KjrxrSdcxLV4Wqwtlw1hcR7oUbDuXsLhqvHeN9O9mdE+e9X02q+tIFxVcp2PFVsPqlnb3bFbLR2zwEqxWC8JfKYuxZEsydhYD1eLvV8ajPmYeDQ+17vuV8JBzm/HxUG8Rfyk85BxAc/R/WTzU+jswDWAMdGWl90P/Gr8+jJcEDgxUcFwNOIMd+kO1aMbAGeTqSr8VsyGRqXPwsZDhaqtRmwGA6fmiV5/I2PKFYo1Buywy6ikHQ2aIq5HXqzJKAjW6yqj5NzdmX83RyNgM6Gho8/B3B6qk8/C3HeD9/w==</diagram></mxfile>" style="background-color: rgb(24, 24, 24);"><defs/><g><path d="M 129.95 150 L 320 150" fill="none" stroke="#4f9cfe" stroke-miterlimit="10" pointer-events="stroke"/><rect x="0" y="10" width="120" height="40" fill="none" stroke="#b9b9b9" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 30px; margin-left: 1px;"><div data-drawio-colors="color: #B9B9B9; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(185, 185, 185); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Adolin</div></div></div></foreignObject><text x="60" y="34" fill="#B9B9B9" font-family="Helvetica" font-size="12px" text-anchor="middle">Adolin</text></switch></g><rect x="0" y="250" width="120" height="40" fill="none" stroke="#b9b9b9" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 270px; margin-left: 1px;"><div data-drawio-colors="color: #B9B9B9; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(185, 185, 185); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Baon</div></div></div></foreignObject><text x="60" y="274" fill="#B9B9B9" font-family="Helvetica" font-size="12px" text-anchor="middle">Baon</text></switch></g><rect x="320" y="130" width="120" height="40" fill="none" stroke="#b9b9b9" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 150px; margin-left: 321px;"><div data-drawio-colors="color: #B9B9B9; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(185, 185, 185); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Elend</div></div></div></foreignObject><text x="380" y="154" fill="#B9B9B9" font-family="Helvetica" font-size="12px" text-anchor="middle">Elend</text></switch></g><rect x="240" y="10" width="120" height="40" fill="none" stroke="#b9b9b9" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 30px; margin-left: 241px;"><div data-drawio-colors="color: #B9B9B9; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(185, 185, 185); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Cody</div></div></div></foreignObject><text x="300" y="34" fill="#B9B9B9" font-family="Helvetica" font-size="12px" text-anchor="middle">Cody</text></switch></g><rect x="240" y="250" width="120" height="40" fill="none" stroke="#b9b9b9" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 118px; height: 1px; padding-top: 270px; margin-left: 241px;"><div data-drawio-colors="color: #B9B9B9; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(185, 185, 185); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">Dalinar</div></div></div></foreignObject><text x="300" y="274" fill="#B9B9B9" font-family="Helvetica" font-size="12px" text-anchor="middle">Dalinar</text></switch></g><path d="M 82.5 130 C 56.5 130 50 150 70.8 154 C 50 162.8 73.4 182 90.3 174 C 102 190 141 190 154 174 C 180 174 180 158 163.75 150 C 180 134 154 118 131.25 126 C 115 114 89 114 82.5 130 Z" fill="#181818" stroke="#b9b9b9" stroke-miterlimit="10" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 128px; height: 1px; padding-top: 150px; margin-left: 51px;"><div data-drawio-colors="color: #E67F43; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(230, 127, 67); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">192.168.1.0/24</div></div></div></foreignObject><text x="115" y="154" fill="#E67F43" font-family="Helvetica" font-size="12px" text-anchor="middle">192.168.1.0/24</text></switch></g><path d="M 82.5 130 L 60 50" fill="none" stroke="#e67f43" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 60 250 L 90.3 174" fill="none" stroke="#e67f43" stroke-miterlimit="10" pointer-events="stroke"/><rect x="250" y="120" width="70" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-end; width: 68px; height: 1px; padding-top: 147px; margin-left: 250px;"><div data-drawio-colors="color: #4f9cfe; " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(79, 156, 254); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">168.119.114.183</div></div></div></foreignObject><text x="318" y="147" fill="#4f9cfe" font-family="Helvetica" font-size="12px" text-anchor="end">168.119.114...</text></switch></g><rect x="40" y="50" width="20" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-end; width: 18px; height: 1px; padding-top: 57px; margin-left: 40px;"><div data-drawio-colors="color: #e67f43; " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(230, 127, 67); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">.10</div></div></div></foreignObject><text x="58" y="69" fill="#e67f43" font-family="Helvetica" font-size="12px" text-anchor="end">.10</text></switch></g><rect x="40" y="220" width="20" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-end; width: 18px; height: 1px; padding-top: 247px; margin-left: 40px;"><div data-drawio-colors="color: #e67f43; " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(230, 127, 67); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">.20</div></div></div></foreignObject><text x="58" y="247" fill="#e67f43" font-family="Helvetica" font-size="12px" text-anchor="end">.20</text></switch></g><path d="M 154 174 L 300 250" fill="none" stroke="#4f9cfe" stroke-miterlimit="10" pointer-events="stroke"/><path d="M 164.4 130 L 300 50" fill="none" stroke="#4f9cfe" stroke-miterlimit="10" pointer-events="stroke"/><rect x="300" y="50" width="70" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 68px; height: 1px; padding-top: 57px; margin-left: 302px;"><div data-drawio-colors="color: #4f9cfe; " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(79, 156, 254); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">51.77.159.16</div></div></div></foreignObject><text x="302" y="69" fill="#4f9cfe" font-family="Helvetica" font-size="12px">51.77.159.16</text></switch></g><rect x="300" y="220" width="70" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-start; width: 68px; height: 1px; padding-top: 247px; margin-left: 302px;"><div data-drawio-colors="color: #4f9cfe; " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(79, 156, 254); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">141.148.230.102</div></div></div></foreignObject><text x="302" y="247" fill="#4f9cfe" font-family="Helvetica" font-size="12px">141.148.230...</text></switch></g><path d="M 360 270 L 480 270 L 480 30 L 360 30" fill="none" stroke="#70b433" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/><rect x="330" y="20" width="30" height="20" fill="none" stroke="#70b433" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 30px; margin-left: 331px;"><div data-drawio-colors="color: #70B433; background-color: #181818; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(112, 180, 51); line-height: 1.2; pointer-events: all; background-color: rgb(24, 24, 24); white-space: normal; overflow-wrap: normal;">wg0</div></div></div></foreignObject><text x="345" y="34" fill="#70B433" font-family="Helvetica" font-size="12px" text-anchor="middle">wg0</text></switch></g><path d="M 120 30 L 330 120 L 329.99 160" fill="none" stroke="#70b433" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/><path d="M 120 270 L 320 170" fill="none" stroke="#70b433" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/><path d="M 360 35 L 390 60 L 342.5 150" fill="none" stroke="#70b433" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/><path d="M 360 265 L 410 240 L 342.5 170" fill="none" stroke="#70b433" stroke-width="2" stroke-miterlimit="10" stroke-dasharray="6 6" pointer-events="stroke"/><rect x="90" y="20" width="30" height="20" fill="none" stroke="#70b433" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 30px; margin-left: 91px;"><div data-drawio-colors="color: #70B433; background-color: #181818; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(112, 180, 51); line-height: 1.2; pointer-events: all; background-color: rgb(24, 24, 24); white-space: normal; overflow-wrap: normal;">wg0</div></div></div></foreignObject><text x="105" y="34" fill="#70B433" font-family="Helvetica" font-size="12px" text-anchor="middle">wg0</text></switch></g><rect x="90" y="260" width="30" height="20" fill="none" stroke="#70b433" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 270px; margin-left: 91px;"><div data-drawio-colors="color: #70B433; background-color: #181818; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(112, 180, 51); line-height: 1.2; pointer-events: all; background-color: rgb(24, 24, 24); white-space: normal; overflow-wrap: normal;">wg0</div></div></div></foreignObject><text x="105" y="274" fill="#70B433" font-family="Helvetica" font-size="12px" text-anchor="middle">wg0</text></switch></g><rect x="330" y="260" width="30" height="20" fill="none" stroke="#70b433" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 270px; margin-left: 331px;"><div data-drawio-colors="color: #70B433; background-color: #181818; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(112, 180, 51); line-height: 1.2; pointer-events: all; background-color: rgb(24, 24, 24); white-space: normal; overflow-wrap: normal;">wg0</div></div></div></foreignObject><text x="345" y="274" fill="#70B433" font-family="Helvetica" font-size="12px" text-anchor="middle">wg0</text></switch></g><rect x="320" y="150" width="30" height="20" fill="none" stroke="#70b433" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe center; justify-content: unsafe center; width: 28px; height: 1px; padding-top: 160px; margin-left: 321px;"><div data-drawio-colors="color: #70B433; background-color: #181818; " style="box-sizing: border-box; font-size: 0px; text-align: center;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(112, 180, 51); line-height: 1.2; pointer-events: all; background-color: rgb(24, 24, 24); white-space: normal; overflow-wrap: normal;">wg0</div></div></div></foreignObject><text x="335" y="164" fill="#70B433" font-family="Helvetica" font-size="12px" text-anchor="middle">wg0</text></switch></g><rect x="120" y="0" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-start; width: 58px; height: 1px; padding-top: 27px; margin-left: 122px;"><div data-drawio-colors="color: #70B433; " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(112, 180, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">10.1.2.10</div></div></div></foreignObject><text x="122" y="27" fill="#70B433" font-family="Helvetica" font-size="12px">10.1.2.10</text></switch></g><rect x="120" y="270" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 58px; height: 1px; padding-top: 277px; margin-left: 122px;"><div data-drawio-colors="color: #70B433; " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(112, 180, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">10.1.2.20</div></div></div></foreignObject><text x="122" y="289" fill="#70B433" font-family="Helvetica" font-size="12px">10.1.2.20</text></switch></g><rect x="260" y="150" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-end; width: 58px; height: 1px; padding-top: 157px; margin-left: 260px;"><div data-drawio-colors="color: #70B433; " style="box-sizing: border-box; font-size: 0px; text-align: right;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(112, 180, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">10.1.2.1</div></div></div></foreignObject><text x="318" y="169" fill="#70B433" font-family="Helvetica" font-size="12px" text-anchor="end">10.1.2.1</text></switch></g><rect x="360" y="270" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-start; justify-content: unsafe flex-start; width: 58px; height: 1px; padding-top: 277px; margin-left: 362px;"><div data-drawio-colors="color: #70B433; " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(112, 180, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">10.1.2.3</div></div></div></foreignObject><text x="362" y="289" fill="#70B433" font-family="Helvetica" font-size="12px">10.1.2.3</text></switch></g><rect x="360" y="0" width="60" height="30" fill="none" stroke="none" pointer-events="all"/><g transform="translate(-0.5 -0.5)"><switch><foreignObject pointer-events="none" width="100%" height="100%" requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility" style="overflow: visible; text-align: left;"><div xmlns="http://www.w3.org/1999/xhtml" style="display: flex; align-items: unsafe flex-end; justify-content: unsafe flex-start; width: 58px; height: 1px; padding-top: 27px; margin-left: 362px;"><div data-drawio-colors="color: #70B433; " style="box-sizing: border-box; font-size: 0px; text-align: left;"><div style="display: inline-block; font-size: 12px; font-family: Helvetica; color: rgb(112, 180, 51); line-height: 1.2; pointer-events: all; white-space: normal; overflow-wrap: normal;">10.1.2.2</div></div></div></foreignObject><text x="362" y="27" fill="#70B433" font-family="Helvetica" font-size="12px">10.1.2.2</text></switch></g></g><switch><g requiredFeatures="http://www.w3.org/TR/SVG11/feature#Extensibility"/><a transform="translate(0,-5)" xlink:href="https://www.diagrams.net/doc/faq/svg-export-text-problems" target="_blank"><text text-anchor="middle" font-size="10px" x="50%" y="100%">Text is not SVG - cannot display</text></a></switch></svg>
\ No newline at end of file |