From 90a19717c495f7847e5942f76b5f3a1a5e2bb47f Mon Sep 17 00:00:00 2001 From: TechnologyClassroom Date: Wed, 15 Apr 2026 21:37:26 -0400 Subject: [PATCH 1/6] Upload installer and minor fixes. --- README.md | 105 +- TODO.md | 3 - block_page/blocked.png | Bin 25762 -> 25638 bytes block_page/index.html | 2 +- excludes/google.txt | 4226 +++------------------------------------- excludes/my.txt | 5 +- fortress-block.sh | 118 +- fortress-centos7.spec | 9 +- fortress-install.sh | 173 ++ fortress-unblock.sh | 110 +- fortress.conf | 41 +- fortress.pl | 78 +- fortress.service | 2 +- 13 files changed, 787 insertions(+), 4085 deletions(-) delete mode 100644 TODO.md create mode 100755 fortress-install.sh diff --git a/README.md b/README.md index 97f565f..ac409d2 100644 --- a/README.md +++ b/README.md @@ -1,45 +1,106 @@ # About -Fortress is a simple tool aimed at reducing the manual sysadmin work involved in blocking attacking IPs. +Fortress is a simple tool aimed at reducing the manual sysadmin work involved +in blocking attacking IPs during SYN floods. -The default thing that sysadmins do is `netstat -ntp`/`ss -ntp` to find what IPs are accessing the system, during overload times. These tools may be slow to produce the desired information and are usully combined with piping this information into grep/awk/sort/uniq additional tools to get the right data. +The default thing that sysadmins do is `netstat -ntp`/`ss -ntp` to find what +IPs are accessing the system, during overload times. These tools may be slow to +produce the desired information and are usully combined with piping this +information into grep/awk/sort/uniq additional tools to get the right data. -Fortress is able to identify such attacks in less then 1sec and then block the offending IPs. This tool does the same thing that a sysadmin would do, but costing significantly less resources and faster. +Fortress is able to identify such attacks in less then 1 second and then block +the offending IPs. This tool does the same thing that a sysadmin would do, but +costing significantly less resources and faster. -This is a standalone daemon or a systemd service. +Fortress can run as a standalone daemon or as a systemd service. -The daemon supports excluding/whitelisting individual IPs and/or IP ranges(CIDR) in separate files. The good thing is that the whitelisting mechanism is pretty efficient(based on Patricia Trie for the IP lookups), so it can take huge IP lists, like the IP ranges of google, cloudflare, bing or etc. +The daemon supports excluding/whitelisting individual IPs and/or IP ranges +(CIDR) in separate files. The whitelisting mechanism is pretty efficient (based +on Patricia Trie for the IP lookups), so it can take huge IP lists, like the IP +ranges of Google, Cloudflare, Bing, etc. -To that end, we have provided a compiled list of IP ranges from the biggest providers on the net in the excludes folder. +To that end, we have provided a compiled list of IP ranges from the biggest +providers on the net in the excludes folder. - -Right now, the tool supports only TCP with UDP to be added soon. It checks conns only in either SYN_RECV or ESTABLISHED states to prevent either resource exhaustion or service interruption(flood). +Right now, the tool supports only TCP with UDP to be added soon and IPv4. It +checks conns only in either `SYN_RECV` or `ESTABLISHED` states to prevent +either resource exhaustion or service interruption (flood). # How does it work? -Fortress parses `/proc/net/tcp`(the tcp states provided by the Linux kernel) every second and also checks the load of the machine from `/proc/loadavg`. +Fortress parses `/proc/net/tcp` (the tcp states provided by the Linux kernel) +every second and also checks `/proc/loadavg` for the load of the machine. -It first creates a list of connections for the monitored ports. Then based on the configuration(high_load, low_conns, high_cons, syn_recv_conns) it decides if an IP has to be blocked. +It first creates a list of connections for the monitored ports. Then based on +the configuration (high_load, low_conns, high_cons, syn_recv_conns) it decides +if an IP has to be blocked. -It uses an external [shell script](fortress-block.sh), that can be modified by the administrator, to block IPs. +It uses an external [shell script](fortress-block.sh), that can be modified by +the administrator, to block IPs. +With the default configuration, Fortress will look for SYN flood conns all the +time. These are IPs sending more then 20 TCP packets with SYN flag set. This +means that at a single moment, this IP has tried to open more then +20(syn_recv_conns) simultaneous connections to the server. -With the default configuration, Fortress will look for syn flood conns all the time. These are IPs sending more then 20 TCP packets with SYN flag set. This means that at a single moment, this IP has tried to open more then 20(syn_recv_conns) simultaneous connections to the server. - -It will also check established connections. These are connections that already have the TCP 3-way handshake finished and application is expected to handle them. -When the load is below the high limit(high_load), the number of simultaneous connections from a single IP has to be above 50(low_conns) in order to get blocked. -When the load is above the high limit(high_load), the number of simultaneous connections from a single IP has to be above 30(high_conns) in order to get blocked. +It will also check established connections. These are connections that already +have the TCP 3-way handshake finished and application is expected to handle +them. When the load is below the high limit(high_load), the number of +simultaneous connections from a single IP has to be above 50(low_conns) in +order to get blocked. When the load is above the high limit(high_load), the +number of simultaneous connections from a single IP has to be above +30(high_conns) in order to get blocked. # Configuration -Configuration, by default is expected to be in [`/etc/fortress/fortress.conf`](fortress.conf). We have tried to provide enough comments in there to reduce the need for separate documentation. +Configuration, by default is expected to be in +[`/etc/fortress/fortress.conf`](fortress.conf). We have tried to provide enough +comments in there to reduce the need for separate documentation. # Blocking -Fortress supports 3 different types of blocking the offending IPs. And all 3 are defined in the [`fortress-block.sh`](fortress-block.sh). -1. `iptables` - blocking the IPs directly in your firewall with iptables. You can also create a dedicated chain for that and set its name in fortres.conf -2. `ipset` - a more efficient blocking mechanism would be to levarage IPsets. This allows you to block large number of IPs without overwhelming iptables and slowing down the packet processing. -3. redirection - in this mechanism, we forward the TCP connection to a separate server, on which we expect to have a block page explaining, why the client is not seeing the expected web page. This mechanims uses DNAT and SNAT to achieve this and is the most resource inefficient way. However, it does give proper information to the end user. An example blocked page can be seen in the [block_page](block_page) folder. +Fortress supports 3 different types of blocking the offending IPs. And all 3 +are defined in the [`fortress-block.sh`](fortress-block.sh). +1. `iptables` - blocking the IPs directly in your firewall with iptables. You + can also create a dedicated chain for that and set its name in fortres.conf +2. `ipset` - a more efficient blocking mechanism would be to levarage IPsets. + This allows you to block large number of IPs without overwhelming iptables + and slowing down the packet processing. +3. redirection - in this mechanism, we forward the TCP connection to a separate + server, on which we expect to have a block page explaining, why the client + is not seeing the expected web page. This mechanims uses DNAT and SNAT to + achieve this and is the most resource inefficient way. However, it does give + proper information to the end user. An example blocked page can be seen in + the [block_page](block_page) folder. Feel free to modify this script in any way, to suit your blocking needs. +# How to install? + +## Operating Systems with rpm + +With rpm-based distributions, you can download the latest rpm package from the +[Releases](https://github.com/hackman/Fortress/releases) page manually or with +`wget` or another command line tool of your choice. + + wget https://github.com/hackman/Fortress/releases/download/v1.0.3/fortress-1.0-3.noarch.rpm + +Install the rpm. + + sudo rpm -ivh fortress-1.0-3.noarch.rpm + +## Operating Systems without rpm + +Clone the Fortress repository. + + git clone https://github.com/hackman/fortress + +Change to the fortress directory. + + cd fortress + +Run the installer. + + sudo bash fortress-install.sh + # Credits: - - block icon, originally pulled from https://www.pngwing.com/en/free-png-mqxsx and resized + - Block icon is CC0 and pulled from + and resized. diff --git a/TODO.md b/TODO.md deleted file mode 100644 index a62c7d0..0000000 --- a/TODO.md +++ /dev/null @@ -1,3 +0,0 @@ -* Signal handler for stop, saving the current list of blocked IPs before exiting. -* Parse and check /proc/net/udp -* Debian and Ubuntu packages diff --git a/block_page/blocked.png b/block_page/blocked.png index 24bb26b469a151f8529a0a712b093d73f80d6440..5bfcbe7a961afa8781434f99e5b36d826ab25480 100644 GIT binary patch delta 22589 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 delta 22723 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 O0000 body {font-family:Arial,Helvetica,sans-serif;background:#666;margin:0;padding:0;text-align:center;color:#fff;} h1 {padding:20px 0 20px 0;margin:0;background:linear-gradient(0,rgba(102,102,102,100),rgba(194,20,3,1)15%);} -p {font-size:14px;font-weight:bold;} +p {font-size:14px;font-weight:bold;} diff --git a/excludes/google.txt b/excludes/google.txt index 2581026..862ce90 100644 --- a/excludes/google.txt +++ b/excludes/google.txt @@ -1,3914 +1,312 @@ -# Google -# UA "AdsBot-Google (+http://www.google.com/adsbot.html)" -# UA "Googlebot-Image/1.0" -# UA "Googlebot/2.1 (+http://www.googlebot.com/bot.html)" -# UA "Googlebot/Test (+http://www.googlebot.com/bot.html)" -# UA "Googlebot/Test" -# UA "Mediapartners-Google/2.1 (+http://www.googlebot.com/bot.html)" -# UA "Mediapartners-Google/2.1" -# UA "Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)" -# UA "gsa-crawler (Enterprise; S4-E9LJ2B82FJJAA; me@mycompany.com)" -1.179.112.0/20 -5.183.79.0/24 -8.34.208.0/21 -8.34.208.0/24 -8.34.209.0/24 -8.34.210.0/24 -8.34.211.0/24 -8.34.212.0/24 -8.34.213.0/24 -8.34.214.0/24 -8.34.215.0/24 -8.34.216.0/21 -8.34.216.0/24 -8.34.217.0/24 -8.34.218.0/24 -8.34.219.0/24 -8.34.220.0/24 -8.34.221.0/24 -8.34.222.0/24 -8.34.223.0/24 -8.35.192.0/21 -8.35.192.0/24 -8.35.193.0/24 -8.35.194.0/24 -8.35.195.0/24 -8.35.196.0/24 -8.35.197.0/24 -8.35.198.0/24 -8.35.199.0/24 -8.35.200.0/21 -8.8.4.0/24 -8.8.8.0/24 -23.131.144.0/24 -23.161.104.0/24 -23.227.32.0/24 -23.227.33.0/24 -23.227.34.0/24 -23.227.35.0/24 -23.227.36.0/24 -23.227.40.0/24 -23.227.41.0/24 -23.227.42.0/24 -23.227.43.0/24 -23.227.44.0/24 -23.227.45.0/24 -23.227.46.0/24 -23.227.47.0/24 -23.227.48.0/24 -23.227.49.0/24 -23.227.50.0/24 -23.227.51.0/24 -23.227.52.0/24 -23.227.53.0/24 -23.227.54.0/24 -23.227.55.0/24 -23.227.56.0/24 -23.227.57.0/24 -23.227.58.0/24 -23.227.59.0/24 -23.227.61.0/24 -23.227.62.0/24 -23.227.63.0/24 -23.236.48.0/20 -23.236.48.0/24 -23.236.49.0/24 -23.236.50.0/24 -23.236.51.0/24 -23.236.52.0/24 -23.236.53.0/24 -23.236.54.0/24 -23.236.55.0/24 -23.236.56.0/24 -23.236.57.0/24 -23.236.58.0/24 -23.236.59.0/24 -23.236.60.0/24 -23.236.61.0/24 -23.236.62.0/24 -23.236.63.0/24 -23.251.128.0/19 -23.251.128.0/24 -23.251.129.0/24 -23.251.130.0/24 -23.251.131.0/24 -23.251.132.0/24 -23.251.133.0/24 -23.251.134.0/24 -23.251.135.0/24 -23.251.136.0/24 -23.251.137.0/24 -23.251.138.0/24 -23.251.139.0/24 -23.251.140.0/24 -23.251.141.0/24 -23.251.142.0/24 -23.251.143.0/24 -23.251.144.0/24 -23.251.145.0/24 -23.251.146.0/24 -23.251.147.0/24 -23.251.148.0/24 -23.251.149.0/24 -23.251.150.0/24 -23.251.151.0/24 -23.251.152.0/24 -23.251.153.0/24 -23.251.154.0/24 -23.251.155.0/24 -23.251.156.0/24 -23.251.157.0/24 -23.251.158.0/24 -23.251.159.0/24 -23.89.224.0/21 -23.89.240.0/21 -27.0.224.0/22 -31.25.12.0/24 -31.25.14.0/24 -34.0.128.0/19 -34.0.160.0/19 -34.0.192.0/19 -34.0.224.0/24 -34.0.225.0/24 -34.0.226.0/24 -34.0.227.0/24 -34.0.240.0/20 -34.0.48.0/20 -34.0.96.0/19 -34.1.0.0/20 -34.1.16.0/20 -34.1.32.0/20 -34.1.48.0/20 -34.1.64.0/24 -34.1.65.0/24 -34.1.66.0/24 -34.1.67.0/24 -34.1.68.0/24 -34.1.69.0/24 -34.1.70.0/24 -34.1.71.0/24 -34.1.72.0/24 -34.1.73.0/24 -34.100.0.0/14 -34.100.0.0/20 -34.100.104.0/21 -34.100.112.0/20 -34.100.128.0/20 -34.100.144.0/20 -34.100.16.0/20 -34.100.160.0/20 -34.100.176.0/20 -34.100.192.0/20 -34.100.208.0/20 -34.100.224.0/20 -34.100.240.0/20 -34.100.32.0/20 -34.100.48.0/20 -34.100.64.0/21 -34.100.72.0/21 -34.100.80.0/20 -34.100.96.0/21 -34.101.0.0/16 -34.101.112.0/20 -34.101.128.0/20 -34.101.144.0/20 -34.101.160.0/20 -34.101.176.0/20 -34.101.18.0/24 -34.101.192.0/20 -34.101.208.0/20 -34.101.224.0/20 -34.101.240.0/20 -34.101.32.0/19 -34.101.64.0/20 -34.101.80.0/20 -34.101.96.0/20 -34.102.0.0/20 -34.102.112.0/20 -34.102.16.0/20 -34.102.32.0/20 -34.102.48.0/20 -34.102.64.0/20 -34.102.80.0/20 -34.102.96.0/20 -34.103.0.0/20 -34.103.112.0/20 -34.103.128.0/20 -34.103.144.0/20 -34.103.16.0/20 -34.103.160.0/20 -34.103.176.0/20 -34.103.192.0/20 -34.103.208.0/20 -34.103.224.0/20 -34.103.240.0/20 -34.103.32.0/20 -34.103.48.0/21 -34.103.56.0/21 -34.103.64.0/22 -34.103.68.0/22 -34.103.72.0/22 -34.103.76.0/22 -34.103.80.0/20 -34.103.96.0/20 -34.104.0.0/14 -34.104.0.0/22 -34.104.128.0/20 -34.104.144.0/20 -34.104.16.0/21 -34.104.160.0/20 -34.104.176.0/20 -34.104.192.0/20 -34.104.208.0/20 -34.104.224.0/20 -34.104.240.0/20 -34.104.29.0/24 -34.104.40.0/21 -34.104.6.0/23 -34.104.8.0/21 -34.105.0.0/20 -34.105.112.0/20 -34.105.128.0/20 -34.105.144.0/20 -34.105.16.0/20 -34.105.160.0/20 -34.105.176.0/20 -34.105.192.0/20 -34.105.208.0/20 -34.105.224.0/20 -34.105.240.0/20 -34.105.32.0/20 -34.105.48.0/20 -34.105.64.0/20 -34.105.80.0/20 -34.105.96.0/20 -34.106.0.0/20 -34.106.112.0/20 -34.106.128.0/20 -34.106.144.0/20 -34.106.16.0/20 -34.106.160.0/20 -34.106.176.0/20 -34.106.192.0/20 -34.106.208.0/20 -34.106.224.0/20 -34.106.240.0/20 -34.106.32.0/20 -34.106.48.0/20 -34.106.64.0/20 -34.106.80.0/20 -34.106.96.0/20 -34.107.0.0/20 -34.107.112.0/20 -34.107.16.0/20 -34.107.32.0/20 -34.107.48.0/20 -34.107.64.0/20 -34.107.80.0/20 -34.107.96.0/20 -34.108.0.0/14 -34.108.0.0/20 -34.108.112.0/20 -34.108.128.0/20 -34.108.144.0/20 -34.108.16.0/20 -34.108.160.0/20 -34.108.176.0/20 -34.108.192.0/20 -34.108.208.0/20 -34.108.224.0/20 -34.108.240.0/20 -34.108.32.0/20 -34.108.48.0/20 -34.108.64.0/20 -34.108.80.0/20 -34.108.96.0/20 -34.110.16.0/20 -34.116.0.0/14 -34.116.0.0/20 -34.116.112.0/20 -34.116.128.0/20 -34.116.144.0/20 -34.116.160.0/20 -34.116.176.0/20 -34.116.192.0/20 -34.116.208.0/20 -34.116.224.0/20 -34.116.240.0/20 -34.116.48.0/20 -34.116.64.0/20 -34.116.80.0/20 -34.116.96.0/20 -34.118.0.0/20 -34.118.112.0/20 -34.118.128.0/18 -34.118.16.0/20 -34.118.192.0/21 -34.118.200.0/21 -34.118.208.0/20 -34.118.240.0/22 -34.118.244.0/22 -34.118.248.0/23 -34.118.250.0/23 -34.118.252.0/23 -34.118.254.0/23 -34.118.32.0/20 -34.118.48.0/20 -34.118.64.0/20 -34.118.80.0/20 -34.118.96.0/20 -34.119.0.0/20 -34.119.112.0/20 -34.119.128.0/20 -34.119.144.0/20 -34.119.16.0/20 -34.119.160.0/20 -34.119.176.0/20 -34.119.192.0/20 -34.119.208.0/20 -34.119.224.0/20 -34.119.240.0/20 -34.119.32.0/20 -34.119.48.0/20 -34.119.64.0/20 -34.119.80.0/20 -34.119.96.0/20 -34.120.0.0/13 -34.120.0.0/14 -34.121.0.0/20 -34.121.112.0/20 -34.121.128.0/20 -34.121.144.0/20 -34.121.16.0/20 -34.121.160.0/20 -34.121.176.0/20 -34.121.192.0/20 -34.121.208.0/20 -34.121.224.0/20 -34.121.240.0/20 -34.121.32.0/20 -34.121.48.0/20 -34.121.64.0/20 -34.121.80.0/20 -34.121.96.0/20 -34.122.0.0/20 -34.122.112.0/20 -34.122.128.0/20 -34.122.144.0/20 -34.122.16.0/20 -34.122.160.0/20 -34.122.176.0/20 -34.122.192.0/20 -34.122.208.0/20 -34.122.224.0/20 -34.122.240.0/20 -34.122.32.0/20 -34.122.48.0/20 -34.122.64.0/20 -34.122.80.0/20 -34.122.96.0/20 -34.123.0.0/20 -34.123.112.0/20 -34.123.128.0/20 -34.123.144.0/20 -34.123.16.0/20 -34.123.160.0/20 -34.123.176.0/20 -34.123.192.0/20 -34.123.208.0/20 -34.123.224.0/20 -34.123.240.0/20 -34.123.32.0/20 -34.123.48.0/20 -34.123.64.0/20 -34.123.80.0/20 -34.123.96.0/20 -34.124.0.0/14 -34.124.112.0/20 -34.124.128.0/20 -34.124.144.0/20 -34.124.160.0/20 -34.124.176.0/20 -34.124.192.0/20 -34.124.208.0/20 -34.124.224.0/20 -34.124.240.0/20 -34.124.64.0/20 -34.124.80.0/23 -34.124.84.0/22 -34.124.88.0/23 -34.124.90.0/24 -34.124.91.0/24 -34.124.92.0/22 -34.124.96.0/21 -34.125.0.0/20 -34.125.112.0/20 -34.125.128.0/20 -34.125.144.0/20 -34.125.16.0/20 -34.125.160.0/20 -34.125.176.0/20 -34.125.192.0/20 -34.125.208.0/20 -34.125.224.0/20 -34.125.240.0/20 -34.125.32.0/20 -34.125.48.0/20 -34.125.64.0/20 -34.125.80.0/20 -34.125.96.0/20 -34.126.112.0/20 -34.126.128.0/20 -34.126.144.0/20 -34.126.160.0/20 -34.126.176.0/20 -34.126.192.0/20 -34.126.208.0/20 -34.126.240.0/21 -34.126.248.0/21 -34.126.64.0/20 -34.126.80.0/20 -34.126.96.0/20 -34.127.0.0/20 -34.127.112.0/20 -34.127.16.0/20 -34.127.192.0/18 -34.127.32.0/20 -34.127.48.0/20 -34.127.64.0/20 -34.127.80.0/20 -34.127.96.0/20 -34.128.0.0/13 -34.128.0.0/16 -34.128.0.0/17 -34.128.0.0/24 -34.128.128.0/17 -34.128.16.0/20 -34.128.192.0/20 -34.128.252.0/24 -34.128.64.0/19 -34.128.96.0/19 -34.129.0.0/16 -34.129.0.0/20 -34.129.112.0/20 -34.129.128.0/20 -34.129.144.0/20 -34.129.16.0/20 -34.129.160.0/20 -34.129.176.0/20 -34.129.192.0/20 -34.129.208.0/20 -34.129.224.0/20 -34.129.240.0/20 -34.129.32.0/20 -34.129.48.0/20 -34.129.64.0/20 -34.129.80.0/20 -34.129.96.0/20 -34.130.0.0/16 -34.130.0.0/20 -34.130.112.0/20 -34.130.128.0/20 -34.130.144.0/20 -34.130.16.0/20 -34.130.160.0/20 -34.130.176.0/20 -34.130.192.0/20 -34.130.208.0/20 -34.130.224.0/20 -34.130.240.0/20 -34.130.32.0/20 -34.130.48.0/20 -34.130.64.0/20 -34.130.80.0/20 -34.130.96.0/20 -34.131.0.0/16 -34.131.0.0/20 -34.131.112.0/20 -34.131.128.0/20 -34.131.144.0/20 -34.131.16.0/20 -34.131.160.0/20 -34.131.176.0/20 -34.131.192.0/20 -34.131.208.0/20 -34.131.224.0/20 -34.131.240.0/20 -34.131.32.0/20 -34.131.48.0/20 -34.131.64.0/20 -34.131.80.0/20 -34.131.96.0/20 -34.132.0.0/16 -34.132.0.0/20 -34.132.112.0/20 -34.132.128.0/20 -34.132.144.0/20 -34.132.16.0/20 -34.132.160.0/20 -34.132.176.0/20 -34.132.192.0/20 -34.132.208.0/20 -34.132.224.0/20 -34.132.240.0/20 -34.132.32.0/20 -34.132.48.0/20 -34.132.64.0/20 -34.132.80.0/20 -34.132.96.0/20 -34.133.0.0/16 -34.133.0.0/20 -34.133.112.0/20 -34.133.128.0/20 -34.133.144.0/20 -34.133.16.0/20 -34.133.160.0/20 -34.133.176.0/20 -34.133.192.0/20 -34.133.208.0/20 -34.133.224.0/20 -34.133.240.0/20 -34.133.32.0/20 -34.133.48.0/20 -34.133.64.0/20 -34.133.80.0/20 -34.133.96.0/20 -34.134.0.0/16 -34.134.0.0/20 -34.134.112.0/20 -34.134.128.0/20 -34.134.144.0/20 -34.134.16.0/20 -34.134.160.0/20 -34.134.176.0/20 -34.134.192.0/20 -34.134.208.0/20 -34.134.224.0/20 -34.134.240.0/20 -34.134.32.0/20 -34.134.48.0/20 -34.134.64.0/20 -34.134.80.0/20 -34.134.96.0/20 -34.135.0.0/16 -34.135.0.0/20 -34.135.112.0/20 -34.135.128.0/20 -34.135.144.0/20 -34.135.16.0/20 -34.135.160.0/20 -34.135.176.0/20 -34.135.192.0/20 -34.135.208.0/20 -34.135.224.0/20 -34.135.240.0/20 -34.135.32.0/20 -34.135.48.0/20 -34.135.64.0/20 -34.135.80.0/20 -34.135.96.0/20 -34.136.0.0/13 -34.136.0.0/16 -34.136.0.0/20 -34.136.112.0/20 -34.136.128.0/20 -34.136.144.0/20 -34.136.16.0/20 -34.136.160.0/20 -34.136.176.0/20 -34.136.192.0/20 -34.136.208.0/20 -34.136.224.0/20 -34.136.240.0/20 -34.136.32.0/20 -34.136.48.0/20 -34.136.64.0/20 -34.136.80.0/20 -34.136.96.0/20 -34.137.0.0/16 -34.137.0.0/17 -34.137.128.0/17 -34.138.0.0/16 -34.138.0.0/20 -34.138.112.0/20 -34.138.128.0/20 -34.138.144.0/20 -34.138.16.0/20 -34.138.160.0/20 -34.138.176.0/20 -34.138.192.0/20 -34.138.208.0/20 -34.138.224.0/20 -34.138.240.0/20 -34.138.32.0/20 -34.138.48.0/20 -34.138.64.0/20 -34.138.80.0/20 -34.138.96.0/20 -34.139.0.0/16 -34.139.0.0/20 -34.139.112.0/20 -34.139.128.0/20 -34.139.144.0/20 -34.139.16.0/20 -34.139.160.0/20 -34.139.176.0/20 -34.139.192.0/20 -34.139.208.0/20 -34.139.224.0/20 -34.139.240.0/20 -34.139.32.0/20 -34.139.48.0/20 -34.139.64.0/20 -34.139.80.0/20 -34.139.96.0/20 -34.140.0.0/16 -34.140.0.0/20 -34.140.112.0/20 -34.140.128.0/20 -34.140.144.0/20 -34.140.16.0/20 -34.140.160.0/20 -34.140.176.0/20 -34.140.192.0/20 -34.140.208.0/20 -34.140.224.0/20 -34.140.240.0/20 -34.140.32.0/20 -34.140.48.0/20 -34.140.64.0/20 -34.140.80.0/20 -34.140.96.0/20 -34.141.0.0/16 -34.141.0.0/20 -34.141.112.0/20 -34.141.128.0/20 -34.141.144.0/20 -34.141.16.0/20 -34.141.160.0/20 -34.141.176.0/20 -34.141.192.0/20 -34.141.208.0/20 -34.141.224.0/20 -34.141.240.0/20 -34.141.32.0/20 -34.141.48.0/20 -34.141.64.0/20 -34.141.80.0/20 -34.141.96.0/20 -34.142.0.0/16 -34.142.0.0/20 -34.142.112.0/20 -34.142.128.0/17 -34.142.16.0/20 -34.142.32.0/20 -34.142.48.0/20 -34.142.64.0/20 -34.142.80.0/20 -34.142.96.0/20 -34.143.0.0/16 -34.143.0.0/20 -34.143.112.0/20 -34.143.128.0/17 -34.143.16.0/20 -34.143.32.0/20 -34.143.48.0/20 -34.143.72.0/24 -34.143.73.0/24 -34.143.74.0/24 -34.143.75.0/24 -34.143.76.0/24 -34.143.77.0/24 -34.143.78.0/24 -34.143.79.0/24 -34.143.80.0/21 -34.143.96.0/20 -34.144.0.0/13 -34.144.0.0/14 -34.144.0.0/16 -34.144.112.0/20 -34.144.128.0/17 -34.144.16.0/20 -34.144.160.0/21 -34.144.32.0/20 -34.144.48.0/20 -34.144.64.0/20 -34.144.80.0/20 -34.144.96.0/20 -34.145.0.0/16 -34.145.0.0/20 -34.145.112.0/20 -34.145.128.0/20 -34.145.144.0/20 -34.145.16.0/20 -34.145.160.0/20 -34.145.176.0/20 -34.145.192.0/20 -34.145.208.0/20 -34.145.224.0/20 -34.145.240.0/20 -34.145.32.0/20 -34.145.48.0/20 -34.145.64.0/20 -34.145.80.0/20 -34.145.96.0/20 -34.146.0.0/16 -34.146.0.0/20 -34.146.112.0/20 -34.146.128.0/20 -34.146.144.0/20 -34.146.16.0/20 -34.146.160.0/20 -34.146.176.0/20 -34.146.192.0/20 -34.146.208.0/20 -34.146.224.0/20 -34.146.240.0/20 -34.146.32.0/20 -34.146.48.0/20 -34.146.64.0/20 -34.146.80.0/20 -34.146.96.0/20 -34.147.0.0/16 -34.147.0.0/20 -34.147.112.0/20 -34.147.128.0/20 -34.147.144.0/20 -34.147.16.0/20 -34.147.160.0/20 -34.147.176.0/20 -34.147.192.0/20 -34.147.208.0/20 -34.147.224.0/20 -34.147.240.0/20 -34.147.32.0/20 -34.147.48.0/20 -34.147.64.0/20 -34.147.80.0/20 -34.147.96.0/20 -34.148.0.0/14 -34.148.0.0/16 -34.148.0.0/20 -34.148.112.0/20 -34.148.128.0/20 -34.148.144.0/20 -34.148.16.0/20 -34.148.160.0/20 -34.148.176.0/20 -34.148.192.0/20 -34.148.208.0/20 -34.148.224.0/20 -34.148.240.0/20 -34.148.32.0/20 -34.148.48.0/20 -34.148.64.0/20 -34.148.80.0/20 -34.148.96.0/20 -34.150.0.0/16 -34.150.0.0/20 -34.150.112.0/20 -34.150.128.0/20 -34.150.144.0/20 -34.150.16.0/20 -34.150.160.0/20 -34.150.176.0/20 -34.150.192.0/20 -34.150.208.0/20 -34.150.224.0/20 -34.150.240.0/20 -34.150.32.0/20 -34.150.48.0/20 -34.150.64.0/20 -34.150.80.0/20 -34.150.96.0/20 -34.151.0.0/16 -34.151.0.0/20 -34.151.112.0/20 -34.151.128.0/20 -34.151.144.0/20 -34.151.16.0/20 -34.151.160.0/20 -34.151.176.0/20 -34.151.192.0/20 -34.151.208.0/20 -34.151.224.0/20 -34.151.240.0/20 -34.151.32.0/20 -34.151.48.0/20 -34.151.64.0/20 -34.151.80.0/20 -34.151.96.0/20 -34.152.0.0/13 -34.152.0.0/16 -34.152.0.0/20 -34.152.128.0/17 -34.152.16.0/20 -34.152.32.0/20 -34.152.48.0/20 -34.153.0.0/16 -34.153.0.0/17 -34.153.128.0/17 -34.154.0.0/16 -34.154.0.0/17 -34.154.128.0/17 -34.155.0.0/16 -34.155.0.0/17 -34.155.128.0/17 -34.156.0.0/16 -34.157.0.0/16 -34.158.0.0/16 -34.158.0.0/22 -34.158.252.0/22 -34.159.0.0/16 -34.159.0.0/17 -34.159.128.0/17 -34.16.0.0/12 -34.16.0.0/17 -34.16.128.0/17 -34.160.0.0/13 -34.160.0.0/14 -34.160.0.0/16 -34.161.0.0/16 -34.161.0.0/17 -34.161.128.0/17 -34.162.0.0/16 -34.162.0.0/18 -34.162.128.0/18 -34.162.192.0/18 -34.162.64.0/18 -34.163.0.0/16 -34.163.0.0/18 -34.163.128.0/18 -34.163.192.0/18 -34.163.64.0/18 -34.164.0.0/14 -34.164.0.0/16 -34.164.0.0/17 -34.164.128.0/17 -34.165.0.0/16 -34.165.0.0/17 -34.165.128.0/17 -34.166.0.0/16 -34.166.0.0/18 -34.166.128.0/18 -34.166.192.0/18 -34.166.64.0/18 -34.167.0.0/16 -34.168.0.0/13 -34.168.0.0/16 -34.168.0.0/17 -34.168.128.0/17 -34.169.0.0/16 -34.169.0.0/17 -34.169.128.0/17 -34.17.0.0/16 -34.170.0.0/16 -34.170.0.0/17 -34.170.128.0/17 -34.171.0.0/16 -34.171.0.0/17 -34.171.128.0/17 -34.172.0.0/16 -34.172.0.0/17 -34.172.128.0/17 -34.173.0.0/16 -34.173.0.0/17 -34.173.128.0/17 -34.174.0.0/16 -34.174.0.0/17 -34.174.128.0/17 -34.175.0.0/16 -34.175.0.0/17 -34.175.128.0/17 -34.176.0.0/13 -34.176.0.0/16 -34.176.0.0/20 -34.176.112.0/20 -34.176.128.0/20 -34.176.144.0/20 -34.176.16.0/20 -34.176.160.0/20 -34.176.176.0/20 -34.176.192.0/20 -34.176.208.0/20 -34.176.224.0/20 -34.176.240.0/20 -34.176.32.0/20 -34.176.48.0/20 -34.176.64.0/20 -34.176.80.0/20 -34.176.96.0/20 -34.177.0.0/16 -34.177.0.0/21 -34.177.124.0/22 -34.177.128.0/17 -34.177.16.0/21 -34.177.8.0/21 -34.178.0.0/16 -34.178.0.0/17 -34.178.128.0/17 -34.179.0.0/16 -34.18.0.0/16 -34.180.0.0/17 -34.181.0.0/16 -34.182.0.0/16 -34.183.0.0/16 -34.184.0.0/14 -34.184.0.0/16 -34.185.0.0/16 -34.186.0.0/16 -34.186.128.0/17 -34.187.0.0/16 -34.19.0.0/17 -34.19.128.0/17 -34.20.0.0/17 -34.20.128.0/17 -34.21.0.0/17 -34.21.128.0/17 -34.22.0.0/19 -34.22.112.0/20 -34.22.128.0/17 -34.22.32.0/19 -34.22.64.0/19 -34.22.96.0/20 -34.23.0.0/16 -34.24.0.0/16 -34.25.0.0/16 -34.26.0.0/16 -34.27.0.0/16 -34.28.0.0/16 -34.29.0.0/16 -34.3.0.0/23 -34.3.3.0/24 -34.3.4.0/24 -34.3.8.0/21 -34.30.0.0/16 -34.31.0.0/16 -34.32.0.0/11 -34.32.0.0/17 -34.32.128.0/17 -34.33.0.0/16 -34.34.0.0/17 -34.34.128.0/18 -34.34.192.0/24 -34.35.0.0/16 -34.37.0.0/16 -34.38.0.0/16 -34.39.0.0/17 -34.39.128.0/17 -34.4.0.0/22 -34.4.4.0/24 -34.4.5.0/24 -34.4.6.0/23 -34.4.8.0/21 -34.40.0.0/17 -34.40.128.0/17 -34.41.0.0/16 -34.42.0.0/16 -34.44.0.0/16 -34.45.0.0/16 -34.46.0.0/16 -34.47.0.0/18 -34.48.0.0/16 -34.64.0.0/11 -34.64.0.0/12 -34.64.0.0/14 -34.64.0.0/16 -34.64.112.0/20 -34.64.132.0/22 -34.64.136.0/21 -34.64.144.0/20 -34.64.160.0/20 -34.64.176.0/20 -34.64.192.0/20 -34.64.208.0/20 -34.64.224.0/20 -34.64.240.0/20 -34.64.32.0/19 -34.64.68.0/22 -34.64.72.0/21 -34.64.80.0/20 -34.64.96.0/20 -34.65.0.0/20 -34.65.112.0/20 -34.65.128.0/20 -34.65.144.0/20 -34.65.16.0/20 -34.65.160.0/20 -34.65.176.0/20 -34.65.192.0/20 -34.65.208.0/20 -34.65.224.0/20 -34.65.240.0/20 -34.65.32.0/20 -34.65.48.0/20 -34.65.64.0/20 -34.65.80.0/20 -34.65.96.0/20 -34.66.0.0/20 -34.66.112.0/20 -34.66.128.0/20 -34.66.144.0/20 -34.66.16.0/20 -34.66.160.0/20 -34.66.176.0/20 -34.66.192.0/20 -34.66.208.0/20 -34.66.224.0/20 -34.66.240.0/20 -34.66.32.0/20 -34.66.48.0/20 -34.66.64.0/20 -34.66.80.0/20 -34.66.96.0/20 -34.67.0.0/20 -34.67.112.0/20 -34.67.128.0/20 -34.67.144.0/20 -34.67.16.0/20 -34.67.160.0/20 -34.67.176.0/20 -34.67.192.0/20 -34.67.208.0/20 -34.67.224.0/20 -34.67.240.0/20 -34.67.32.0/20 -34.67.48.0/20 -34.67.64.0/20 -34.67.80.0/20 -34.67.96.0/20 -34.68.0.0/14 -34.68.0.0/20 -34.68.112.0/20 -34.68.128.0/20 -34.68.144.0/20 -34.68.16.0/20 -34.68.160.0/20 -34.68.176.0/20 -34.68.192.0/20 -34.68.208.0/20 -34.68.224.0/20 -34.68.240.0/20 -34.68.32.0/20 -34.68.48.0/20 -34.68.64.0/20 -34.68.80.0/20 -34.68.96.0/20 -34.69.0.0/20 -34.69.112.0/20 -34.69.128.0/20 -34.69.144.0/20 -34.69.16.0/20 -34.69.160.0/20 -34.69.176.0/20 -34.69.192.0/20 -34.69.208.0/20 -34.69.224.0/20 -34.69.240.0/20 -34.69.32.0/20 -34.69.48.0/20 -34.69.64.0/20 -34.69.80.0/20 -34.69.96.0/20 -34.70.0.0/20 -34.70.112.0/20 -34.70.128.0/20 -34.70.144.0/20 -34.70.16.0/20 -34.70.160.0/20 -34.70.176.0/20 -34.70.192.0/20 -34.70.208.0/20 -34.70.224.0/20 -34.70.240.0/20 -34.70.32.0/20 -34.70.48.0/20 -34.70.64.0/20 -34.70.80.0/20 -34.70.96.0/20 -34.71.0.0/20 -34.71.112.0/20 -34.71.128.0/20 -34.71.144.0/20 -34.71.16.0/20 -34.71.160.0/20 -34.71.176.0/20 -34.71.192.0/20 -34.71.208.0/20 -34.71.224.0/20 -34.71.240.0/20 -34.71.32.0/20 -34.71.48.0/20 -34.71.64.0/20 -34.71.80.0/20 -34.71.96.0/20 -34.72.0.0/14 -34.72.0.0/20 -34.72.112.0/20 -34.72.128.0/20 -34.72.144.0/20 -34.72.16.0/20 -34.72.160.0/20 -34.72.176.0/20 -34.72.192.0/20 -34.72.208.0/20 -34.72.224.0/20 -34.72.240.0/20 -34.72.32.0/20 -34.72.48.0/20 -34.72.64.0/20 -34.72.80.0/20 -34.72.96.0/20 -34.73.0.0/20 -34.73.112.0/20 -34.73.128.0/20 -34.73.144.0/20 -34.73.16.0/20 -34.73.160.0/20 -34.73.176.0/20 -34.73.192.0/20 -34.73.208.0/20 -34.73.224.0/20 -34.73.240.0/20 -34.73.32.0/20 -34.73.48.0/20 -34.73.64.0/20 -34.73.80.0/20 -34.73.96.0/20 -34.74.0.0/20 -34.74.112.0/20 -34.74.128.0/20 -34.74.144.0/20 -34.74.16.0/20 -34.74.160.0/20 -34.74.176.0/20 -34.74.192.0/20 -34.74.208.0/20 -34.74.224.0/20 -34.74.240.0/20 -34.74.32.0/20 -34.74.48.0/20 -34.74.64.0/20 -34.74.80.0/20 -34.74.96.0/20 -34.75.0.0/20 -34.75.112.0/20 -34.75.128.0/20 -34.75.144.0/20 -34.75.16.0/20 -34.75.160.0/20 -34.75.176.0/20 -34.75.192.0/20 -34.75.208.0/20 -34.75.224.0/20 -34.75.240.0/20 -34.75.32.0/20 -34.75.48.0/20 -34.75.64.0/20 -34.75.80.0/20 -34.75.96.0/20 -34.76.0.0/14 -34.76.0.0/20 -34.76.112.0/20 -34.76.128.0/20 -34.76.144.0/20 -34.76.16.0/20 -34.76.160.0/20 -34.76.176.0/20 -34.76.192.0/20 -34.76.208.0/20 -34.76.224.0/20 -34.76.240.0/20 -34.76.32.0/20 -34.76.48.0/20 -34.76.64.0/20 -34.76.80.0/20 -34.76.96.0/20 -34.77.0.0/20 -34.77.112.0/20 -34.77.128.0/20 -34.77.144.0/20 -34.77.16.0/20 -34.77.160.0/20 -34.77.176.0/20 -34.77.192.0/20 -34.77.208.0/20 -34.77.224.0/20 -34.77.240.0/20 -34.77.32.0/20 -34.77.48.0/20 -34.77.64.0/20 -34.77.80.0/20 -34.77.96.0/20 -34.78.0.0/20 -34.78.112.0/20 -34.78.128.0/20 -34.78.144.0/20 -34.78.16.0/20 -34.78.160.0/20 -34.78.176.0/20 -34.78.192.0/20 -34.78.208.0/20 -34.78.224.0/20 -34.78.240.0/20 -34.78.32.0/20 -34.78.48.0/20 -34.78.64.0/20 -34.78.80.0/20 -34.78.96.0/20 -34.79.0.0/20 -34.79.112.0/20 -34.79.128.0/20 -34.79.144.0/20 -34.79.16.0/20 -34.79.160.0/20 -34.79.176.0/20 -34.79.192.0/20 -34.79.208.0/20 -34.79.224.0/20 -34.79.240.0/20 -34.79.32.0/20 -34.79.48.0/20 -34.79.64.0/20 -34.79.80.0/20 -34.79.96.0/20 -34.8.0.0/13 -34.80.0.0/12 -34.80.0.0/14 -34.80.0.0/20 -34.80.112.0/20 -34.80.128.0/20 -34.80.144.0/20 -34.80.16.0/20 -34.80.160.0/20 -34.80.176.0/20 -34.80.192.0/20 -34.80.208.0/20 -34.80.224.0/20 -34.80.240.0/20 -34.80.32.0/20 -34.80.48.0/20 -34.80.64.0/20 -34.80.80.0/20 -34.80.96.0/20 -34.81.0.0/20 -34.81.112.0/20 -34.81.128.0/20 -34.81.144.0/20 -34.81.16.0/20 -34.81.160.0/20 -34.81.176.0/20 -34.81.192.0/20 -34.81.208.0/20 -34.81.224.0/20 -34.81.240.0/20 -34.81.32.0/20 -34.81.48.0/20 -34.81.64.0/20 -34.81.80.0/20 -34.81.96.0/20 -34.82.0.0/20 -34.82.112.0/20 -34.82.128.0/20 -34.82.144.0/20 -34.82.16.0/20 -34.82.160.0/20 -34.82.176.0/20 -34.82.192.0/20 -34.82.208.0/20 -34.82.224.0/20 -34.82.240.0/20 -34.82.32.0/20 -34.82.48.0/20 -34.82.64.0/20 -34.82.80.0/20 -34.82.96.0/20 -34.83.0.0/20 -34.83.112.0/20 -34.83.128.0/20 -34.83.144.0/20 -34.83.16.0/20 -34.83.160.0/20 -34.83.176.0/20 -34.83.192.0/20 -34.83.208.0/20 -34.83.224.0/20 -34.83.240.0/20 -34.83.32.0/20 -34.83.48.0/20 -34.83.64.0/20 -34.83.80.0/20 -34.83.96.0/20 -34.84.0.0/14 -34.84.0.0/20 -34.84.112.0/20 -34.84.128.0/20 -34.84.144.0/20 -34.84.16.0/20 -34.84.160.0/20 -34.84.176.0/20 -34.84.192.0/20 -34.84.208.0/20 -34.84.224.0/20 -34.84.240.0/20 -34.84.32.0/20 -34.84.48.0/20 -34.84.64.0/20 -34.84.80.0/20 -34.84.96.0/20 -34.85.0.0/20 -34.85.112.0/20 -34.85.128.0/20 -34.85.144.0/20 -34.85.16.0/20 -34.85.160.0/20 -34.85.176.0/20 -34.85.192.0/20 -34.85.208.0/20 -34.85.224.0/20 -34.85.240.0/20 -34.85.32.0/20 -34.85.48.0/20 -34.85.64.0/20 -34.85.80.0/20 -34.85.96.0/20 -34.86.0.0/20 -34.86.112.0/20 -34.86.128.0/20 -34.86.144.0/20 -34.86.16.0/20 -34.86.160.0/20 -34.86.176.0/20 -34.86.192.0/20 -34.86.208.0/20 -34.86.224.0/20 -34.86.240.0/20 -34.86.32.0/20 -34.86.48.0/20 -34.86.64.0/20 -34.86.80.0/20 -34.86.96.0/20 -34.87.0.0/20 -34.87.112.0/20 -34.87.128.0/20 -34.87.144.0/20 -34.87.16.0/20 -34.87.160.0/20 -34.87.176.0/20 -34.87.192.0/20 -34.87.208.0/20 -34.87.224.0/20 -34.87.240.0/20 -34.87.32.0/20 -34.87.48.0/20 -34.87.64.0/20 -34.87.80.0/20 -34.87.96.0/20 -34.88.0.0/14 -34.88.0.0/20 -34.88.112.0/20 -34.88.128.0/20 -34.88.144.0/20 -34.88.16.0/20 -34.88.160.0/20 -34.88.176.0/20 -34.88.192.0/20 -34.88.208.0/20 -34.88.224.0/20 -34.88.240.0/20 -34.88.32.0/20 -34.88.48.0/20 -34.88.64.0/20 -34.88.80.0/20 -34.88.96.0/20 -34.89.0.0/20 -34.89.112.0/20 -34.89.128.0/20 -34.89.144.0/20 -34.89.16.0/20 -34.89.160.0/20 -34.89.176.0/20 -34.89.192.0/20 -34.89.208.0/20 -34.89.224.0/20 -34.89.240.0/20 -34.89.32.0/20 -34.89.48.0/20 -34.89.64.0/20 -34.89.80.0/20 -34.89.96.0/20 -34.90.0.0/20 -34.90.112.0/20 -34.90.128.0/20 -34.90.144.0/20 -34.90.16.0/20 -34.90.160.0/20 -34.90.176.0/20 -34.90.192.0/20 -34.90.208.0/20 -34.90.224.0/20 -34.90.240.0/20 -34.90.32.0/20 -34.90.48.0/20 -34.90.64.0/20 -34.90.80.0/20 -34.90.96.0/20 -34.91.0.0/20 -34.91.112.0/20 -34.91.128.0/20 -34.91.144.0/20 -34.91.16.0/20 -34.91.160.0/20 -34.91.176.0/20 -34.91.192.0/20 -34.91.208.0/20 -34.91.224.0/20 -34.91.240.0/20 -34.91.32.0/20 -34.91.48.0/20 -34.91.64.0/20 -34.91.80.0/20 -34.91.96.0/20 -34.92.0.0/14 -34.92.0.0/16 -34.93.0.0/20 -34.93.112.0/20 -34.93.128.0/20 -34.93.144.0/20 -34.93.16.0/20 -34.93.160.0/20 -34.93.176.0/20 -34.93.192.0/20 -34.93.208.0/20 -34.93.224.0/20 -34.93.240.0/20 -34.93.32.0/20 -34.93.48.0/20 -34.93.64.0/20 -34.93.80.0/20 -34.93.96.0/20 -34.94.0.0/20 -34.94.112.0/20 -34.94.128.0/20 -34.94.144.0/20 -34.94.16.0/20 -34.94.160.0/20 -34.94.176.0/20 -34.94.192.0/20 -34.94.208.0/20 -34.94.224.0/20 -34.94.240.0/20 -34.94.32.0/20 -34.94.48.0/20 -34.94.64.0/20 -34.94.80.0/20 -34.94.96.0/20 -34.95.0.0/20 -34.95.128.0/20 -34.95.144.0/20 -34.95.16.0/20 -34.95.160.0/20 -34.95.176.0/20 -34.95.192.0/20 -34.95.208.0/20 -34.95.224.0/20 -34.95.240.0/20 -34.95.32.0/20 -34.95.48.0/20 -34.96.0.0/12 -34.96.0.0/14 -34.96.0.0/20 -34.96.128.0/20 -34.96.144.0/20 -34.96.16.0/20 -34.96.160.0/20 -34.96.176.0/20 -34.96.192.0/20 -34.96.208.0/20 -34.96.224.0/20 -34.96.240.0/20 -34.97.0.0/20 -34.97.112.0/20 -34.97.128.0/20 -34.97.144.0/20 -34.97.16.0/20 -34.97.160.0/20 -34.97.176.0/20 -34.97.192.0/20 -34.97.208.0/20 -34.97.224.0/20 -34.97.240.0/20 -34.97.32.0/20 -34.97.48.0/20 -34.97.64.0/20 -34.97.80.0/20 -34.97.96.0/20 -34.98.0.0/20 -34.98.128.0/21 -34.98.152.0/22 -34.98.156.0/22 -34.98.16.0/20 -34.98.160.0/20 -34.98.176.0/20 -34.98.192.0/20 -34.98.208.0/20 -34.98.224.0/20 -34.98.240.0/20 -34.98.32.0/20 -34.98.48.0/20 -34.99.0.0/20 -34.99.112.0/20 -34.99.128.0/20 -34.99.144.0/20 -34.99.16.0/20 -34.99.160.0/20 -34.99.176.0/20 -34.99.192.0/20 -34.99.208.0/20 -34.99.224.0/20 -34.99.240.0/20 -34.99.32.0/20 -34.99.48.0/20 -34.99.64.0/20 -34.99.80.0/21 -34.99.88.0/21 -34.99.96.0/20 -35.184.0.0/13 -35.184.0.0/19 -35.184.0.0/20 -35.184.112.0/20 -35.184.128.0/19 -35.184.128.0/20 -35.184.144.0/20 -35.184.16.0/20 -35.184.160.0/19 -35.184.160.0/20 -35.184.176.0/20 -35.184.192.0/19 -35.184.192.0/20 -35.184.208.0/20 -35.184.224.0/19 -35.184.224.0/20 -35.184.240.0/20 -35.184.32.0/19 -35.184.32.0/20 -35.184.48.0/20 -35.184.64.0/19 -35.184.64.0/20 -35.184.80.0/20 -35.184.96.0/19 -35.184.96.0/20 -35.185.0.0/19 -35.185.0.0/20 -35.185.112.0/20 -35.185.128.0/19 -35.185.128.0/20 -35.185.144.0/20 -35.185.16.0/20 -35.185.160.0/19 -35.185.160.0/20 -35.185.176.0/20 -35.185.192.0/19 -35.185.192.0/20 -35.185.208.0/20 -35.185.224.0/19 -35.185.224.0/20 -35.185.240.0/20 -35.185.32.0/19 -35.185.32.0/20 -35.185.48.0/20 -35.185.64.0/19 -35.185.64.0/20 -35.185.80.0/20 -35.185.96.0/19 -35.185.96.0/20 -35.186.0.0/16 -35.186.0.0/19 -35.186.0.0/20 -35.186.112.0/20 -35.186.128.0/19 -35.186.128.0/20 -35.186.144.0/20 -35.186.16.0/20 -35.186.160.0/19 -35.186.160.0/20 -35.186.176.0/20 -35.186.32.0/19 -35.186.32.0/20 -35.186.48.0/20 -35.186.64.0/19 -35.186.64.0/20 -35.186.80.0/20 -35.186.96.0/19 -35.186.96.0/20 -35.187.0.0/19 -35.187.0.0/20 -35.187.112.0/20 -35.187.128.0/19 -35.187.144.0/20 -35.187.16.0/20 -35.187.160.0/19 -35.187.160.0/20 -35.187.176.0/20 -35.187.192.0/19 -35.187.192.0/20 -35.187.208.0/20 -35.187.224.0/19 -35.187.224.0/20 -35.187.240.0/20 -35.187.32.0/19 -35.187.32.0/20 -35.187.48.0/20 -35.187.64.0/19 -35.187.64.0/20 -35.187.80.0/20 -35.187.96.0/19 -35.187.96.0/20 -35.188.0.0/19 -35.188.0.0/20 -35.188.112.0/20 -35.188.128.0/19 -35.188.128.0/20 -35.188.144.0/20 -35.188.16.0/20 -35.188.160.0/19 -35.188.160.0/20 -35.188.176.0/20 -35.188.192.0/19 -35.188.192.0/20 -35.188.208.0/20 -35.188.224.0/19 -35.188.224.0/20 -35.188.240.0/20 -35.188.32.0/19 -35.188.32.0/20 -35.188.48.0/20 -35.188.64.0/19 -35.188.64.0/20 -35.188.80.0/20 -35.188.96.0/19 -35.188.96.0/20 -35.189.0.0/19 -35.189.0.0/20 -35.189.112.0/20 -35.189.128.0/19 -35.189.128.0/20 -35.189.144.0/20 -35.189.16.0/20 -35.189.160.0/19 -35.189.160.0/20 -35.189.176.0/20 -35.189.192.0/19 -35.189.192.0/20 -35.189.208.0/20 -35.189.224.0/19 -35.189.224.0/20 -35.189.240.0/20 -35.189.32.0/19 -35.189.32.0/20 -35.189.48.0/20 -35.189.64.0/19 -35.189.64.0/20 -35.189.80.0/20 -35.189.96.0/19 -35.189.96.0/20 -35.190.0.0/16 -35.190.128.0/19 -35.190.128.0/20 -35.190.144.0/20 -35.190.160.0/19 -35.190.160.0/20 -35.190.176.0/20 -35.190.192.0/19 -35.190.192.0/20 -35.190.208.0/20 -35.190.224.0/19 -35.190.224.0/20 -35.190.240.0/23 -35.190.242.0/23 -35.190.244.0/23 -35.190.246.0/23 -35.192.0.0/14 -35.192.0.0/20 -35.192.112.0/20 -35.192.128.0/20 -35.192.144.0/20 -35.192.16.0/20 -35.192.160.0/20 -35.192.176.0/20 -35.192.192.0/20 -35.192.208.0/20 -35.192.224.0/20 -35.192.240.0/20 -35.192.32.0/20 -35.192.48.0/20 -35.192.64.0/20 -35.192.80.0/20 -35.192.96.0/20 -35.193.0.0/20 -35.193.112.0/20 -35.193.128.0/20 -35.193.144.0/20 -35.193.16.0/20 -35.193.160.0/20 -35.193.176.0/20 -35.193.192.0/20 -35.193.208.0/20 -35.193.224.0/20 -35.193.240.0/20 -35.193.32.0/20 -35.193.48.0/20 -35.193.64.0/20 -35.193.80.0/20 -35.193.96.0/20 -35.194.0.0/20 -35.194.112.0/20 -35.194.128.0/20 -35.194.144.0/20 -35.194.16.0/20 -35.194.160.0/20 -35.194.176.0/20 -35.194.192.0/20 -35.194.208.0/20 -35.194.224.0/20 -35.194.240.0/20 -35.194.32.0/20 -35.194.48.0/20 -35.194.64.0/20 -35.194.80.0/20 -35.194.96.0/20 -35.195.0.0/20 -35.195.112.0/20 -35.195.128.0/20 -35.195.144.0/20 -35.195.16.0/20 -35.195.160.0/20 -35.195.176.0/20 -35.195.192.0/20 -35.195.208.0/20 -35.195.224.0/20 -35.195.240.0/20 -35.195.32.0/20 -35.195.48.0/20 -35.195.64.0/20 -35.195.80.0/20 -35.195.96.0/20 -35.196.0.0/15 -35.196.0.0/20 -35.196.112.0/20 -35.196.128.0/20 -35.196.144.0/20 -35.196.16.0/20 -35.196.160.0/20 -35.196.176.0/20 -35.196.192.0/20 -35.196.208.0/20 -35.196.224.0/20 -35.196.240.0/20 -35.196.32.0/20 -35.196.48.0/20 -35.196.64.0/20 -35.196.80.0/20 -35.196.96.0/20 -35.197.0.0/20 -35.197.112.0/20 -35.197.128.0/20 -35.197.144.0/20 -35.197.16.0/20 -35.197.160.0/20 -35.197.176.0/20 -35.197.192.0/20 -35.197.208.0/20 -35.197.224.0/20 -35.197.240.0/20 -35.197.32.0/20 -35.197.48.0/20 -35.197.64.0/20 -35.197.80.0/20 -35.197.96.0/20 -35.198.0.0/16 -35.198.0.0/20 -35.198.112.0/20 -35.198.128.0/20 -35.198.144.0/20 -35.198.16.0/20 -35.198.160.0/20 -35.198.176.0/20 -35.198.192.0/20 -35.198.208.0/20 -35.198.224.0/20 -35.198.240.0/20 -35.198.32.0/20 -35.198.48.0/20 -35.198.64.0/20 -35.198.80.0/20 -35.198.96.0/20 -35.199.0.0/17 -35.199.0.0/20 -35.199.112.0/20 -35.199.128.0/18 -35.199.128.0/20 -35.199.144.0/20 -35.199.16.0/20 -35.199.160.0/20 -35.199.176.0/20 -35.199.32.0/20 -35.199.48.0/20 -35.199.64.0/20 -35.199.80.0/20 -35.199.96.0/20 -35.200.0.0/14 -35.200.0.0/15 -35.200.0.0/20 -35.200.112.0/20 -35.200.128.0/20 -35.200.144.0/20 -35.200.16.0/20 -35.200.160.0/20 -35.200.176.0/20 -35.200.192.0/20 -35.200.208.0/20 -35.200.224.0/20 -35.200.240.0/20 -35.200.32.0/20 -35.200.48.0/20 -35.200.64.0/20 -35.200.80.0/20 -35.200.96.0/20 -35.201.0.0/20 -35.201.128.0/20 -35.201.144.0/20 -35.201.16.0/20 -35.201.160.0/20 -35.201.176.0/20 -35.201.192.0/20 -35.201.208.0/20 -35.201.224.0/20 -35.201.240.0/20 -35.201.32.0/24 -35.201.33.0/24 -35.201.34.0/24 -35.201.35.0/24 -35.201.36.0/24 -35.201.37.0/24 -35.201.38.0/24 -35.201.39.0/24 -35.201.40.0/24 -35.201.41.0/24 -35.201.42.0/24 -35.201.43.0/24 -35.201.44.0/24 -35.201.45.0/24 -35.201.46.0/24 -35.201.47.0/24 -35.202.0.0/15 -35.202.0.0/20 -35.202.112.0/20 -35.202.128.0/20 -35.202.144.0/20 -35.202.16.0/20 -35.202.160.0/20 -35.202.176.0/20 -35.202.192.0/20 -35.202.208.0/20 -35.202.224.0/20 -35.202.240.0/20 -35.202.32.0/20 -35.202.48.0/20 -35.202.64.0/20 -35.202.80.0/20 -35.202.96.0/20 -35.203.0.0/20 -35.203.112.0/20 -35.203.128.0/20 -35.203.144.0/20 -35.203.16.0/20 -35.203.160.0/20 -35.203.176.0/20 -35.203.192.0/20 -35.203.208.0/24 -35.203.209.0/24 -35.203.210.0/24 -35.203.211.0/24 -35.203.212.0/24 -35.203.213.0/24 -35.203.214.0/24 -35.203.215.0/24 -35.203.216.0/24 -35.203.217.0/24 -35.203.218.0/24 -35.203.219.0/24 -35.203.220.0/24 -35.203.221.0/24 -35.203.222.0/24 -35.203.223.0/24 -35.203.224.0/23 -35.203.224.0/24 -35.203.225.0/24 -35.203.226.0/23 -35.203.228.0/23 -35.203.230.0/24 -35.203.232.0/21 -35.203.32.0/20 -35.203.48.0/20 -35.203.64.0/20 -35.203.80.0/20 -35.203.96.0/20 -35.204.0.0/15 -35.204.0.0/20 -35.204.112.0/20 -35.204.128.0/20 -35.204.144.0/20 -35.204.16.0/20 -35.204.160.0/20 -35.204.176.0/20 -35.204.192.0/20 -35.204.208.0/20 -35.204.224.0/20 -35.204.240.0/20 -35.204.32.0/20 -35.204.48.0/20 -35.204.64.0/20 -35.204.80.0/20 -35.204.96.0/20 -35.205.0.0/20 -35.205.112.0/20 -35.205.128.0/20 -35.205.144.0/20 -35.205.16.0/20 -35.205.160.0/20 -35.205.176.0/20 -35.205.192.0/20 -35.205.208.0/20 -35.205.224.0/20 -35.205.240.0/20 -35.205.32.0/20 -35.205.48.0/20 -35.205.64.0/20 -35.205.80.0/20 -35.205.96.0/20 -35.206.0.0/24 -35.206.1.0/24 -35.206.128.0/18 -35.206.192.0/18 -35.206.2.0/24 -35.206.3.0/24 -35.206.32.0/19 -35.206.4.0/24 -35.206.5.0/24 -35.206.6.0/24 -35.206.64.0/18 -35.206.9.0/24 -35.207.0.0/18 -35.207.128.0/18 -35.207.64.0/18 -35.208.0.0/15 -35.210.0.0/16 -35.211.0.0/16 -35.212.0.0/17 -35.212.128.0/17 -35.213.0.0/17 -35.213.128.0/18 -35.213.192.0/18 -35.214.0.0/17 -35.214.128.0/17 -35.215.0.0/18 -35.215.128.0/18 -35.215.192.0/18 -35.215.64.0/18 -35.216.0.0/17 -35.216.128.0/17 -35.217.0.0/18 -35.217.128.0/17 -35.217.64.0/18 -35.219.0.0/17 -35.219.128.0/18 -35.219.224.0/19 -35.220.0.0/14 -35.220.128.0/20 -35.220.144.0/20 -35.220.160.0/20 -35.220.176.0/20 -35.220.192.0/20 -35.220.208.0/20 -35.220.224.0/20 -35.220.240.0/20 -35.221.0.0/20 -35.221.112.0/20 -35.221.128.0/20 -35.221.144.0/20 -35.221.16.0/20 -35.221.160.0/20 -35.221.176.0/20 -35.221.192.0/20 -35.221.208.0/20 -35.221.224.0/20 -35.221.240.0/20 -35.221.32.0/20 -35.221.48.0/20 -35.221.64.0/20 -35.221.80.0/20 -35.221.96.0/20 -35.222.0.0/21 -35.222.104.0/21 -35.222.112.0/21 -35.222.120.0/21 -35.222.128.0/21 -35.222.136.0/21 -35.222.144.0/21 -35.222.152.0/21 -35.222.16.0/21 -35.222.160.0/21 -35.222.168.0/21 -35.222.176.0/21 -35.222.184.0/21 -35.222.192.0/21 -35.222.200.0/21 -35.222.208.0/21 -35.222.216.0/21 -35.222.224.0/21 -35.222.232.0/21 -35.222.24.0/21 -35.222.240.0/21 -35.222.248.0/21 -35.222.32.0/21 -35.222.40.0/21 -35.222.48.0/21 -35.222.56.0/21 -35.222.64.0/21 -35.222.72.0/21 -35.222.8.0/21 -35.222.80.0/21 -35.222.88.0/21 -35.222.96.0/21 -35.223.0.0/20 -35.223.112.0/20 -35.223.128.0/20 -35.223.144.0/20 -35.223.16.0/20 -35.223.160.0/20 -35.223.176.0/20 -35.223.192.0/20 -35.223.208.0/20 -35.223.224.0/20 -35.223.240.0/20 -35.223.32.0/20 -35.223.48.0/20 -35.223.64.0/20 -35.223.80.0/20 -35.223.96.0/20 -35.224.0.0/14 -35.224.0.0/20 -35.224.112.0/20 -35.224.128.0/20 -35.224.144.0/20 -35.224.16.0/20 -35.224.160.0/20 -35.224.176.0/20 -35.224.192.0/20 -35.224.208.0/20 -35.224.224.0/20 -35.224.240.0/20 -35.224.32.0/20 -35.224.48.0/20 -35.224.64.0/20 -35.224.80.0/20 -35.224.96.0/20 -35.225.0.0/20 -35.225.112.0/20 -35.225.128.0/20 -35.225.144.0/20 -35.225.16.0/20 -35.225.160.0/20 -35.225.176.0/20 -35.225.192.0/20 -35.225.208.0/20 -35.225.224.0/20 -35.225.240.0/20 -35.225.32.0/20 -35.225.48.0/20 -35.225.64.0/20 -35.225.80.0/20 -35.225.96.0/20 -35.226.0.0/20 -35.226.112.0/20 -35.226.128.0/20 -35.226.144.0/20 -35.226.16.0/20 -35.226.160.0/20 -35.226.176.0/20 -35.226.192.0/20 -35.226.208.0/20 -35.226.224.0/20 -35.226.240.0/20 -35.226.32.0/20 -35.226.48.0/20 -35.226.64.0/20 -35.226.80.0/20 -35.226.96.0/20 -35.227.0.0/16 -35.227.0.0/20 -35.227.112.0/20 -35.227.128.0/20 -35.227.144.0/20 -35.227.16.0/20 -35.227.160.0/20 -35.227.176.0/20 -35.227.32.0/20 -35.227.48.0/20 -35.227.64.0/20 -35.227.80.0/20 -35.227.96.0/20 -35.228.0.0/14 -35.228.0.0/20 -35.228.112.0/20 -35.228.128.0/20 -35.228.144.0/20 -35.228.16.0/20 -35.228.160.0/20 -35.228.176.0/20 -35.228.192.0/20 -35.228.208.0/20 -35.228.224.0/20 -35.228.240.0/20 -35.228.32.0/20 -35.228.48.0/20 -35.228.64.0/20 -35.228.80.0/20 -35.228.96.0/20 -35.229.0.0/20 -35.229.112.0/20 -35.229.128.0/17 -35.229.16.0/20 -35.229.32.0/20 -35.229.48.0/20 -35.229.64.0/20 -35.229.80.0/20 -35.229.96.0/20 -35.230.0.0/16 -35.230.0.0/17 -35.230.128.0/19 -35.230.160.0/19 -35.230.196.0/22 -35.230.200.0/22 -35.230.204.0/24 -35.230.205.0/24 -35.230.206.0/24 -35.230.207.0/24 -35.230.208.0/22 -35.230.212.0/22 -35.230.216.0/21 -35.230.224.0/21 -35.230.240.0/20 -35.231.0.0/17 -35.231.128.0/17 -35.232.0.0/14 -35.232.0.0/16 -35.233.0.0/17 -35.233.128.0/17 -35.234.0.0/18 -35.234.128.0/19 -35.234.160.0/20 -35.234.176.0/20 -35.234.192.0/20 -35.234.208.0/20 -35.234.224.0/20 -35.234.240.0/20 -35.234.64.0/18 -35.235.0.0/16 -35.235.0.0/20 -35.235.128.0/20 -35.235.144.0/20 -35.235.16.0/20 -35.235.162.0/24 -35.235.163.0/24 -35.235.192.0/21 -35.235.200.0/21 -35.235.208.0/22 -35.235.216.0/21 -35.235.224.0/23 -35.235.226.0/23 -35.235.228.0/23 -35.235.230.0/23 -35.235.32.0/20 -35.235.48.0/20 -35.235.64.0/18 -35.236.0.0/14 -35.236.0.0/17 -35.236.128.0/20 -35.236.144.0/20 -35.236.160.0/20 -35.236.176.0/20 -35.236.192.0/20 -35.236.208.0/20 -35.236.224.0/20 -35.236.240.0/20 -35.237.0.0/16 -35.238.0.0/20 -35.238.112.0/20 -35.238.128.0/20 -35.238.144.0/20 -35.238.16.0/20 -35.238.160.0/20 -35.238.176.0/20 -35.238.192.0/20 -35.238.208.0/20 -35.238.224.0/20 -35.238.240.0/20 -35.238.32.0/20 -35.238.48.0/20 -35.238.64.0/20 -35.238.80.0/20 -35.238.96.0/20 -35.239.0.0/20 -35.239.112.0/20 -35.239.128.0/20 -35.239.144.0/20 -35.239.16.0/20 -35.239.160.0/20 -35.239.176.0/20 -35.239.192.0/20 -35.239.208.0/20 -35.239.224.0/20 -35.239.240.0/20 -35.239.32.0/20 -35.239.48.0/20 -35.239.64.0/20 -35.239.80.0/20 -35.239.96.0/20 -35.240.0.0/14 -35.240.0.0/20 -35.240.112.0/20 -35.240.128.0/20 -35.240.144.0/20 -35.240.16.0/20 -35.240.160.0/20 -35.240.176.0/20 -35.240.192.0/20 -35.240.208.0/20 -35.240.224.0/20 -35.240.240.0/20 -35.240.32.0/20 -35.240.48.0/20 -35.240.64.0/20 -35.240.80.0/20 -35.240.96.0/20 -35.241.0.0/16 -35.241.112.0/20 -35.241.128.0/20 -35.241.144.0/20 -35.241.160.0/20 -35.241.176.0/20 -35.241.192.0/20 -35.241.208.0/20 -35.241.224.0/20 -35.241.240.0/20 -35.241.64.0/20 -35.241.80.0/20 -35.241.96.0/20 -35.242.128.0/20 -35.242.144.0/20 -35.242.160.0/20 -35.242.176.0/20 -35.242.192.0/20 -35.242.208.0/20 -35.242.224.0/20 -35.242.240.0/20 -35.243.0.0/21 -35.243.112.0/20 -35.243.128.0/20 -35.243.144.0/20 -35.243.160.0/20 -35.243.176.0/20 -35.243.192.0/20 -35.243.208.0/20 -35.243.224.0/20 -35.243.240.0/20 -35.243.32.0/21 -35.243.40.0/21 -35.243.48.0/21 -35.243.56.0/21 -35.243.64.0/20 -35.243.8.0/21 -35.243.80.0/20 -35.243.96.0/20 -35.244.0.0/14 -35.244.0.0/16 -35.244.0.0/20 -35.244.112.0/20 -35.244.16.0/20 -35.244.32.0/20 -35.244.48.0/20 -35.244.64.0/20 -35.244.80.0/20 -35.244.96.0/20 -35.245.0.0/20 -35.245.112.0/20 -35.245.128.0/20 -35.245.144.0/20 -35.245.16.0/20 -35.245.160.0/20 -35.245.176.0/20 -35.245.192.0/20 -35.245.208.0/20 -35.245.224.0/20 -35.245.240.0/20 -35.245.32.0/20 -35.245.48.0/20 -35.245.64.0/20 -35.245.80.0/20 -35.245.96.0/20 -35.246.0.0/20 -35.246.112.0/20 -35.246.128.0/20 -35.246.144.0/20 -35.246.16.0/20 -35.246.160.0/20 -35.246.176.0/20 -35.246.192.0/20 -35.246.208.0/20 -35.246.224.0/20 -35.246.240.0/20 -35.246.32.0/20 -35.246.48.0/20 -35.246.64.0/20 -35.246.80.0/20 -35.246.96.0/20 -35.247.0.0/20 -35.247.112.0/20 -35.247.128.0/20 -35.247.144.0/20 -35.247.16.0/20 -35.247.160.0/20 -35.247.176.0/20 -35.247.192.0/20 -35.247.208.0/20 -35.247.224.0/20 -35.247.240.0/20 -35.247.32.0/20 -35.247.48.0/20 -35.247.64.0/20 -35.247.80.0/20 -35.247.96.0/20 -43.229.32.0/23 -43.231.13.0/24 -43.231.15.0/24 -45.128.172.0/24 -45.150.56.0/24 -45.159.34.0/24 -45.250.160.0/24 -45.66.81.0/24 -45.88.10.0/24 -45.91.254.0/24 -46.16.164.0/24 -46.16.166.0/24 -46.19.170.0/24 -46.235.152.0/21 -52.119.11.0/24 -63.141.158.0/24 -63.141.159.0/24 -64.15.112.0/20 -64.233.160.0/19 -64.233.160.0/24 -64.233.161.0/24 -64.233.162.0/24 -64.233.163.0/24 -64.233.164.0/24 -64.233.165.0/24 -64.233.166.0/24 -64.233.167.0/24 -64.233.168.0/24 -64.233.169.0/24 -64.233.170.0/24 -64.233.171.0/24 -64.233.172.0/23 -64.233.176.0/24 -64.233.177.0/24 -64.233.178.0/24 -64.233.179.0/24 -64.233.181.0/24 -64.233.182.0/24 -64.233.183.0/24 -64.233.184.0/24 -64.233.185.0/24 -64.233.186.0/24 -64.233.187.0/24 -64.233.188.0/24 -64.233.189.0/24 -64.233.190.0/24 -64.233.191.0/24 -64.6.19.0/24 -64.9.224.0/23 -64.9.224.0/24 -64.9.225.0/24 -64.9.228.0/23 -64.9.228.0/24 -64.9.229.0/24 -64.9.236.0/22 -64.9.244.0/22 -64.9.248.0/22 -64.9.252.0/22 -66.102.0.0/20 -66.102.0.0/24 -66.102.1.0/24 -66.102.2.0/24 -66.102.3.0/24 -66.102.4.0/24 -66.102.8.0/23 -66.159.192.0/19 -66.170.109.0/24 -66.22.228.0/24 -66.22.229.0/24 -66.249.64.0/19 -66.249.64.0/20 -66.249.80.0/22 -66.249.84.0/23 -66.249.88.0/24 -67.199.248.0/24 -69.48.232.0/24 -70.32.128.0/19 -70.32.128.0/24 -70.32.129.0/24 -70.32.131.0/24 -70.32.140.0/24 -70.32.141.0/24 -70.32.142.0/24 -70.32.143.0/24 -70.32.145.0/24 -70.32.148.0/24 -70.32.149.0/24 -70.32.150.0/24 -70.32.152.0/23 -70.32.154.0/24 -70.32.155.0/24 -70.32.156.0/24 -70.32.157.0/24 -70.32.158.0/24 -70.32.159.0/24 -72.14.192.0/18 -74.112.186.0/24 -74.112.187.0/24 -74.120.14.0/24 -74.125.0.0/16 -74.125.0.0/20 -74.125.124.0/24 -74.125.125.0/24 -74.125.126.0/24 -74.125.127.0/24 -74.125.128.0/24 -74.125.129.0/24 -74.125.130.0/24 -74.125.131.0/24 -74.125.132.0/24 -74.125.133.0/24 -74.125.134.0/24 -74.125.135.0/24 -74.125.136.0/24 -74.125.137.0/24 -74.125.138.0/24 -74.125.139.0/24 -74.125.140.0/24 -74.125.141.0/24 -74.125.142.0/24 -74.125.143.0/24 -74.125.152.0/21 -74.125.176.0/20 -74.125.192.0/24 -74.125.193.0/24 -74.125.194.0/24 -74.125.195.0/24 -74.125.196.0/24 -74.125.197.0/24 -74.125.198.0/24 -74.125.199.0/24 -74.125.20.0/24 -74.125.200.0/24 -74.125.201.0/24 -74.125.202.0/24 -74.125.203.0/24 -74.125.204.0/24 -74.125.205.0/24 -74.125.206.0/24 -74.125.207.0/24 -74.125.21.0/24 -74.125.22.0/24 -74.125.225.0/24 -74.125.226.0/24 -74.125.227.0/24 -74.125.228.0/24 -74.125.23.0/24 -74.125.230.0/24 -74.125.232.0/24 -74.125.234.0/24 -74.125.235.0/24 -74.125.236.0/24 -74.125.238.0/24 -74.125.24.0/24 -74.125.25.0/24 -74.125.250.0/24 -74.125.26.0/24 -74.125.28.0/24 -74.125.29.0/24 -74.125.31.0/24 -74.125.38.0/24 -74.125.39.0/24 -74.125.44.0/22 -74.125.6.0/24 -74.125.64.0/24 -74.125.65.0/24 -74.125.66.0/24 -74.125.68.0/24 -74.125.69.0/24 -74.125.70.0/24 -74.125.71.0/24 -74.125.72.0/22 -74.221.128.0/24 -74.51.254.0/24 -80.91.225.0/24 -85.208.67.0/24 -85.208.98.0/24 -87.238.241.0/24 -89.207.224.0/24 -89.207.228.0/24 -89.207.229.0/24 -89.207.231.0/24 -91.197.141.0/24 -91.199.181.0/24 -91.241.14.0/24 -92.119.244.0/24 -92.119.245.0/24 -92.119.246.0/24 -98.158.240.0/20 -98.98.157.0/24 -101.102.103.0/24 -103.10.108.0/24 -103.101.215.0/24 -103.123.131.0/24 -103.125.224.0/24 -103.141.214.0/24 -103.157.55.0/24 -103.165.152.0/24 -103.165.153.0/24 -103.169.213.0/24 -103.177.50.0/23 -103.20.245.0/24 -103.224.174.0/24 -103.230.57.0/24 -103.232.218.0/24 -103.242.79.0/24 -103.246.36.0/22 -103.56.211.0/24 -103.73.115.0/24 -103.9.96.0/22 -104.132.0.0/14 -104.132.114.0/24 -104.132.117.0/24 -104.132.118.0/24 -104.132.119.0/24 -104.132.124.0/24 -104.132.133.0/24 -104.132.140.0/24 -104.132.142.0/24 -104.132.146.0/24 -104.132.153.0/24 -104.132.154.0/24 -104.132.162.0/24 -104.132.169.0/24 -104.132.179.0/24 -104.132.185.0/24 -104.132.186.0/24 -104.132.191.0/24 -104.132.207.0/24 -104.132.213.0/24 -104.132.214.0/24 -104.132.215.0/24 -104.132.222.0/24 -104.132.25.0/24 -104.132.31.0/24 -104.132.37.0/24 -104.132.38.0/24 -104.132.40.0/24 -104.132.42.0/24 -104.132.57.0/24 -104.132.59.0/24 -104.132.6.0/24 -104.132.61.0/24 -104.132.62.0/24 -104.132.72.0/24 -104.133.128.0/23 -104.133.5.0/24 -104.133.6.0/24 -104.133.7.0/24 -104.134.131.0/24 -104.134.137.0/24 -104.134.138.0/24 -104.134.139.0/24 -104.134.140.0/24 -104.134.147.0/24 -104.134.151.0/24 -104.134.152.0/24 -104.134.153.0/24 -104.134.154.0/24 -104.134.156.0/24 -104.134.157.0/24 -104.134.158.0/24 -104.134.159.0/24 -104.134.160.0/23 -104.134.162.0/24 -104.134.163.0/24 -104.134.164.0/24 -104.134.166.0/24 -104.134.167.0/24 -104.134.168.0/24 -104.134.169.0/24 -104.134.170.0/24 -104.134.172.0/24 -104.134.176.0/24 -104.134.177.0/24 -104.134.179.0/24 -104.134.180.0/24 -104.134.185.0/24 -104.134.188.0/24 -104.134.191.0/24 -104.134.196.0/24 -104.134.200.0/24 -104.134.203.0/24 -104.134.206.0/24 -104.134.207.0/24 -104.134.210.0/24 -104.134.211.0/24 -104.134.212.0/24 -104.134.217.0/24 -104.134.232.0/24 -104.134.233.0/24 -104.134.236.0/24 -104.134.237.0/24 -104.134.70.0/23 -104.134.71.0/24 -104.135.192.0/20 -104.135.200.0/24 -104.135.204.0/23 -104.135.208.0/20 -104.135.216.0/24 -104.135.220.0/23 -104.135.253.0/24 -104.135.254.0/24 -104.154.0.0/15 -104.154.0.0/19 -104.154.0.0/20 -104.154.112.0/24 -104.154.113.0/24 -104.154.114.0/24 -104.154.115.0/24 -104.154.116.0/24 -104.154.117.0/24 -104.154.118.0/24 -104.154.119.0/24 -104.154.120.0/24 -104.154.121.0/24 -104.154.122.0/24 -104.154.123.0/24 -104.154.126.0/23 -104.154.128.0/19 -104.154.128.0/20 -104.154.144.0/20 -104.154.16.0/20 -104.154.160.0/19 -104.154.160.0/20 -104.154.176.0/20 -104.154.192.0/19 -104.154.192.0/20 -104.154.208.0/20 -104.154.224.0/19 -104.154.224.0/20 -104.154.240.0/20 -104.154.32.0/19 -104.154.32.0/20 -104.154.48.0/20 -104.154.64.0/19 -104.154.64.0/20 -104.154.80.0/20 -104.154.96.0/19 -104.154.96.0/20 -104.155.0.0/19 -104.155.0.0/20 -104.155.112.0/20 -104.155.128.0/19 -104.155.128.0/20 -104.155.144.0/20 -104.155.16.0/20 -104.155.160.0/19 -104.155.160.0/20 -104.155.176.0/20 -104.155.192.0/19 -104.155.192.0/20 -104.155.208.0/20 -104.155.224.0/19 -104.155.224.0/20 -104.155.240.0/20 -104.155.32.0/19 -104.155.32.0/20 -104.155.48.0/20 -104.155.64.0/19 -104.155.64.0/20 -104.155.80.0/20 -104.155.96.0/19 -104.155.96.0/20 -104.195.120.0/22 -104.195.127.0/24 -104.196.0.0/14 -104.196.0.0/19 -104.196.0.0/20 -104.196.112.0/20 -104.196.128.0/19 -104.196.128.0/20 -104.196.144.0/20 -104.196.16.0/20 -104.196.160.0/19 -104.196.160.0/20 -104.196.176.0/20 -104.196.192.0/19 -104.196.192.0/20 -104.196.208.0/20 -104.196.224.0/19 -104.196.224.0/20 -104.196.240.0/20 -104.196.32.0/19 -104.196.32.0/20 -104.196.48.0/20 -104.196.64.0/19 -104.196.64.0/24 -104.196.65.0/24 -104.196.66.0/24 -104.196.67.0/24 -104.196.68.0/24 -104.196.69.0/24 -104.196.70.0/24 -104.196.71.0/24 -104.196.72.0/24 -104.196.73.0/24 -104.196.74.0/24 -104.196.75.0/24 -104.196.76.0/24 -104.196.77.0/24 -104.196.78.0/24 -104.196.79.0/24 -104.196.80.0/20 -104.196.96.0/19 -104.196.96.0/20 -104.197.0.0/19 -104.197.0.0/20 -104.197.112.0/20 -104.197.128.0/19 -104.197.128.0/20 -104.197.144.0/20 -104.197.16.0/20 -104.197.160.0/19 -104.197.160.0/20 -104.197.176.0/20 -104.197.192.0/19 -104.197.192.0/20 -104.197.208.0/20 -104.197.224.0/19 -104.197.224.0/20 -104.197.240.0/20 -104.197.32.0/19 -104.197.32.0/20 -104.197.48.0/20 -104.197.64.0/19 -104.197.64.0/20 -104.197.80.0/20 -104.197.96.0/19 -104.197.96.0/20 -104.198.0.0/19 -104.198.0.0/20 -104.198.112.0/20 -104.198.128.0/19 -104.198.128.0/20 -104.198.144.0/20 -104.198.16.0/20 -104.198.160.0/19 -104.198.160.0/20 -104.198.176.0/20 -104.198.192.0/19 -104.198.192.0/20 -104.198.208.0/20 -104.198.224.0/19 -104.198.224.0/20 -104.198.240.0/20 -104.198.32.0/19 -104.198.32.0/20 -104.198.48.0/20 -104.198.64.0/19 -104.198.64.0/20 -104.198.80.0/20 -104.198.96.0/19 -104.198.96.0/20 -104.199.0.0/19 -104.199.0.0/20 -104.199.112.0/20 -104.199.128.0/19 -104.199.128.0/20 -104.199.144.0/20 -104.199.16.0/20 -104.199.160.0/19 -104.199.160.0/20 -104.199.176.0/20 -104.199.192.0/19 -104.199.192.0/20 -104.199.208.0/20 -104.199.224.0/19 -104.199.224.0/20 -104.199.240.0/23 -104.199.242.0/23 -104.199.244.0/22 -104.199.248.0/21 -104.199.32.0/19 -104.199.32.0/20 -104.199.48.0/20 -104.199.64.0/19 -104.199.64.0/23 -104.199.66.0/23 -104.199.68.0/22 -104.199.72.0/21 -104.199.80.0/20 -104.199.96.0/19 -104.199.96.0/20 -104.237.160.0/19 -104.237.160.0/24 -104.237.164.0/24 -104.237.167.0/24 -104.237.168.0/24 -104.237.169.0/24 -104.237.170.0/24 -104.237.171.0/24 -104.237.172.0/24 -107.167.160.0/19 -107.167.160.0/24 -107.167.161.0/24 -107.167.162.0/24 -107.167.163.0/24 -107.167.164.0/24 -107.167.165.0/24 -107.167.166.0/24 -107.167.167.0/24 -107.167.168.0/24 -107.167.169.0/24 -107.167.170.0/24 -107.167.171.0/24 -107.167.172.0/24 -107.167.173.0/24 -107.167.174.0/24 -107.167.175.0/24 -107.167.176.0/24 -107.167.177.0/24 -107.167.178.0/24 -107.167.179.0/24 -107.167.180.0/24 -107.167.181.0/24 -107.167.182.0/24 -107.167.183.0/24 -107.167.184.0/24 -107.167.185.0/24 -107.167.186.0/24 -107.167.187.0/24 -107.167.188.0/24 -107.167.189.0/24 -107.167.190.0/24 -107.167.191.0/24 -107.178.192.0/18 -107.178.192.0/19 -107.178.208.0/20 -107.178.224.0/19 -108.170.192.0/18 -108.170.192.0/24 -108.170.193.0/24 -108.170.194.0/24 -108.170.195.0/24 -108.170.198.0/24 -108.170.199.0/24 -108.170.200.0/24 -108.170.201.0/24 -108.170.202.0/24 -108.170.203.0/24 -108.170.204.0/24 -108.170.205.0/24 -108.170.206.0/24 -108.170.207.0/24 -108.170.208.0/24 -108.170.209.0/24 -108.170.210.0/24 -108.170.211.0/24 -108.170.212.0/24 -108.170.213.0/24 -108.170.214.0/24 -108.170.215.0/24 -108.170.217.0/24 -108.170.218.0/24 -108.170.219.0/24 -108.170.222.0/24 -108.170.223.0/24 -108.177.0.0/17 -108.177.10.0/24 -108.177.100.0/24 -108.177.101.0/24 -108.177.102.0/24 -108.177.103.0/24 -108.177.104.0/24 -108.177.108.0/24 -108.177.109.0/24 -108.177.11.0/24 -108.177.110.0/24 -108.177.111.0/24 -108.177.112.0/24 -108.177.113.0/24 -108.177.114.0/24 -108.177.115.0/24 -108.177.116.0/24 -108.177.117.0/24 -108.177.118.0/24 -108.177.119.0/24 -108.177.12.0/24 -108.177.120.0/24 -108.177.121.0/24 -108.177.122.0/24 -108.177.125.0/24 -108.177.126.0/24 -108.177.127.0/24 -108.177.13.0/24 -108.177.14.0/24 -108.177.15.0/24 -108.177.8.0/24 -108.177.9.0/24 -108.177.96.0/24 -108.177.97.0/24 -108.177.98.0/24 -108.177.99.0/24 -108.59.80.0/20 -108.59.80.0/24 -108.59.81.0/24 -108.59.82.0/24 -108.59.83.0/24 -108.59.84.0/24 -108.59.85.0/24 -108.59.86.0/24 -108.59.87.0/24 -108.59.88.0/24 -108.59.89.0/24 -108.59.90.0/24 -108.59.91.0/24 -108.59.92.0/24 -108.59.93.0/24 -108.59.94.0/24 -108.59.95.0/24 -109.235.99.0/24 -109.68.56.0/21 -109.95.124.0/22 -114.141.120.0/24 -114.141.121.0/24 -114.141.122.0/24 -114.141.123.0/24 -114.141.124.0/24 -114.141.125.0/24 -114.141.126.0/24 -114.141.127.0/24 -128.77.64.0/19 -130.211.0.0/16 -130.211.0.0/17 -130.211.112.0/20 -130.211.128.0/18 -130.211.192.0/20 -130.211.208.0/20 -130.211.224.0/20 -130.211.240.0/20 -130.211.48.0/20 -130.211.64.0/19 -130.211.96.0/20 -130.41.0.0/18 -130.41.132.0/23 -130.41.144.0/20 -130.41.160.0/19 -130.41.192.0/19 -130.41.224.0/20 -130.41.242.0/23 -130.41.244.0/22 -130.41.248.0/22 -130.41.252.0/24 -130.41.253.0/24 -130.41.64.0/18 -134.195.26.0/23 -134.238.0.0/16 -135.84.69.0/24 -136.22.100.0/24 -136.22.101.0/24 -136.22.102.0/24 -136.22.103.0/24 -136.22.104.0/24 -136.22.105.0/24 -136.22.106.0/24 -136.22.107.0/24 -136.22.108.0/24 -136.22.109.0/24 -136.22.110.0/24 -136.22.111.0/24 -136.22.112.0/24 -136.22.113.0/24 -136.22.114.0/24 -136.22.115.0/24 -136.22.12.0/24 -136.22.122.0/23 -136.22.13.0/24 -136.22.14.0/24 -136.22.15.0/24 -136.22.16.0/24 -136.22.17.0/24 -136.22.18.0/24 -136.22.19.0/24 -136.22.20.0/24 -136.22.21.0/24 -136.22.224.0/24 -136.22.225.0/24 -136.22.226.0/24 -136.22.227.0/24 -136.22.228.0/23 -136.22.231.0/24 -136.22.232.0/24 -136.22.233.0/24 -136.22.237.0/24 -136.22.239.0/24 -136.22.240.0/24 -136.22.241.0/24 -136.22.64.0/23 -136.22.64.0/24 -136.22.65.0/24 -136.22.76.0/22 -136.22.83.0/24 -136.22.86.0/23 -136.22.86.0/24 -136.22.87.0/24 -136.22.92.0/24 -136.22.93.0/24 -136.22.94.0/24 -136.22.95.0/24 -136.22.96.0/24 -136.22.97.0/24 -136.22.98.0/24 -136.22.99.0/24 -136.23.0.0/24 -136.23.1.0/24 -136.23.10.0/24 -136.23.11.0/24 -136.23.12.0/24 -136.23.13.0/24 -136.23.14.0/24 -136.23.15.0/24 -136.23.16.0/24 -136.23.17.0/24 -136.23.18.0/24 -136.23.19.0/24 -136.23.2.0/24 -136.23.20.0/24 -136.23.21.0/24 -136.23.22.0/24 -136.23.23.0/24 -136.23.24.0/24 -136.23.25.0/24 -136.23.26.0/24 -136.23.27.0/24 -136.23.28.0/24 -136.23.29.0/24 -136.23.3.0/24 -136.23.32.0/24 -136.23.33.0/24 -136.23.34.0/24 -136.23.35.0/24 -136.23.36.0/24 -136.23.37.0/24 -136.23.4.0/24 -136.23.5.0/24 -136.23.6.0/24 -136.23.7.0/24 -136.23.8.0/24 -136.23.9.0/24 -137.83.213.0/24 -137.83.215.0/24 -137.83.216.0/21 -137.83.224.0/20 -137.83.240.0/21 -137.83.248.0/23 -137.83.250.0/24 -141.202.0.0/20 -141.202.254.0/24 -142.147.12.0/24 -142.147.14.0/24 -142.250.0.0/15 -142.250.0.0/24 -142.250.1.0/24 -142.250.10.0/24 -142.250.100.0/24 -142.250.101.0/24 -142.250.102.0/24 -142.250.103.0/24 -142.250.105.0/24 -142.250.106.0/24 -142.250.107.0/24 -142.250.109.0/24 -142.250.11.0/24 -142.250.110.0/24 -142.250.111.0/24 -142.250.112.0/24 -142.250.113.0/24 -142.250.114.0/24 -142.250.115.0/24 -142.250.116.0/24 -142.250.118.0/24 -142.250.119.0/24 -142.250.12.0/24 -142.250.120.0/24 -142.250.122.0/24 -142.250.123.0/24 -142.250.124.0/24 -142.250.125.0/24 -142.250.126.0/24 -142.250.128.0/24 -142.250.13.0/24 -142.250.130.0/24 -142.250.131.0/24 -142.250.132.0/24 -142.250.133.0/24 -142.250.134.0/24 -142.250.135.0/24 -142.250.136.0/24 -142.250.137.0/24 -142.250.138.0/24 -142.250.139.0/24 -142.250.14.0/24 -142.250.141.0/24 -142.250.142.0/24 -142.250.144.0/24 -142.250.145.0/24 -142.250.147.0/24 -142.250.148.0/24 -142.250.149.0/24 -142.250.15.0/24 -142.250.150.0/24 -142.250.151.0/24 -142.250.152.0/24 -142.250.153.0/24 -142.250.154.0/24 -142.250.157.0/24 -142.250.158.0/24 -142.250.159.0/24 -142.250.16.0/24 -142.250.17.0/24 -142.250.176.0/24 -142.250.178.0/24 -142.250.18.0/24 -142.250.180.0/24 -142.250.181.0/24 -142.250.182.0/24 -142.250.183.0/24 -142.250.184.0/24 -142.250.185.0/24 -142.250.188.0/24 -142.250.189.0/24 -142.250.19.0/24 -142.250.190.0/24 -142.250.196.0/24 -142.250.199.0/24 -142.250.2.0/24 -142.250.20.0/24 -142.250.204.0/24 -142.250.205.0/24 -142.250.206.0/24 -142.250.207.0/24 -142.250.21.0/24 -142.250.216.0/24 -142.250.217.0/24 -142.250.218.0/24 -142.250.219.0/24 -142.250.22.0/24 -142.250.23.0/24 -142.250.24.0/24 -142.250.25.0/24 -142.250.26.0/24 -142.250.27.0/24 -142.250.28.0/24 -142.250.29.0/24 -142.250.3.0/24 -142.250.30.0/24 -142.250.31.0/24 -142.250.4.0/24 -142.250.5.0/24 -142.250.6.0/24 -142.250.64.0/24 -142.250.65.0/24 -142.250.66.0/24 -142.250.67.0/24 -142.250.68.0/24 -142.250.69.0/24 -142.250.70.0/24 -142.250.71.0/24 -142.250.72.0/24 -142.250.73.0/24 -142.250.74.0/24 -142.250.75.0/24 -142.250.76.0/24 -142.250.77.0/24 -142.250.78.0/24 -142.250.79.0/24 -142.250.8.0/24 -142.250.80.0/24 -142.250.81.0/24 -142.250.82.0/24 -142.250.9.0/24 -142.250.92.0/23 -142.250.96.0/24 -142.250.97.0/24 -142.250.98.0/24 -142.250.99.0/24 -142.251.0.0/24 -142.251.1.0/24 -142.251.10.0/24 -142.251.107.0/24 -142.251.109.0/24 -142.251.111.0/24 -142.251.112.0/24 -142.251.116.0/24 -142.251.117.0/24 -142.251.12.0/24 -142.251.120.0/24 -142.251.123.0/24 -142.251.124.0/24 -142.251.125.0/24 -142.251.128.0/24 -142.251.129.0/24 -142.251.132.0/24 -142.251.144.0/24 -142.251.145.0/24 -142.251.146.0/24 -142.251.147.0/24 -142.251.148.0/24 -142.251.149.0/24 -142.251.15.0/24 -142.251.150.0/24 -142.251.151.0/24 -142.251.152.0/24 -142.251.153.0/24 -142.251.154.0/24 -142.251.155.0/24 -142.251.156.0/24 -142.251.157.0/24 -142.251.158.0/24 -142.251.159.0/24 -142.251.16.0/24 -142.251.160.0/24 -142.251.161.0/24 -142.251.162.0/24 -142.251.163.0/24 -142.251.164.0/24 -142.251.165.0/24 -142.251.166.0/24 -142.251.167.0/24 -142.251.168.0/24 -142.251.169.0/24 -142.251.170.0/24 -142.251.171.0/24 -142.251.172.0/24 -142.251.173.0/24 -142.251.174.0/24 -142.251.175.0/24 -142.251.176.0/24 -142.251.177.0/24 -142.251.178.0/24 -142.251.179.0/24 -142.251.18.0/24 -142.251.19.0/24 -142.251.2.0/24 -142.251.20.0/24 -142.251.27.0/24 -142.251.29.0/24 -142.251.31.0/24 -142.251.32.0/24 -142.251.33.0/24 -142.251.34.0/24 -142.251.35.0/24 -142.251.36.0/24 -142.251.37.0/24 -142.251.38.0/24 -142.251.39.0/24 -142.251.4.0/24 -142.251.40.0/24 -142.251.41.0/24 -142.251.42.0/24 -142.251.43.0/24 -142.251.44.0/24 -142.251.45.0/24 -142.251.46.0/24 -142.251.47.0/24 -142.251.48.0/24 -142.251.49.0/24 -142.251.5.0/24 -142.251.50.0/24 -142.251.51.0/24 -142.251.52.0/24 -142.251.53.0/24 -142.251.54.0/24 -142.251.55.0/24 -142.251.56.0/24 -142.251.57.0/24 -142.251.58.0/24 -142.251.59.0/24 -142.251.6.0/24 -142.251.60.0/24 -142.251.61.0/24 -142.251.62.0/24 -142.251.63.0/24 -142.251.8.0/24 -142.251.9.0/24 -144.49.128.0/18 -144.49.200.0/22 -144.49.208.0/20 -144.49.224.0/21 -144.49.232.0/22 -144.49.236.0/22 -144.49.240.0/21 -144.49.248.0/21 -144.49.96.0/19 -144.86.173.0/24 -146.148.0.0/17 -146.148.112.0/20 -146.148.16.0/20 -146.148.2.0/23 -146.148.32.0/20 -146.148.4.0/22 -146.148.48.0/20 -146.148.64.0/20 -146.148.8.0/21 -146.148.80.0/20 -146.148.96.0/20 -147.124.188.0/24 -147.124.190.0/24 -147.124.191.0/24 -147.146.240.0/20 -147.185.132.0/22 -147.189.238.0/24 -147.189.239.0/24 -148.64.0.0/19 -148.80.64.0/22 -148.80.68.0/22 -149.77.121.0/24 -152.131.248.0/22 -152.132.248.0/22 -152.133.248.0/22 -155.184.0.0/19 -156.77.128.0/20 -156.93.224.0/23 -158.51.129.0/24 -161.38.184.0/24 -161.38.56.0/24 -161.38.57.0/24 -161.38.58.0/24 -162.120.128.0/23 -162.120.130.0/23 -162.120.132.0/23 -162.120.134.0/23 -162.120.136.0/23 -162.120.138.0/23 -162.120.140.0/23 -162.120.142.0/23 -162.120.144.0/24 -162.120.145.0/24 -162.120.146.0/24 -162.120.147.0/24 -162.120.148.0/24 -162.120.149.0/24 -162.120.150.0/24 -162.120.151.0/24 -162.120.152.0/24 -162.120.153.0/24 -162.120.154.0/24 -162.120.155.0/24 -162.120.156.0/24 -162.120.157.0/24 -162.120.158.0/24 -162.120.159.0/24 -162.120.160.0/24 -162.120.161.0/24 -162.120.162.0/24 -162.120.163.0/24 -162.120.164.0/24 -162.120.165.0/24 -162.120.167.0/24 -162.120.168.0/23 -162.120.170.0/23 -162.120.172.0/24 -162.120.173.0/24 -162.120.174.0/24 -162.120.175.0/24 -162.120.176.0/24 -162.216.148.0/22 -162.216.148.0/24 -162.216.149.0/24 -162.216.150.0/24 -162.216.151.0/24 -162.216.248.0/24 -162.216.249.0/24 -162.216.250.0/24 -162.216.251.0/24 -162.222.176.0/21 -162.222.176.0/24 -162.222.177.0/24 -162.222.178.0/24 -162.222.179.0/24 -162.222.180.0/24 -162.222.181.0/24 -162.222.182.0/24 -162.222.183.0/24 -162.222.78.0/24 -162.222.79.0/24 -162.240.199.0/24 -162.244.0.0/24 -162.244.1.0/24 -162.247.196.0/24 -162.247.96.0/21 -162.251.20.0/22 -165.1.128.0/19 -165.1.172.0/22 -165.1.176.0/20 -165.1.192.0/18 -165.85.0.0/18 -165.85.128.0/20 -165.85.146.0/23 -165.85.148.0/23 -165.85.152.0/21 -165.85.160.0/19 -165.85.192.0/20 -165.85.208.0/20 -165.85.224.0/20 -165.85.240.0/21 -165.85.249.0/24 -165.85.96.0/19 -166.73.4.0/23 -167.234.37.0/24 -168.100.24.0/22 -168.149.128.0/18 -168.235.234.0/24 -170.10.143.0/24 -170.10.222.0/24 -170.114.50.0/24 -170.114.69.0/24 -170.176.240.0/21 -172.102.10.0/24 -172.102.11.0/24 -172.102.12.0/24 -172.102.13.0/24 -172.102.14.0/24 -172.102.15.0/24 -172.102.8.0/24 -172.102.9.0/24 -172.110.32.0/21 -172.110.44.0/24 -172.217.0.0/16 -172.217.0.0/24 -172.217.1.0/24 -172.217.10.0/24 -172.217.11.0/24 -172.217.12.0/24 -172.217.128.0/19 -172.217.13.0/24 -172.217.14.0/24 -172.217.15.0/24 -172.217.16.0/24 -172.217.17.0/24 -172.217.176.0/24 -172.217.177.0/24 -172.217.178.0/24 -172.217.179.0/24 -172.217.18.0/24 -172.217.19.0/24 -172.217.192.0/24 -172.217.193.0/24 -172.217.194.0/24 -172.217.195.0/24 -172.217.196.0/24 -172.217.197.0/24 -172.217.198.0/24 -172.217.199.0/24 -172.217.2.0/24 -172.217.20.0/24 -172.217.200.0/24 -172.217.201.0/24 -172.217.202.0/24 -172.217.203.0/24 -172.217.204.0/24 -172.217.205.0/24 -172.217.206.0/24 -172.217.207.0/24 -172.217.208.0/24 -172.217.209.0/24 -172.217.21.0/24 -172.217.210.0/24 -172.217.211.0/24 -172.217.212.0/24 -172.217.213.0/24 -172.217.214.0/24 -172.217.215.0/24 -172.217.216.0/24 -172.217.217.0/24 -172.217.218.0/24 -172.217.219.0/24 -172.217.22.0/24 -172.217.220.0/24 -172.217.221.0/24 -172.217.222.0/24 -172.217.223.0/24 -172.217.23.0/24 -172.217.24.0/24 -172.217.25.0/24 -172.217.26.0/24 -172.217.27.0/24 -172.217.28.0/24 -172.217.29.0/24 -172.217.3.0/24 -172.217.30.0/24 -172.217.31.0/24 -172.217.4.0/24 -172.217.5.0/24 -172.217.56.0/21 -172.217.6.0/24 -172.217.62.0/24 -172.217.63.0/24 -172.217.7.0/24 -172.217.8.0/24 -172.217.9.0/24 -172.253.0.0/16 -172.253.112.0/24 -172.253.113.0/24 -172.253.114.0/24 -172.253.115.0/24 -172.253.116.0/24 -172.253.117.0/24 -172.253.118.0/24 -172.253.119.0/24 -172.253.120.0/24 -172.253.121.0/24 -172.253.122.0/24 -172.253.123.0/24 -172.253.124.0/24 -172.253.125.0/24 -172.253.126.0/24 -172.253.127.0/24 -172.253.16.0/20 -172.253.16.0/24 -172.253.17.0/24 -172.253.18.0/24 -172.253.19.0/24 -172.253.20.0/24 -172.253.21.0/24 -172.253.23.0/24 -172.253.56.0/24 -172.253.57.0/24 -172.253.58.0/24 -172.253.59.0/24 -172.253.60.0/24 -172.253.62.0/24 -172.253.63.0/24 -173.194.0.0/16 -173.194.0.0/19 -173.194.112.0/24 -173.194.113.0/24 -173.194.117.0/24 -173.194.118.0/24 -173.194.119.0/24 -173.194.120.0/24 -173.194.121.0/24 -173.194.124.0/24 -173.194.128.0/20 -173.194.132.0/24 -173.194.136.0/24 -173.194.140.0/24 -173.194.141.0/24 -173.194.142.0/24 -173.194.144.0/20 -173.194.160.0/21 -173.194.172.0/24 -173.194.173.0/24 -173.194.174.0/24 -173.194.175.0/24 -173.194.176.0/20 -173.194.192.0/24 -173.194.193.0/24 -173.194.194.0/24 -173.194.195.0/24 -173.194.196.0/24 -173.194.197.0/24 -173.194.198.0/24 -173.194.199.0/24 -173.194.200.0/24 -173.194.201.0/24 -173.194.202.0/24 -173.194.203.0/24 -173.194.204.0/24 -173.194.205.0/24 -173.194.206.0/24 -173.194.207.0/24 -173.194.208.0/24 -173.194.209.0/24 -173.194.210.0/24 -173.194.211.0/24 -173.194.212.0/24 -173.194.213.0/24 -173.194.214.0/24 -173.194.215.0/24 -173.194.216.0/24 -173.194.217.0/24 -173.194.218.0/24 -173.194.219.0/24 -173.194.220.0/24 -173.194.221.0/24 -173.194.222.0/24 -173.194.223.0/24 -173.194.32.0/24 -173.194.34.0/24 -173.194.35.0/24 -173.194.36.0/24 -173.194.37.0/24 -173.194.38.0/24 -173.194.39.0/24 -173.194.40.0/24 -173.194.41.0/24 -173.194.42.0/24 -173.194.44.0/24 -173.194.46.0/24 -173.194.48.0/20 -173.194.53.0/24 -173.194.63.0/24 -173.194.64.0/24 -173.194.66.0/24 -173.194.67.0/24 -173.194.68.0/24 -173.194.69.0/24 -173.194.7.0/24 -173.194.70.0/24 -173.194.71.0/24 -173.194.72.0/24 -173.194.73.0/24 -173.194.74.0/24 -173.194.75.0/24 -173.194.76.0/24 -173.194.77.0/24 -173.194.78.0/24 -173.194.79.0/24 -173.194.96.0/21 -173.255.112.0/20 -173.255.112.0/24 -173.255.113.0/24 -173.255.114.0/24 -173.255.115.0/24 -173.255.116.0/24 -173.255.117.0/24 -173.255.118.0/24 -173.255.119.0/24 -173.255.120.0/24 -173.255.121.0/24 -173.255.122.0/24 -173.255.123.0/24 -173.255.124.0/24 -173.255.125.0/24 -173.255.126.0/24 -173.255.127.0/24 -176.113.47.0/24 -178.249.140.0/23 -185.110.98.0/24 -185.137.157.0/24 -185.142.144.0/24 -185.142.145.0/24 -185.142.146.0/24 -185.145.247.0/24 -185.146.174.0/24 -185.146.175.0/24 -185.162.80.0/22 -185.168.204.0/24 -185.180.142.0/24 -185.180.48.0/22 -185.188.93.0/24 -185.197.148.0/24 -185.207.237.0/24 -185.225.161.0/24 -185.227.234.0/24 -185.235.238.0/24 -185.235.239.0/24 -185.241.47.0/24 -185.249.220.0/24 -185.25.28.0/23 -185.30.28.0/22 -185.46.233.0/24 -185.56.84.0/24 -185.56.85.0/24 -185.56.86.0/24 -185.56.87.0/24 -185.73.224.0/24 -185.76.36.0/24 -185.81.120.0/24 -185.81.121.0/24 -185.88.148.0/22 -185.92.208.0/24 -185.94.240.0/23 -185.94.242.0/23 -188.92.121.0/24 -188.92.122.0/24 -188.92.136.0/24 -188.92.137.0/24 -192.104.36.0/24 -192.107.133.0/24 -192.149.17.0/24 -192.158.28.0/22 -192.158.28.0/24 -192.158.29.0/24 -192.158.30.0/24 -192.158.31.0/24 -192.178.0.0/15 -192.178.40.0/24 -192.178.41.0/24 -192.178.42.0/24 -192.178.43.0/24 -192.19.120.0/24 -192.19.255.0/24 -192.200.190.0/24 -192.200.191.0/24 -192.34.32.0/23 -192.40.69.0/24 -192.69.115.0/24 -193.108.15.0/24 -193.151.72.0/22 -193.177.222.0/24 -193.186.4.0/24 -193.73.208.0/24 -194.187.56.0/22 -194.38.4.0/22 -195.10.199.0/24 -195.149.126.0/24 -195.234.145.0/24 -198.135.124.0/23 -198.135.184.0/24 -198.179.226.0/24 -198.179.227.0/24 -198.235.24.0/24 -199.103.85.0/24 -199.116.168.0/21 -199.166.212.0/24 -199.19.248.0/21 -199.192.112.0/22 -199.192.113.0/24 -199.192.114.0/24 -199.192.115.0/24 -199.223.232.0/21 -199.223.232.0/24 -199.223.233.0/24 -199.223.234.0/24 -199.223.235.0/24 -199.223.236.0/24 -199.223.237.0/24 -199.244.98.0/24 -199.244.99.0/24 -199.247.32.0/20 -199.250.249.0/24 -199.36.154.0/23 -199.36.156.0/24 -199.47.186.0/24 -199.47.187.0/24 -199.47.27.0/24 -199.65.28.0/24 -199.91.151.0/24 -202.14.19.0/24 -202.250.28.0/24 -202.92.198.0/24 -202.92.199.0/24 -203.4.188.0/23 -203.4.190.0/23 -204.10.52.0/22 -204.107.8.0/24 -204.138.99.0/24 -204.62.215.0/24 -204.87.186.0/24 -205.210.31.0/24 -206.126.251.0/24 -207.126.144.0/22 -207.154.144.0/22 -207.223.160.0/20 -208.112.128.0/24 -208.112.129.0/24 -208.112.130.0/24 -208.112.131.0/24 -208.112.132.0/24 -208.112.133.0/24 -208.112.142.0/24 -208.112.143.0/24 -208.112.192.0/24 -208.112.193.0/24 -208.112.194.0/24 -208.112.195.0/24 -208.112.196.0/24 -208.112.197.0/24 -208.117.224.0/19 -208.117.254.0/24 -208.127.0.0/17 -208.127.128.0/18 -208.127.192.0/21 -208.127.208.0/20 -208.127.224.0/21 -208.127.232.0/21 -208.127.240.0/21 -208.127.248.0/21 -208.56.18.0/24 -208.56.24.0/24 -208.56.32.0/24 -208.56.33.0/24 -208.56.34.0/24 -208.56.38.0/24 -208.56.42.0/23 -208.65.152.0/22 -208.67.156.0/22 -208.68.108.0/22 -208.76.68.0/24 -208.81.188.0/22 -208.86.170.0/23 -208.94.216.0/24 -208.94.223.0/24 -209.107.176.0/24 -209.107.177.0/24 -209.107.178.0/24 -209.107.179.0/24 -209.107.180.0/24 -209.107.181.0/24 -209.107.182.0/24 -209.107.183.0/24 -209.107.184.0/24 -209.107.185.0/24 -209.107.186.0/24 -209.107.187.0/24 -209.107.188.0/24 -209.107.189.0/24 -209.107.190.0/24 -209.107.191.0/24 -209.133.250.0/24 -209.133.255.0/24 -209.188.98.0/24 -209.209.125.0/24 -209.85.128.0/17 -209.85.144.0/24 -209.85.145.0/24 -209.85.146.0/24 -209.85.147.0/24 -209.85.164.0/23 -209.85.200.0/24 -209.85.201.0/24 -209.85.202.0/24 -209.85.203.0/24 -209.85.232.0/24 -209.85.233.0/24 -209.85.234.0/24 -209.85.235.0/24 -212.11.79.0/24 -216.239.32.0/19 -216.239.32.0/24 -216.239.33.0/24 -216.239.34.0/24 -216.239.35.0/24 -216.239.36.0/24 -216.239.38.0/24 -216.239.39.0/24 -216.252.220.0/24 -216.252.221.0/24 -216.58.192.0/19 -216.58.192.0/22 -216.58.196.0/23 -216.58.198.0/24 -216.58.199.0/24 -216.58.200.0/24 -216.58.201.0/24 -216.58.202.0/24 -216.58.203.0/24 -216.58.204.0/23 -216.58.206.0/23 -216.58.208.0/24 -216.58.209.0/24 -216.58.210.0/24 -216.58.211.0/24 -216.58.212.0/24 -216.58.213.0/24 -216.58.214.0/24 -216.58.215.0/24 -216.58.216.0/24 -216.58.217.0/24 -216.58.218.0/24 -216.58.219.0/24 -216.58.220.0/24 -216.58.221.0/24 -216.58.222.0/24 -216.58.223.0/24 -216.59.133.0/24 -216.73.80.0/20 -217.169.118.0/24 -223.29.216.0/22 +# Googlebot updated 2026-04-15 +# wget https://developers.google.com/search/apis/ipranges/googlebot.json +# jq .prefixes[].ipv4Prefix,.prefixes[].ipv6Prefix googlebot.json | grep -v null | sed "s/\"//g" +192.178.4.0/27 +192.178.4.128/27 +192.178.4.160/27 +192.178.4.192/27 +192.178.4.224/27 +192.178.4.32/27 +192.178.4.64/27 +192.178.4.96/27 +192.178.5.0/27 +192.178.6.0/27 +192.178.6.128/27 +192.178.6.160/27 +192.178.6.192/27 +192.178.6.224/27 +192.178.6.32/27 +192.178.6.64/27 +192.178.6.96/27 +192.178.7.0/27 +192.178.7.128/27 +192.178.7.160/27 +192.178.7.192/27 +192.178.7.224/27 +192.178.7.32/27 +192.178.7.64/27 +192.178.7.96/27 +34.100.182.96/28 +34.101.50.144/28 +34.118.254.0/28 +34.118.66.0/28 +34.126.178.96/28 +34.146.150.144/28 +34.147.110.144/28 +34.151.74.144/28 +34.152.50.64/28 +34.154.114.144/28 +34.155.98.32/28 +34.165.18.176/28 +34.175.160.64/28 +34.176.130.16/28 +34.22.85.0/27 +34.64.82.64/28 +34.65.242.112/28 +34.80.50.80/28 +34.88.194.0/28 +34.89.10.80/28 +34.89.198.80/28 +34.96.162.48/28 +35.247.243.240/28 +66.249.64.0/27 +66.249.64.128/27 +66.249.64.160/27 +66.249.64.192/27 +66.249.64.224/27 +66.249.64.32/27 +66.249.64.64/27 +66.249.64.96/27 +66.249.65.0/27 +66.249.65.128/27 +66.249.65.160/27 +66.249.65.192/27 +66.249.65.224/27 +66.249.65.32/27 +66.249.65.64/27 +66.249.65.96/27 +66.249.66.0/27 +66.249.66.128/27 +66.249.66.160/27 +66.249.66.192/27 +66.249.66.224/27 +66.249.66.32/27 +66.249.66.64/27 +66.249.66.96/27 +66.249.67.0/27 +66.249.67.32/27 +66.249.67.64/27 +66.249.68.0/27 +66.249.68.128/27 +66.249.68.160/27 +66.249.68.192/27 +66.249.68.32/27 +66.249.68.64/27 +66.249.68.96/27 +66.249.69.0/27 +66.249.69.128/27 +66.249.69.160/27 +66.249.69.192/27 +66.249.69.224/27 +66.249.69.32/27 +66.249.69.64/27 +66.249.69.96/27 +66.249.70.0/27 +66.249.70.128/27 +66.249.70.160/27 +66.249.70.192/27 +66.249.70.224/27 +66.249.70.32/27 +66.249.70.64/27 +66.249.70.96/27 +66.249.71.0/27 +66.249.71.128/27 +66.249.71.160/27 +66.249.71.192/27 +66.249.71.224/27 +66.249.71.32/27 +66.249.71.64/27 +66.249.71.96/27 +66.249.72.0/27 +66.249.72.128/27 +66.249.72.160/27 +66.249.72.192/27 +66.249.72.224/27 +66.249.72.32/27 +66.249.72.64/27 +66.249.73.0/27 +66.249.73.128/27 +66.249.73.160/27 +66.249.73.192/27 +66.249.73.224/27 +66.249.73.32/27 +66.249.73.64/27 +66.249.73.96/27 +66.249.74.0/27 +66.249.74.128/27 +66.249.74.160/27 +66.249.74.192/27 +66.249.74.224/27 +66.249.74.32/27 +66.249.74.64/27 +66.249.74.96/27 +66.249.75.0/27 +66.249.75.128/27 +66.249.75.160/27 +66.249.75.192/27 +66.249.75.224/27 +66.249.75.32/27 +66.249.75.64/27 +66.249.75.96/27 +66.249.76.0/27 +66.249.76.128/27 +66.249.76.160/27 +66.249.76.192/27 +66.249.76.224/27 +66.249.76.32/27 +66.249.76.64/27 +66.249.76.96/27 +66.249.77.0/27 +66.249.77.128/27 +66.249.77.160/27 +66.249.77.192/27 +66.249.77.224/27 +66.249.77.32/27 +66.249.77.64/27 +66.249.77.96/27 +66.249.78.0/27 +66.249.78.128/27 +66.249.78.160/27 +66.249.78.32/27 +66.249.78.64/27 +66.249.78.96/27 +66.249.79.0/27 +66.249.79.128/27 +66.249.79.160/27 +66.249.79.192/27 +66.249.79.224/27 +66.249.79.32/27 +66.249.79.64/27 +2001:4860:4801:10::/64 +2001:4860:4801:12::/64 +2001:4860:4801:13::/64 +2001:4860:4801:14::/64 +2001:4860:4801:15::/64 +2001:4860:4801:16::/64 +2001:4860:4801:17::/64 +2001:4860:4801:18::/64 +2001:4860:4801:19::/64 +2001:4860:4801:1a::/64 +2001:4860:4801:1b::/64 +2001:4860:4801:1c::/64 +2001:4860:4801:1d::/64 +2001:4860:4801:1e::/64 +2001:4860:4801:1f::/64 +2001:4860:4801:20::/64 +2001:4860:4801:21::/64 +2001:4860:4801:22::/64 +2001:4860:4801:23::/64 +2001:4860:4801:24::/64 +2001:4860:4801:25::/64 +2001:4860:4801:26::/64 +2001:4860:4801:27::/64 +2001:4860:4801:28::/64 +2001:4860:4801:29::/64 +2001:4860:4801:2::/64 +2001:4860:4801:2a::/64 +2001:4860:4801:2b::/64 +2001:4860:4801:2c::/64 +2001:4860:4801:2d::/64 +2001:4860:4801:2e::/64 +2001:4860:4801:2f::/64 +2001:4860:4801:30::/64 +2001:4860:4801:31::/64 +2001:4860:4801:32::/64 +2001:4860:4801:33::/64 +2001:4860:4801:34::/64 +2001:4860:4801:35::/64 +2001:4860:4801:36::/64 +2001:4860:4801:37::/64 +2001:4860:4801:38::/64 +2001:4860:4801:39::/64 +2001:4860:4801:3a::/64 +2001:4860:4801:3b::/64 +2001:4860:4801:3c::/64 +2001:4860:4801:3d::/64 +2001:4860:4801:3e::/64 +2001:4860:4801:3f::/64 +2001:4860:4801:40::/64 +2001:4860:4801:41::/64 +2001:4860:4801:42::/64 +2001:4860:4801:44::/64 +2001:4860:4801:45::/64 +2001:4860:4801:46::/64 +2001:4860:4801:47::/64 +2001:4860:4801:48::/64 +2001:4860:4801:49::/64 +2001:4860:4801:4a::/64 +2001:4860:4801:4b::/64 +2001:4860:4801:4c::/64 +2001:4860:4801:4d::/64 +2001:4860:4801:4e::/64 +2001:4860:4801:50::/64 +2001:4860:4801:51::/64 +2001:4860:4801:52::/64 +2001:4860:4801:53::/64 +2001:4860:4801:54::/64 +2001:4860:4801:55::/64 +2001:4860:4801:56::/64 +2001:4860:4801:57::/64 +2001:4860:4801:58::/64 +2001:4860:4801:59::/64 +2001:4860:4801:60::/64 +2001:4860:4801:61::/64 +2001:4860:4801:62::/64 +2001:4860:4801:63::/64 +2001:4860:4801:64::/64 +2001:4860:4801:65::/64 +2001:4860:4801:66::/64 +2001:4860:4801:67::/64 +2001:4860:4801:68::/64 +2001:4860:4801:69::/64 +2001:4860:4801:6a::/64 +2001:4860:4801:6b::/64 +2001:4860:4801:6c::/64 +2001:4860:4801:6d::/64 +2001:4860:4801:6e::/64 +2001:4860:4801:6f::/64 +2001:4860:4801:70::/64 +2001:4860:4801:71::/64 +2001:4860:4801:72::/64 +2001:4860:4801:73::/64 +2001:4860:4801:74::/64 +2001:4860:4801:75::/64 +2001:4860:4801:76::/64 +2001:4860:4801:77::/64 +2001:4860:4801:78::/64 +2001:4860:4801:79::/64 +2001:4860:4801:7a::/64 +2001:4860:4801:7b::/64 +2001:4860:4801:7c::/64 +2001:4860:4801:7d::/64 +2001:4860:4801:80::/64 +2001:4860:4801:81::/64 +2001:4860:4801:82::/64 +2001:4860:4801:83::/64 +2001:4860:4801:84::/64 +2001:4860:4801:85::/64 +2001:4860:4801:86::/64 +2001:4860:4801:87::/64 +2001:4860:4801:88::/64 +2001:4860:4801:90::/64 +2001:4860:4801:91::/64 +2001:4860:4801:92::/64 +2001:4860:4801:93::/64 +2001:4860:4801:94::/64 +2001:4860:4801:95::/64 +2001:4860:4801:96::/64 +2001:4860:4801:97::/64 +2001:4860:4801:a0::/64 +2001:4860:4801:a1::/64 +2001:4860:4801:a2::/64 +2001:4860:4801:a3::/64 +2001:4860:4801:a4::/64 +2001:4860:4801:a5::/64 +2001:4860:4801:a6::/64 +2001:4860:4801:a7::/64 +2001:4860:4801:a8::/64 +2001:4860:4801:a9::/64 +2001:4860:4801:aa::/64 +2001:4860:4801:ab::/64 +2001:4860:4801:ac::/64 +2001:4860:4801:ad::/64 +2001:4860:4801:ae::/64 +2001:4860:4801:b0::/64 +2001:4860:4801:b1::/64 +2001:4860:4801:b2::/64 +2001:4860:4801:b3::/64 +2001:4860:4801:b4::/64 +2001:4860:4801:b5::/64 +2001:4860:4801:b6::/64 +2001:4860:4801:c::/64 +2001:4860:4801:f::/64 diff --git a/excludes/my.txt b/excludes/my.txt index 66bc421..331f79c 100644 --- a/excludes/my.txt +++ b/excludes/my.txt @@ -1,2 +1,3 @@ -# In this file, you should put the IPs you don't want blocked. -# One IP/range per line. +# In this file, place the IPs you do not want blocked. One IP/range per line. +127.0.0.0/8 +::1/128 diff --git a/fortress-block.sh b/fortress-block.sh index b39ad2f..0f33e2f 100755 --- a/fortress-block.sh +++ b/fortress-block.sh @@ -1,9 +1,28 @@ #!/bin/bash + +# fortress-block.sh +# Copyright (C) 2023 Marian Marinov +# IP blocker for Fortress. https://github.com/hackman/Fortress + +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see +# . + config=/etc/fortress/fortress.conf if [[ ! -f $config ]]; then - echo "Missing configuration file: $config" - exit + echo "Missing configuration file: $config" + exit fi redirect_ip=$(awk -F= '/redirect_ip/ && $1 !~ /^\s*#/ {print $2}' $config) block_type=$( awk -F= '/block_type/ && $1 !~ /^\s*#/ {print $2}' $config) @@ -13,74 +32,75 @@ ip='' comment='' if [[ $# -eq 0 ]]; then - echo "Usage: $0 IP [comment]" - exit + echo "Usage: $0 IP [comment]" + exit fi if [[ ! $1 =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - echo "Error: invalid IP format" - exit + echo "Error: invalid IP format" + exit fi # Parameters: # 1 - IP # 2 - Comment ipset_block() { - ip=$1 - shift - ipset_name=$( awk -F= '/ipset_name/ && $1 !~ /^\s*#/ {print $2}' $config) - if [[ -z $ipset_name ]]; then - echo -e "Error: unable to find ipset_name in $config.\nPlease check the configuration and try again.\n" - exit - fi - if [[ -n $1 ]]; then - ipset add $ipset_name $ip comment "$*" timeout $block_time - else - ipset add $ipset_name $ip - fi + ip=$1 + shift + ipset_name=$( awk -F= '/ipset_name/ && $1 !~ /^\s*#/ {print $2}' $config) + if [[ -z $ipset_name ]]; then + echo "Error: unable to find ipset_name in $config." + echo -e "Please check the configuration and try again.\n" + exit + fi + if [[ -n $1 ]]; then + ipset add $ipset_name $ip comment "$*" timeout $block_time + else + ipset add $ipset_name $ip + fi } # Parameters: # 1 - IP # 2 - Comment iptables_block() { - ip=$1 - shift - chain=INPUT - chain_name=$( awk -F= '/chain_name/ && $1 !~ /^\s*#/ {print $2}' $config) - if [[ -n $chain_name ]]; then - chain=$chain_name - fi - if [[ -n $1 ]]; then - iptables -I $chain -j DROP -s $ip -m comment --comment "$*" - else - iptables -I $chain -j DROP -s $ip - fi + ip=$1 + shift + chain=INPUT + chain_name=$( awk -F= '/chain_name/ && $1 !~ /^\s*#/ {print $2}' $config) + if [[ -n $chain_name ]]; then + chain=$chain_name + fi + if [[ -n $1 ]]; then + iptables -I $chain -j DROP -s $ip -m comment --comment "$*" + else + iptables -I $chain -j DROP -s $ip + fi } # Parameters: # 1 - IP redirection() { - if [[ -z $redirect_ip ]]; then - echo "No redirect IP defined. Quiting without redirection." - exit 1 - fi - iptables -t nat -A PREROUTING -j DNAT -s $1 -p tcp --dport 80 --to $redirect_ip - iptables -t nat -A PREROUTING -j DNAT -s $1 -p tcp --dport 443 --to $redirect_ip - iptables -t nat -A PREROUTING -j DNAT -s $1 -p udp --dport 443 --to $redirect_ip + if [[ -z $redirect_ip ]]; then + echo "No redirect IP defined. Quiting without redirection." + exit 1 + fi + iptables -t nat -A PREROUTING -j DNAT -s $1 -p tcp --dport 80 --to $redirect_ip + iptables -t nat -A PREROUTING -j DNAT -s $1 -p tcp --dport 443 --to $redirect_ip + iptables -t nat -A PREROUTING -j DNAT -s $1 -p udp --dport 443 --to $redirect_ip } case "$block_type" in - ipset) - ipset_block $* - ;; - iptables) - iptables_block $* - ;; - redirect) - redirection $* - ;; - *) - echo "Error: unsupported block type in the configuration $config" - ;; + ipset) + ipset_block $* + ;; + iptables) + iptables_block $* + ;; + redirect) + redirection $* + ;; + *) + echo "Error: unsupported block type in the configuration $config" + ;; esac diff --git a/fortress-centos7.spec b/fortress-centos7.spec index ed97d3f..87e501e 100644 --- a/fortress-centos7.spec +++ b/fortress-centos7.spec @@ -2,7 +2,7 @@ Name: fortress Version: 1.0 Release: 3 Summary: Fortress connection monitoring and protection -License: GPLv2 +License: GPL-2.0-or-later URL: https://github.com/hackman/Fortress Source0: %{name}-%{version}.tgz BuildArch: noarch @@ -12,10 +12,9 @@ Provides: fortress AutoReqProv: no %description -This package provides the Fortress connection monitoring and -protection system. -It monitors TCP and UDP connections and automaticaly blocks -and unblocks IPs that may put the machine at risk. +This package provides the Fortress connection monitoring and protection system. +It monitors TCP and UDP connections and automaticaly blocks and unblocks IPs +that may put the machine at risk. %prep %setup -q diff --git a/fortress-install.sh b/fortress-install.sh new file mode 100755 index 0000000..b58bf4a --- /dev/null +++ b/fortress-install.sh @@ -0,0 +1,173 @@ +#!/bin/bash + +# fortress-install.sh +# Copyright (C) 2026 Michael McMahon +# Installer for Fortress. https://github.com/hackman/Fortress + +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see +# . + +set -euo pipefail +#set -euxo pipefail # DEBUG + +echo "This script installs and configures Fortress for iptables or ipset." +echo "https://github.com/hackman/Fortress" + +# Initialization checks. + +# Check for /bin/bash. +if [ "$BASH_VERSION" = '' ]; then + echo "You are not using bash." + echo "Use this syntax instead:" + echo " sudo bash fortress-install.sh" + exit 1 +fi + +# Check for root. +if [[ $EUID -ne 0 ]]; then + echo "This script must be run as root." + exit 1 +fi + +# Create config directory. +echo "Creating fortress directories..." +mkdir -p /etc/fortress +mkdir -p /usr/share/fortress +mkdir -p /usr/lib/fortress +mkdir -p /var/log/fortress +mkdir -p /var/run/fortress +mkdir -p /var/cache/fortress +mkdir -p /etc/systemd/system + +# Copy configuration files. +echo "Copying configuration files..." +config="/etc/fortress/fortress.conf" +cp fortress.conf "$config" +# Copy exclude files. +cp excludes/baidu.txt /etc/fortress/ +cp excludes/bingbot.txt /etc/fortress/ +cp excludes/cloudflare.txt /etc/fortress/ +cp excludes/google.txt /etc/fortress/ +cp excludes/msnbot.txt /etc/fortress/ +cp excludes/my.txt /etc/fortress/ +cp excludes/yahoo.txt /etc/fortress/ +cp excludes/yandex.txt /etc/fortress/ +# Copy LICENSE file. +cp LICENSE /usr/share/fortress + +# Check dependencies. +# Mandatory: Perl's Net::Patricia module +# For package names across operating systems reference: +# https://repology.org/project/perl%3Anet-patricia/versions +# Optional: ipset +# For package names across operating systems reference: +# https://repology.org/project/ipset/versions + +# Enable ipset configuration if present. +echo "Checking if ipset is installed..." +ipsetpresent=0 +package="ipset" +# Check if dpkg is present. +if command -v dpkg >/dev/null 2>&1; then + # Check if ipset is present. + if dpkg -s $package >/dev/null 2>&1; then + ipsetpresent=1 + echo "$package is installed." + fi + echo "Checking if libnet-patricia-perl is installed..." + if dpkg -s libnet-patricia-perl >/dev/null 2>&1; then + echo "libnet-patricia-perl is installed." + else + echo "Attempting to install the libnet-patricia-perl dependency..." + apt-get install -y libnet-patricia-perl + fi +fi +# Check if rpm is present. +if command -v rpm >/dev/null 2>&1; then + # Check if ipset is present. + if rpm -q $package >/dev/null 2>&1; then + echo "$package is installed." + fi + echo "Checking if perl-Net-Patricia is installed..." + if rpm -q perl-Net-Patricia >/dev/null 2>&1; then + echo "perl-Net-Patricia is installed." + else + echo "Attempting to install the perl-Net-Patricia dependency..." + if command -v yum >/dev/null 2>&1; then + yum install -y perl-Net-Patricia + fi + if command -v dnf >/dev/null 2>&1; then + dnf install -y perl-Net-Patricia + fi + if command -v zypper >/dev/null 2>&1; then + zypper install -y perl-Net-Patricia + fi + fi +fi +if [ $ipsetpresent = 1 ]; then + echo "Enabling ipset configuration..." + sed -i 's/block_type=iptables/block_type=ipset/g' "$config" + sed -i 's/#ipset_name=blocklist/ipset_name=fortress/g' "$config" + echo "Note: Some additional steps are required to create the ipset and add" + echo "the ipset to iptables." +else + echo "ipset was not found with rpm or dpkg. The iptables configuration is" + echo "the default and is currently applied. If you want Fortress to block" + echo "with ipset, install the ipset package and run this script again." +fi +echo "If you want the redirection configuration, manual steps will need to be" +echo "taken to configure the redirection and setup the secondary server." + +# Install Fortress scripts. +echo "Installing Fortress scripts..." +cp fortress.pl /usr/sbin/fortress +# These chmod entries should not be necessary, but they could be useful if +# someone places these files in a NTFS partition first. +chmod +x /usr/sbin/fortress +cp fortress-unblock.sh /usr/sbin/fortress-unblock +chmod +x /usr/sbin/fortress-unblock +cp fortress-block.sh /usr/sbin/fortress-block +chmod +x /usr/sbin/fortress-block + +# SystemD +echo "Configuring systemd..." +# Install the service file. +cp fortress.service /etc/systemd/system/ +# Reload systemctl. +systemctl daemon-reload +# Starting fortress service +systemctl start fortress + +# Check if Fortress works. +echo "Checking if fortress started successfully..." + +if ! systemctl is-active --quiet fortress ; then + echo "Fortress failed to start. Troubleshooting is required. The following" + echo "text is the output of this command:" + echo ' journalctl -u fortress.service --since="today" --no-pager' + journalctl -u fortress.service --since="today" --no-pager + echo "Stopping Fortress service." + systemctl stop fortress + echo "Disabling Fortress service." + systemctl disable fortress + echo "Fortress failed to start." + exit 1 +else + # Enable fortress service + systemctl enable fortress + echo "If all commands were successful and all dependencies were met, fortress" + echo "should be running now and should start automatically after you reboot." +fi + +exit 0 diff --git a/fortress-unblock.sh b/fortress-unblock.sh index e71146a..2ac24b0 100755 --- a/fortress-unblock.sh +++ b/fortress-unblock.sh @@ -1,9 +1,28 @@ #!/bin/bash + +# fortress-unblock.sh +# Copyright (C) 2023 Marian Marinov +# IP unblocker for Fortress. https://github.com/hackman/Fortress + +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see +# . + config=/etc/fortress/fortress.conf if [[ ! -f $config ]]; then - echo "Missing configuration file: $config" - exit + echo "Missing configuration file: $config" + exit fi redirect_ip=$(awk -F= '/redirect_ip/ && $1 !~ /^\s*#/ {print $2}' $config) block_type=$( awk -F= '/block_type/ && $1 !~ /^\s*#/ {print $2}' $config) @@ -12,70 +31,71 @@ ip='' comment='' if [[ $# -eq 0 ]]; then - echo "Usage: $0 IP [comment]" - exit + echo "Usage: $0 IP [comment]" + exit fi if [[ ! $1 =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - echo "Error: invalid IP format" - exit + echo "Error: invalid IP format" + exit fi # Parameters: # 1 - IP # 2 - Comment ipset_unblock() { - ip=$1 - shift - ipset_name=$( awk -F= '/ipset_name/ && $1 !~ /^\s*#/ {print $2}' $config) - if [[ -z $ipset_name ]]; then - echo -e "Error: unable to find ipset_name in $config.\nPlease check the configuration and try again.\n" - exit - fi - ipset del $ipset_name $ip 2>/dev/null + ip=$1 + shift + ipset_name=$( awk -F= '/ipset_name/ && $1 !~ /^\s*#/ {print $2}' $config) + if [[ -z $ipset_name ]]; then + echo "Error: unable to find ipset_name in $config." + echo -e "Please check the configuration and try again.\n" + exit + fi + ipset del $ipset_name $ip 2>/dev/null } # Parameters: # 1 - IP # 2 - Comment iptables_unblock() { - ip=$1 - shift - chain=INPUT - chain_name=$( awk -F= '/chain_name/ && $1 !~ /^\s*#/ {print $2}' $config) - if [[ -n $chain_name ]]; then - chain=$chain_name - fi - if [[ -n $1 ]]; then - iptables -D $chain -j DROP -s $ip -m comment --comment "$*" - else - iptables -D $chain -j DROP -s $ip - fi + ip=$1 + shift + chain=INPUT + chain_name=$( awk -F= '/chain_name/ && $1 !~ /^\s*#/ {print $2}' $config) + if [[ -n $chain_name ]]; then + chain=$chain_name + fi + if [[ -n $1 ]]; then + iptables -D $chain -j DROP -s $ip -m comment --comment "$*" + else + iptables -D $chain -j DROP -s $ip + fi } # Parameters: # 1 - IP redirection() { - if [[ -z $redirect_ip ]]; then - echo "No redirect IP defined. Quiting without redirection." - exit 1 - fi - iptables -t nat -D PREROUTING -j DNAT -s $1 -p tcp --dport 80 --to $redirect_ip - iptables -t nat -D PREROUTING -j DNAT -s $1 -p tcp --dport 443 --to $redirect_ip - iptables -t nat -D PREROUTING -j DNAT -s $1 -p udp --dport 443 --to $redirect_ip + if [[ -z $redirect_ip ]]; then + echo "No redirect IP defined. Quiting without redirection." + exit 1 + fi + iptables -t nat -D PREROUTING -j DNAT -s $1 -p tcp --dport 80 --to $redirect_ip + iptables -t nat -D PREROUTING -j DNAT -s $1 -p tcp --dport 443 --to $redirect_ip + iptables -t nat -D PREROUTING -j DNAT -s $1 -p udp --dport 443 --to $redirect_ip } case "$block_type" in - ipset) - ipset_unblock $* - ;; - iptables) - iptables_unblock $* - ;; - redirect) - redirection $* - ;; - *) - echo "Error: unsupported block type in the configuration $config" - ;; + ipset) + ipset_unblock $* + ;; + iptables) + iptables_unblock $* + ;; + redirect) + redirection $* + ;; + *) + echo "Error: unsupported block type in the configuration $config" + ;; esac diff --git a/fortress.conf b/fortress.conf index af4ef3a..0038652 100644 --- a/fortress.conf +++ b/fortress.conf @@ -1,41 +1,45 @@ -# +# # Fortress configuration # -# turn on/of the debugging of the daemon +# Turn on/off the debugging of the daemon. debug=0 -# if you don't run Fortress as systemd service, you most likely want fortress running as daemon +# If you do not run Fortress as systemd service, you most likely want fortress +# running as daemon. daemonize=0 # Exclude IPs or ranges from being blocked -# The files have one IP or CIDR range per line and can have comments with # at the begining of the line. -# You have many lists prepared for you in /etc/fortress. +# The files have one IP or CIDR range per line and can have comments with # at +# the begining of the line. You have many lists prepared for you in the +# /etc/fortress directory. excludes="/etc/fortress/cloudflare.txt /etc/fortress/google.txt /etc/fortress/yahoo.txt /etc/fortress/my.txt" -# On which ports should we monitor for connections in SYN_RECV or ESTABLISHED states. -# Anything other then these local ports is skipped. -# Default: 80 443 +# On which ports should we monitor for connections in SYN_RECV or ESTABLISHED +# states? Anything other then these local ports is skipped. Default: 80 443 ports=25 53 80 110 143 443 993 995 # Type of blocking you want to do: -# iptables - using iptables to block the offending IP. You may also uncomment the chain_name option. -# If chain_name is not defined INPUT will be used. -# ipset - using IPsets to block the offending IP. You also have to uncomment ipset_name option. -# redirect - in this setup, traffic to web will be redirected to an IP using DNAT. For this type -# you also need to set redirect_ip +# iptables - Use iptables to block the offending IP. You may also uncomment the +# chain_name option. If chain_name is not defined INPUT will be +# used. +# ipset - Use IPsets to block the offending IP. You also have to uncomment +# ipset_name option. +# redirect - In this setup, traffic to web will be redirected to an IP using +# DNAT. For this type you also need to set redirect_ip and configure +# another server to run the other page. block_type=iptables #ipset_name=blocklist #chain_name=block #redirect_ip=127.0.0.1 -# Path to the scripts used for blocking and unblocking of offending IPs +# Path to the scripts used for blocking and unblocking of offending IPs. block_script=/usr/sbin/fortress-block -# When using ipset with automatic expire, unblock script is not needed +# When using ipset with automatic expire, unblock script is not needed. unblock_script=/usr/sbin/fortress-unblock -# Blocked time in seconds. -# Default: 900sec(15min) +# Blocked time in seconds. +# Default: 900sec (15min) block_time=900 ## Connection count configuration @@ -53,7 +57,8 @@ high_conns=20 low_syn_recv_conns=50 high_syn_recv_conns=25 -# File that stores the list of last blocked IPs before last service interruption. +# File that stores the list of last blocked IPs before last service +# interruption. store_db=/var/cache/fortress/ip.db # File locations diff --git a/fortress.pl b/fortress.pl index 5efea21..071c290 100755 --- a/fortress.pl +++ b/fortress.pl @@ -1,4 +1,23 @@ #!/usr/bin/perl + +# fortress.pl +# Copyright (C) 2023 Marian Marinov +# IP detector for Fortress. https://github.com/hackman/Fortress + +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, see +# . + use strict; use warnings; use POSIX qw(strftime setsid); @@ -20,12 +39,13 @@ my $load = 0; open my $conf_file, '<', $config_path or die "Error: Cannot open configuration file($config_path): $!"; -# Read the configuration file, by skipping all lines that start with # and remove any quotes +# Read the configuration file, by skipping all lines that start with # and +# remove any quotes. while (my $line = <$conf_file>) { next if ($line !~ /^\s*\w/); $line =~ s/[\s\r\n]*$//g; $line =~ s/['"]*$//g; - my ($key, $val) = split /=/, $line, 2; + my ($key, $val) = split /=/, $line, 2; $config{$key} = $val; } close $conf_file; @@ -70,10 +90,10 @@ sub block_ip { my $blocked_ref = shift; my $ip = shift; my $msg = shift; - return if (exists $blocked_ref->{$ip}); # already blocked + return if (exists $blocked_ref->{$ip}); # Already blocked. logger($conf_ref, $msg); - + $blocked_ref->{$ip}=time(); system($conf_ref->{'block_script'}, $ip, $msg); } @@ -90,7 +110,7 @@ sub get_local_ips { return; } -# Make sure none of the local IPs on the machine gets accidentally blocked +# Make sure none of the local IPs on the machine gets accidentally blocked. get_local_ips($excludes); if (exists $config{'exclude_files'} and $config{'exclude_files'} ne '') { @@ -118,7 +138,7 @@ sub get_local_ips { die "Error: missing block_script or $config{'block_script'} not executable\n"; } -# check if the daemon is running +# Check if the daemon is running. if ( -e $config{'pid_file'} ) { # get the old pid umask 077; @@ -164,11 +184,11 @@ sub get_local_ips { $config{'ports'} = '80 443'; } -# Convert the port numbers to hex and put them in a hash +# Convert the port numbers to hex and put them in a hash. %ports = map { sprintf('%04X', $_) => 1 } split /\s+/, $config{'ports'}; -# This is used only to optimize the check in the loop later. -# This way we don't need to convert every hex port from the file to decimal. +# This is used only to optimize the check in the loop later. This way we do not +# need to convert every hex port from the file to decimal. my %monitored_states = ( '01' => 'ESTABLISHED', '03' => 'SYN_RECV' @@ -179,26 +199,29 @@ sub get_local_ips { logger(\%config, "Ports monitored: $config{'ports'}"); logger(\%config, "High load set to: $config{'high_load'}"); while (1) { - # Make sure we start the loop with empty values + # Make sure we start the loop with empty values. %established= (); %syn_sent = (); $counter++; - # We use a counter here, instead of actual times as it is more efficient. The counter is not so suffisticated, as - # the code, some times may not execute in less then 1sec. But we don't need high accuracy here. - clean_ips(\%config, $blocked_ips) if ($counter%10 == 0); # execute every 10th time (10sec) - $load = get_load(\%config) if ($counter%5 == 0); # get the current load every 5 seconds - $counter=0 if ($counter > 10000); # reset the counter to prevent comparison of very high numbers - store \%blocked, $config{'store_db'} if ($counter%120 == 0);# execute every 120th time (rufly every 120sec) + # We use a counter here, instead of actual times as it is more + # efficient. The counter is not so sophisticated, as the code, some + # times may not execute in less then 1 second. But we do not need high + # accuracy here. + clean_ips(\%config, $blocked_ips) if ($counter%10 == 0); # Execute every 10th time (10sec). + $load = get_load(\%config) if ($counter%5 == 0); # Get the current load every 5 seconds. + $counter=0 if ($counter > 10000); # Reset the counter to prevent comparison of very high numbers. + store \%blocked, $config{'store_db'} if ($counter%120 == 0); # Execute every 120th time (roughly every 120sec). my $conn_count = $config{'low_conns'}; my $syn_count = $config{'low_syn_recv_conns'}; - # We do this check here, otherwise we would need to do it in the loop, just before we check the $established count. + # We do this check here, otherwise we would need to do it in the loop, + # just before we check the $established count. if ($load > $config{'high_load'}) { $conn_count = $config{'high_conns'}; $syn_count = $config{'high_syn_recv_conns'}; } - # Collect the stats + # Collect the stats. open my $tcp, '<', '/proc/net/tcp' or die "Error: Failed to open /proc/net/tcp: $!"; while (<$tcp>) { # sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode @@ -210,11 +233,13 @@ sub get_local_ips { my $remote_hex_port = $4; my $state = $5; - # Do not check states other then ESTABLISHED and SYN_RECV + # Do not check states other then ESTABLISHED and SYN_RECV. next if (!exists $monitored_states{$state}); - # The IP is written in reverse byte order, in hex. This converts each two hex chars into a number and at the end returns the dotted IPv4 format, that is expected. + # The IP is written in reverse byte order, in hex. This + # converts each two hex chars into a number and at the end + # returns the dotted IPv4 format, that is expected. my $ip = hex(substr($remote_hex_ip,6,2)) . '.' . hex(substr($remote_hex_ip,4,2)) . '.' . hex(substr($remote_hex_ip,2,2)) . '.' . hex(substr($remote_hex_ip,0,2)); - # Do not continue if the IP is in the excluded list + # Do not continue if the IP is in the excluded list. next if ($excludes->match_string($ip)); # States: @@ -223,19 +248,22 @@ sub get_local_ips { # 06 - TIME_WAIT # 08 - CLOSE_WAIT - # This is to catch smaller SYN flood attacks, usually dispersed between multiple source IPs. - # This should be checked no matter the load value. + # This is to catch smaller SYN flood attacks, usually dispersed + # between multiple source IPs. This should be checked no matter + # the load value. if ($state eq '03') { $syn_sent{$ip}++; } - # Check established conns, if the port is one of the ports configured to be monitored + # Check established conns, if the port is one of the ports + # configured to be monitored. if ($state eq '01' and exists $ports{$local_hex_port}) { $established{$ip}++; } } # read /proc/net/tcp - # Check if we need to block any IP. We do it here and not in the above loop, so we know what was the actual number of conns from the IP. + # Check if we need to block any IP. We do it here and not in the above + # loop, so we know what was the actual number of conns from the IP. while (my ($ip, $conns) = each(%syn_sent)) { if ($syn_sent{$ip} > $syn_count) { block_ip(\%config, $blocked_ips, $ip, "Blocking IP $ip for having more then $syn_count($syn_sent{$ip}) SYN_RECV connections"); diff --git a/fortress.service b/fortress.service index 5a49d68..7fe12e4 100644 --- a/fortress.service +++ b/fortress.service @@ -3,7 +3,7 @@ Description=Fortress connection blocking service After=network.target [Service] -# Disable OOM kill for this process +# Disable OOM kill for this process. OOMScoreAdjust=-1000 ExecStart=/usr/sbin/fortress TimeoutSec=15 From e21529c99847afc399abf4b71690a019d63c72d4 Mon Sep 17 00:00:00 2001 From: TechnologyClassroom Date: Wed, 15 Apr 2026 22:04:22 -0400 Subject: [PATCH 2/6] shellcheck --- fortress-block.sh | 32 ++++++++++++++++---------------- fortress-unblock.sh | 28 ++++++++++++++-------------- 2 files changed, 30 insertions(+), 30 deletions(-) diff --git a/fortress-block.sh b/fortress-block.sh index 0f33e2f..a4e9e1e 100755 --- a/fortress-block.sh +++ b/fortress-block.sh @@ -22,7 +22,7 @@ config=/etc/fortress/fortress.conf if [[ ! -f $config ]]; then echo "Missing configuration file: $config" - exit + exit 1 fi redirect_ip=$(awk -F= '/redirect_ip/ && $1 !~ /^\s*#/ {print $2}' $config) block_type=$( awk -F= '/block_type/ && $1 !~ /^\s*#/ {print $2}' $config) @@ -33,12 +33,12 @@ comment='' if [[ $# -eq 0 ]]; then echo "Usage: $0 IP [comment]" - exit + exit 1 fi if [[ ! $1 =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - echo "Error: invalid IP format" - exit + echo "Error: Invalid IP format." + exit 1 fi # Parameters: @@ -49,14 +49,14 @@ ipset_block() { shift ipset_name=$( awk -F= '/ipset_name/ && $1 !~ /^\s*#/ {print $2}' $config) if [[ -z $ipset_name ]]; then - echo "Error: unable to find ipset_name in $config." + echo "Error: Unable to find ipset_name in $config." echo -e "Please check the configuration and try again.\n" exit fi if [[ -n $1 ]]; then - ipset add $ipset_name $ip comment "$*" timeout $block_time + ipset add "$ipset_name" "$ip" comment "$*" timeout "$block_time" else - ipset add $ipset_name $ip + ipset add "$ipset_name" "$ip" fi } @@ -72,9 +72,9 @@ iptables_block() { chain=$chain_name fi if [[ -n $1 ]]; then - iptables -I $chain -j DROP -s $ip -m comment --comment "$*" + iptables -I "$chain" -j DROP -s "$ip" -m comment --comment "$*" else - iptables -I $chain -j DROP -s $ip + iptables -I "$chain" -j DROP -s "$ip" fi } @@ -85,22 +85,22 @@ redirection() { echo "No redirect IP defined. Quiting without redirection." exit 1 fi - iptables -t nat -A PREROUTING -j DNAT -s $1 -p tcp --dport 80 --to $redirect_ip - iptables -t nat -A PREROUTING -j DNAT -s $1 -p tcp --dport 443 --to $redirect_ip - iptables -t nat -A PREROUTING -j DNAT -s $1 -p udp --dport 443 --to $redirect_ip + iptables -t nat -A PREROUTING -j DNAT -s "$1" -p tcp --dport 80 --to "$redirect_ip" + iptables -t nat -A PREROUTING -j DNAT -s "$1" -p tcp --dport 443 --to "$redirect_ip" + iptables -t nat -A PREROUTING -j DNAT -s "$1" -p udp --dport 443 --to "$redirect_ip" } case "$block_type" in ipset) - ipset_block $* + ipset_block "$*" ;; iptables) - iptables_block $* + iptables_block "$*" ;; redirect) - redirection $* + redirection "$*" ;; *) - echo "Error: unsupported block type in the configuration $config" + echo "Error: Unsupported block type in the configuration $config" ;; esac diff --git a/fortress-unblock.sh b/fortress-unblock.sh index 2ac24b0..645e867 100755 --- a/fortress-unblock.sh +++ b/fortress-unblock.sh @@ -36,8 +36,8 @@ if [[ $# -eq 0 ]]; then fi if [[ ! $1 =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then - echo "Error: invalid IP format" - exit + echo "Error: Invalid IP format." + exit 1 fi # Parameters: @@ -48,11 +48,11 @@ ipset_unblock() { shift ipset_name=$( awk -F= '/ipset_name/ && $1 !~ /^\s*#/ {print $2}' $config) if [[ -z $ipset_name ]]; then - echo "Error: unable to find ipset_name in $config." + echo "Error: Unable to find ipset_name in $config." echo -e "Please check the configuration and try again.\n" - exit + exit 1 fi - ipset del $ipset_name $ip 2>/dev/null + ipset del "$ipset_name" "$ip" 2>/dev/null } # Parameters: @@ -67,9 +67,9 @@ iptables_unblock() { chain=$chain_name fi if [[ -n $1 ]]; then - iptables -D $chain -j DROP -s $ip -m comment --comment "$*" + iptables -D "$chain" -j DROP -s "$ip" -m comment --comment "$*" else - iptables -D $chain -j DROP -s $ip + iptables -D "$chain" -j DROP -s "$ip" fi } @@ -80,22 +80,22 @@ redirection() { echo "No redirect IP defined. Quiting without redirection." exit 1 fi - iptables -t nat -D PREROUTING -j DNAT -s $1 -p tcp --dport 80 --to $redirect_ip - iptables -t nat -D PREROUTING -j DNAT -s $1 -p tcp --dport 443 --to $redirect_ip - iptables -t nat -D PREROUTING -j DNAT -s $1 -p udp --dport 443 --to $redirect_ip + iptables -t nat -D PREROUTING -j DNAT -s "$1" -p tcp --dport 80 --to "$redirect_ip" + iptables -t nat -D PREROUTING -j DNAT -s "$1" -p tcp --dport 443 --to "$redirect_ip" + iptables -t nat -D PREROUTING -j DNAT -s "$1" -p udp --dport 443 --to "$redirect_ip" } case "$block_type" in ipset) - ipset_unblock $* + ipset_unblock "$*" ;; iptables) - iptables_unblock $* + iptables_unblock "$*" ;; redirect) - redirection $* + redirection "$*" ;; *) - echo "Error: unsupported block type in the configuration $config" + echo "Error: Unsupported block type in the configuration $config" ;; esac From 0ce037780d3682137f1a9a2238ebb6dca6a23cc4 Mon Sep 17 00:00:00 2001 From: TechnologyClassroom Date: Thu, 16 Apr 2026 23:40:10 -0400 Subject: [PATCH 3/6] Add comments with plan. --- fortress.pl | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/fortress.pl b/fortress.pl index 071c290..eef97c3 100755 --- a/fortress.pl +++ b/fortress.pl @@ -37,16 +37,17 @@ my $config_path = '/etc/fortress/fortress.conf'; my $excludes = new Net::Patricia; my $load = 0; +my $ipset_name = ''; open my $conf_file, '<', $config_path or die "Error: Cannot open configuration file($config_path): $!"; # Read the configuration file, by skipping all lines that start with # and # remove any quotes. while (my $line = <$conf_file>) { - next if ($line !~ /^\s*\w/); - $line =~ s/[\s\r\n]*$//g; - $line =~ s/['"]*$//g; - my ($key, $val) = split /=/, $line, 2; - $config{$key} = $val; + next if ($line !~ /^\s*\w/); + $line =~ s/[\s\r\n]*$//g; + $line =~ s/['"]*$//g; + my ($key, $val) = split /=/, $line, 2; + $config{$key} = $val; } close $conf_file; @@ -110,6 +111,18 @@ sub get_local_ips { return; } +# Bootstrap ipset if configured to use ipset. +# - Set $ipset_name if $config{'ipset_name'} exists. +# - If $ipset_name is not empty, boot strap the required steps to get ipset +# working. +# - Check if ipset exists. +# - Create ipset for fortress. +# ipset -exist -N fortress4 hash:net family inet maxelem 100000 +# - Check if iptables rules exist. +# - Create iptables rules for fortress ipset. +# iptables -w 10 -I INPUT 1 -m set --match-set fortress4 src -j DROP +# iptables -w 10 -I FORWARD 1 -m set --match-set fortress4 src -j DROP + # Make sure none of the local IPs on the machine gets accidentally blocked. get_local_ips($excludes); @@ -140,13 +153,13 @@ sub get_local_ips { # Check if the daemon is running. if ( -e $config{'pid_file'} ) { - # get the old pid + # Get the old pid. umask 077; open my $PIDFILE, '<', $config{'pid_file'} or die "Error: Can't open pid file(".$config{'pid_file'}."): $!\n"; $old_pid = <$PIDFILE>; close $PIDFILE; umask($umask); - # check if $old_pid is still running + # Check if $old_pid is still running. if ( $old_pid =~ /[0-9]+/ ) { if ( -d "/proc/$old_pid" ) { die "Error: Fortress is already running!\n"; From bd7fe2e0f651d2cde1da97b4b32b4c5819595bc0 Mon Sep 17 00:00:00 2001 From: Corwin Date: Fri, 17 Apr 2026 01:03:02 -0500 Subject: [PATCH 4/6] implement ipset bootstrapping first pass; this does nothing to "clean-up", for example if block_type is first set to ipset and then later changed the created ipset is abandoned and must be removed manually. I included a bunch of comments but maybe those should be removed to better match the tighter style of the rest of the program. --- fortress.pl | 48 +++++++++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 11 deletions(-) diff --git a/fortress.pl b/fortress.pl index eef97c3..e0b0c7d 100755 --- a/fortress.pl +++ b/fortress.pl @@ -111,17 +111,43 @@ sub get_local_ips { return; } -# Bootstrap ipset if configured to use ipset. -# - Set $ipset_name if $config{'ipset_name'} exists. -# - If $ipset_name is not empty, boot strap the required steps to get ipset -# working. -# - Check if ipset exists. -# - Create ipset for fortress. -# ipset -exist -N fortress4 hash:net family inet maxelem 100000 -# - Check if iptables rules exist. -# - Create iptables rules for fortress ipset. -# iptables -w 10 -I INPUT 1 -m set --match-set fortress4 src -j DROP -# iptables -w 10 -I FORWARD 1 -m set --match-set fortress4 src -j DROP +# ipset bootstrapping +if( $config{'block_type'} eq 'ipset' ) { + # take ipset name from $config{'ipset_name'} when defined + # otherwise use "fortress" as a default ipset name + $ipset_name = $config{'ipset_name'} || 'fortress'; + + # Check if ipset exists. + # grep lines returned when listing kernel ipset names + unless(grep /\b$ipset_name\b/, qx/ipset list -n/) { + # the set does not exist, create + my $create_command = + qq(ipset -exist -N $ipset_name hash:net family inet maxelem 100000); + + # system should return zero if all goes well + unless(system( $create_command )) { + # handle error, e.g. + die qq(failed to create ipset; fix this issue or try another block_type; $!); + } + } + + # - Check if iptables rules exist. + my @iptables_args = ( + qq(-w 10 -I INPUT 1 -m set --match-set $ipset_name src -j DROP), + qq(-w 10 -I FORWARD 1 -m set --match-set $ipset_name src -j DROP) + ); + for my$args (@iptables_args) { + # - Create iptables rules for fortress ipset. + if(system( qq(iptables -C $args) )) { + + # rule does not exist, create + unless(system( qq(iptables $args) )) { + # handle error, or don't. e.g. + die qq(failed to create iptable for ipset; fix this issue or try another block_type; $!); + } + } + } +} # Make sure none of the local IPs on the machine gets accidentally blocked. get_local_ips($excludes); From f7833493d83b39a586b34870b5387b414fab0e7c Mon Sep 17 00:00:00 2001 From: Michael McMahon Date: Fri, 17 Apr 2026 09:31:31 -0400 Subject: [PATCH 5/6] Change default ipset name to match reaction formatting. --- fortress.pl | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fortress.pl b/fortress.pl index e0b0c7d..5e18382 100755 --- a/fortress.pl +++ b/fortress.pl @@ -114,8 +114,8 @@ sub get_local_ips { # ipset bootstrapping if( $config{'block_type'} eq 'ipset' ) { # take ipset name from $config{'ipset_name'} when defined - # otherwise use "fortress" as a default ipset name - $ipset_name = $config{'ipset_name'} || 'fortress'; + # otherwise use "fortressv4" as a default ipset name + $ipset_name = $config{'ipset_name'} || 'fortressv4'; # Check if ipset exists. # grep lines returned when listing kernel ipset names From b1e8361e3d2b6403d80b34a6d91ce5deb4eedc95 Mon Sep 17 00:00:00 2001 From: TechnologyClassroom Date: Fri, 17 Apr 2026 21:32:12 -0400 Subject: [PATCH 6/6] Fix ipset setup. --- fortress.pl | 75 +++++++++++++++++++++++++++++------------------------ 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/fortress.pl b/fortress.pl index 5e18382..8d55bc1 100755 --- a/fortress.pl +++ b/fortress.pl @@ -101,7 +101,7 @@ sub block_ip { sub get_local_ips { my $excluded_ref = shift; - open my $ips, '-|', '/usr/sbin/ip -4 a l'; + open my $ips, '-|', '/sbin/ip -4 a l'; while(my $line = <$ips>) { if ($line =~ /inet ([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)\/[0-9]+/) { $excluded_ref->add_string($1, 'local'); @@ -111,42 +111,49 @@ sub get_local_ips { return; } +sub run_setup_command { + my( $action, $errstring, $command ) = @_; + + warn qq(info: running $action with # $command\n); + die qq(failed to $action; $errstring; $!) if system( $command ); +} + +sub try_setup_command { + my( $action, $command ) = @_; + + warn qq(info: probing for $action with # $command\n); + system( qq($command >/dev/null 2>&1) ); +} + # ipset bootstrapping if( $config{'block_type'} eq 'ipset' ) { - # take ipset name from $config{'ipset_name'} when defined - # otherwise use "fortressv4" as a default ipset name - $ipset_name = $config{'ipset_name'} || 'fortressv4'; - - # Check if ipset exists. - # grep lines returned when listing kernel ipset names - unless(grep /\b$ipset_name\b/, qx/ipset list -n/) { - # the set does not exist, create - my $create_command = - qq(ipset -exist -N $ipset_name hash:net family inet maxelem 100000); - - # system should return zero if all goes well - unless(system( $create_command )) { - # handle error, e.g. - die qq(failed to create ipset; fix this issue or try another block_type; $!); - } - } - - # - Check if iptables rules exist. - my @iptables_args = ( - qq(-w 10 -I INPUT 1 -m set --match-set $ipset_name src -j DROP), - qq(-w 10 -I FORWARD 1 -m set --match-set $ipset_name src -j DROP) - ); - for my$args (@iptables_args) { - # - Create iptables rules for fortress ipset. - if(system( qq(iptables -C $args) )) { - - # rule does not exist, create - unless(system( qq(iptables $args) )) { - # handle error, or don't. e.g. - die qq(failed to create iptable for ipset; fix this issue or try another block_type; $!); - } + # Take ipset name from $config{'ipset_name'} when defined otherwise use + # "fortressv4" as a default ipset name. + $ipset_name = $config{'ipset_name'} || 'fortressv4'; + + # Add ipset using -exist to prevent errors when it already exists. + my $ipset_create_command = + qq(ipset -exist -N $ipset_name hash:net family inet maxelem 100000); + # iptables command are modified to create "probing" versions. + my @iptables_cmds = ( + qq[iptables -I INPUT -m set --match-set $ipset_name src -j DROP], + qq[iptables -I FORWARD -m set --match-set $ipset_name src -j DROP] + ); + + run_setup_command( + 'create ipset', + 'fix this issue or try another block_type', + $ipset_create_command + ); + + for my$cmds (@iptables_cmds) { # + # Make a test version (-C) to avoid duplicating iptables entries. + my $testcmds = $cmds; + $testcmds =~ s/-I/-C/; + if(try_setup_command( 'iptable', $testcmds )) { + run_setup_command('iptable', 'check command manually for errors', $cmds); + } } - } } # Make sure none of the local IPs on the machine gets accidentally blocked.