{ "cells": [ { "cell_type": "markdown", "id": "41485f29-7287-40d2-a87a-c5daeb84f731", "metadata": {}, "source": [ "## Analyzing raw OONI data, a case study\n", "\n", "The goal of this notebook is to explain some of the common workflows that can be adopted when performing analysis of OONI data. This will be done within the context of a specific case study and will focus on the analysis of [Web Connectivity](https://github.com/ooni/spec/blob/master/nettests/ts-017-web-connectivity.md) data.\n", "\n", "We will be focusing on answering the following 2 research questions:\n", "- What domains present signs of blocking in Russia between the 23rd of February and the 17th of March 2022?\n", "- How does the blocking vary from ISP to ISP?\n", "\n", "It can be useful, before you dive into more extensive analysis, to get a sense for what you are likely to find in the data by using the [Measurement Aggregation Toolkit](https://explorer.ooni.org/experimental/mat). For example you can pick a certain country and plot the [anomalies with a per-domain breakdown](https://explorer.ooni.org/experimental/mat?probe_cc=RU&test_name=web_connectivity&category_code=GRP&since=2022-03-09&until=2022-04-09&axis_x=measurement_start_day&axis_y=domain) (it's often helpful to limit the domains to categories that are most relevant, so as to focus on interesting insight).\n", "\n", "In doing so, you will understand if there is something interesting to investigate in the country in question at all and will also help in identifying some examples of interesting sites that you might want to further investigate.\n", "\n", "It's also posisble to use the same API the MAT relies on, for downloading the anomaly,confirmed,failure,ok breakdowns to be used in your own analysis or plotting tooling. Depending on the type of analysis you need to do, this might be sufficient, however keep in mind that the anomaly flag is [suscpetible to false positives](https://ooni.org/support/faq/#why-do-false-positives-occur).\n", "\n", "It's also useful, while you are performing the analysis, to refer to OONI Explorer to inspect the measurements that present anomalies, so as to be able to identify patterns that you can use to further improve your detection heuristics.\n", "\n", "At a high level the workflow we are going to look at is the following:\n", "\n", "![High level overview](https://kroki.io/blockdiag/svg/eNqVj7EKwkAMhnefIpM3CUVxEgVF3FxcHMQh9mINXpNyplQQ392ednAR6RjyfX_yn4LmV89YwGMA4NbaSFD0sFvuwaOhg9EC3IbQ6khAd4uYG6vAEEoWLvmGafxgqxTGUgCKqH0ttig1hlavgkbs_HNLUqwii4Eno3eum6U3evA_D_cNOjTs7TKfZNkxmf8rd8J42grPF1OgcX0=)\n", "\n", "### Downloading the data\n", "\n", "Once you have gotten a feel for the data, it's time to download the raw dataset.\n", "\n", "We offer a tool called oonidata (that's currently in BETA and be sure you have at least v0.2.3), which can be installed by running:\n", "```\n", "pip install oonidata\n", "```\n", "\n", "To download all OONI data for this example notebook, run the following command (you should have at least 38GB on disk):\n", "```\n", "oonidata sync --start-day 2022-02-23 --end-day 2022-03-17 --probe-cc RU --test-name web_connectivity --output-dir ooni-russia-data\n", "```" ] }, { "cell_type": "code", "execution_count": 1, "id": "a96ac23b-e9cd-482c-b598-ba70184eee58", "metadata": {}, "outputs": [], "source": [ "import pandas as pd\n", "import numpy as np\n", "import matplotlib.pyplot as plt\n", "\n", "from datetime import datetime, timedelta\n", "from dateutil.parser import parse as parse_date\n", "from urllib.parse import urlencode, quote, urlparse\n", "\n", "from tqdm import tqdm\n", "tqdm.pandas()" ] }, { "cell_type": "markdown", "id": "aff8b48e-786d-462f-91ed-881f995a9a5f", "metadata": {}, "source": [ "### OONI Explorer utility functions\n", "\n", "Below are a couple of useful utility functions when dealing with measurements. They take a dataframe row and return (or print) the OONI Explorer URL. This is useful to get a link to OONI explorer to more easily inspect the raw measurement to better understand what is going on." ] }, { "cell_type": "code", "execution_count": 2, "id": "db0a313f-7410-409a-9059-a6e19bd157a9", "metadata": {}, "outputs": [], "source": [ "def get_explorer_url(e):\n", " query = ''\n", " if 'input' in e.keys() and e['input']:\n", " query = '?input={}'.format(quote(e['input'], safe=''))\n", " return 'https://explorer.ooni.org/measurement/{}{}'.format(e['report_id'], query)\n", " \n", "def print_explorer_url(e):\n", " print(get_explorer_url(e))" ] }, { "cell_type": "markdown", "id": "0a2c55b2-f304-4288-92ff-965991ffdea6", "metadata": {}, "source": [ "### Extracting metadata from raw measurements\n", "\n", "The OONI raw data is very rich, but for most analysis use-cases you just need a subset of the fields or some value that is derived from them.\n", "\n", "Below are functions that will extract all the metadata we care about from the web_connectivity test." ] }, { "cell_type": "code", "execution_count": 3, "id": "b0ed1fd5-5338-43ec-ae9a-d3dd468a5e2f", "metadata": {}, "outputs": [], "source": [ "import requests\n", "from base64 import b64decode\n", "import hashlib\n", "import json\n", "import re\n", "\n", "def get_raw_measurement(row):\n", " r = requests.get(\"https://api.ooni.io/api/v1/measurement_meta\", params={\n", " 'report_id':row['report_id'],\n", " 'input': row['input'],\n", " 'full': True\n", " })\n", " j = r.json()\n", " return json.loads(j['raw_measurement'])\n", "\n", "def get_resolved_ips(msmt):\n", " queries = msmt['test_keys'].get('queries', [])\n", " if not queries:\n", " return ''\n", " answers = queries[0].get('answers', [])\n", " if not answers:\n", " return []\n", " \n", " ip_list = []\n", " for a in answers:\n", " ip = a.get('ipv4', '')\n", " if ip:\n", " ip_list.append(ip)\n", " return ip_list\n", "\n", "def get_control_failure(msmt):\n", " if 'test_keys' not in msmt:\n", " return 'missing_test_keys'\n", " return msmt['test_keys']['control_failure']\n", "\n", "def get_test_keys_blocking(msmt):\n", " return str(msmt['test_keys']['blocking'])\n", "\n", "def get_http_experiment_failure(msmt):\n", " return str(msmt['test_keys']['http_experiment_failure'])\n", "\n", "def get_resolver_info(msmt):\n", " return {\n", " 'resolver_ip': msmt.get('resolver_ip', ''),\n", " 'resolver_asn': msmt.get('resolver_asn', ''),\n", " 'resolver_network_name': msmt.get('resolver_network_name', '')\n", " }\n", "\n", "def get_network_events(msmt):\n", " return msmt['test_keys'].get('network_events', [])\n", "\n", "def get_tcp_connect(msmt):\n", " return msmt['test_keys'].get('tcp_connect', [])\n", "\n", "def decode_body(body):\n", " if body is None:\n", " return ''\n", " if isinstance(body, dict):\n", " raw_body = b64decode(body['data'])\n", " try:\n", " return raw_body.decode('utf-8')\n", " except:\n", " return raw_body\n", " return body\n", "\n", "def get_last_response_body(msmt):\n", " try:\n", " # The requests/response list sorts them from the newest to the oldest, \n", " # hence the first item in the list is the last response we received.\n", " body = msmt['test_keys']['requests'][0]['response']['body']\n", " return decode_body(body)\n", " except (KeyError, TypeError, IndexError):\n", " return ''\n", "\n", "TITLE_REGEXP = re.compile(\"

(.*?)\", re.IGNORECASE | re.DOTALL)\n", "# Doesn't take into account ordering\n", "META_TITLE_REGEXP = re.compile(\"= ts:\n", " continue\n", " if query.get('until') and parse_date(query['until']) <= ts:\n", " continue\n", " yield p\n", " \n", "def iter_raw_measurements(query):\n", " path_list = list(iter_jsonl_paths(query))\n", " print(f\"processing {len(path_list)}\")\n", " for fp in tqdm(path_list):\n", " for msmt in iter_msmts(fp):\n", " if query.get('probe_asn') and msmt['probe_asn'] != query['probe_asn']:\n", " continue\n", " if query.get('domain'):\n", " domain = urlparse(msmt['input']).netloc\n", " if domain != query['domain']:\n", " continue\n", " yield msmt" ] }, { "cell_type": "code", "execution_count": 7, "id": "6439fc37-2715-4cc1-9b50-a4754aebf955", "metadata": {}, "outputs": [], "source": [ "import csv\n", "\n", "def msmt_to_csv(query, output_file=\"output.csv\"):\n", " with open(output_file, 'w') as output_file:\n", " csv_writer = None\n", " for msmt in iter_raw_measurements(query):\n", " msmt_meta = get_measurement_meta(msmt)\n", " if csv_writer is None:\n", " fieldnames = msmt_meta.keys()\n", " csv_writer = csv.DictWriter(output_file, fieldnames=fieldnames)\n", " csv_writer.writeheader()\n", " csv_writer.writerow(msmt_meta)" ] }, { "cell_type": "code", "execution_count": 8, "id": "898e8ebf-bce6-4a7e-905a-0563460b539d", "metadata": {}, "outputs": [], "source": [ "def get_msmt_df(query):\n", " msmt_list = []\n", " for msmt in iter_raw_measurements(query):\n", " mdf = pd.DataFrame([get_measurement_meta(msmt)])\n", " msmt_list.append(mdf)\n", " return pd.concat(msmt_list, ignore_index=True)" ] }, { "cell_type": "markdown", "id": "5dbaf33a-5686-4c16-8c9c-380fa55f0302", "metadata": {}, "source": [ "Here we do the actual conversion to CSV." ] }, { "cell_type": "code", "execution_count": null, "id": "5a5546b9-d164-4f14-a115-ff14cfe675b4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "processing 14234\n" ] }, { "name": "stderr", "output_type": "stream", "text": [ " 94%|████████████████████████████████████████████████████████▌ | 13411/14234 [1:27:58<05:48, 2.36it/s]" ] } ], "source": [ "msmt_to_csv({\n", " 'since': '2022-02-23',\n", " 'until': '2022-03-17',\n", " 'probe_cc': 'RU',\n", " 'test_name': 'web_connectivity'\n", "}, output_file=\"ooni-data-russia.csv\")" ] }, { "cell_type": "code", "execution_count": 10, "id": "3f784f91-8de0-4595-9559-998ff3d40e23", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "3423845 ooni-data-russia.csv\n" ] } ], "source": [ "!wc -l ooni-data-russia.csv" ] }, { "cell_type": "markdown", "id": "0cb1e94e-746b-42cd-898f-6f46122e65d1", "metadata": {}, "source": [ "We then load the CSV file in memory as a pandas dataframe for more analysis" ] }, { "cell_type": "code", "execution_count": 11, "id": "3dbca11f-b14a-4ff8-8a78-dcd0c15db207", "metadata": {}, "outputs": [], "source": [ "df_ru = pd.read_csv('ooni-data-russia.csv')" ] }, { "cell_type": "code", "execution_count": 12, "id": "d7c05cfc-c6bc-48d3-b4d0-7ec3f85eecef", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3152336" ] }, "execution_count": 12, "metadata": {}, "output_type": "execute_result" } ], "source": [ "len(df_ru)" ] }, { "cell_type": "markdown", "id": "9616a5be-8915-45af-93dd-4ad6e0d01c82", "metadata": {}, "source": [ "When dealing with websites, we generally care to look at data from a domain centric perspective. This allows us to group together URLs that are of the same domain, but that have different paths.\n", "\n", "Since the raw dataset doesn't include the `domain` we add this column here." ] }, { "cell_type": "code", "execution_count": 13, "id": "0adbc67f-adf9-4d7b-aa47-93b91b696b66", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|██████████████████████████████████████████████████████| 3152336/3152336 [00:08<00:00, 365955.32it/s]\n" ] } ], "source": [ "df_ru['domain'] = df_ru['input'].progress_apply(lambda r: urlparse(r).netloc)" ] }, { "cell_type": "code", "execution_count": 14, "id": "c15eadb9-8149-4d80-b011-f9c72a59dbb2", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "13.035878223367035" ] }, "execution_count": 14, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ru.memory_usage(deep=True).sum()/1024**3" ] }, { "cell_type": "markdown", "id": "9cf49c12-b6c0-4c0c-af15-9872f28fe712", "metadata": {}, "source": [ "### Hunting for blocking fingerprints\n", "\n", "We can have a very high confidence that the blocking is intentional (and not caused by transient network failures), when it fits in the following classes:\n", "- DNS level interference\n", "- HTTP level intereference\n", "- TLS MITM\n", "\n", "\n", "The first two classes, though, are susceptive to false positives, because sometimes the IP returned in a DNS query can differ based on the geographical location (think CDNs) and sometimes the content of a webpage can also vary from request to request (think the homepage of a news site).\n", "\n", "On the other hand, once we find a blocking fingerprint, we can with great confidence claim that access to that particular site is being restricted. For example we might notice that when a site is blocked on a particular network, the DNS query always returns a given IP address or we might know that the HTTP title for a blockpage is always \"Access to this website is denied\".\n", "\n", "Our goal now to come up with some heuristics that will allow us to, in a way, hunt for these blockpage fingerprints in the big dataset that we have available." ] }, { "cell_type": "markdown", "id": "7ce9e1ba-6888-44a4-bc74-3daaf697f89e", "metadata": {}, "source": [ "### Same title, but different page\n", "\n", "One heuristic which we can apply to spotting blockpages, is that we can say that a web page that looks exactly the same for many different sites. Based on this fairly simple intuition, we can look for blockpage fingerprints by just counting for the number of domains that share the same HTTP title tag." ] }, { "cell_type": "code", "execution_count": 15, "id": "1b97c56c-2da8-4987-aabd-191f6fb5003a", "metadata": {}, "outputs": [], "source": [ "title_domain_count = df_ru[\n", " df_ru['blocking'] == 'http-diff'\n", "].groupby('http_title')['domain'].nunique().sort_values().reset_index()" ] }, { "cell_type": "markdown", "id": "4881770f-2b65-4574-88c4-ac6611ee02cf", "metadata": {}, "source": [ "As we can see in the breakdown below, all these blockpage fingerprints look fairly suspicious and are quite likely to be an indication of blocking. Some of them, however, might be signs of server-side blocking (ex. Geoblocking or DDOS prevention). This is why it's best, to obtain a high degree of accuracy, to investigate these manually and add them to a fingerprint database.\n", "\n", "This is a shared effort amonst censorship research projects, for example you can find a repo of known blocking fingerprints maintained by the CitizenLab here: https://github.com/citizenlab/filtering-annotations " ] }, { "cell_type": "code", "execution_count": 16, "id": "8bf95466-f879-4187-a670-8f38ab86c95f", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
http_titledomain
181Доступ к информационному ресурсу ограничен10
182Доступ к ресурсу ограничен!10
183Just a moment...10
184ERROR: The requested URL could not be retrieved11
185403 Forbidden13
186Dr.Web не рекомендует посещать этот сайт14
187Инфолинк17
188Доступ ограничен | Наука-Связь18
189Антивирус ESET NOD3221
190РКН МегаФон25
191Доступ ограничен!26
192Подряд - Сайт заблокирован по решению суда26
193Доступ заблокирован / Access blocked26
194Марк37
195RialCom39
196Инсис45
197МегаФон Kaspersky50
198МегаФон Gameloft51
199Akado51
200МегаФон Пресса52
201Яндекс с МегаФоном53
202МегаФон Знаю, кто звонит53
203Подписка START с МегаФоном54
204МегаФон SMS-фильтр54
205Доступ к запрошенному ресурсу заблокирован55
206IVI с МегаФоном57
207МТС57
208МегаФон МегаФон ТВ59
209Запрещено59
210МегаФон Стоп-реклама63
211Планета65
212MTC69
213Доступ запрещён72
214Домен заблокирован73
215РКН74
216Ресурс заблокирован75
217Орион телеком :: БЛОКИРОВКА75
218Доступ заблокирован76
219Единый реестр доменных имен, указателей страни...79
220Доступ к ресурсу заблокирован80
221Страница заблокирована84
222Доступ закрыт87
223Данный ресурс заблокирован87
224TTK :: Доступ к ресурсу ограничен90
225Доступ к ресурсу ограничен90
226Доступ к запрашиваемому ресурсу ограничен92
227Ресурс заблокирован - Resource is blocked95
228Доступ ограничен109
\n", "
" ], "text/plain": [ " http_title domain\n", "181 Доступ к информационному ресурсу ограничен 10\n", "182 Доступ к ресурсу ограничен! 10\n", "183 Just a moment... 10\n", "184 ERROR: The requested URL could not be retrieved 11\n", "185 403 Forbidden 13\n", "186 Dr.Web не рекомендует посещать этот сайт 14\n", "187 Инфолинк 17\n", "188 Доступ ограничен | Наука-Связь 18\n", "189 Антивирус ESET NOD32 21\n", "190 РКН МегаФон 25\n", "191 Доступ ограничен! 26\n", "192 Подряд - Сайт заблокирован по решению суда 26\n", "193 Доступ заблокирован / Access blocked 26\n", "194 Марк 37\n", "195 RialCom 39\n", "196 Инсис 45\n", "197 МегаФон Kaspersky 50\n", "198 МегаФон Gameloft 51\n", "199 Akado 51\n", "200 МегаФон Пресса 52\n", "201 Яндекс с МегаФоном 53\n", "202 МегаФон Знаю, кто звонит 53\n", "203 Подписка START с МегаФоном 54\n", "204 МегаФон SMS-фильтр 54\n", "205 Доступ к запрошенному ресурсу заблокирован 55\n", "206 IVI с МегаФоном 57\n", "207 МТС 57\n", "208 МегаФон МегаФон ТВ 59\n", "209 Запрещено 59\n", "210 МегаФон Стоп-реклама 63\n", "211 Планета 65\n", "212 MTC 69\n", "213 Доступ запрещён 72\n", "214 Домен заблокирован 73\n", "215 РКН 74\n", "216 Ресурс заблокирован 75\n", "217 Орион телеком :: БЛОКИРОВКА 75\n", "218 Доступ заблокирован 76\n", "219 Единый реестр доменных имен, указателей страни... 79\n", "220 Доступ к ресурсу заблокирован 80\n", "221 Страница заблокирована 84\n", "222 Доступ закрыт 87\n", "223 Данный ресурс заблокирован 87\n", "224 TTK :: Доступ к ресурсу ограничен 90\n", "225 Доступ к ресурсу ограничен 90\n", "226 Доступ к запрашиваемому ресурсу ограничен 92\n", "227 Ресурс заблокирован - Resource is blocked 95\n", "228 Доступ ограничен 109" ] }, "execution_count": 16, "metadata": {}, "output_type": "execute_result" } ], "source": [ "title_domain_count[\n", " title_domain_count['domain'] > 8\n", "]" ] }, { "cell_type": "markdown", "id": "bd33a5d0-bed6-4d8f-a6e1-9cf1337785b3", "metadata": {}, "source": [ "Once we have confirmed that a fingerprint is known to implement blocking, we can use it to which domains are being restricted." ] }, { "cell_type": "code", "execution_count": 17, "id": "c9817b77-2e1a-4527-b740-980ff5720554", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['www.linkedin.com', 'www.seedjah.com', 'tushkan.net',\n", " 'bluesystem.ru', 'www.resistance88.com', 'khilafah.net',\n", " 'www.casinoking.com', 'www.eurogrand.com', 'www.usacasino.com',\n", " 'www.anonymizer.ru', 'thepiratebay.org', 'www.lesbi.ru',\n", " 'www.sex.com', 'www.slotland.com', 'www.sportsinteraction.com',\n", " 'www.youporn.com', 'www.spinpalace.com', 'www.sportingbet.com',\n", " 'www.weedy.be', 'libgen.lc', 'new-rutor.org', 'lib.rus.ec',\n", " 'megatfile.cc', 'anonymouse.org', 'ikhwanonline.com',\n", " 'imrussia.org', 'limonka.nbp-info.com', 'mirknig.su',\n", " 'www.hizb-ut-tahrir.org', 'www.blackseango.org',\n", " 'www.grandonline.com', 'nomer-org.website', 'www.aceshigh.com',\n", " 'www.islamdin.com', 'www.partypoker.com', 'betway.com',\n", " 'drugs-forum.com', 'vozrojdenie.crimea.ua', 'www.deti-404.com',\n", " 'www.uniongang.net', 'rutracker.org', 'libgen.rs',\n", " 'hotgaylist.com', 'beeg.com', 'weedfarmer.com',\n", " 'www.888casino.com', 'www.carnivalcasino.com',\n", " 'www.pokerstars.com', 'www.artnet.com', 'bluesystem.info',\n", " 'khodorkovsky.ru', 'censor.net.ua', 'ipvnews.org', 'baskino.me',\n", " 'kinozal.tv', 'namba.kz', 'nnmclub.to', 'www.kasparov.ru',\n", " 'www.ned.org', 'kavkaz.tv', 'www.europacasino.com', 'kinobolt.ru',\n", " 'www.daymohk.org', 'www.kavkazcenter.com', 'www.annacasino.ru',\n", " 'www.ej.ru', 'www.khilafah.com', 'proxy.org', 'www.medinkur.ru',\n", " 'seedoff.zannn.top', 'pornolab.net', 'www.betfair.com',\n", " 'www.casinotropez.com', 'www.goldenrivieracasino.com',\n", " 'www.lostfilm.tv', 'rapidgator.net', 'howtogrowmarijuana.com',\n", " 'www.gotgayporn.com', 'www.agentura.ru', 'www.bbc.com',\n", " 'www.narkop.com', 'www.cannaweed.com', 'zhurnal.lib.ru',\n", " 'haamash.wordpress.com', 'www.marijuana.com', 'guardster.com',\n", " 'www.rollitup.org', 'xs.gay.ru', 'www.minjust.net',\n", " 'video.mivzakon.co.il', 'kazak-chita.ru', 'kasparov.ru'],\n", " dtype=object)" ] }, "execution_count": 17, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ru[\n", " (df_ru['http_title'] == 'Доступ к ресурсу ограничен')\n", "]['domain'].unique()" ] }, { "cell_type": "code", "execution_count": 18, "id": "8a63bd45-b1cd-41bc-a581-3bc6b8937064", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "3779 be62357d2a95c5d8a4df95a75284b9b2\n", "5684 be62357d2a95c5d8a4df95a75284b9b2\n", "11936 be62357d2a95c5d8a4df95a75284b9b2\n", "12001 be62357d2a95c5d8a4df95a75284b9b2\n", "12524 be62357d2a95c5d8a4df95a75284b9b2\n", " ... \n", "3123964 be62357d2a95c5d8a4df95a75284b9b2\n", "3124077 be62357d2a95c5d8a4df95a75284b9b2\n", "3138277 be62357d2a95c5d8a4df95a75284b9b2\n", "3138369 be62357d2a95c5d8a4df95a75284b9b2\n", "3140570 be62357d2a95c5d8a4df95a75284b9b2\n", "Name: http_body_md5, Length: 1831, dtype: object" ] }, "execution_count": 18, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ru[\n", " (df_ru['http_title'] == 'Доступ к ресурсу ограничен')\n", "]['http_body_md5']" ] }, { "cell_type": "markdown", "id": "946144f0-43c1-44c8-987e-9495b96f578f", "metadata": {}, "source": [ "### DNS level interference\n", "\n", "We can use a similar heuristics for DNS level interference. The assumption is the same, when we see one IP being mapped to multiple hostnames, it's an indication of it potentially being an IP used to implement blocking.\n", "\n", "In this case, we need to be careful of false positives that might be caused by the use of CDNs, as these will be hosting multiple sites. In the sections below we can see what techniques we can adopt to reduce these false positives further." ] }, { "cell_type": "markdown", "id": "8fe85118-9a33-4acb-b945-53403165cbe5", "metadata": {}, "source": [ "We are going to make use of a IP to ASN database for some of our heuristics. In particular we are going to download the one from db-ip, which has a fairly permissive license and is compatible with the maxmind database format." ] }, { "cell_type": "code", "execution_count": null, "id": "dffd5107-536f-4603-8f82-1203e6ccf2d8", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ " % Total % Received % Xferd Average Speed Time Time Time Current\n", " Dload Upload Total Spent Left Speed\n", "100 4015k 100 4015k 0 0 45.5M 0 --:--:-- --:--:-- --:--:-- 45.5M\n" ] } ], "source": [ "!curl -O https://download.db-ip.com/free/dbip-asn-lite-2022-04.mmdb.gz" ] }, { "cell_type": "code", "execution_count": null, "id": "16eb1a3a-2836-4164-b6d0-9c96c175a376", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "gzip: dbip-asn-lite-2022-04.mmdb already exists; do you wish to overwrite (y or n)? " ] } ], "source": [ "!gunzip dbip-asn-lite-2022-04.mmdb.gz" ] }, { "cell_type": "code", "execution_count": 19, "id": "38f87a59-a8c7-4c0c-b0b4-2a228a8af3c1", "metadata": {}, "outputs": [], "source": [ "import maxminddb\n", "\n", "asn_db_path = 'dbip-asn-lite-2022-04.mmdb'\n", "def lookup_asn(ip):\n", " with maxminddb.open_database(asn_db_path) as reader:\n", " try:\n", " return reader.get(ip)\n", " # Probably not an IP\n", " except ValueError:\n", " return None" ] }, { "cell_type": "code", "execution_count": 20, "id": "11b35948-b9e6-4412-ad56-4859b8ee8f46", "metadata": {}, "outputs": [], "source": [ "dns_resp_sorted = df_ru[\n", " df_ru['blocking'] == 'dns'\n", "].groupby('dns_resolved_ips')['domain'].nunique().sort_values().reset_index()" ] }, { "cell_type": "code", "execution_count": 21, "id": "b35cb825-4342-476b-aa2d-1721f9ccd7e4", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
dns_resolved_ipsdomain
1737['184.85.124.165']3
1738['178.248.233.32']3
1739['185.107.56.192']3
1740['185.107.56.195']3
1741['185.107.56.52']3
.........
1862['80.76.104.20']222
1863['100.64.64.66']223
1864['95.213.158.61']225
1865['188.186.157.49']238
1866[]1590
\n", "

130 rows × 2 columns

\n", "
" ], "text/plain": [ " dns_resolved_ips domain\n", "1737 ['184.85.124.165'] 3\n", "1738 ['178.248.233.32'] 3\n", "1739 ['185.107.56.192'] 3\n", "1740 ['185.107.56.195'] 3\n", "1741 ['185.107.56.52'] 3\n", "... ... ...\n", "1862 ['80.76.104.20'] 222\n", "1863 ['100.64.64.66'] 223\n", "1864 ['95.213.158.61'] 225\n", "1865 ['188.186.157.49'] 238\n", "1866 [] 1590\n", "\n", "[130 rows x 2 columns]" ] }, "execution_count": 21, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dns_resp_sorted[\n", " dns_resp_sorted['domain'] > 2\n", "]" ] }, { "cell_type": "code", "execution_count": 22, "id": "e494cca9-9041-4d07-8e7d-fe1da135ed1c", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
dns_resolved_ipsdomain
1819['81.200.2.238']12
1820['188.114.97.132']13
1821['83.69.208.124']14
1822['127.0.0.2']16
1823['188.114.97.136']16
1824['188.114.96.136']16
1825['31.28.24.3']16
1826['35.168.95.233']16
1827['195.128.72.1']17
1828['195.128.72.3']17
1829['188.65.128.218']20
1830['212.109.26.243']21
1831['188.114.98.136']21
1832['188.114.99.136']22
1833['193.58.251.1']22
1834['188.114.98.132']24
1835['188.114.96.128']24
1836['81.88.208.208']28
1837['10.1.1.3']30
1838['89.21.139.21']31
1839['188.114.97.128']32
1840['188.114.97.7', '188.114.96.7']33
1841['188.114.96.7', '188.114.97.7']34
1842['37.252.254.39']36
1843['188.114.97.2', '188.114.96.2']37
1844['188.114.98.128']39
1845['78.29.1.40']42
1846['188.43.20.67']44
1847['188.114.99.132']44
1848['188.114.96.2', '188.114.97.2']44
1849['185.77.150.2']46
1850['46.175.31.250']49
1851['188.114.99.128']60
1852['176.103.130.135']62
1853['0.0.0.0']73
1854['78.24.40.190']78
1855['62.140.245.46']81
1856['46.175.31.251']81
1857['127.0.0.1']89
1858['77.238.226.53']163
1859['62.33.207.197', '62.33.207.196']202
1860['85.142.29.248']203
1861['62.33.207.196', '62.33.207.197']208
1862['80.76.104.20']222
1863['100.64.64.66']223
1864['95.213.158.61']225
1865['188.186.157.49']238
1866[]1590
\n", "
" ], "text/plain": [ " dns_resolved_ips domain\n", "1819 ['81.200.2.238'] 12\n", "1820 ['188.114.97.132'] 13\n", "1821 ['83.69.208.124'] 14\n", "1822 ['127.0.0.2'] 16\n", "1823 ['188.114.97.136'] 16\n", "1824 ['188.114.96.136'] 16\n", "1825 ['31.28.24.3'] 16\n", "1826 ['35.168.95.233'] 16\n", "1827 ['195.128.72.1'] 17\n", "1828 ['195.128.72.3'] 17\n", "1829 ['188.65.128.218'] 20\n", "1830 ['212.109.26.243'] 21\n", "1831 ['188.114.98.136'] 21\n", "1832 ['188.114.99.136'] 22\n", "1833 ['193.58.251.1'] 22\n", "1834 ['188.114.98.132'] 24\n", "1835 ['188.114.96.128'] 24\n", "1836 ['81.88.208.208'] 28\n", "1837 ['10.1.1.3'] 30\n", "1838 ['89.21.139.21'] 31\n", "1839 ['188.114.97.128'] 32\n", "1840 ['188.114.97.7', '188.114.96.7'] 33\n", "1841 ['188.114.96.7', '188.114.97.7'] 34\n", "1842 ['37.252.254.39'] 36\n", "1843 ['188.114.97.2', '188.114.96.2'] 37\n", "1844 ['188.114.98.128'] 39\n", "1845 ['78.29.1.40'] 42\n", "1846 ['188.43.20.67'] 44\n", "1847 ['188.114.99.132'] 44\n", "1848 ['188.114.96.2', '188.114.97.2'] 44\n", "1849 ['185.77.150.2'] 46\n", "1850 ['46.175.31.250'] 49\n", "1851 ['188.114.99.128'] 60\n", "1852 ['176.103.130.135'] 62\n", "1853 ['0.0.0.0'] 73\n", "1854 ['78.24.40.190'] 78\n", "1855 ['62.140.245.46'] 81\n", "1856 ['46.175.31.251'] 81\n", "1857 ['127.0.0.1'] 89\n", "1858 ['77.238.226.53'] 163\n", "1859 ['62.33.207.197', '62.33.207.196'] 202\n", "1860 ['85.142.29.248'] 203\n", "1861 ['62.33.207.196', '62.33.207.197'] 208\n", "1862 ['80.76.104.20'] 222\n", "1863 ['100.64.64.66'] 223\n", "1864 ['95.213.158.61'] 225\n", "1865 ['188.186.157.49'] 238\n", "1866 [] 1590" ] }, "execution_count": 22, "metadata": {}, "output_type": "execute_result" } ], "source": [ "dns_resp_sorted[\n", " dns_resp_sorted['domain'] > 10\n", "]" ] }, { "cell_type": "code", "execution_count": 23, "id": "8806744f-7408-4994-b4e8-bb941ba7d0ee", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "360 sci-hub.se\n", "549 www.ej.ru\n", "1896 www.shram.kiev.ua\n", "1902 zhurnal.lib.ru\n", "1948 rutracker.org\n", " ... \n", "3149505 bluesystem.info\n", "3149517 www.rollitup.org\n", "3150702 rutracker.org\n", "3151623 www.bbm.com\n", "3151928 nnmclub.to\n", "Name: domain, Length: 15447, dtype: object" ] }, "execution_count": 23, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ru[\n", " (df_ru['blocking'] == 'dns')\n", " & (df_ru['dns_resolved_ips'] == \"['188.186.157.49']\")\n", "]['domain']" ] }, { "cell_type": "code", "execution_count": 24, "id": "c5fb9b86-0596-467e-9827-ac0266aca99e", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "https://explorer.ooni.org/measurement/20220302T160209Z_webconnectivity_RU_41733_n1_3bHDEUlWMQ3J7M9e?input=https%3A%2F%2Fsci-hub.se%2F\n" ] } ], "source": [ "print_explorer_url(df_ru.iloc[360])" ] }, { "cell_type": "markdown", "id": "79b97d53-57bc-4862-aeff-3ce8c7f20c30", "metadata": {}, "source": [ "### DNS inconsistency false positive removal\n", "\n", "To understand if what we are looking at is a real blocking IP or not, we can use the following heuristics:\n", "\n", "1. Does the IP in question have a PTR record pointing to something that looks like a blockpage (ex. a hostname that is related to the ISP)\n", "2. What information can we get about the IP by doing a whois lookup\n", "3. Is the ASN of the IP the same as the network where the measurement was collected\n", "4. Do we get a valid TLS certificate for one of the domains in question when doing a TLS handshake and specifying the SNI\n", "\n", "Using these 4 conditions, we are generally able to understand if it's in fact a blocking IP or not" ] }, { "cell_type": "markdown", "id": "4d64bb3d-cc1f-4044-bc3a-501061ec842b", "metadata": {}, "source": [ "### True positive example\n", "\n", "In the following example we can see that the IP `188.186.157.49`:\n", "\n", "1. Has a PTR record pointing to `k8s-lb-onlyhttp-cluster-ingress.static.cc.ertelecom.ru`\n", "2. The whois record shows it's owned by the ISP\n", "3. The AS network name is the same as the measured network\n", "4. We get a certificate with a common name \"*.dom.ru\" (i.e. it's not valid for sci-hub.se)\n", "\n", "This gives is a strong indication that it is in fact a blockpage IP" ] }, { "cell_type": "code", "execution_count": null, "id": "9645f03e-f0d7-4a86-a043-5bc421e1a911", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": 25, "id": "99b3d33d-5c27-4eca-bbd9-f7fdf9810547", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "49.157.186.188.in-addr.arpa domain name pointer k8s-lb-onlyhttp-cluster-ingress.static.cc.ertelecom.ru.\n" ] } ], "source": [ "!host 188.186.157.49" ] }, { "cell_type": "code", "execution_count": 26, "id": "fdb48924-f43b-4fec-9121-29aaf454b555", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "% This is the RIPE Database query service.\n", "% The objects are in RPSL format.\n", "%\n", "% The RIPE Database is subject to Terms and Conditions.\n", "% See http://www.ripe.net/db/support/db-terms-conditions.pdf\n", "\n", "% Note: this output has been filtered.\n", "% To receive output for a database update, use the \"-B\" flag.\n", "\n", "% Information related to '188.186.0.0 - 188.187.255.255'\n", "\n", "% Abuse contact for '188.186.0.0 - 188.187.255.255' is '[email protected]'\n", "\n", "inetnum: 188.186.0.0 - 188.187.255.255\n", "netname: RU-RAID-20090619\n", "country: RU\n", "org: ORG-RA21-RIPE\n", "admin-c: RAID1-RIPE\n", "tech-c: RAID1-RIPE\n", "status: ALLOCATED PA\n", "mnt-by: RIPE-NCC-HM-MNT\n", "mnt-by: RAID-MNT\n", "mnt-lower: RAID-MNT\n", "mnt-routes: RAID-MNT\n", "created: 2009-06-19T14:03:12Z\n", "last-modified: 2016-05-30T12:40:21Z\n", "source: RIPE # Filtered\n", "\n", "organisation: ORG-RA21-RIPE\n", "org-name: JSC \"ER-Telecom Holding\"\n", "country: RU\n", "org-type: LIR\n", "address: str. Shosse Kosmonavtov, 111, bldg. 43, office 509\n", "address: 614990\n", "address: Perm\n", "address: RUSSIAN FEDERATION\n", "phone: +7 342 2462233\n", "fax-no: +7 342 2195024\n", "admin-c: ERTH3-RIPE\n", "tech-c: RAID1-RIPE\n", "abuse-c: RAID1-RIPE\n", "mnt-ref: RIPE-NCC-HM-MNT\n", "mnt-ref: RAID-MNT\n", "mnt-ref: ENFORTA-MNT\n", "mnt-ref: AS8345-MNT\n", "mnt-ref: RU-NTK-MNT\n", "mnt-by: RIPE-NCC-HM-MNT\n", "mnt-by: RAID-MNT\n", "created: 2004-04-17T11:56:55Z\n", "last-modified: 2021-05-17T06:43:35Z\n", "source: RIPE # Filtered\n", "\n", "role: ER-Telecom ISP Contact Role\n", "address: JSC \"ER-Telecom\"\n", "address: 111, str. Shosse Kosmonavtov\n", "address: 614000 Perm\n", "address: Russian Federation\n", "phone: +7 342 2462233\n", "fax-no: +7 342 2463344\n", "abuse-mailbox: [email protected]\n", "remarks: 24/7 phone number: +7-342-2362233\n", "admin-c: AAP113-RIPE\n", "tech-c: AAP113-RIPE\n", "tech-c: GRIF59-RIPE\n", "nic-hdl: RAID1-RIPE\n", "mnt-by: RAID-MNT\n", "created: 2005-02-11T12:50:50Z\n", "last-modified: 2022-01-11T06:25:37Z\n", "source: RIPE # Filtered\n", "\n", "% Information related to '188.186.157.0/24AS31483'\n", "\n", "route: 188.186.157.0/24\n", "origin: AS31483\n", "org: ORG-RA21-RIPE\n", "descr: JSC \"ER-Telecom Holding\"\n", "descr: Russia\n", "mnt-by: RAID-MNT\n", "created: 2016-05-12T07:15:31Z\n", "last-modified: 2016-05-12T07:15:31Z\n", "source: RIPE # Filtered\n", "\n", "organisation: ORG-RA21-RIPE\n", "org-name: JSC \"ER-Telecom Holding\"\n", "country: RU\n", "org-type: LIR\n", "address: str. Shosse Kosmonavtov, 111, bldg. 43, office 509\n", "address: 614990\n", "address: Perm\n", "address: RUSSIAN FEDERATION\n", "phone: +7 342 2462233\n", "fax-no: +7 342 2195024\n", "admin-c: ERTH3-RIPE\n", "tech-c: RAID1-RIPE\n", "abuse-c: RAID1-RIPE\n", "mnt-ref: RIPE-NCC-HM-MNT\n", "mnt-ref: RAID-MNT\n", "mnt-ref: ENFORTA-MNT\n", "mnt-ref: AS8345-MNT\n", "mnt-ref: RU-NTK-MNT\n", "mnt-by: RIPE-NCC-HM-MNT\n", "mnt-by: RAID-MNT\n", "created: 2004-04-17T11:56:55Z\n", "last-modified: 2021-05-17T06:43:35Z\n", "source: RIPE # Filtered\n", "\n", "% This query was served by the RIPE Database Query Service version 1.102.3 (HEREFORD)\n", "\n", "\n" ] } ], "source": [ "!whois 188.186.157.49" ] }, { "cell_type": "code", "execution_count": 27, "id": "5251312c-f5af-4092-b3e0-b4a2bae66357", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'autonomous_system_number': 31483,\n", " 'autonomous_system_organization': 'JSC \"ER-Telecom Holding\"'}" ] }, "execution_count": 27, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lookup_asn(\"188.186.157.49\")" ] }, { "cell_type": "code", "execution_count": 28, "id": "b69ac508-a875-4e73-8657-eb19cc978ec8", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'JSC \"ER-Telecom Holding\"'" ] }, "execution_count": 28, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ru.iloc[360]['probe_network_name']" ] }, { "cell_type": "code", "execution_count": 29, "id": "1edcd0af-7573-4071-b4f3-8c9912d37410", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "'AS41733'" ] }, "execution_count": 29, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ru.iloc[360]['probe_asn']" ] }, { "cell_type": "code", "execution_count": 30, "id": "c3e8b467-cf43-4e1f-8406-a5cb8bd2f067", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "depth=2 C = US, ST = New Jersey, L = Jersey City, O = The USERTRUST Network, CN = USERTrust RSA Certification Authority\n", "verify return:1\n", "depth=1 C = RU, ST = Moscow, L = Moscow, O = RU-Center (\\D0\\97\\D0\\90\\D0\\9E \\D0\\A0\\D0\\B5\\D0\\B3\\D0\\B8\\D0\\BE\\D0\\BD\\D0\\B0\\D0\\BB\\D1\\8C\\D0\\BD\\D1\\8B\\D0\\B9 \\D0\\A1\\D0\\B5\\D1\\82\\D0\\B5\\D0\\B2\\D0\\BE\\D0\\B9 \\D0\\98\\D0\\BD\\D1\\84\\D0\\BE\\D1\\80\\D0\\BC\\D0\\B0\\D1\\86\\D0\\B8\\D0\\BE\\D0\\BD\\D0\\BD\\D1\\8B\\D0\\B9 \\D0\\A6\\D0\\B5\\D0\\BD\\D1\\82\\D1\\80), CN = RU-CENTER High Assurance Services CA 2\n", "verify return:1\n", "depth=0 C = RU, ST = Permskiy kray, L = Perm, O = JSC ER-Telecom Holding, OU = job, CN = *.dom.ru\n", "verify return:1\n", "DONE\n" ] } ], "source": [ "!echo Q | openssl s_client -connect 188.186.157.49:443 -servername sci-hub.se | openssl x509 -noout -text | grep sci-hub.se" ] }, { "cell_type": "markdown", "id": "7e2e3d4f-a33d-48fb-8566-302d0bc4e66c", "metadata": {}, "source": [ "### False positive example\n", "\n", "In the following example we can see that the IP `188.114.97.7`:\n", "\n", "1. Doesn't have a PTR record\n", "2. The whois record shows it's owned by the Cloudflare\n", "3. The ASN is **not** the same as the measured network\n", "4. We get a valid certificate for `mastodon.cloud` when doing a TLS handshake\n", "\n", "We can conclude that this is most likely a false positive" ] }, { "cell_type": "code", "execution_count": 31, "id": "b50a205b-fc38-45f5-8329-0fb4928b8d8e", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "944 www.blogdir.ru\n", "1333 www.freewebspace.com\n", "1805 www.babyplan.ru\n", "2676 mastodon.cloud\n", "2924 sputnikipogrom.com\n", " ... \n", "3145972 hitwe.com\n", "3146741 www.resistance88.com\n", "3146962 www.wftucentral.org\n", "3149916 www.nostraightnews.com\n", "3150651 www.metal-archives.com\n", "Name: domain, Length: 4255, dtype: object" ] }, "execution_count": 31, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ru[\n", " df_ru['dns_resolved_ips'] == \"['188.114.97.7', '188.114.96.7']\"\n", "]['domain']" ] }, { "cell_type": "code", "execution_count": 32, "id": "88251b53-51e3-46c5-8945-39dc7ce399cf", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "https://explorer.ooni.org/measurement/20220302T224757Z_webconnectivity_RU_31257_n1_ElZKi2MAW05O7NYj?input=https%3A%2F%2Fmastodon.cloud%2F\n" ] } ], "source": [ "print_explorer_url(df_ru.iloc[2676])" ] }, { "cell_type": "code", "execution_count": 33, "id": "c9ab47c9-a824-4e41-83ba-441588823a42", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Host 7.97.114.188.in-addr.arpa. not found: 3(NXDOMAIN)\n" ] } ], "source": [ "!host 188.114.97.7" ] }, { "cell_type": "code", "execution_count": 34, "id": "d7003aa0-ee69-4492-9180-598ac554c36c", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "% This is the RIPE Database query service.\n", "% The objects are in RPSL format.\n", "%\n", "% The RIPE Database is subject to Terms and Conditions.\n", "% See http://www.ripe.net/db/support/db-terms-conditions.pdf\n", "\n", "% Note: this output has been filtered.\n", "% To receive output for a database update, use the \"-B\" flag.\n", "\n", "% Information related to '188.114.96.0 - 188.114.99.255'\n", "\n", "% Abuse contact for '188.114.96.0 - 188.114.99.255' is '[email protected]'\n", "\n", "inetnum: 188.114.96.0 - 188.114.99.255\n", "netname: CLOUDFLARENET-EU\n", "descr: CloudFlare, Inc.\n", "descr: 101 Townsend Street, San Francisco, CA 94107, US\n", "descr: +1 (650) 319-8930\n", "descr: https://cloudflare.com/\n", "country: US\n", "admin-c: CAC80-RIPE\n", "tech-c: CTC6-RIPE\n", "status: ASSIGNED PA\n", "mnt-by: MNT-CLOUDFLARE\n", "mnt-lower: MNT-CLOUDFLARE\n", "mnt-routes: MNT-CLOUDFLARE\n", "remarks: https://cloudflare.com/abuse\n", "created: 2015-10-16T16:26:10Z\n", "last-modified: 2015-10-16T16:26:10Z\n", "source: RIPE\n", "\n", "person: Cloudflare Abuse Contact\n", "address: 101 Townsend Street, San Francisco, CA 94107, US\n", "phone: +1 (650) 319-8930\n", "remarks: All Cloudflare abuse reporting can be done via https://www.cloudflare.com/abuse\n", "nic-hdl: CAC80-RIPE\n", "mnt-by: MNT-CLOUDFLARE\n", "created: 2012-06-01T23:27:49Z\n", "last-modified: 2018-06-10T10:14:26Z\n", "source: RIPE # Filtered\n", "\n", "person: Cloudflare Technical Contact\n", "address: 101 Townsend Street, San Francisco, CA 94107, US\n", "phone: +1 (650) 319-8930\n", "nic-hdl: CTC6-RIPE\n", "mnt-by: MNT-CLOUDFLARE\n", "created: 2012-06-01T23:35:57Z\n", "last-modified: 2018-06-10T10:16:13Z\n", "source: RIPE # Filtered\n", "\n", "% Information related to '188.114.97.0/24AS13335'\n", "\n", "route: 188.114.97.0/24\n", "origin: AS13335\n", "mnt-by: MNT-CLOUDFLARE\n", "created: 2020-06-15T18:05:37Z\n", "last-modified: 2020-06-15T18:05:37Z\n", "source: RIPE # Filtered\n", "\n", "% This query was served by the RIPE Database Query Service version 1.102.3 (HEREFORD)\n", "\n", "\n" ] } ], "source": [ "!whois 188.114.97.7" ] }, { "cell_type": "code", "execution_count": 35, "id": "a44b47ba-3204-4867-b63e-a29f0453d764", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "{'autonomous_system_number': 13335,\n", " 'autonomous_system_organization': 'Cloudflare, Inc.'}" ] }, "execution_count": 35, "metadata": {}, "output_type": "execute_result" } ], "source": [ "lookup_asn(\"188.114.97.7\")" ] }, { "cell_type": "code", "execution_count": 36, "id": "a65aeca9-1588-4fce-a82b-2a37b7e72a53", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "AS31257\n", "Orion Telecom LLC\n" ] } ], "source": [ "print(df_ru.iloc[2676]['probe_asn'])\n", "print(df_ru.iloc[2676]['probe_network_name'])" ] }, { "cell_type": "code", "execution_count": 37, "id": "1d44e940-0b8b-4a2b-953a-1886f3a3e8d5", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "depth=2 C = IE, O = Baltimore, OU = CyberTrust, CN = Baltimore CyberTrust Root\n", "verify return:1\n", "depth=1 C = US, O = \"Cloudflare, Inc.\", CN = Cloudflare Inc ECC CA-3\n", "verify return:1\n", "depth=0 C = US, ST = California, L = San Francisco, O = \"Cloudflare, Inc.\", CN = sni.cloudflaressl.com\n", "verify return:1\n", "DONE\n", " DNS:mastodon.cloud, DNS:sni.cloudflaressl.com, DNS:*.mastodon.cloud\n" ] } ], "source": [ "!echo Q | openssl s_client -connect 188.114.97.7:443 -servername mastodon.cloud | openssl x509 -noout -text | grep mastodon.cloud" ] }, { "cell_type": "markdown", "id": "a87f65c8-b17f-49ec-9ab2-a8d497cc3e1d", "metadata": {}, "source": [ "We can then rinse and repeat this process multiple times, until we have divided all these anomalous IPs into those confirmed to be associated to blocking or those that are false positive.\n", "\n", "Similarly we can do this for the HTML titles." ] }, { "cell_type": "code", "execution_count": 38, "id": "77d8a03e-1a05-4b2d-94bd-71c9a8c61dbd", "metadata": {}, "outputs": [], "source": [ "confirmed_ips = [\n", " # PTR record is k8s-lb-onlyhttp-cluster-ingress.static.cc.ertelecom.ru\n", " # Serves blockpage for: http://lawfilter.ertelecom.ru/\n", " '188.186.157.49',\n", " # PTR records are block.tdsplus.ru & balance.tdsplus.ru\n", " # We get connection refused when attempting to access it \n", " '80.76.104.20',\n", " # PTR record is block.runnet.ru\n", " # We get a blockpage when attempting to access it\n", " '85.142.29.248',\n", " # AS is mapped to 49505 - SELECTEL\n", " '95.213.158.61',\n", " # Known russian blockpages\n", " '62.33.207.197',\n", " '62.33.207.196',\n", " # Blockpage for AS60139\n", " '185.77.150.2',\n", " # Blockpage for AS42429\n", " '77.238.226.53',\n", " # Blockpage for AS8369\n", " '78.29.1.40',\n", " # Blockpage for AS8427\n", " '188.43.20.67',\n", " # Blockpage for AS52207\n", " '195.128.72.3',\n", " # Blockpage for AS12389\n", " '31.28.24.3',\n", " # Likely blockpage for AS197460\n", " # reverse pointer to host-46-175-31-251.rev.zencom.ru.\n", " # as of 2022-03-05 connection times out when accessing it\n", " '46.175.31.251',\n", " # Likely blockpage for AS3335\n", " # PTR record host190.49.237.84.nsu.ru\n", " # as of 2022-03-05 503 error when accessing page\n", " '84.237.49.190'\n", "]\n", "\n", "false_positive_ips = [\n", " '188.114.97.7',\n", " '188.114.96.7'\n", "]\n", "\n", "confirmed_titles = [\n", " 'Доступ к ресурсу ограничен'\n", "]" ] }, { "cell_type": "code", "execution_count": 39, "id": "907d1dbc-b9f4-42ae-936a-1e7067506baf", "metadata": {}, "outputs": [], "source": [ "valid_ip_map = {}" ] }, { "cell_type": "code", "execution_count": 40, "id": "5882b3a1-29c3-4519-a517-d232f7e39a1d", "metadata": {}, "outputs": [], "source": [ "import certifi\n", "import ssl\n", "import socket\n", "\n", "def is_tls_valid(ip, hostname):\n", " if len(df_ru[\n", " (df_ru['dns_resolved_ips'].str.contains(ip, na=False))\n", " & (df_ru['domain'] == hostname)\n", " & (df_ru['input'].str.startswith('https'))\n", " & (df_ru['http_experiment_failure'] == 'None')\n", " ]) > 0:\n", " return True\n", "\n", " context = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT)\n", " context.load_verify_locations(certifi.where())\n", "\n", " with socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) as sock:\n", " sock.settimeout(1)\n", " with context.wrap_socket(sock, server_hostname=hostname) as conn:\n", " try:\n", " conn.connect((ip, 443))\n", " # TODO: do we care to distinguish these values?\n", " except ssl.SSLCertVerificationError:\n", " return False\n", " except ssl.SSLError:\n", " return False\n", " except socket.timeout:\n", " return False\n", " except socket.error:\n", " return False\n", " except:\n", " return False\n", " return True\n", "\n", "def is_tls_valid_with_cache(ip, hostname):\n", " key = f\"{ip}{hostname}\"\n", " if key in valid_ip_map:\n", " return valid_ip_map[key]\n", " valid_ip_map[key] = is_tls_valid(ip, hostname)\n", " return valid_ip_map[key]" ] }, { "cell_type": "markdown", "id": "6ba0d045-31c2-4766-8b19-544860051169", "metadata": {}, "source": [ "### Putting it all together\n", "\n", "We can then proceed to automating the detection on the full dataset. Our goal is that of recomputing the `blocking` feature for each individual measurement based on our improved heuristics.\n", "\n", "In addition to the previously discussed DNS and HTTP based blocking, we are going to additionally classify blocking that happens at different layers of the network stack.\n", "\n", "Specifically, we are going to be using the following identifiers for the various ways in which blocking might occur:\n", "\n", "#### DNS\n", "* dns.confirmed - one of the returned IPs matches an IP known to be used to implement blocking\n", "* dns.no_ipv4 - no IPv4 address was returned\n", "* dns.bogon - a bogon IP address was returned\n", "* dns.nxdomain - we got an NXDOMAIN response from the probe, but we got a valid response from the control vantage point\n", "* dns.inconsistent - our DNS consistency heuristics determined the returned IP to be inconsistent\n", "\n", "#### HTTP\n", "\n", "These are all blocking types related to plaintext HTTP requests:\n", "\n", "* http.confirmed - the returned page is a known blockpages\n", "* http.http_diff - the page doesn't match based on our page consistency heuristics\n", "* http.connection_reset - we got a connection reset to a plaintext HTTP request\n", "* http.connection_closed - the connection was closed before all data was transmitted\n", "* http.connection_timeout - the connection timed out before we could retrieve all the data \n", "* http.generic_failure - this is an generic error from legacy OONI probes\n", "\n", "#### TLS\n", "\n", "These are all blocking types related to TLS:\n", "\n", "* tls.connection_reset - a reset packet was seen after the client sent the ClientHello packet\n", "* tls.connection_closed - the connection was closed after the ClientHello\n", "* tls.connection_timeout - the connection timed out after the ClientHello\n", " * All of the above can also have the `_after_hello` suffix, indicating that the event happened after the client sent the ClienHello packet\n", "* tls.mitm - The DNS is consistent, but the TLS certificate validation failed. This suggest a TLS man-in-the-middle\n", "* tls.generic_failure - generic error from legacy OONI probes\n", "\n", "#### TCP/IP\n", "\n", "This is when blocking is implemented by targeting the IP address of the host:\n", "\n", "* tcp.connection_reset - the TCP connect test failed due to a reset packet\n", "* tcp.connection_timeout - the TCP connect test failed with a timeout" ] }, { "cell_type": "code", "execution_count": 41, "id": "477cde66-7af8-446d-afaa-5e859fc74e1b", "metadata": {}, "outputs": [], "source": [ "from ast import literal_eval\n", "import ipaddress\n", "\n", "def normalize_failure(failure_str):\n", " if \"An existing connection was forcibly closed by the remote host\" in failure_str:\n", " return \"connection_reset\"\n", " if \"No address associated with hostname\" in failure_str:\n", " return \"dns_nxdomain_error\"\n", " return failure_str\n", "\n", "def is_dns_asns_consistent(dns_resolved_ips, control_measurement, row):\n", " try:\n", " control_addrs = control_measurement['dns']['addrs']\n", " if not control_addrs:\n", " return False\n", " control_asns = set(list(map(lambda e: e['autonomous_system_number'], \n", " filter(lambda e: e != None, map(lookup_asn, control_addrs)))))\n", " exp_asns = set(list(map(lambda e: e['autonomous_system_number'], \n", " filter(lambda e: e != None, map(lookup_asn, dns_resolved_ips)))))\n", " if exp_asns.intersection(control_asns):\n", " return True\n", " except KeyError:\n", " # Missing control measurement\n", " return False\n", " return False\n", "\n", "bogon_ipv4_ranges = [\n", " ipaddress.ip_network(\"0.0.0.0/8\"), # \"This\" network\n", " ipaddress.ip_network(\"10.0.0.0/8\"), # Private-use networks\n", " ipaddress.ip_network(\"100.64.0.0/10\"), # Carrier-grade NAT\n", " ipaddress.ip_network(\"127.0.0.0/8\"), # Loopback\n", " ipaddress.ip_network(\"127.0.53.53\"), # Name collision occurrence\n", " ipaddress.ip_network(\"169.254.0.0/16\"), # Link local\n", " ipaddress.ip_network(\"172.16.0.0/12\"), # Private-use networks\n", " ipaddress.ip_network(\"192.0.0.0/24\"), # IETF protocol assignments\n", " ipaddress.ip_network(\"192.0.2.0/24\"), # TEST-NET-1\n", " ipaddress.ip_network(\"192.168.0.0/16\"), # Private-use networks\n", " ipaddress.ip_network(\"198.18.0.0/15\"), # Network interconnect device benchmark testing\n", " ipaddress.ip_network(\"198.51.100.0/24\"), # TEST-NET-2\n", " ipaddress.ip_network(\"203.0.113.0/24\"), # TEST-NET-3\n", " ipaddress.ip_network(\"224.0.0.0/4\"), # Multicast\n", " ipaddress.ip_network(\"240.0.0.0/4\"), # Reserved for future use\n", " ipaddress.ip_network(\"255.255.255.255/32\"), # Limited broadcast\n", "]\n", "def is_dns_bogon(dns_resolved_ips):\n", " for ip in dns_resolved_ips:\n", " ipv4addr = ipaddress.IPv4Address(ip)\n", " if any([ipv4addr in ip_range for ip_range in bogon_ipv4_ranges]):\n", " return True\n", " return False\n", "\n", "def is_dns_tls_consistent(dns_resolved_ips, row):\n", " # If it's a HTTPs site and we didn't get a TLS error, we can assume the IPs are valid\n", " if row['input'].startswith('https://') and row['http_experiment_failure'] == 'None':\n", " return False\n", " \n", " for ip in dns_resolved_ips:\n", " domain = urlparse(row['input']).netloc\n", " if is_tls_valid_with_cache(ip, domain):\n", " # We consider the first hit to be enough to consider it consistent\n", " return True\n", " return False\n", "\n", "def is_dns_false_positive(dns_resolved_ips):\n", " for ip in dns_resolved_ips:\n", " if ip in false_positive_ips:\n", " return True\n", " return False\n", "\n", "def recompute_blocking(row):\n", " try:\n", " dns_resolved_ips = literal_eval(row['dns_resolved_ips'])\n", " except:\n", " dns_resolved_ips = []\n", "\n", " blocking = row['blocking']\n", " for ip in dns_resolved_ips:\n", " if ip in confirmed_ips:\n", " return 'dns.confirmed'\n", " \n", " # This is a special case for when we got no ipv4 addresses and the network doesn't support ipv6\n", " if len(dns_resolved_ips) == 0 and row['http_experiment_failure'] == 'network_unreachable':\n", " return 'dns.no_ipv4'\n", " \n", " if is_dns_bogon(dns_resolved_ips):\n", " return 'dns.bogon'\n", "\n", " try:\n", " control_measurement = literal_eval(row['control_measurement'])\n", " except:\n", " return 'invalid'\n", " if not control_measurement:\n", " return 'invalid'\n", " \n", " if control_measurement['http_request']['failure'] != None:\n", " return 'invalid'\n", "\n", " if (normalize_failure(row['dns_experiment_failure']) == 'dns_nxdomain_error' and \n", " control_measurement.get('http_request', {}).get('failure', '') != 'dns_lookup_error'):\n", " return 'dns.nxdomain'\n", "\n", " if (\n", " not (row['input'].startswith('https://') and row['http_experiment_failure'] == 'None') \n", " and not is_dns_false_positive(dns_resolved_ips) \n", " and not is_dns_asns_consistent(dns_resolved_ips, control_measurement, row)\n", " #and not is_dns_tls_consistent(dns_resolved_ips, row)\n", " ):\n", " return 'dns.inconsistent'\n", "\n", " # If we got down to here, it means that DNS is consistent \n", " if row['http_title'] in confirmed_titles:\n", " return 'http.confirmed'\n", " \n", " if blocking == 'http-diff' and row['input'].startswith('http://'):\n", " return 'http.http_diff'\n", " \n", " if row['http_experiment_failure'] != 'None':\n", " tcp_connect_list = literal_eval(row['tcp_connect'])\n", " for conn in tcp_connect_list:\n", " if conn['status']['failure'] == 'connection_reset':\n", " return 'tcp.connection_reset'\n", " elif conn['status']['failure'] == 'generic_timeout_error':\n", " return 'tcp.connection_timeout'\n", " \n", " # We compute TLS level anomalies this using the network_events\n", " tls_handshake_started = False\n", " try:\n", " network_events = literal_eval(row['network_events'])\n", " except:\n", " network_events = []\n", " if network_events:\n", " for idx, network_event in enumerate(network_events):\n", " if network_event['operation'] == 'write':\n", " write_operations += 1\n", " if network_event['operation'] == 'read':\n", " read_operations += 1\n", "\n", " if tls_handshake_started and network_event['failure']:\n", " # We are guaranteed to not be out of bounds due to the tls_handshake_started flag\n", " prev_operation = network_events[idx-1]\n", " \n", " suffix = ''\n", " if normalize_failure(network_event['failure']) == 'connection_reset':\n", " return f'tls.connection_reset{suffix}'\n", " elif normalize_failure(network_event['failure']) == 'eof_error':\n", " return f'tls.connection_closed{suffix}'\n", " elif normalize_failure(network_event['failure']) == 'generic_timeout_error':\n", " return f'tls.connection_timeout{suffix}'\n", " if write_operations > 1:\n", " suffix = f'_after_hello'\n", "\n", " if network_event['operation'] == 'tls_handshake_start':\n", " tls_handshake_started = True\n", " write_operations = 0\n", " read_operations = 0\n", " if network_event['operation'] == 'tls_handshake_done':\n", " tls_handshake_started = False\n", "\n", " # If we got down to here, it means the DNS consistency checks have passed\n", " # For the http related failures, if we are spotting them here, it means the test most likely doesn't support the \n", " # new network_events keys, and therefore the results are a bit less accurate.\n", " # This should ideally be indicated via a lower confidence value.\n", " if normalize_failure(row['http_experiment_failure']) == 'connection_reset':\n", " if row['input'].startswith('https://'):\n", " return 'tls.connection_reset'\n", " else:\n", " return 'http.connection_reset'\n", " elif normalize_failure(row['http_experiment_failure']) == 'eof_error':\n", " if row['input'].startswith('https://'):\n", " return 'tls.connection_closed'\n", " else:\n", " return 'http.connection_closed'\n", " elif normalize_failure(row['http_experiment_failure']) == 'generic_timeout_error':\n", " if row['input'].startswith('https://'):\n", " return 'tls.connection_timeout'\n", " else:\n", " return 'http.connection_timeout'\n", " # It's not just using DNS to point us to an IP that serves a blockpage and it's a TLS MITM\n", " elif row['input'].startswith('https://') and row['http_experiment_failure'].startswith('ssl_'):\n", " return 'tls.mitm'\n", " \n", " # We map unknown_failures to invalid measurements\n", " elif row['http_experiment_failure'].startswith('unknown_failure'):\n", " return 'invalid'\n", " \n", " # All unmapped errors go into a generic failure pool\n", " elif row['http_experiment_failure'] != 'None':\n", " if row['input'].startswith('https://'):\n", " return 'tls.generic_failure'\n", " else:\n", " return 'http.generic_failure'\n", " \n", " return 'ok'" ] }, { "cell_type": "code", "execution_count": 42, "id": "8c336cb6-0177-4eeb-a89e-894e898946ee", "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "100%|████████████████████████████████████████████████████████| 3152336/3152336 [20:14<00:00, 2595.73it/s]\n" ] } ], "source": [ "df_ru['blocking_recalc'] = df_ru.progress_apply(recompute_blocking, axis=1)" ] }, { "cell_type": "code", "execution_count": 43, "id": "ed0b8ebc-063f-49bf-98ed-e2baadddf55b", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['ok', 'invalid', 'tls.generic_failure', 'tls.mitm',\n", " 'http.http_diff', 'dns.inconsistent', 'tls.connection_timeout',\n", " 'tls.connection_reset', 'tls.connection_closed',\n", " 'http.connection_reset', 'dns.confirmed', 'dns.nxdomain',\n", " 'tcp.connection_timeout', 'http.generic_failure',\n", " 'http.connection_timeout', 'http.connection_closed', 'dns.bogon',\n", " 'http.confirmed', 'dns.no_ipv4', 'tcp.connection_reset'],\n", " dtype=object)" ] }, "execution_count": 43, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ru['blocking_recalc'].unique()" ] }, { "cell_type": "code", "execution_count": 46, "id": "285f43ee-1abf-4f96-92c9-b9026fb0f55f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([\"['172.98.192.37']\", \"['13.107.42.14']\", \"['185.3.143.71']\", ...,\n", " \"['62.115.252.49', '80.239.137.162', '62.115.252.57', '62.115.252.56']\",\n", " \"['62.115.252.57', '80.239.137.162', '62.115.252.49']\",\n", " \"['62.115.252.64', '80.239.137.162', '62.115.252.41', '62.115.252.18', '62.115.252.57']\"],\n", " dtype=object)" ] }, "execution_count": 46, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ru[\n", " df_ru['blocking_recalc'] == 'dns.inconsistent'\n", "]['dns_resolved_ips'].unique()" ] }, { "cell_type": "code", "execution_count": null, "id": "52ac54e9-3193-477d-9e06-4f47b9824f4d", "metadata": {}, "outputs": [], "source": [ "mask = (df_ru['blocking_recalc'] == 'dns.inconsistent')\n", "df_ru.loc[mask, 'blocking_recalc'] = df_ru[mask].progress_apply(recompute_blocking, axis=1)" ] }, { "cell_type": "code", "execution_count": null, "id": "de2b2276-f519-4f2b-8bc6-4e37189d4787", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "id": "3d133e88-e8f9-450d-bc6f-e720bd2b76d2", "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "markdown", "id": "fc0a42c9-992a-4482-9724-d7f2edf1f2fb", "metadata": {}, "source": [ "Let's see on how many networks we were able to confirm the blocking of sites" ] }, { "cell_type": "code", "execution_count": 48, "id": "ebbd857c-d768-4d9d-906b-d20ba42c4455", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['AS34533', 'AS41733', 'AS8790', 'AS50544', 'AS15774', 'AS41668',\n", " 'AS8427', 'AS51604', 'AS41843', 'AS8369', 'AS51547', 'AS212614',\n", " 'AS44507', 'AS56420', 'AS41786', 'AS42429', 'AS51813', 'AS12958',\n", " 'AS51570', 'AS41330', 'AS52207', 'AS15378', 'AS60139', 'AS2848',\n", " 'AS25408', 'AS42289', 'AS42437', 'AS206873', 'AS41661', 'AS49404',\n", " 'AS13335', 'AS202173', 'AS42682', 'AS41754', 'AS58158', 'AS197460',\n", " 'AS50542', 'AS34703', 'AS48092', 'AS3267', 'AS34590', 'AS43478',\n", " 'AS12389', 'AS3335', 'AS198715', 'AS29076', 'AS20485', 'AS50498',\n", " 'AS48190', 'AS35807', 'AS25159', 'AS25513', 'AS42610', 'AS49048',\n", " 'AS12768', 'AS57843', 'AS56981', 'AS39435'], dtype=object)" ] }, "execution_count": 48, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ru[\n", " df_ru['blocking_recalc'] == 'dns.confirmed'\n", "]['probe_asn'].unique()" ] }, { "cell_type": "code", "execution_count": 49, "id": "e8f2ccf0-9644-4c6e-b1d1-3368b9237b5a", "metadata": {}, "outputs": [], "source": [ "msmt_counts = df_ru[\n", " df_ru['blocking_recalc'] == 'dns.confirmed'\n", "][['domain', 'report_id']].groupby('domain').count().reset_index()" ] }, { "cell_type": "markdown", "id": "d5157460-b535-4108-b6b2-ca48a864a869", "metadata": {}, "source": [ "And let's check out how many sites were confirmed to be blocked based on our fingerprints" ] }, { "cell_type": "code", "execution_count": 50, "id": "ef55d134-02de-4569-bbb5-e6132bfa223a", "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
domainreport_id
119shajtanshop.com1
59instagram.com1
34facebook.com1
36fapreactor.com1
89nani24.cc1
.........
115rutracker.org477
156www.bbc.com513
58imrussia.org515
135twitter.com1873
182www.facebook.com1972
\n", "

269 rows × 2 columns

\n", "
" ], "text/plain": [ " domain report_id\n", "119 shajtanshop.com 1\n", "59 instagram.com 1\n", "34 facebook.com 1\n", "36 fapreactor.com 1\n", "89 nani24.cc 1\n", ".. ... ...\n", "115 rutracker.org 477\n", "156 www.bbc.com 513\n", "58 imrussia.org 515\n", "135 twitter.com 1873\n", "182 www.facebook.com 1972\n", "\n", "[269 rows x 2 columns]" ] }, "execution_count": 50, "metadata": {}, "output_type": "execute_result" } ], "source": [ "msmt_counts.sort_values('report_id')" ] }, { "cell_type": "markdown", "id": "9a59e4c8-0c37-4ee0-adca-c1c96955b44d", "metadata": {}, "source": [ "From the perspective of presenting the data and digging deeper into the blocking of specific sites, since the data has so many dimensions, it's often useful to restrict your analysis to a subset of some of the axis.\n", "\n", "Common choices for this, is to use a subset of all the domains or a subset of all the networks.\n", "\n", "In this example we are going to pick some domains that have very good testing coverage and are highly relevant." ] }, { "cell_type": "code", "execution_count": 55, "id": "0eb1f0f9-e4d7-4625-a636-664c5773722f", "metadata": {}, "outputs": [], "source": [ "relevant_domains = [\n", " 'www.bbc.com',\n", " 'twitter.com',\n", " 'www.facebook.com'\n", "]" ] }, { "cell_type": "code", "execution_count": 56, "id": "d7a3c33d-2f79-47b8-944d-0406f2252e43", "metadata": {}, "outputs": [], "source": [ "domain_asn_counts = df_ru[\n", " df_ru['domain'].isin(relevant_domains)\n", "][['probe_asn', 'domain', 'report_id']].groupby(['probe_asn', 'domain']).count().reset_index()" ] }, { "cell_type": "code", "execution_count": 57, "id": "991ac54c-2eb2-47b0-8ef8-79c1388e9afe", "metadata": {}, "outputs": [], "source": [ "# We are looking at 23 days, so having ~4 metrics per day per network seems like a reasonable cutoff\n", "relevant_asn_domains = domain_asn_counts[\n", " domain_asn_counts['report_id'] > 100\n", "][['probe_asn', 'domain']]" ] }, { "cell_type": "code", "execution_count": 58, "id": "179f4662-cde2-437a-9e32-08658a33a1f1", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array(['AS12389', 'AS12668', 'AS12714', 'AS12737', 'AS12958', 'AS15493',\n", " 'AS15640', 'AS15774', 'AS16345', 'AS205638', 'AS20632', 'AS21479',\n", " 'AS25086', 'AS25159', 'AS25490', 'AS25513', 'AS28840', 'AS29194',\n", " 'AS31163', 'AS31200', 'AS31213', 'AS31257', 'AS31286', 'AS31376',\n", " 'AS3216', 'AS34533', 'AS34757', 'AS35533', 'AS35807', 'AS41330',\n", " 'AS41668', 'AS41733', 'AS42387', 'AS42511', 'AS42610', 'AS42668',\n", " 'AS43966', 'AS44724', 'AS44927', 'AS47165', 'AS47438', 'AS47655',\n", " 'AS48642', 'AS50716', 'AS51547', 'AS51604', 'AS51813', 'AS52207',\n", " 'AS56724', 'AS59734', 'AS8331', 'AS8334', 'AS8359', 'AS8402',\n", " 'AS8427', 'AS8492', 'AS8580', 'AS8790'], dtype=object)" ] }, "execution_count": 58, "metadata": {}, "output_type": "execute_result" } ], "source": [ "relevant_asn_domains['probe_asn'].unique()" ] }, { "cell_type": "markdown", "id": "0511c839-46d8-4284-ab41-2408246ccc99", "metadata": {}, "source": [] }, { "cell_type": "markdown", "id": "838a2e30-9065-445c-bc4e-804ea657cb98", "metadata": {}, "source": [ "Let's start off by looking at the ways through which sites are blocked accross the networks we have selected to have enough measurements. To make the data easier to look at, we are going to fix the domain." ] }, { "cell_type": "code", "execution_count": 59, "id": "80a8607f-cfa2-4f6b-a4a4-87bf569d48b6", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 59, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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k0+45557CAkJ4d577+XQoUMF7nHo0CH69OmDw+HA4XDw9ddfX+KTFRERkYpMBSERERG5pu3cuZMnnniC7du3U716dV5//XXvuQMHDjBu3DiSkpJwuVykpKSwYsUKDh8+zGOPPcby5cvZvHkzH3zwQb6Yr732Gp9++ikrVqwgICCgwD3r1KnDxo0bGTZsmHeJ2dSpU+nUqRMZGRn07duXvXv3Fpt3ZmYmTzzxBBkZGezcuZPMzEw2bNiAy+UiLS2NtWvXkpGRwfPPP09SUhKbN29mzpw5ALRt25ZvvvmGTZs28eCDD/LSSy8ViD9y5Ejat2/P5s2b2bhxI0FBQZf8bEVERKTi0pIxERERuabdfvvtREVFATBgwABeffVV77mUlBQ6dOhA3bp1AYiNjWXt2rX4+voSHR1N48aNAbj55pu917z33nvcfvvtrFixAj8/v0LvGRMTA0BYWBgffvghAMnJyXz00UcAdO/enVq1ahWb95133kmrVq0AWLVqFatWrSIkJASA3NxcMjMz2bx5Mw888AB16tTJl+e+ffvo168fBw8e5NSpU95xnC8pKYn33nsPAF9fX2rUqFFsPiIiIiLn0wwhERERuaYZY4o9vlQ2m42srCz27dtXZB9/f3/AXWjJy8u7rPtUrVrV+7NlWTz99NO4XC5cLhe7du3iT3/6U5HXjhgxgieffJL09HT+9re/cfLkycvKQURERKQoKgiJiIjINW3v3r2sX78egMWLF9O2bVvvucjISL788kuOHDnCmTNnWLJkCe3bt6dVq1asXbuWH374AYCff/7Ze01ISAh/+9vf6NWrFwcOHChxHlFRUbz//vuAe8bP0aNHS3xtt27dePvtt8nNzQVg//79/Oc//6FTp0588MEH/PTTT/nyPHbsGLfddhsA7777bqExO3fuzBtvvAHAmTNnOHbsWInzEREREVFBSERERK5pzZs3Z968ebRo0YKjR48ybNgw77n69eszY8YMOnbsiMPhICwsjN69e1O3bl3+/ve/ExMTg8PhoF+/fvlitm3bllmzZvH73/++yI2hLzR58mRWrVpFcHAwH3zwAfXq1aNatWolurZr167079+f1q1bY7PZ6Nu3Lzk5OQQFBTFhwgTat2+Pw+HgqaeeAmDKlCk88MADhIWFeZeTXWjOnDmsXr0am81GWFgY27ZtK1EuIiIiIgDG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Dh06cPLkSfbu3QtA586dqVGjBlWqVKFly5bs2bPnIk9UREREpORUEBIREZFrjr+/P+Au2OTl5QHQv39/Vq5cSUBAAD169CApKanYGH5+fhhjCsS53FwujPPZZ58xfPhwNm7cSERERIH48fHxPP/88/z444+EhYXx008/FYhtWRbLly/H5XLhcrnYu3cvLVq0KPa+IiIiIqVBBSEREREpF9HR0axYsYITJ06Qk5PDJ598Umz/77//niZNmjBy5Eh69+7Nli1bLuu+nTt35o033gDgzJkzHDt2jHbt2rFixQp+/fVXjh8/zkcffUS7du2KjHH27Fl+/PFHOnbsyIsvvsixY8fIzc3N12f37t3cc889TJs2jbp16/Ljjz9SrVo1cnJyvH26devG3LlzsSwLgE2bNl00fz8/P06fPn05QxcRERHx0h5CIiIiclmvib9SoaGh9OvXD4fDwS233EJERESx/d9//30WLlyIn58f9erV8756vUePHrz55ps0aNCgRPedM2cOQ4YM4a233sLX15c33niD1q1bExcXR2RkJOB+fX1ISIh3ediFzpw5w4ABAzh27BiWZTFy5Ehq1qyZr8+YMWPIzMzEsiw6d+6Mw+Hgjjvu8C4Re/rpp3n22Wf585//jN1u5+zZszRu3JhPP/202PyHDBmC3W4nNDSURYsWlWjMIiIiIhcy5/6LVHkKDw+3zr0R5Jzh0fNLdO28tY9djZRERERuaNu3b/cuTRIpK/reiYiIlC1jTJplWeGFndOSMRERERERERGRCkYFIRERERERERGRCkYFIRERERERERGRCkYFIRERERERERGRCkYFIRERERERERGRCkYFIRERERERERGRCqZSeScgIiIi5e+TrJmlGu+/Go255GumTJlCYGAgf/nLX0o1l0sRGBhIbm7uVYu/cuVKtm3bxvjx46/aPURERERKQgUhERERkTLSq1cvevXqVd5piIiIiGjJmIiIiJSf6dOn06xZM9q2bcvOnTsB6NChA+PGjSMyMpJmzZqxbt06ADIyMoiMjMTpdGK328nMzCwQr1GjRkyePJnQ0FBsNhs7duwAYNSoUUybNg2Af/3rX0RHR3P27Fl++OEHWrdujc1mY+LEid44lmUxZswYgoODsdlsJCQkALBmzRrat29P7969adKkCePHj2fRokVERkZis9nYvXs3AJ988gn33HMPISEh3HvvvRw6dAiABQsW8OSTTwIQFxfHyJEjadOmDU2aNGHZsmVX4xGLiIiIFEoFIRERESkXaWlpLF26FJfLxeeff05KSor3XF5eHhs2bGD27NlMnToVgPj4eEaNGoXL5SI1NZWGDRsWGrdOnTps3LiRYcOGMWvWLAD++te/kpCQwOrVqxk5ciTvvPMOPj4+jBo1imHDhpGenk79+vW9MT788ENcLhebN28mMTGRMWPGcPDgQQA2b95MfHw827dvZ+HChXz33Xds2LCBRx99lLlz5wLQtm1bvvnmGzZt2sSDDz7ISy+9VGiuBw8eJDk5mU8//VTLyERERKRMqSAkIiIi5WLdunX06dOHm266ierVq+dbShUTEwNAWFgYWVlZALRu3ZoXXniBF198kT179hAQEFBo3MKuvemmm5g/fz5dunThySef5K677gLgq6++4qGHHgJg4MCB3hjJyck89NBD+Pr6cuutt9K+fXtvwSoiIoL69evj7+/PXXfdRdeuXQGw2Wze++3bt49u3bphs9mYOXMmGRkZheb6hz/8AR8fH1q2bOmdRSQiIiJSFlQQEhERkWuOv78/AL6+vuTl5QHQv39/Vq5cSUBAAD169CApKanE1wKkp6dTu3ZtDhw4kK+/MeaycgPw8fHxHvv4+HjvN2LECJ588knS09P529/+xsmTJy8ay7KsS8pDRERE5EqoICQiIiLlIjo6mhUrVnDixAlycnL45JNPiu3//fff06RJE0aOHEnv3r3ZsmVLie+1Z88e/ud//odNmzbxz3/+k2+//RaAqKgoli5dCsCiRYu8/du1a0dCQgJnzpzh8OHDrF27lsjIyBLf79ixY9x2220AvPvuuyW+TkRERKSs6C1jIiIiclmvib9SoaGh9OvXD4fDwS233EJERESx/d9//30WLlyIn58f9erV45lnngGgR48evPnmmzRo0KDQ6yzL4k9/+hOzZs2iQYMGvPXWW8TFxZGSksKcOXPo378/L774Ir179/Ze06dPH9avX4/D4cAYw0svvUS9evW8m1RfzJQpU3jggQeoVasWnTp14ocffijhUxEREREpG+ZamJ4cHh5upaam5msbHj2/RNfOW/vY1UhJRETkhrZ9+3ZatGhR3mlIBaPvnYiISNkyxqRZlhVe2DktGRMRERERERERqWBUEBIRERERERER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39/f+7Ovry8nTpy45BjGmCvOw8/PzxvH19eXvLy8QnO0LMv799NPP83jjz+eL87cuXOvOJfznbv3hTmVlmbNmrFx40Y+//xzJk6cSOfOnenTpw9BQUGsX78+X9/s7OxSv7+IiIiUHxWERERE5Jp6TXy1atXIyckpcHxu1s3Zs2dZtmwZDz74IIsXL6Zt27YFYnTp0oV58+Z598o5evQokZGRjBw5kiNHjlCrVi2WLFnCiBEjLivHbt268eyzzxIbG0tgYCD79+/Hz8+PTp060adPH5566ilq167Nzz//zM0331xgTOc0b96crKwsdu3axe9+9zsWLlxI+/btLzmfwsZ7/iyhdu3aERcXx/jx47Esi48++oiFCxdy4MABbr75ZgYMGEDNmjV58803GT9+PIcPH2b9+vW0bt2a06dP89133xEUFETNmjVJTk6mbdu2LFq06LKenYiIiFwbtGRMRERErilxcXEMHToUp9PJiRMnGDJkCN27d/duKl21alU2bNhAcHAwSUlJTJo0CYD4+Hji4+MBmDhxIkePHiU4OBiHw8Hq1aupX78+M2bMoGPHjjgcDsLCwujdu/dl5di1a1f69+9P69atsdls9O3bl5ycHIKCgpgwYQLt27fH4XDw1FNPAfDggw8yc+ZMQkJC2L17tzdOlSpVeOedd3jggQew2Wz4+PgwdOjQS86nsPGeLzQ0lLi4OCIjI7nnnnt49NFHCQkJIT09ncjISJxOJ1OnTmXixIlUrlyZZcuWMW7cOBwOB06nk6+//hqAd955h+HDh+N0Or2zpUREROT6ZK6F/zMPDw+3UlNT87UNj55fRO/85q197GqkJCIickPbvn07LVq0KO80LktgYCC5ubnlnYZchuv5eyciIldOv+eXPWNMmmVZ4YWd0wwhEREREREREZEKRnsIiYiIyHWlIs8Oeuedd5gzZ06+tqioKObNm1dOGYmIiMj1SgUhERERkevE4MGDGTx4cHmnISIiIjcALRkTEREREREREalgVBASEREREREREalgVBASEREREREREalgtIeQiIiIkDf/76Uar9JjQ0o1noiIiIiULs0QEhERkXKRlZVFcHBwgfYFCxZw4MAB7/Hs2bP59ddfyzK1UrdixQq2bdvmPZ40aRKJiYnlmNHFZWdn8/rrr5d3GiIiInKVqCAkIiIi15SKUBCaNm0a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qn+uRLVq1cjJySny+OzZs979dxYvXkzbtm0LxOjSpQvz5s3zHh89epTIyEi+/PJLjhw5wpkzZ1iyZAnt27e/rBy7devG22+/TW5uLgD79+/nP//5D506deKDDz7gp59+AuDnn38udAznNG/enKysLHbt2gXAwoULLyunouKXVOfOnVm2bBn/+c9/vHnv2bOn2Gd26623sn37ds6ePctHH31UarmIiIhI2VBBSERERK4pcXFxDB06FKfTyYkTJxgyZAjdu3f3bipdtWpVNmzYQHBwMElJSUyaNAlwv2o9Pj4egIkTJ3L06FGCg4NxOBysXr2a+vXrM2PGDDp27IjD4SAsLIzevXtfVo5du3alf//+tG7dGpvNRt++fcnJySEoKIgJEybQvn17HA4HTz31FAAPPvggM2fOJCQkJN9Gy1WqVOGdd97hgQcewGaz4ePjw9ChQy85n//6r//io48+8m4qfalatmzJ888/T9euXbHb7XTp0oWDBw8W+8xmzJhBz549adOmDfXr1/fGKmqsIiIicm0x56Y+l6fw8HArNTU1X9vw6PlF9M5v3trHrkZKIiIiN7Tt27fTokWL8k7jsgQGBnpn5sj15Xr+3omIyJXT7/llzxiTZllWeGHnNENIRERERERERKSC0abSIiIicl2pyLOD3nnnHebMmZOvLSoqKt9+SSIiIiIloYKQiIiIyHVi8ODBDB48uLzTEBERkRuAloyJiIiIiIiIiFQwKgiJiIiIiIiIiFQwKgiJiIiIiIiIiFQw2kNIREREOLvmz6Uaz6fD7FKNJyIiIiKlSzOEREREpFxkZWURHBxcoH3BggUcOHDAezx79mx+/fXXskztsqSmpjJy5MhLvu6DDz6gRYsWdOzYscg+Bw4coG/fvgCsWbOGnj17XnaeIiIiIqCCkIiIiFxjrseCUF5eHuHh4bz66quXfO1bb73F/PnzWb16dZF9GjRowLJlyy4rN8uyOHv27GVdKyIiIjcuFYRERESk3Jw5c4bHHnuMoKAgunbtysKFC0lNTSU2Nhan08mcOXM4cOAAHTt29M6gCQwMZPTo0QQFBdG5c2cOHz5cIO7hw4fp0qULQUFBPProo9x5550cOXIEgH/84x9ERkbidDp5/PHHOXPmjDfuhAkTcDgctGrVikOHDnlj3X///URERBAREcFXX30FwJQpUxg4cCBR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uFwuAgIC+Pvf/86WLVuYOXNmqd9XREREpKS0ZExERETKzZkzZ3jsscf4+uuvue222xg4cCCpqanExsYSEBDA4MGDOXDgAB07dqROnTqsXr2awMBAHnvsMVatWkW9evVYunQpdevWLRB727ZtdOjQgb179/LnP/+ZkSNHMn78eHbv3o3T6aRLly6sW7eO7du343Q6GTRoELVq1eKjjz7i2LFj7N+/nwEDBjB58uQi858+fTrvvvsut9xyC7fffjthYWEAxMXF0bNnT7Kzs3n//ff517/+xT//+U9ycnLIzc0lLCyMp59+mn79+l21ZysiIiJSHBWEREREpNxkZmayZMkS5s+fzx//+EeMMYSHhzNr1izCw8MBeOWVV1i9ejV16tQB4Pjx44SHh/PKK68wbdo0pk6dymuvvVYg9o4dO1i9ejU5OTk0b96cYcOGMWPGDLZu3YrL5QJgzZo1zJo1i08//RRwz07asGEDW7du5aabbiIiIoLf//733lzOl5aWxtKlS3G5XOTl5REaGuotCJ3z6KOPkpycTM+ePenbty8AgYGB3vuLiIiIlBctGRMREZFy07hxY5xOJwBhYWFkZWVd9BofHx/vzJoBAwaQnJxcaL/f//73+Pv7U6dOHW655RYOHTpUopy6dOlC7dq1CQgIICYmpsj469ato0+fPtx0001Ur16dXr16lSi+iIiIyLVABSEREREpN/7+/t6ffX19ycvLu+QYxphSjX1hvKLii4iIiFzPtGRMRERErqnXxFerVo2cnJwCx+eWjJ09e5Zly5bx4IMPsnjxYtq2bXvFsc/373//m59//pmAgABWrFjB22+/XWis6Oho4uLiePrpp8nLy+OTTz7h8ccfv5ShioiIiJQbzRASERGRa0pcXBxDhw71vqZ9yJAhdO/enY4dOwJQtWpVNmzYQHBwMElJSUyaNAmA+Ph44uPji41du3ZtoqKiCA4OZsyYMdjtdnx9fXE4HLzyyisAREZGcv/992O327n//vsL3T8IIDQ0lH79+uFwOLjvvvuIiIgoxacgIiIicnUZy7LKOwfCw8Ot1NTUfG3Do+eX6Np5ax+7GimJiIjc0LZv306LFi3KO43LEhgYSG5u7lWJvWDBAlJTUwvdpFqu3PX8vRMRkSun3/PLnjEmzbKsQv/rlmYIiYiIiIiIiIhUMNpDSERERK4rV2t2ELiXq8XFxeVr++mnn+jcuXOBvl988QW1a9e+armIiIiIXE0qCImIiIgUo3bt2rhcrvJOQ0RERKRUacmYiIiIiIiIiEgFo4KQiIiIiIiIiEgFo4KQiIiIiIiIiEgFoz2EREREBKaYUo5nXdZlWVlZ9OzZk61bt5ZuPiIiIiKSj2YIiYiIiIiIiIhUMCoIiYiISLl5+eWXCQ4OJjg4mNmzZ+c79/333xMSEkJKSkr5JCciIiJyA9OSMRERESkXaWlpvPPOO3z77bdYlsU999xD+/btAdi5cycPPvggCxYswOFwlHOmIiIiIjceFYRERESkXCQnJ9OnTx+qVq0KQExMDOvWrePw4cP07t2bDz/8kJYtW5ZzliIiIiI3Ji0ZExERkWtKjRo1uOOOO0hOTi7vVERERERuWCoIiYiISLlo164dK1as4Ndff+X48eN89NFHtGvXjsqVK/PRRx/x3nvvsXjx4vJOU0REROSGpCVjIiIictmvib8SoaGhxMXFERkZCcCjjz5KrVq1AKhatSqffvopXbp0ITAwkF69epV5fiIiIiI3MhWEREREpNw89dRTPPXUU/natm7dCkDNmjX1hjERERGRq0RLxkREREREREREKhgVhEREREREREREKhgVhEREREREREREKhgVhEREREREREREKhgVhEREREREREREKhgVhEREREREREREKhi9dl5ERERI+WR7qcaL+K8WpRpPREREREqXZgiJiIhImcvOzub1118v7zRKncvl4vPPP/cer1y5khkzZpRa/KysLBYvXuw9Tk1NZeTIkaUW/1JcOFYRERG5vqggJCIiImWuohSEevXqxfjx40st/oUFofDwcF599dVSi38pVBASERG5vqkgJCIiImVu/Pjx7N69G6fTyZgxY3jxxRex2Ww4HA5vAaVDhw6MGjUKp9NJcHAwGzZsKDRWYde6XC5atWqF3W6nT58+HD161Btz3LhxREZG0qxZM9atWwfAggULiImJoXv37jRt2pSxY8d6469atYrWrVsTGhrKAw88QG5uLgApKSm0adMGh8NBZGQkx44dY9KkSSQkJOB0OklISGDBggU8+eSTgLuY06lTJ+x2O507d2bv3r0AxMXFMXLkSNq0aUOTJk1YtmxZsc9t3bp1OJ1OXnnlFdasWUPPnj0BmDJlCoMGDaJdu3bceeedfPjhh4wd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QkICERER/PLLLwQEBDBnzhyMMaSnp7Njxw66du3Kd999B4DL5WLTpk34+/vTvHlzRowYwe23387x48dp1aoV06dPZ+zYscyfP5+JEycyatQoRo8eTdu2bdm7dy/dunVj+/btPPfcc9SoUYP09HQAjh49yv33389rr72Gy+UqMMYPP/wQl8vF5s2bOXLkCBEREURHRwOwadMmMjIyaNCgAVFRUXz11Ve0bdu2QIyRI0fy8ssvs3r1aurUqVPg/K5du/jggw94++23iYiIYPHixSQnJ7Ny5UpeeOEFVqxYwfTp0+nUqRNvv/022dnZREZGcu+99xIfH1/kMyvqMytqrCIiInL9UUFIRERErhmtW7dm+vTp7Nu3j5iYGJo2bZrv/M6dO6lfvz4REREAVK9eHYDk5GRGjBgBwN13382dd97pLW507tyZGjVqANCyZUv27NnD7bffTuXKlb2FqLCwMP79738DkJiYyLZt27z3/OWXX8jNzSUxMZGlS5d622vVqlXsWJKTk3nooYfw9fXl1ltvpX379qSkpFC9enUiIyNp2LAhAE6nk6ysrEILQhfTuHFjbDYbAEFBQXTu3BljDDabjaysLABWrVrFypUrmTVrFuCeGbR3795in5mIiIjc+FQQEhERkWtG//79ueeee/jss8/o0aMHf/vb3+jUqdMVxfT39/f+7OvrS15eHgB+fn4YYwq0nz17lm+++YYqVapc0X0vJ6criePj4+M99vHx8ca0LIvly5fTvHnzEsWsVKkSZ8+e9R6fPHnysnITERGRa5sKQiIiIkJZvya+WrVq5OTkFGj//vvvadKkCSNHjmTv3r1s2bIlX0GoefPmHDx4kJSUFCIiIsjJySEgIIB27dqxaNEiOnXqxHfffcfevXtp3rw5GzduvOTcunbtyty5c717G7lcLpxOJ126dGHevHnMnj0bcC8Zq1WrFn5+fpw+fRo/P798cdq1a8ff/vY3Bg0axM8//8zatWuZOXMmO3bsuKR8zj2rwpaMlUS3bt2YO3cuc+fOxRjDpk2bCAkJKfKZ/fLLL7z++uucPXuW/fv3e/ciAoocq4iISEnM61TSf288dlXzEDdtKi0iIiJlrnbt2kRFRREcHJxvU+n333+f4OBgnE4nW7du5eGHHwbcr1o/cOAAlStXJiEhgREjRuBwOOjSpQsnT57kiSee4OzZ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ERERuQLdunW7olfIi4iIiJQHLRkTEREREREREalgVBASEREREREREalgVBASEREREREREalgtIeQiIiIsLJ/6b4KvNfi7cWez87OZvHixTzxxBNkZWXRs2dPtm7dWmr3P3DgACNHjmTZsmW4XC4OHDhAjx49Si2+iIiIyPVOM4RERESkzGVnZ/P6669ftfgNGjRg2bJlALhcLj7//POrdi8RERGR65EKQiIiIlLmxo8fz+7du3E6nYwZM8bbnpGRQWRkJE6nE7vdTmZmZoFrGzVqxNNPP43T6SQ8PJyNGzfSrVs37rrrLuLj4wHIysoiODiYU6dOMWnSJBISEnA6nSQkJDBlyhQGDRpEu3btuPPOO/nwww8ZO3YsNpuN7t27c/r06TJ7DiIiIiLlRQUhERERKXMzZszgrrvuwuVyMXPmTG97fHw8o0aNwuVykZqaSsOGDQu9/o477sDlctGuXTvi4uJYtmwZ33zzDZMnT87Xr3LlykybNo1+/frhcrno168fALt37yYpKYmVK1cyYMAAOnbsSHp6OgEBAXz22WdXb+AiIiIi1wjtISQiIiLXjNatWzN9+nT27dtHTEwMTZs2LbRfr169ALDZbOTm5lKtWjWqVauGv78/2dnZF73Pfffdh5+fHzabjTNnztC9e3dvvKysrNIajoiIiMg1SzOERERE5JrRv39/Vq5cSUBAAD169CApKanQfv7+/gD4+Ph4fz53nJeXd9H7nH+9n58fxphLul5ERETkeqeCkIiIiJS5atWqkZOTU6D9+++/p0mTJowcOZLevXuzZcuWq3YvERERkYrsokvGjDG3A+8BtwIW8HfLsuYYY24GEoBGQBbwR8uyjhr3f2KbA/QAfgXiLMvaeHXSFxERkdJwsdfEl7batWsTFRVFcHAwLVr8/1fev//++yxcuBA/Pz/q1avHM888A0CPHj148803adCgwSXfq2PHjsyYMQOn08nTTz9damMQERERuZ4Zy7KK72BMfaC+ZVkbjTHVgDTgD0Ac8LNlWTOMMeOBWpZljTPG9ABG4C4I3QPMsSzrnuLuER4ebqWmpuZrGx49v0QDmLf2sRL1ExERkf9v+/bt+QoxImVB3zsRkQpuiilhv+LrFFJyxpg0y7LCCzt30SVjlmUdPDfDx7KsHGA7cBvQG3jX0+1d3EUiPO3vWW7fADU9RSUREREREREREbkGXNIeQsaYRkAI8C1wq2VZBz2n/g/3kjJwF4t+PO+yfZ62C2MNMcakGmNSDx8+fKl5i4iIiIiIiIjIZSrxa+eNMYHAcuDPlmX9cu5tHACWZVnGmEua02VZ1t+Bv4N7ydilXCsiUh5W9i/ZMoey3otF5HJZlsX5/38ucjVdbJsCERERKVslmiFkjPHDXQxaZFnWh57mQ+eWgnn+/o+nfT9w+3mXN/S0iYiIyDWiSpUq/PTTT/olXcqEZVn89NNPVKlSpbxTEREREY+SvGXMAG8B2y3Levm8UyuBQcAMz98fn9f+pDFmKe5NpY+dt7RMRERErgENGzZk3759aNm2lJUqVarQsGHD8k5DREREPEqyZCwKGAikG2NcnrZncBeC3jfG/AnYA/zRc+5z3G8Y24X7tfODSzNhERERuXJ+fn40bty4vNMQERERkXJy0YKQZVnJQFEbDHQupL8FDL/CvERERERERERE5Cq5pLeMiYiIiIiIiIjI9U8FIRERERERERGRCqbEr50XEanoei0eXd4piIiIiIiIlArNEBIRERERERERqWBUEBIRERERERERqWBUEBIRERERERERqWBUEBIRERERERERqWBUEBIRERERERERqWBUEBIRERERERERqWBUEBIRERERERERqWBUEBIRERERERERqWBUEBIRERERERERqWBUEBIRERERERERqWBUEBIRERERERERqWBUEBIRERERERERqWBUEBIRERERERERqWBUEBIRERERERERqWBUEBIRERERERERqWBUEBIRERERERERqWBUEBIRERERERERqWAqlXcCIiIiIteq4dHzS9Tv/7V37/GXjvX+x9/vMcghZ1EmlE5UTg3VTnJoF+2IpFLtKFE7KTq36xdbB7Q7soeihEohqlHRATU6iGGGIaSQiJqKSO22w+f3x3V9zbKs78y673Xds+7v3K/n43E/5v7ea63PfO7TWve61nVfn1lzDmg4EwAAgLLoIQQAAAAAANAxNAgBAAAAAAB0DLeMAcCQDtreQz1v1pyGEwEAAI2a/apNh3re7qdd03AmANAceggBAAAAAAB0DA1CAAAAAAAAHUODEAAAAAAAQMfQIAQAAAAAANAxNAgBAAAAAAB0DA1CAAAAAAAAHUODEAAAAAAAQMfQIAQAAAAAANAxNAgBAAAAAAB0DA1CAAAA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\n", "text/plain": [ "<figure size with axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "to_plot = df_ru[\n", " (df_ru['domain'] == 'www.bbc.com')\n", " & (df_ru['probe_asn'].isin(relevant_asn_domains['probe_asn'].unique()))\n", " & (df_ru['blocking_recalc'] != 'invalid')\n", " & (df_ru['measurement_start_time'] > '2022-03-05')\n", " #& (df_ru['blocking_recalc'] != 'ok')\n", "][['blocking_recalc', 'probe_asn']]\n", "to_plot['count'] = 1\n", "(\n", " to_plot.pivot_table(\n", " columns='blocking_recalc',\n", " index='probe_asn',\n", " values='count',\n", " aggfunc='sum'\n", " ).reset_index()\n", " .groupby('probe_asn')\n", " .sum().reset_index()\n", " .set_index('probe_asn')\n", " .plot(kind='bar', stacked=True, figsize=(20,10), colormap='Paired', title='Blocking of www.bbc.com by probe_asn')\n", ")" ] }, { "cell_type": "markdown", "id": "ffb3637e-81a3-467c-88c3-302b6589e6c6", "metadata": {}, "source": [ "As we can see above, the means through which blocking is implemented across different ISPs varies significantly. In some of them, we can also see that the block is not being implemented at all.\n", "\n", "We can use the above chart to navigate our exploration of individual measurements on a per-ISP basis." ] }, { "cell_type": "code", "execution_count": 64, "id": "6a4dee21-1961-4fe6-b92b-ee7497e0c3c5", "metadata": {}, "outputs": [], "source": [ "def plot_blocking(probe_asn, domain):\n", " to_plot = df_ru[\n", " (df_ru['probe_asn'] == probe_asn)\n", " & (df_ru['domain'] == domain)\n", " & (df_ru['blocking_recalc'] != 'invalid')\n", " ][['blocking_recalc', 'measurement_start_time']]\n", " to_plot['measurement_start_time'] = pd.to_datetime(to_plot['measurement_start_time'])\n", " to_plot['count'] = 1\n", " (\n", " to_plot.pivot_table(\n", " columns='blocking_recalc',\n", " index='measurement_start_time',\n", " values='count',\n", " aggfunc='sum'\n", " ).reset_index()\n", " .groupby(pd.Grouper(key='measurement_start_time', freq='D'))\n", " .sum().reset_index()\n", " .set_index('measurement_start_time')\n", " .plot(kind='bar', stacked=True, title=f\"{probe_asn} {domain}\", colormap='Paired', figsize=(20,8))\n", " )" ] }, { "cell_type": "markdown", "id": "41fdf5af-e7d9-4c40-97ee-699e6e234dfc", "metadata": {}, "source": [ "Through the above function, we now have the power to plot a chart that shows us the blocking of a certain domain and ISP over time. In doing so we can determine if the methods through which the blocking is happening are consistent or if there is some variation.\n", "\n", "Having a stable signal that doesn't show different ways through which the block is implemented (in cases where the root-cause may be a transient network failure) gives you higher confidence in the data." ] }, { "cell_type": "code", "execution_count": 65, "id": "a8c81b4e-fe79-4444-ae21-32d8993481f5", "metadata": {}, "outputs": [ { "data": { "image/png": "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pnfv3jz88MOtfGeLz+aOJEmSJEkZeO655zj++OOZOnUqa6yxBpdddlnDuldffZXTTz+de+65h7q6OsaPH88dd9zBzJkzOfroo7n11luZPHkyN99883zb/NnPfsbvfvc77rjjDlZZZZUFXnPddddl0qRJHHfccQ2ncZ1zzjnstttuTJkyhf3335+XXnppkXVPmzaN448/nilTpvDcc88xbdo0Hn/8cerq6pg4cSIPPPAAU6ZM4bzzzuOee+5h8uTJXHzxxQDsuOOOPProozzxxBMcdNBB/OhHP1pg+yeffDJDhgxh8uTJTJo0ie7du7f6vS06T8uSJEmSJCkDm266KYMHDwbgq1/9KpdccknDuvHjx7PLLruw3nrrAXDooYfywAMP0KFDB3beeWe22GILANZee+2G51x99dVsuumm3HHHHXTq1KnZ1xwxYgQA2267LbfddhsADz74ILfffjsAe+65J2uttdYi6958880ZNGgQAGPHjmXs2LH07dsXgFmzZjFt2jQmT57MAQccwLrrrjtfnTNmzODAAw/kn//8J//5z38acjR2zz33cPXVVwPQoUMHunTpssh6ysgjdyRJkiRJykDTy2cv6SXce/bsyfTp05kxY8ZCH7PSSisBlabJnDlz2vQ6nTt3bvg6pcR3vvMd6urqqKur429/+xtf//rXF/rck046iRNPPJGnnnqKX/ziF8yePbtNNZSdzR1JkiRJkjLw0ksv8cgjjwBw/fXXs+OOOzasGzhwIPfffz9vvPEGc+fO5YYbbmDIkCEMGjSIBx54gBdeeAGAt956q+E5ffv25Re/+AXDhw/n1VdfbXEdgwcP5qabbgIqR+K8/fbbLX7uHnvswa9//WtmzZoFwCuvvMLrr7/Obrvtxs0338ybb745X53vvvsun/rUpwD4zW9+0+w2hw4dys9//nMA5s6dy7vvvtviesrC5o4kSZIkSRnYeuutufTSS+nWrRtvv/02xx13XMO6jTbaiPPPP59dd92V3r17s+2227LPPvuw3nrrccUVVzBixAh69+7NgQceON82d9xxRy688EK++MUvLnRS5KZGjRrF2LFj6dGjBzfffDMbbrghq6++eoueO2zYMA455BC23357evbsyf7778/7779P9+7dOfPMMxkyZAi9e/fmm9/8JlC5ZPsBBxzAtttu23DKVlMXX3wx9957Lz179mTbbbflmWeeaVEtZRIppaW+0f79+6cJEyYs9e1KkiRJkrQsTZ06lW7dutW6jFL56KOP6NChAx07duSRRx7huOOOo66urtZllU5zYy8iJqaU+jd9rBMqS5IkSZKkpeall17iK1/5CvPmzWPFFVfkyiuvrHVJ2bO5I0mSJEmSlpott9ySJ554Yr5lb775JkOHDl3gsXfffTfrrLPOsiotWzZ3JEkqsLsOaf/DwIdfP7XdX0OSVAz+XlGtrLPOOp6a1Y6cUFmSJEmSJKnEbO5IkiRJkiSVmM0dSZIkSZKkErO5I0mSJEmSVGJOqCxJkiRJUgvd8MSMpbq9g/tustjHTJ8+nb333punn356vuWjR49m2LBhbLzxxgBcdNFFHHPMMay66qpLtcZl6Y477mCrrbZim222AeC73/0uO++8M5///OeXyvbvu+8+VlxxRXbYYQcALr/8clZddVUOP/zwpbL91miadUl45I4kSZIkSSU0evRoXn311Yb7F110Ef/+979rWNGSu+OOO3jmmWca7n/ve99bao0dqDR3Hn744Yb7xx57bE0aO7Bg1iVhc0eSJEmSpIKbO3cuRx99NN27d2fYsGFcc801TJgwgUMPPZQ+ffpw8cUX8+qrr7Lrrruy6667ArDaaqtx2mmn0b17d4YOHcrMmTMX2O6sWbM48sgj6dmzJ7169eLWW28F4IYbbqBnz5706NGD008/veHxq622GmeeeSa9e/dm0KBBvPbaawCMHDmSk08+mR122IFPf/rT3HLLLQ3PueCCCxgwYAC9evVi1KhRDcuvvvpqevXqRe/evTnssMN4+OGHueuuu/jWt75Fnz59+Pvf/87IkSMbtnX33XfTt29fevbsyde+9jU++ugjALp27cqoUaPo168fPXv25Nlnn232PZw+fTqXX345P/nJT+jTpw9//etfOfvss7nwwgsB2GWXXTjttNPo378/3bp1Y/z48YwYMYItt9ySs846q2E71157LQMHDqRPnz584xvfYO7cuYt9z+rdcsstjBw5stmsS8LmjiRJkiRJBTdt2jROOOEEpkyZwpprrklE0L9/f6677jrq6uo45ZRT2Hjjjbn33nu59957Afjggw/o378/U6ZMYciQIZxzzjkLbPfcc8+lS5cuPPXUUzz55JPstttuvPrqq5x++uncc8891NXVMX78eO64446GbQ4aNIjJkyez8847c+WVVzZs65///CcPPvggv/vd7zjjjDMAGDt2LNOmTePxxx+nrq6OiRMn8sADDzBlyhTOO+887rnnHiZPnszFF1/MDjvswPDhw7nggguoq6vjM5/5TMO2Z8+ezciRIxkzZgxPPfUUc+bM4ec//3nD+nXXXZdJkyZx3HHHNTRrmuratSvHHnssp512GnV1dey0004LPGbFFVdkwoQJHHvsseyzzz5ceumlPP3004wePZo333yTqVOnMmbMGB566CHq6uro0KED11133SLfs+YsKmtb2NyRJEmSJKngtthiC/r06QPAtttuy/Tp0xf7nBVWWIEDDzwQgK9+9as8+OCDCzxm3LhxnHDCCQ3311prLcaPH88uu+zCeuutR8eOHTn00EN54IEHgErzY++99262ji9/+cussMIKbLPNNg1H9IwdO5axY8fSt29f+vXrx7PPPsu0adO45557OOCAA1h33XUBWHvttReZ5bnnnmOLLbZgq622AuCII45oqAlgxIgRrXpvFmb48OEA9OzZk+7du7PRRhux0kor8elPf5qXX36Zu+++m4kTJzJgwAD69OnD3XffzT/+8Y9FvmfLghMqS5IkSZJUcCuttFLD1x06dODDDz9s9TYiYonr6NSpU8N2OnTowJw5c5qtMaXU8O93vvMdvvGNb8y3nZ/+9KdLXEtj9a/dtKa2bmeFFVaYL88KK6zAnDlzSClxxBFH8IMf/GC+5915550L3Wbj93327Nltrm1RPHJHkiRJkqQSWn311Xn//fcXen/evHkN89Vcf/317LjjjgtsY/fdd+fSSy9tuP/2228zcOBA7r//ft544w3mzp3LDTfcwJAhQ9pU4x577MGvf/1rZs2aBcArr7zC66+/zm677cbNN9/Mm2++CcBbb73VbIZ6W2+9NdOnT+dvf/sbANdcc02balrY9ltq6NCh3HLLLbz++usNdb/44ouLfM822GADpk6dyrx587j99tuXWi2NeeSOJEmSJEkt1JJLly8rI0eO5Nhjj2WVVVbhkUce4ZhjjmHPPfdsmHunc+fOPP7445x33nmsv/76jBkzBqhc/hsqV4o666yzOOGEE+jRowcdOnRg1KhRjBgxgvPPP59dd92VlBJf/OIX2WeffdpU47Bhw5g6dSrbb789UJlc+Nprr6V79+6ceeaZDBkyhA4dOtC3b19Gjx7NQQcdxNFHH80ll1wy36TMK6+8MldddRUHHHAAc+bMYcCAARx77LGtrudLX/oS+++/P3feeWebjh7aZpttOO+88xg2bBjz5s2jU6dOXHrppQwaNGih79n555/P3nvvzXrrrUf//v0bGl1Nsy7JvDtRf6jU0tS/f/80YcKEpb5dSZKWN3cd0q3dX2P49VPb/TUkScXg75XWmzp1Kt26tf/71h5WW221hkaCyqe5sRcRE1NK/Zs+1tOyJEmSJEmSSszTsiRJkiRJytDyfNTOVVddxcUXXzzfssGDB883v1BObO5IkiRJkqSsHHnkkRx55JG1LmOZ8bQsSZIkSZKkErO5I0mSJEmSVGI2dyRJkiRJkkrM5o4kSZIkSVKJOaGyJEmSJEktNOfKK5bq9joefcxiHzN9+nT23ntvnn766fmWjx49mmHDhrHxxhsDcNFFF3HMMcew6qqrLtUal7YJEyZw9dVXc8kll7TqeTfffDPf/e532XDDDbn33nubfcyrr77KySefzC233MJ9993HhRdeyO9+97ulUXaheeSOJEmSJEklNHr0aF599dWG+xdddBH//ve/a1jR4s2ZM4f+/fu3urED8Ktf/Yorr7xyoY0dgI033phbbrmlTbWllJg3b16bnltrNnckSZIkSSq4uXPncvTRR9O9e3eGDRvGNddcw4QJEzj00EPp06cPF198Ma+++iq77roru+66KwCrrbYap512Gt27d2fo0KHMnDlzge3OnDmT3Xffne7du3PUUUex+eab88YbbwBw7bXXMnDgQPr06cM3vvEN5s6d27DdM888k969ezNo0CBee+21hm3tt99+DBgwgAEDBvDQQw8BcPbZZ3PYYYcxePBgDjvsMO677z723ntvAGbNmsWRRx5Jz5496dWrF7feemuz+b/3ve/x4IMP8vWvf51vfetbTJ8+nZ122ol+/frRr18/Hn74YaBylFOPHj0WeP7ZZ5/NhRde2HC/R48eTJ8+nenTp7P11ltz+OGH06NHD15++WUuuOACBgwYQK9evRg1alSbvl/Lms0dSZIkSZIKbtq0aZxwwglMmTKFNddck4igf//+XHfdddTV1XHKKaew8cYbc++99zYc2fLBBx/Qv39/pkyZwpAhQzjnnHMW2O4555zDbrvtxpQpU9h///156aWXAJg6dSpjxozhoYceoq6ujg4dOnDdddc1bHfQoEFMnjyZnXfemSuvvBKAU045hdNOO43x48dz6623ctRRRzW8zjPPPMO4ceO44YYb5nv9c889ly5duvDUU0/x5JNPsttuuzWb/7vf/W5D3gsuuID111+fv/zlL0yaNIkxY8Zw8sknL9F7e/zxxzNlyhSee+45pk2bxuOPP05dXR0TJ07kgQceaPO2lxXn3JEkSZIkqeC22GIL+vTpA8C2227L9OnTF/ucFVZYgQMPPBCAr371q4wYMWKBxzz44IPcfvvtAOy5556stdZaANx9991MnDiRAQMGAPDhhx+y/vrrA7Diiis2HHmz7bbb8pe//AWAcePG8cwzzzRs+7333mPWrFkADB8+nFVWWWWB1x83bhw33nhjw/3611+cjz/+mBNPPLGh8fT888+36HnN2XzzzRk0aBAAY8eOZezYsfTt2xeoHFk0bdo0dt555zZvf1mwuSNJkiRJUsGttNJKDV936NCBDz/8sNXbiIgWPzalxBFHHMEPfvCDBdZ16tSpYVsdOnRgzpw5AMybN49HH32UlVdeeYHndO7cudX1LspPfvITNthgAyZPnsy8efOafc3GOnbsON98OrNnz262tpQS3/nOd/jGN76xVOttb56WJUmSJElSCa2++uq8//77C70/b968hsmFr7/+enbccccFtjF48GBuuukmoHLUyttvvw3A0KFDueWWW3j99dcBeOutt3jxxRcXWc+wYcP46U9/2nC/rq5usRl23313Lr300ob79a+/OO+++y4bbbQRK6ywAtdcc03DfEAL07VrVyZNmgTApEmTeOGFF5p93B577MGvf/3rhiOOXnnllYb3oMg8ckeSJEmSpBZqyaXLl5WRI0dy7LHHssoqq/DII49wzDHHsOeeezbMvdO5c2cef/xxzjvvPNZff33GjBkDwOWXXw7Asccey6hRozj44IO55ppr2H777dlwww1ZffXVWXfddTnvvPMYNmwY8+bNo1OnTlx66aVsvvnmC63nkksu4YQTTqBXr17MmTOHnXfeueG1Fuass87ihBNOoEePHnTo0IFRo0Y1e/pYU8cffzz77bcfV199NXvuuedijwyqf2z37t3Zbrvt2GqrrZp93LBhw5g6dSrbb789UJk8+tprr204Ja2oIqW01Dfav3//NGHChKW+XUmSljd3HdKt3V9j+PVT2/01JEnF4O+V1ps6dSrdurX/+9YeVltttYYjUBbmo48+okOHDnTs2JFHHnmE4447rkVH3Kj9NTf2ImJiSql/08d65I4kSZIkScupl156ia985SvMmzePFVdcseHKVyoXmzuSJEmSJGVocUftAGy55ZY88cQTy6Calttuu+346KOP5lt2zTXX0LNnzxpVVHw2dyRJkiRJUmE89thjtS6hdLxaliRJkiRJUonZ3JEkSZIkSSoxmzuSJEmSJEklZnNHkiRJkqSSmT59Oj169Kh1GSoIJ1SWJEmSJKmFxv926lLd3oAvdVuq29PyySN3JEmSJEkquB//+Mf06NGDHj16cNFFF8237h//+Ad9+/Zl/PjxtSlONeeRO5IkSZIkFdjEiRO56qqreOyxx0gpsd122zFkyBAAnnvuOQ466CBGjx5N7969a1ypasXmjiRJkiRJBfbggw+y77770rlzZwBGjBjBX//6V2bOnMk+++zDbbfdxjbbbFPjKlVLnpYlSZIkSVIJdenShc0224wHH3yw1qWoxlrU3ImI0yJiSkQ8HRE3RMTK7V2YJEmSJEmCnXbaiTvuuIN///vffPDBB9x+++3stNNOrLjiitx+++1cffXVXH/99bUuUzW02NOyIuJTwMnANimlDyPiJuAgYHQ71yZJkiRJ0nKvX79+jBw5koEDBwJw1FFHsdZaawHQuXNnfve737H77ruz2mqrMXz48FqWqhpp6Zw7HYFVIuJjYFXg1fYrSZIkSZKkYqrVpcu/+c1v8s1vfnO+ZU8//TQAa665plfKWs4t9rSslNIrwIXAS8A/gXdTSmPbuzBJkiRJkiQtXktOy1oL2AfYAngHuDkivppSurbJ444BjgHYbLPNln6lkiRJWqruOqT9//o8/Pqp7f4akiQt71oyofLngRdSSjNTSh8DtwE7NH1QSumKlFL/lFL/9dZbb2nXKUmSJEmSpGa0pLnzEjAoIlaNiACGAv4JRpIkSZIkqQBaMufOY8AtwCTgqepzrmjnuiRJkiRJktQCLbpaVkppFDCqnWuRJEmSJElSK7XktCxJkiRJkiQVVIuO3JEkSZIkSUv/SoOLu6rgO++8w/XXX8/xxx/P9OnT2XvvvXn66aeXag3Lyv/+7//yP//zPw33d9hhBx5++OEaVrR49913HyuuuCI77LDAdaUKxSN3JEmSJEkqqHfeeYfLLrus1mUsFf/7v/873/32bOzMnTt3qWznvvvuK3wDCmzuSJIkSZJUWGeccQZ///vf6dOnD9/61rcalk+ZMoWBAwfSp08fevXqxbRp0xZ47vjx49lhhx3o3bs3AwcO5P3332f27NkceeSR9OzZk759+3LvvfcCMHr0aEaMGMGee+7Jlltuybe//e2G7ay22mqceeaZ9O7dm0GDBvHaa68BMHPmTPbbbz8GDBjAgAEDeOihhwCYNWtWw2v06tWLW2+9lTPOOIMPP/yQPn36cOihhzZsFyClxLe+9S169OhBz549GTNmDFBprOyyyy7sv//+fO5zn+PQQw8lpbTQ96pr166cfvrp9OvXj5tvvpmxY8ey/fbb069fPw444ABmzZrV8J5us8029OrVi//+7/9eaJbp06dz+eWX85Of/IQ+ffrw17/+tW3fxGXA07IkSZIkSSqo888/n6effpq6urqG07IALr/8ck455RQOPfRQ/vOf/yxwpMp//vMfDjzwQMaMGcOAAQN47733WGWVVbj44ouJCJ566imeffZZhg0bxvPPPw9AXV0dTzzxBCuttBJbb701J510EptuuikffPABgwYN4vvf/z7f/va3ufLKKznrrLM45ZRTOO2009hxxx156aWX2GOPPZg6dSrnnnsuXbp04amnngLg7bffZr/99uNnP/sZdXV1C2S87bbbqKurY/LkybzxxhsMGDCAnXfeGYAnnniCKVOmsPHGGzN48GAeeughdtxxx4W+X+ussw6TJk3ijTfeYMSIEYwbN47OnTvzwx/+kB//+MeccMIJ3H777Tz77LNEBO+88w7AQrMce+yxrLbaag1NoKKyuSNJkiRJUslsv/32fP/732fGjBmMGDGCLbfccr71zz33HBtttBEDBgwAYI011gDgwQcf5KSTTgLgc5/7HJtvvnlDc2fo0KF06dIFgG222YYXX3yRTTfdlBVXXLGhqbTtttvyl7/8BYBx48bxzDPPNLzme++9x6xZsxg3bhw33nhjw/K11lprkVkefPBBDj74YDp06MAGG2zAkCFDGD9+PGussQYDBw5kk002AaBPnz5Mnz59kc2dAw88EIBHH32UZ555hsGDBwOVZtf2229Ply5dWHnllfn617/O3nvv3ZBrYVnKwuaOJEmSJEklc8ghh7Dddtvx+9//nr322otf/OIX7Lbbbku0zZVWWqnh6w4dOjBnzhwAOnXqREQssHzevHk8+uijrLzyykv0um2paWE6d+4MVE712n333bnhhhsWeMzjjz/O3XffzS233MLPfvYz7rnnnmWSpT05544kSZIkSQW1+uqr8/777y+w/B//+Aef/vSnOfnkk9lnn3148skn51u/9dZb889//pPx48cD8P777zNnzhx22mknrrvuOgCef/55XnrpJbbeeus21TZs2DB++tOfNtyvP+Vq991359JLL21Y/vbbbwOVJtHHH3+8wHZ22mknxowZw9y5c5k5cyYPPPAAAwcObFNN9QYNGsRDDz3E3/72NwA++OADnn/+eWbNmsW7777LXnvtxU9+8hMmT568yCwLe/+LxiN3JEmSJElqocVdunxpW2eddRg8eDA9evSgW7dPLsN+0003cc0119CpUyc23HDDhkuM77XXXvzyl79k4403ZsyYMZx00kl8+OGHrLLKKowbN47jjz+e4447jp49e9KxY0dGjx4939ExrXHJJZdwwgkn0KtXL+bMmcPOO+/M5ZdfzllnncUJJ5xAjx496NChA6NGjWLEiBEcc8wx9OrVi379+jU0mAD23XdfHnnkEXr37k1E8KMf/YgNN9yQZ599ts3v23rrrcfo0aM5+OCD+eijjwA477zzWH311dlnn32YPXs2KSV+/OMfLzLLl770Jfbff3/uvPNOfvrTn7LTTju1uab2FIuaabqt+vfvnyZMmLDUtytJ0vLmrkO6Lf5BS2hZf0hVcTi+pOWP+33rTZ06db6mirSsNDf2ImJiSql/08d6WpYkSZIkSVKJeVqWJEmSJEkqjX333ZcXXnhhvmU//OEP2WOPPWpUUe3Z3JEkSZIkSaVx++2317qEwvG0LEmSJEmSFqE95qqVFqW1Y87mjiRJkiRJC7Hyyivz5ptv2uDRMpNS4s0332TllVdu8XM8LUuSJEmSpIXYZJNNmDFjBjNnzqx1KVqOrLzyymyyySYtfrzNHUmSJEmSFqJTp05sscUWtS5DWiRPy5IkSZIkSSoxmzuSJEmSJEklZnNHkiRJkiSpxGzuSJIkSZIklZjNHUmSJEmSpBKzuSNJkiRJklRiNnckSZIkSZJKzOaOJEmSJElSidnckSRJkiRJKjGbO5IkSZIkSSVmc0eSJEmSJKnEbO5IkiRJkiSVmM0dSZIkSZKk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\n", "text/plain": [ "<figure size with axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_blocking('AS43966', 'www.bbc.com')" ] }, { "cell_type": "markdown", "id": "76408298-99f8-429d-8c4a-37221739fb8e", "metadata": {}, "source": [ "Here we can see that the block is happening through a connection reset most of the time. The only outliers are cause by what very likely are old versions of the probe (in many cases you may want to exclude older versions of probes from your analysis, if you have enough data).\n", "\n", "The only case that probably deserves further investigation, is the OK measurement on the 16th. Let's find it and open it in OONI Explorer." ] }, { "cell_type": "code", "execution_count": 62, "id": "b6b0df1e-9102-466e-b357-15d915a5d847", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border='\"1\"' class='\"dataframe\"'>\n", " <thead>\n", " <tr style='\"text-align:' right>\n", " <th></th>\n", " <th>input</th>\n", " <th>measurement_start_time</th>\n", " <th>probe_asn</th>\n", " <th>probe_cc</th>\n", " <th>probe_network_name</th>\n", " <th>report_id</th>\n", " <th>resolver_asn</th>\n", " <th>resolver_ip</th>\n", " <th>resolver_network_name</th>\n", " <th>software_name</th>\n", " <th>...</th>\n", " <th>control_measurement</th>\n", " <th>blocking</th>\n", " <th>http_experiment_failure</th>\n", " <th>dns_experiment_failure</th>\n", " <th>http_title</th>\n", " <th>http_meta_title</th>\n", " <th>http_body_md5</th>\n", " <th>tcp_connect</th>\n", " <th>domain</th>\n", " <th>blocking_recalc</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>517649</th>\n", " <td>https://www.bbc.com/news/world-51235105</td>\n", " <td>2022-03-16 12:41:20</td>\n", " <td>AS43966</td>\n", " <td>RU</td>\n", " <td>IT REGION LTD</td>\n", " <td>20220316T124100Z_webconnectivity_RU_43966_n1_q...</td>\n", " <td>AS43966</td>\n", " <td>79.173.80.17</td>\n", " <td>IT REGION LTD</td>\n", " <td>ooniprobe-android</td>\n", " <td>...</td>\n", " <td>{'tcp_connect': {'151.101.112.81:443': {'statu...</td>\n", " <td>False</td>\n", " <td>None</td>\n", " <td>None</td>\n", " <td>Covid map: Coronavirus cases, deaths, vaccinat...</td>\n", " <td>Covid map: Coronavirus cases, deaths, vaccinat...</td>\n", " <td>add8e023428a9d1b4816fb3bb2a238c7</td>\n", " <td>[{'ip': '151.101.112.81', 'port': 443, 'status...</td>\n", " <td>www.bbc.com</td>\n", " <td>ok</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>1 rows × 30 columns</p>\n", "</div>" ], "text/plain": [ " input measurement_start_time \\\n", "517649 https://www.bbc.com/news/world-51235105 2022-03-16 12:41:20 \n", "\n", " probe_asn probe_cc probe_network_name \\\n", "517649 AS43966 RU IT REGION LTD \n", "\n", " report_id resolver_asn \\\n", "517649 20220316T124100Z_webconnectivity_RU_43966_n1_q... AS43966 \n", "\n", " resolver_ip resolver_network_name software_name ... \\\n", "517649 79.173.80.17 IT REGION LTD ooniprobe-android ... \n", "\n", " control_measurement blocking \\\n", "517649 {'tcp_connect': {'151.101.112.81:443': {'statu... False \n", "\n", " http_experiment_failure dns_experiment_failure \\\n", "517649 None None \n", "\n", " http_title \\\n", "517649 Covid map: Coronavirus cases, deaths, vaccinat... \n", "\n", " http_meta_title \\\n", "517649 Covid map: Coronavirus cases, deaths, vaccinat... \n", "\n", " http_body_md5 \\\n", "517649 add8e023428a9d1b4816fb3bb2a238c7 \n", "\n", " tcp_connect domain \\\n", "517649 [{'ip': '151.101.112.81', 'port': 443, 'status... www.bbc.com \n", "\n", " blocking_recalc \n", "517649 ok \n", "\n", "[1 rows x 30 columns]" ] }, "execution_count": 62, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ru[\n", " (df_ru['probe_asn'] == 'AS43966')\n", " & (df_ru['blocking_recalc'] == 'ok')\n", " & (df_ru['measurement_start_time'].str.startswith('2022-03-16'))\n", " & (df_ru['domain'] == 'www.bbc.com')\n", "]" ] }, { "cell_type": "code", "execution_count": 63, "id": "04dc4a18-57db-4b09-a675-72f6c8439054", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "https://explorer.ooni.org/measurement/20220316T124100Z_webconnectivity_RU_43966_n1_qXKPLjBo4r7rzNdl?input=https%3A%2F%2Fwww.bbc.com%2Fnews%2Fworld-51235105\n" ] } ], "source": [ "print_explorer_url(df_ru.iloc[517649])" ] }, { "cell_type": "code", "execution_count": 66, "id": "e595e135-e016-4011-a161-1864596f1185", "metadata": {}, "outputs": [ { "data": { "image/png": "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Tf/HP/5B//796devH0OHLn2R7/Hjx7Pffvvx4YcfMnr0aK699loAevTowemnn07//v3p06cPTz75JABvvPEGe+21F9tssw3f+c532GyzzXjzzTcbrHnWrFn07NmTww47jN69e/PSSy/x85//nEGDBtG3b19OP/30uuf+4Q9/oG/fvvTr149vfvObAPzlL39hu+22Y9ttt2XPPffk9ddfX2odr7/+OgceeCD9+vWjX79+3HvvvU18Z4vJxo8kSZIkSauQp556imOOOYYZM2aw9tprc8kll9TNe+WVVzjllFO4/fbbqa2tZcqUKdxwww288cYbHHnkkVx33XU88sgjXHPNNYst86KLLuKvf/0rN9xwA506dVpqneuttx4PPfQQRx99dN2pYT/+8Y/ZY489mD59OgcffDAvvvjicuueOXMmxxxzDNOnT+epp55i5syZPPjgg9TW1jJt2jTuuusupk+fzk9/+lNuv/12HnnkES644AIAdtppJ+6//34efvhhvv71r/Ozn/1sqeWfcMIJ7LrrrjzyyCM89NBDbLPNNk1+b4vIU70kSZIkSVqFbLLJJgwZMgSAQw89lF/+8pd186ZMmcJuu+1G9+7dARg1ahR33XUX7dq1Y5dddmHzzTcH4DOf+Uzda/7whz+wySabcMMNN9ChQ4cG1zlixAgABgwYwJ///GcAJk+ezPXXXw/Avvvuy7rrrrvcujfbbDO23357AG6++WZuvvlmtt12WwDmzZvHzJkzeeSRR/jqV7/Keuutt1ids2fPZuTIkbz66qt8/PHHdTnqu/322/nDH/4AQLt27ejatety66kWHvEjSZIkSdIqZMlLgq/sJef79OnDrFmzmD179jKf07FjR6DUUJk/f36z1rPWWmvV3U8p8b3vfY/a2lpqa2t55plnOOKII5b52uOPP57jjjuOxx57jF//+td89NFHzaqhGtn4kSRJkiRpFfLiiy9y3333AXDFFVew00471c0bPHgw//rXv3jzzTdZsGABV155Jbvuuivbb789d911F88//zwAb7/9dt1rtt12W379618zfPhwXnnllUbXMWTIEK6++mqgdATPO++80+jX7rPPPvzud79j3rx5ALz88sv8+9//Zo899uCaa67hrbfeWqzOd999l8997nMAXH755Q0uc+jQofzqV78CYMGCBbz77ruNrqfIbPxIkiRJkrQK6dmzJxdffDG9evXinXfe4eijj66bt+GGGzJu3Dh23313+vXrx4ABAzjggAPo3r07l112GSNGjKBfv36MHDlysWXutNNOnHvuuXzpS19a5gDNSzr99NO5+eab6d27N9dccw0bbLABXbp0adRr9957bw455BB22GEH+vTpw8EHH8zcuXPZZptt+MEPfsCuu+5Kv379+K//+i+gdNn5r371qwwYMKDuNLAlXXDBBdxxxx306dOHAQMG8MQTTzSqlqKLlFKbrWzgwIFp6tSpbbY+SZIkSZIqZcaMGfTq1avSZRTWf/7zH9q1a0f79u257777OProo6mtra10WYXX0HYVEdNSSgMber6DO0uSJEmSpDb34osv8rWvfY2FCxey+uqrM378+EqXlCUbP5IkSZIkqc1tscUWPPzww4tNe+uttxg6dOhSz73tttvo1q1bW5WWFRs/bWT++MvaZD3tjxzTJuuRJEmSJKmldevWzdO9WpiDO0uSJEmSJGXKxo8kSZIkSVKmbPxIkiRJkiRlysaPJEmSJEmrgDPOOINzzz13pZbxne98hyeeeKKFKmq6SZMmMW7cuGXOr62t5aabblqpdZx99tkr9fqicXBnSZIkSZLawJUPz27R5X1j241bdHmN8Zvf/KbN11nf8OHDGT58+DLn19bWMnXqVIYNG9bsdZx99tl8//vfb/bri8YjfiRJkiRJytRZZ53FlltuyU477cRTTz0FwG677cYpp5zC4MGD2XLLLbn77rsBmD59OoMHD6ampoa+ffsyc+bMpZa32267MXXqVAA6d+7MD37wA/r168f222/P66+/DsDrr7/OgQceSL9+/ejXrx/33nsvAOeddx69e/emd+/enH/++QDMmjWLXr16ceSRR7LNNtuw99578+GHHwLwy1/+kq233pq+ffvy9a9/HYAJEyZw3HHHAXDNNdfQu3dv+vXrxy677MLHH3/Mj370IyZOnEhNTQ0TJ07k/fff59vf/jaDBw9m22235cYbb6xbzogRI9h3333ZYostOPnkkwE49dRT+fDDD6mpqWHUqFEt/vOoBI/4kSRJkiQpQ9OmTeOqq66itraW+fPn079/fwYMGADA/PnzefDBB7npppv48Y9/zK233sqll17KiSeeyKhRo/j4449ZsGDBcpf//vvvs/3223PWWWdx8sknM378eE477TROOOEEdt11V66//noWLFjAvHnzmDZtGr///e954IEHSCmx3Xbbseuuu7Luuusyc+ZMrrzySsaPH8/XvvY1rrvuOg499FDGjRvH888/T8eOHZkzZ85S6z/zzDP55z//yec+9znmzJnD6quvzplnnsnUqVO56KKLAPj+97/PHnvswe9+9zvmzJnD4MGD2XPPPYHS0UEPP/wwHTt2pGfPnhx//PGMGzeOiy66KKtLynvEjyRJkiRJGbr77rs58MADWXPNNVl77bUXO0VqxIgRAAwYMIBZs2YBsMMOO3D22Wdzzjnn8MILL9CpU6flLn/11Vdn//33X2o5t99+O0cffTQA7dq1o2vXrkyePJkDDzyQtdZai86dOzNixIi6I40233xzampqllpO3759GTVqFP/7v/9L+/ZLH7cyZMgQRo8ezfjx45fZpLr55psZN24cNTU17Lbbbnz00Ue8+OKLAAwdOpSuXbuyxhprsPXWW/PCCy+s4B2tTjZ+JEmSJElaxXTs2BEoNWbmz58PwCGHHMKkSZPo1KkTw4YN4/bbb1/uMjp06EBELLWc5tay5HL+9re/ceyxx/LQQw8xaNCgpZZ/6aWX8tOf/pSXXnqJAQMG8NZbby217JQS1113HbW1tdTW1vLiiy/Sq1ev5a43NzZ+JEmSJEnK0C677MINN9zAhx9+yNy5c/nLX/6y3Oc/99xzfP7zn+eEE07ggAMO4NFHH23WeocOHcqvfvUrABYsWMC7777LzjvvzA033MAHH3zA+++/z/XXX8/OO++8zGUsXLiQl156id13351zzjmHd999l3nz5i32nGeffZbtttuOM888k+7du/PSSy/RpUsX5s6dW/ecffbZhwsvvJCUEgAPP/zwCuvv0KEDn3zySXOiF5KNH0mSJEmSMtS/f39GjhxJv3792G+//Rg0aNByn3/11VfTu3dvampqePzxxznssMMAGDZsGK+88kqj13vBBRdwxx130KdPHwYMGMATTzxB//79GT16NIMHD2a77bbjO9/5Dttuu+0yl7FgwQIOPfRQ+vTpw7bbbssJJ5zAOuuss9hzTjrpJPr06UPv3r3Zcccd6devH7vvvjtPPPFE3eDOP/zhD/nkk0/o27cv22yzDT/84Q9XWP+YMWPqTjPLQSzqerWFgQMHpkWjf69q5o+/rE3W0/7IMW2yHkmSJEnS8s2YMaPutCKppTS0XUXEtJTSwIae7xE/kiRJkiRJmbLxI0mSJEmSlCkbP5IkSZIkSZmy8SNJkiRJkpQpGz+SJEmSJEmZsvEjSZIkSZKUKRs/kiRJkiRJmWpf6QIkSZIkSVoV/GXWz1t0eV/ucdIKnzNr1iz2339/Hn/88cWmT5gwgb333puNNtoIgPPPP58xY8aw5pprNnr9Z5xxBp07d+a///u/F5s+Z84crrjiCo455pi6Gu69914OOeSQRi+7Mev80Y9+xC677MKee+7J3XffzVFHHUWHDh247777+NGPfsRNN93EsGHD+PnPW/Z9rzYe8SNJkiRJ0ipmwoQJvPLKK3WPzz//fD744IMWWfacOXO45JJL6h7PmjWLK664okWWXd+ZZ57JnnvuCcCf/vQnvve971FbW0unTp247LLLePTRR1f5pg94xI8kSZIkSVlbsGABRx55JPfeey+f+9zn+OY3v8nUqVMZNWoUnTp14lvf+havvPIKu+++O+uttx533HEHnTt35sgjj+Tmm29mgw024KqrrqJ79+5LLfuJJ55gt91248UXX2Ts2LGccMIJnHrqqTz77LPU1NSw1157cffddzNjxgxqamo4/PDDWXfddbn++ut59913efnllzn00EM5/fTTl1n/WWedxeWXX85nP/tZNtlkEwYMGADA6NGj2X///ZkzZw5XX301//znP/n73//O3LlzmTdvHgMGDOB73/seI0eObLX3thrY+JEkSZIkKWMzZ87kyiuvZPz48Xzta18jIhg4cCDnnnsuAwcOBOAXv/gFd9xxB+uttx4A77//PgMHDuQXv/gFZ555Jj/+8Y+56KKLllr2k08+yR133MHcuXPp2bMnRx99NOPGjePxxx+ntrYWgDvvvJNzzz2Xv/71r0DpaKMHH3yQxx9/nDXXXJNBgwbxpS99qa6W+qZNm8ZVV11FbW0t8+fPp3///nWNn0W+853vMHnyZPbff38OPvhgADp37ly3/lWdp3pJkiRJkpSxzTffnJqaGgAGDBjArFmzVvia1VZbre5ImUMPPZTJkyc3+LwvfelLdOzYkfXWW4/PfvazvP76642qaa+99qJbt2506tSJESNGLHP5d999NwceeCBrrrkma6+9NsOHD2/U8vUpGz+SJEmSJGWsY8eOdffbtWvH/Pnzm7yMiGjRZS+5vGUtXyvPxo8kSZIkSauYLl26MHfu3GU+XrhwIddeey0AV1xxBTvttFOLLRvglltu4e233+bDDz/khhtuYMiQIQ0ua5ddduGGG27gww8/ZO7cufzlL39pdB0qcYwfSZIkSZLaQGMuv95WRo8ezVFHHUWnTp247777GDNmDPvuuy8bbbQRd9xxB2uttRYPPvggP/3pT/nsZz/LxIkTAbj00ksBOOqoo5a57G7dujFkyBB69+7Nfvvtx9lnn027du3o168fo0ePZt1112Xw4MEcdNBBzJ49m0MPPbTB8X0A+vfvz8iRI+nXrx+f/exnGTRoUMu/GZmLlFKbrWzgwIFp6tSpbba+Ipk//rI2WU/7I8e0yXokSZIkScs3Y8YMevXqVekymqVz587MmzevVZY9YcIEpk6d2uBg0VqxhrariJiWUmqwe+apXpIkSZIkSZnyVC9JkiRJkrSY1jraB0qnmY0ePXqxaW+99RZDhw5d6rm33XYb3bp1a7VaVgU2fiRJkiRJUkV169aN2traSpeRJU/1kiRJkiRJypSNH0mSJEmSpEzZ+JEkSZIkScqUjR9JkiRJklYRs2bNonfv3pUuQ23IwZ0lSZIkSWoD88df1qLLa3/kmBZdnvLkET+SJEmSJGXqvPPOo3fv3vTu3Zvzzz9/sXnPPfcc2267LVOmTKlMcWoTHvEjSZIkSVKGpk2bxu9//3seeOABUkpst9127LrrrgA89dRTfP3rX2fChAn069evwpWqNTXqiJ+IWCciro2IJyNiRkTsEBGfiYhbImJm+d91W7tYSZIkSZLUOJMnT+bAAw9krbXWonPnzowYMYK7776bN954gwMOOIA//elPNn1WAY091esC4B8ppa2AfsAM4FTgtpTSFsBt5ceSJEmSJKnAunbtyqabbsrkyZMrXYrawAobPxHRFdgF+C1ASunjlNIc4ADg8vLTLge+0jolSpIkSZKkptp555254YYb+OCDD3j//fe5/vrr2XnnnVl99dW5/vrr+cMf/sAVV1xR6TLVyhozxs/mwBvA7yOiHzANOBFYP6X0avk5rwHrt06JkiRJkiSpqfr378/o0aMZPHgwAN/5zndYd93SKC1rrbUWf/3rX9lrr73o3Lkzw4cPr2SpakWRUlr+EyIGAvcDQ1JKD0TEBcB7wPEppXXqPe+dlNJS4/xExBhgDMCmm2464IUXXmjB8qtHS1+2b1m8nJ8kSZIkFcOMGTPo1atXpctQZhrariJiWkppYEPPb8wYP7OB2SmlB8qPrwX6A69HxIblFWwI/LuhF6eULkspDUwpDezevXsjY0iSJEmSJGllrbDxk1J6DXgpInqWJw0FngAmAYeXpx0O3NgqFUqSJEmSJKlZGjPGD8DxwJ8iYnXgOeBblJpGV0fEEcALwNdap0RJkiRJkiQ1R6MaPymlWqChc8WGtmg1kiRJkiRJajGNGeNHkiRJkiRJVcjGjyRJkiRJUqZs/EiSJEmSJGWqsYM7S5IkSZKklXFGtPDy0nJnz5kzhyuuuIJjjjmGWbNmsf/++/P444+3bA1t5Oyzz+b73/9+3eMdd9yRe++9t4IVrdidd97J6quvzo477ljROjziR5IkSZKkDM2ZM4dLLrmk0mW0iLPPPnuxx63Z9FmwYEGLLOfOO+8sRHPKxo8kSZIkSRk69dRTefbZZ6mpqeGkk06qmz59+nQGDx5MTU0Nffv2ZebMmUu9dsqUKey4447069ePwYMHM3fuXD766CO+9a1v0adPH7bddlvuuOMOACZMmMCIESPYd9992WKLLTj55JPrltO5c2d+8IMf0K9fP7bffntef/11AN544w0OOuggBg0axKBBg7jnnnsAmDdvXt06+vbty3XXXcepp57Khx9+SE1NDaNGjapbLkBKiZNOOonevXvTp08fJk6cCJSaLrvtthsHH3wwW221FaNGjSKlZR8h1aNHD0455RT69+/PNddcw80338wOO+xA//79+epXv8q8efPq3tOtt96avn378t///d/LzDJr1iwuvfRSfvGLX1BTU8Pdd9/dvB9iC/BUL0mSJEmSMjRu3Dgef/xxamtr6071Arj00ks58cQTGTVqFB9//PFSR7h8/PHHjBw5kokTJzJo0CDee+89OnXqxAUXXEBE8Nhjj/Hkk0+y99578/TTTwNQW1vLww8/TMeOHenZsyfHH388m2yyCe+//z7bb789Z511FieffDLjx4/ntNNO48QTT+S73/0uO+20Ey+++CL77LMPM2bM4Cc/+Qldu3blscceA+Cdd97hoIMO4qKLLqK2tnapjH/+85+pra3lkUce4c0332TQoEHssssuADz88MNMnz6djTbaiCFDhnDPPfew0047LfP96tatGw899BBvvvkmI0aM4NZbb2WttdbinHPO4bzzzuPYY4/l+uuv58knnyQimDNnDsAysxx11FF07ty5rkFUKTZ+JEmSJElaheywww6cddZZzJ49mxEjRrDFFlssNv+pp55iww03ZNCgQQCsvfbaAEyePJnjjz8egK222orNNtusrvEzdOhQunbtCsDWW2/NCy+8wCabbMLqq69e13AaMGAAt9xyCwC33norTzzxRN0633vvPebNm8ett97KVVddVTd93XXXXW6WyZMn841vfIN27dqx/vrrs+uuuzJlyhTWXnttBg8ezMYbbwxATU0Ns2bNWm7jZ+TIkQDcf//9PPHEEwwZMgQoNcJ22GEHunbtyhprrMERRxzB/vvvX5drWVmKwsaPJEmSJEmrkEMOOYTtttuOv/3tbwwbNoxf//rX7LHHHiu1zI4dO9bdb9euHfPnzwegQ4cORMRS0xcuXMj999/PGmussVLrbU5Ny7LWWmsBpdPH9tprL6688sqlnvPggw9y2223ce2113LRRRdx++23t0mWleEYP5IkSZIkZahLly7MnTt3qenPPfccn//85znhhBM44IADePTRRxeb37NnT1599VWmTJkCwNy5c5k/fz4777wzf/rTnwB4+umnefHFF+nZs2ezatt777258MIL6x4vOo1rr7324uKLL66b/s477wClBtInn3yy1HJ23nlnJk6cyIIFC3jjjTe46667GDx4cLNqWmT77bfnnnvu4ZlnngHg/fff5+mnn2bevHm8++67DBs2jF/84hc88sgjy82yrPe/rXnEjyRJkiRJbWEFl19vad26dWPIkCH07t2bXr161U2/+uqr+eMf/0iHDh3YYIMN6i6TPmzYMH7zm9+w0UYbMXHiRI4//ng+/PBDOnXqxK233soxxxzD0UcfTZ8+fWjfvj0TJkxY7KiapvjlL3/JscceS9++fZk/fz677LILl156KaeddhrHHnssvXv3pl27dpx++umMGDGCMWPG0LdvX/r371/XfAI48MADue++++jXrx8Rwc9+9jM22GADnnzyyWa/b927d2fChAl84xvf4D//+Q8AP/3pT+nSpQsHHHAAH330ESklzjvvvOVm+fKXv8zBBx/MjTfeyIUXXsjOO+/c7JpWRixvVOuWNnDgwDR16tQ2W1+RzB9/WZusp/2RY9pkPZIkSZKk5ZsxY8ZiDRepJTS0XUXEtJTSwIae76lekiRJkiRJmfJUL0mSJEmStEo48MADef755xebds4557DPPvtUqKLWZ+NHkiRJkiStEq6//vpKl9DmPNVLkiRJkiQpUzZ+JEmSJEmSMmXjR5IkSZIkKVM2fiRJkiRJkjLl4M6SJEmSJLWBY3cZ36LLu/iuI5c7f86cOVxxxRUcc8wxzJo1i/3335/HH3+8RWtoK2effTbf//736x7vuOOO3HvvvS22/PPPP58xY8aw5pprAjBs2DCuuOIK1llnnRZbR2MtmXVlecSPJEmSJEkZmjNnDpdcckmly2gRZ5999mKPW7LpA6XGzwcffFD3+KabbqpI0weWzrqybPxIkiRJkpShU089lWeffZaamhpOOumkuunTp09n8ODB1NTU0LdvX2bOnLnUa6dMmcKOO+5Iv379GDx4MHPnzuWjjz7iW9/6Fn369GHbbbfljjvuAGDChAmMGDGCfffdly222IKTTz65bjmdO3fmBz/4Af369WP77bfn9ddfB+CNN97goIMOYtCgQQwaNIh77rkHgHnz5tWto2/fvlx33XWceuqpfPjhh9TU1DBq1Ki65QKklDjppJPo3bs3ffr0YeLEiQDceeed7Lbbbhx88MFstdVWjBo1ipRSg+/TL3/5S1555RV23313dt99dwB69OjBm2++yaxZs9hqq60YPXo0W265JaNGjeLWW29lyJAhbLHFFjz44IMAvP/++3z7299m8ODBbLvtttx4440Ay33PjjvuuLoa9t9/f+68884Gs64sT/WSJEmSJClD48aN4/HHH6e2trbuVC+ASy+9lBNPPJFRo0bx8ccfs2DBgsVe9/HHHzNy5EgmTpzIoEGDeO+99+jUqRMXXHABEcFjjz3Gk08+yd57783TTz8NQG1tLQ8//DAdO3akZ8+eHH/88WyyySa8//77bL/99px11lmcfPLJjB8/ntNOO40TTzyR7373u+y00068+OKL7LPPPsyYMYOf/OQndO3alcceewyAd955h4MOOoiLLrqI2trapTL++c9/pra2lkceeYQ333yTQYMGscsuuwDw8MMPM336dDbaaCOGDBnCPffcw0477bTUMk444QTOO+887rjjDtZbb72l5j/zzDNcc801/O53v2PQoEFcccUVTJ48mUmTJnH22Wdzww03cNZZZ7HHHnvwu9/9jjlz5jB48GD23HNPLr300mW+Z8v6mS0ra3PZ+JEkSZIkaRWyww47cNZZZzF79mxGjBjBFltssdj8p556ig033JBBgwYBsPbaawMwefJkjj/+eAC22morNttss7omxtChQ+natSsAW2+9NS+88AKbbLIJq6++el3DacCAAdxyyy0A3HrrrTzxxBN163zvvfeYN28et956K1dddVXd9HXXXXe5WSZPnsw3vvEN2rVrx/rrr8+uu+7KlClTWHvttRk8eDAbb7wxADU1NcyaNavBxs+KbL755vTp0weAbbbZhqFDhxIR9OnTh1mzZgFw8803M2nSJM4991ygdKTPiy++uNz3rK3Y+JEkSZIkaRVyyCGHsN122/G3v/2NYcOG8etf/5o99thjpZbZsWPHuvvt2rVj/vz5AHTo0IGIWGr6woULuf/++1ljjTVWar3NqWlllrPaaqvVPV5ttdXqlplS4rrrrqNnz56NWmb79u1ZuHBh3eOPPvqoWbU1hmP8SJIkSZKUoS5dujB37tylpj/33HN8/vOf54QTTuCAAw7g0UcfXWx+z549efXVV5kyZQoAc+fOZf78+ey888786U9/AuDpp5/mxRdfbHSjY0l77703F154Yd3jRac27bXXXlx88cV109955x2g1ED65JNPllrOzjvvzMSJE1mwYAFvvPEGd911F4MHD25yPct6rxprn3324cILL6wbR+jhhx+uq6+h96xHjx7U1taycOFCXnrppbqxgmDZWZvLI34kSapCkw7p1errGH7FjFZfhyRJq5IVXX69pXXr1o0hQ4bQu3dvevX69LvD1VdfzR//+Ec6dOjABhtsUHfp8GHDhvGb3/yGjTbaiIkTJ3L88cfz4Ycf0qlTJ2699VaOOeYYjj76aPr06UP79u2ZMGHCYkfDNMUvf/lLjj32WPr27cv8+fPZZZdduPTSSznttNM49thj6d27N+3ateP0009nxIgRjBkzhr59+9K/f/+6RgrAgQceyH333Ue/fv2ICH72s5+xwQYb8OSTTzapnjFjxrDvvvuy0UYb1Q3A3BQ//OEPGTt2LH379mXhwoVsvvnm/PWvf13mezZkyBA233xztt56a3r16kX//v0Xq6WhrM0VyxrVujUMHDgwTZ06tc3WVyTzx1/WJutpf+SYNlmPJKmybPxIklR8M2bMWKzhIrWEhrariJiWUhrY0PM91UuSJEmSJClTnuolSZIk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\n", "text/plain": [ "<figure size with axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_blocking('AS25513', 'www.bbc.com')" ] }, { "cell_type": "code", "execution_count": 67, "id": "e7458162-6ae7-4c9c-b8a4-6529e1ff6be2", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border='\"1\"' class='\"dataframe\"'>\n", " <thead>\n", " <tr style='\"text-align:' right>\n", " <th></th>\n", " <th>input</th>\n", " <th>measurement_start_time</th>\n", " <th>probe_asn</th>\n", " <th>probe_cc</th>\n", " <th>probe_network_name</th>\n", " <th>report_id</th>\n", " <th>resolver_asn</th>\n", " <th>resolver_ip</th>\n", " <th>resolver_network_name</th>\n", " <th>software_name</th>\n", " <th>...</th>\n", " <th>control_measurement</th>\n", " <th>blocking</th>\n", " <th>http_experiment_failure</th>\n", " <th>dns_experiment_failure</th>\n", " <th>http_title</th>\n", " <th>http_meta_title</th>\n", " <th>http_body_md5</th>\n", " <th>tcp_connect</th>\n", " <th>domain</th>\n", " <th>blocking_recalc</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>1455010</th>\n", " <td>http://www.bbc.com/news</td>\n", " <td>2022-03-11 22:54:56</td>\n", " <td>AS25513</td>\n", " <td>RU</td>\n", " <td>PJSC Moscow city telephone network</td>\n", " <td>20220311T225300Z_webconnectivity_RU_25513_n1_C...</td>\n", " <td>AS25513</td>\n", " <td>94.29.125.114</td>\n", " <td>PJSC Moscow city telephone network</td>\n", " <td>ooniprobe-android</td>\n", " <td>...</td>\n", " <td>{'tcp_connect': {'151.101.12.81:80': {'status'...</td>\n", " <td>False</td>\n", " <td>None</td>\n", " <td>None</td>\n", " <td>MTC</td>\n", " <td>NaN</td>\n", " <td>a7bad4fa931d233f7e7145dcb6412434</td>\n", " <td>[{'ip': '151.101.12.81', 'port': 80, 'status':...</td>\n", " <td>www.bbc.com</td>\n", " <td>ok</td>\n", " </tr>\n", " <tr>\n", " <th>1465178</th>\n", " <td>http://www.bbc.com/news</td>\n", " <td>2022-03-11 02:32:21</td>\n", " <td>AS25513</td>\n", " <td>RU</td>\n", " <td>PJSC Moscow city telephone network</td>\n", " <td>20220311T021951Z_webconnectivity_RU_25513_n1_F...</td>\n", " <td>AS25513</td>\n", " <td>94.29.125.106</td>\n", " <td>PJSC Moscow city telephone network</td>\n", " <td>ooniprobe-desktop-unattended</td>\n", " <td>...</td>\n", " <td>{'tcp_connect': {'151.101.12.81:80': {'status'...</td>\n", " <td>False</td>\n", " <td>None</td>\n", " <td>None</td>\n", " <td>MTC</td>\n", " <td>NaN</td>\n", " <td>a7bad4fa931d233f7e7145dcb6412434</td>\n", " <td>[{'ip': '151.101.12.81', 'port': 80, 'status':...</td>\n", " <td>www.bbc.com</td>\n", " <td>ok</td>\n", " </tr>\n", " <tr>\n", " <th>1472180</th>\n", " <td>http://www.bbc.com/news</td>\n", " <td>2022-03-11 14:42:04</td>\n", " <td>AS25513</td>\n", " <td>RU</td>\n", " <td>PJSC Moscow city telephone network</td>\n", " <td>20220311T142131Z_webconnectivity_RU_25513_n1_n...</td>\n", " <td>AS59447</td>\n", " <td>45.136.153.146</td>\n", " <td>Istanbuldc Veri Merkezi Ltd Sti</td>\n", " <td>ooniprobe-desktop-unattended</td>\n", " <td>...</td>\n", " <td>{'tcp_connect': {'151.101.12.81:80': {'status'...</td>\n", " <td>False</td>\n", " <td>None</td>\n", " <td>None</td>\n", " <td>MTC</td>\n", " <td>NaN</td>\n", " <td>a7bad4fa931d233f7e7145dcb6412434</td>\n", " <td>[{'ip': '151.101.12.81', 'port': 80, 'status':...</td>\n", " <td>www.bbc.com</td>\n", " <td>ok</td>\n", " </tr>\n", " <tr>\n", " <th>1504898</th>\n", " <td>https://www.bbc.com/news/world-51235105</td>\n", " <td>2022-03-11 07:22:24</td>\n", " <td>AS25513</td>\n", " <td>RU</td>\n", " <td>PJSC Moscow city telephone network</td>\n", " <td>20220311T071246Z_webconnectivity_RU_25513_n1_A...</td>\n", " <td>AS15169</td>\n", " <td>172.217.37.140</td>\n", " <td>Google LLC</td>\n", " <td>ooniprobe-android</td>\n", " <td>...</td>\n", " <td>{'tcp_connect': {'151.101.84.81:443': {'status...</td>\n", " <td>False</td>\n", " <td>None</td>\n", " <td>None</td>\n", " <td>Covid map: Coronavirus cases, deaths, vaccinat...</td>\n", " <td>Covid map: Coronavirus cases, deaths, vaccinat...</td>\n", " <td>add8e023428a9d1b4816fb3bb2a238c7</td>\n", " <td>[{'ip': '151.101.84.81', 'port': 443, 'status'...</td>\n", " <td>www.bbc.com</td>\n", " <td>ok</td>\n", " </tr>\n", " <tr>\n", " <th>1528928</th>\n", " <td>http://www.bbc.com/news</td>\n", " <td>2022-03-11 08:52:32</td>\n", " <td>AS25513</td>\n", " <td>RU</td>\n", " <td>PJSC Moscow city telephone network</td>\n", " <td>20220311T082127Z_webconnectivity_RU_25513_n1_J...</td>\n", " <td>AS25513</td>\n", " <td>94.29.125.114</td>\n", " <td>PJSC Moscow city telephone network</td>\n", " <td>ooniprobe-desktop-unattended</td>\n", " <td>...</td>\n", " <td>{'tcp_connect': {'151.101.12.81:80': {'status'...</td>\n", " <td>False</td>\n", " <td>None</td>\n", " <td>None</td>\n", " <td>MTC</td>\n", " <td>NaN</td>\n", " <td>a7bad4fa931d233f7e7145dcb6412434</td>\n", " <td>[{'ip': '151.101.12.81', 'port': 80, 'status':...</td>\n", " <td>www.bbc.com</td>\n", " <td>ok</td>\n", " </tr>\n", " <tr>\n", " <th>1554661</th>\n", " <td>https://www.bbc.com/news/world-51235105</td>\n", " <td>2022-03-11 07:18:41</td>\n", " <td>AS25513</td>\n", " <td>RU</td>\n", " <td>PJSC Moscow city telephone network</td>\n", " <td>20220311T071719Z_webconnectivity_RU_25513_n1_3...</td>\n", " <td>AS198806</td>\n", " <td>91.239.98.96</td>\n", " <td>LLC SIBUR</td>\n", " <td>ooniprobe-desktop-unattended</td>\n", " <td>...</td>\n", " <td>{'tcp_connect': {'151.101.112.81:443': {'statu...</td>\n", " <td>False</td>\n", " <td>None</td>\n", " <td>None</td>\n", " <td>Covid map: Coronavirus cases, deaths, vaccinat...</td>\n", " <td>Covid map: Coronavirus cases, deaths, vaccinat...</td>\n", " <td>add8e023428a9d1b4816fb3bb2a238c7</td>\n", " <td>[{'ip': '151.101.112.81', 'port': 443, 'status...</td>\n", " <td>www.bbc.com</td>\n", " <td>ok</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "<p>6 rows × 30 columns</p>\n", "</div>" ], "text/plain": [ " input measurement_start_time \\\n", "1455010 http://www.bbc.com/news 2022-03-11 22:54:56 \n", "1465178 http://www.bbc.com/news 2022-03-11 02:32:21 \n", "1472180 http://www.bbc.com/news 2022-03-11 14:42:04 \n", "1504898 https://www.bbc.com/news/world-51235105 2022-03-11 07:22:24 \n", "1528928 http://www.bbc.com/news 2022-03-11 08:52:32 \n", "1554661 https://www.bbc.com/news/world-51235105 2022-03-11 07:18:41 \n", "\n", " probe_asn probe_cc probe_network_name \\\n", "1455010 AS25513 RU PJSC Moscow city telephone network \n", "1465178 AS25513 RU PJSC Moscow city telephone network \n", "1472180 AS25513 RU PJSC Moscow city telephone network \n", "1504898 AS25513 RU PJSC Moscow city telephone network \n", "1528928 AS25513 RU PJSC Moscow city telephone network \n", "1554661 AS25513 RU PJSC Moscow city telephone network \n", "\n", " report_id resolver_asn \\\n", "1455010 20220311T225300Z_webconnectivity_RU_25513_n1_C... AS25513 \n", "1465178 20220311T021951Z_webconnectivity_RU_25513_n1_F... AS25513 \n", "1472180 20220311T142131Z_webconnectivity_RU_25513_n1_n... AS59447 \n", "1504898 20220311T071246Z_webconnectivity_RU_25513_n1_A... AS15169 \n", "1528928 20220311T082127Z_webconnectivity_RU_25513_n1_J... AS25513 \n", "1554661 20220311T071719Z_webconnectivity_RU_25513_n1_3... AS198806 \n", "\n", " resolver_ip resolver_network_name \\\n", "1455010 94.29.125.114 PJSC Moscow city telephone network \n", "1465178 94.29.125.106 PJSC Moscow city telephone network \n", "1472180 45.136.153.146 Istanbuldc Veri Merkezi Ltd Sti \n", "1504898 172.217.37.140 Google LLC \n", "1528928 94.29.125.114 PJSC Moscow city telephone network \n", "1554661 91.239.98.96 LLC SIBUR \n", "\n", " software_name ... \\\n", "1455010 ooniprobe-android ... \n", "1465178 ooniprobe-desktop-unattended ... \n", "1472180 ooniprobe-desktop-unattended ... \n", "1504898 ooniprobe-android ... \n", "1528928 ooniprobe-desktop-unattended ... \n", "1554661 ooniprobe-desktop-unattended ... \n", "\n", " control_measurement blocking \\\n", "1455010 {'tcp_connect': {'151.101.12.81:80': {'status'... False \n", "1465178 {'tcp_connect': {'151.101.12.81:80': {'status'... False \n", "1472180 {'tcp_connect': {'151.101.12.81:80': {'status'... False \n", "1504898 {'tcp_connect': {'151.101.84.81:443': {'status... False \n", "1528928 {'tcp_connect': {'151.101.12.81:80': {'status'... False \n", "1554661 {'tcp_connect': {'151.101.112.81:443': {'statu... False \n", "\n", " http_experiment_failure dns_experiment_failure \\\n", "1455010 None None \n", "1465178 None None \n", "1472180 None None \n", "1504898 None None \n", "1528928 None None \n", "1554661 None None \n", "\n", " http_title \\\n", "1455010 MTC \n", "1465178 MTC \n", "1472180 MTC \n", "1504898 Covid map: Coronavirus cases, deaths, vaccinat... \n", "1528928 MTC \n", "1554661 Covid map: Coronavirus cases, deaths, vaccinat... \n", "\n", " http_meta_title \\\n", "1455010 NaN \n", "1465178 NaN \n", "1472180 NaN \n", "1504898 Covid map: Coronavirus cases, deaths, vaccinat... \n", "1528928 NaN \n", "1554661 Covid map: Coronavirus cases, deaths, vaccinat... \n", "\n", " http_body_md5 \\\n", "1455010 a7bad4fa931d233f7e7145dcb6412434 \n", "1465178 a7bad4fa931d233f7e7145dcb6412434 \n", "1472180 a7bad4fa931d233f7e7145dcb6412434 \n", "1504898 add8e023428a9d1b4816fb3bb2a238c7 \n", "1528928 a7bad4fa931d233f7e7145dcb6412434 \n", "1554661 add8e023428a9d1b4816fb3bb2a238c7 \n", "\n", " tcp_connect domain \\\n", "1455010 [{'ip': '151.101.12.81', 'port': 80, 'status':... www.bbc.com \n", "1465178 [{'ip': '151.101.12.81', 'port': 80, 'status':... www.bbc.com \n", "1472180 [{'ip': '151.101.12.81', 'port': 80, 'status':... www.bbc.com \n", "1504898 [{'ip': '151.101.84.81', 'port': 443, 'status'... www.bbc.com \n", "1528928 [{'ip': '151.101.12.81', 'port': 80, 'status':... www.bbc.com \n", "1554661 [{'ip': '151.101.112.81', 'port': 443, 'status... www.bbc.com \n", "\n", " blocking_recalc \n", "1455010 ok \n", "1465178 ok \n", "1472180 ok \n", "1504898 ok \n", "1528928 ok \n", "1554661 ok \n", "\n", "[6 rows x 30 columns]" ] }, "execution_count": 67, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ru[\n", " (df_ru['probe_asn'] == 'AS25513')\n", " & (df_ru['blocking_recalc'] == 'ok')\n", " & (df_ru['measurement_start_time'].str.startswith('2022-03-11'))\n", " & (df_ru['domain'] == 'www.bbc.com')\n", "]" ] }, { "cell_type": "code", "execution_count": 71, "id": "afbe8d73-c0d2-41f2-9d86-a4fec0ad4e10", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1455010 ['151.101.12.81']\n", "1465178 ['151.101.12.81']\n", "1472180 ['151.101.12.81']\n", "1504898 ['151.101.84.81']\n", "1528928 ['151.101.12.81']\n", "1554661 ['151.101.112.81']\n", "Name: dns_resolved_ips, dtype: object" ] }, "execution_count": 71, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ru[\n", " (df_ru['probe_asn'] == 'AS25513')\n", " & (df_ru['blocking_recalc'] == 'ok')\n", " & (df_ru['measurement_start_time'].str.startswith('2022-03-11'))\n", " & (df_ru['domain'] == 'www.bbc.com')\n", "]['dns_resolved_ips']" ] }, { "cell_type": "markdown", "id": "61910088-73b5-44cb-aef3-49c8a50296d3", "metadata": {}, "source": [ "In two of the OK measurements, it looks like there are different IP addresses returned in the DNS query. Let's inspect the measurement to see if it's a false negative." ] }, { "cell_type": "code", "execution_count": 70, "id": "b7ac9b57-c898-4158-bd39-89ab609b6534", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "https://explorer.ooni.org/measurement/20220311T071246Z_webconnectivity_RU_25513_n1_A6Ux9DxJ1CkxiLNB?input=https%3A%2F%2Fwww.bbc.com%2Fnews%2Fworld-51235105\n" ] } ], "source": [ "print_explorer_url(df_ru.iloc[1504898])" ] }, { "cell_type": "markdown", "id": "bc2ef1a6-2fbe-458f-9fd1-caa8b657976a", "metadata": {}, "source": [ "Nope, it doesn't look like it. When looking at the blocked metrics, we can see that the IP used is always the \"151.101.12.81\" one. This means it's quite likely that the blocking by closing the connection through a RST packet is also matching on the endpoint." ] }, { "cell_type": "code", "execution_count": 74, "id": "59d390c0-a5d4-41b4-aeff-e6aed709340f", "metadata": {}, "outputs": [ { "data": { "text/plain": [ "1435961 ['151.101.12.81']\n", "1438061 ['151.101.0.81', '151.101.64.81', '151.101.128...\n", "1471678 ['151.101.12.81']\n", "1499181 ['151.101.12.81']\n", "1501909 ['151.101.12.81']\n", "1531316 ['151.101.12.81']\n", "Name: dns_resolved_ips, dtype: object" ] }, "execution_count": 74, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ru[\n", " (df_ru['probe_asn'] == 'AS25513')\n", " & (df_ru['blocking_recalc'] != 'ok')\n", " & (df_ru['measurement_start_time'].str.startswith('2022-03-11'))\n", " & (df_ru['domain'] == 'www.bbc.com')\n", "]['dns_resolved_ips']" ] }, { "cell_type": "markdown", "id": "4f3f393b-78a1-4686-9464-e0ff1caf0f91", "metadata": {}, "source": [ "Let's look at the other potentially false negative measurements" ] }, { "cell_type": "code", "execution_count": 75, "id": "ee90cf2c-5c35-4391-a494-b368368ed4b4", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "https://explorer.ooni.org/measurement/20220311T021951Z_webconnectivity_RU_25513_n1_FXsCAbJpZ0dAibqR?input=http%3A%2F%2Fwww.bbc.com%2Fnews\n" ] } ], "source": [ "print_explorer_url(df_ru.iloc[1465178])" ] }, { "cell_type": "markdown", "id": "9164d6d5-f955-4368-bbd4-086a7b3450cb", "metadata": {}, "source": [ "This looks like an actual false negative, which is caused by our blockpage detection heuristics not being good enough.\n", "\n", "Let's add this fingerprint to our fingerprint DB and re-annotate the measurements." ] }, { "cell_type": "code", "execution_count": 80, "id": "7b9b9880-5987-4a1f-b4fe-873900ccef91", "metadata": {}, "outputs": [ { "data": { "text/html": [ "<div>\n", "<style scoped>\n", " .dataframe tbody tr th:only-of-type {\n", " vertical-align: middle;\n", " }\n", "\n", " .dataframe tbody tr th {\n", " vertical-align: top;\n", " }\n", "\n", " .dataframe thead th {\n", " text-align: right;\n", " }\n", "</style>\n", "<table border='\"1\"' class='\"dataframe\"'>\n", " <thead>\n", " <tr style='\"text-align:' right>\n", " <th></th>\n", " <th>http_title</th>\n", " <th>http_body_md5</th>\n", " </tr>\n", " </thead>\n", " <tbody>\n", " <tr>\n", " <th>1455010</th>\n", " <td>MTC</td>\n", " <td>a7bad4fa931d233f7e7145dcb6412434</td>\n", " </tr>\n", " <tr>\n", " <th>1465178</th>\n", " <td>MTC</td>\n", " <td>a7bad4fa931d233f7e7145dcb6412434</td>\n", " </tr>\n", " <tr>\n", " <th>1472180</th>\n", " <td>MTC</td>\n", " <td>a7bad4fa931d233f7e7145dcb6412434</td>\n", " </tr>\n", " <tr>\n", " <th>1504898</th>\n", " <td>Covid map: Coronavirus cases, deaths, vaccinat...</td>\n", " <td>add8e023428a9d1b4816fb3bb2a238c7</td>\n", " </tr>\n", " <tr>\n", " <th>1528928</th>\n", " <td>MTC</td>\n", " <td>a7bad4fa931d233f7e7145dcb6412434</td>\n", " </tr>\n", " <tr>\n", " <th>1554661</th>\n", " <td>Covid map: Coronavirus cases, deaths, vaccinat...</td>\n", " <td>add8e023428a9d1b4816fb3bb2a238c7</td>\n", " </tr>\n", " </tbody>\n", "</table>\n", "</div>" ], "text/plain": [ " http_title \\\n", "1455010 MTC \n", "1465178 MTC \n", "1472180 MTC \n", "1504898 Covid map: Coronavirus cases, deaths, vaccinat... \n", "1528928 MTC \n", "1554661 Covid map: Coronavirus cases, deaths, vaccinat... \n", "\n", " http_body_md5 \n", "1455010 a7bad4fa931d233f7e7145dcb6412434 \n", "1465178 a7bad4fa931d233f7e7145dcb6412434 \n", "1472180 a7bad4fa931d233f7e7145dcb6412434 \n", "1504898 add8e023428a9d1b4816fb3bb2a238c7 \n", "1528928 a7bad4fa931d233f7e7145dcb6412434 \n", "1554661 add8e023428a9d1b4816fb3bb2a238c7 " ] }, "execution_count": 80, "metadata": {}, "output_type": "execute_result" } ], "source": [ "df_ru[\n", " (df_ru['probe_asn'] == 'AS25513')\n", " & (df_ru['blocking_recalc'] == 'ok')\n", " & (df_ru['measurement_start_time'].str.startswith('2022-03-11'))\n", " & (df_ru['domain'] == 'www.bbc.com')\n", "][['http_title', 'http_body_md5']]" ] }, { "cell_type": "code", "execution_count": 81, "id": "172ee8d5-b718-44b7-aa66-5ebe5d45ffc8", "metadata": {}, "outputs": [], "source": [ "df_ru.loc[(df_ru['http_body_md5'] == 'a7bad4fa931d233f7e7145dcb6412434'), 'blocking_recalc'] = 'http.confirmed'" ] }, { "cell_type": "code", "execution_count": 82, "id": "c85cb3bc-eead-441b-98c5-27e1427c3dec", "metadata": {}, "outputs": [ { "data": { "image/png": "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tX76X/7yF/r160efPn3Ya69lL/J9xRVXcMABBzB//nxGjx7N9ddfD0D37t0588wz6devH7169eLZZ58FYPbs2eyzzz7suOOOfO1rX2PrrbfmzTffbLTmmTNn0qNHD4466ihqamp49dVX+fGPf8zAgQPp3bs3Z555Zv1zf/e739G7d2/69OnDl770JQBuu+02dtppJ/r27cvee+/NG2+8scw63njjDQ455BD69OlDnz59eOihh5r4zhaTjR9JkiRJktYgzz33HMcddxzTp09n/fXX59JLL62f9/rrr3Pqqadyzz33UFdXx+TJk7n55puZPXs2X//617nhhht44oknuO6665ZY5iWXXMIf//hHbr75Zjp16rTMOjfaaCMee+wxjj322PpTw84++2z23HNPpk2bxmGHHcYrr7yywrpnzJjBcccdx7Rp03juueeYMWMGjz76KHV1dUydOpX777+fadOm8cMf/pB77rmHJ554gosuugiAXXfdlUceeYTHH3+cL37xi/zoRz9aZvknnngiu+++O0888QSPPfYYO+64Y5Pf2yLyVC9JkiRJktYgW265JUOGDAHgyCOP5Gc/+1n9vMmTJzNs2DA23nhjAEaNGsX9999P+/bt2W233dhmm20A+NjHPlb/mt/97ndsueWW3HzzzXTs2LHRdY4YMQKA/v37c+ONNwIwadIkbrrpJgD2339/NtxwwxXWvfXWWzN48GAA7rjjDu644w769u0LwLx585gxYwZPPPEEn//859loo42WqHPWrFmMHDmSf/zjH3zwwQf1ORq65557+N3vfgdA+/bt6dq16wrrqRYe8SNJkiRJ0hpk6UuCr+4l53v16sXMmTOZNWvWcp+z9tprA6WGyoIFC5q1nvXWW6/+fkqJ73znO9TV1VFXV8cLL7zAV7/61eW+9oQTTuAb3/gGTz31FL/85S95//33m1VDNbLxI0mSJEnSGuSVV17h4YcfBuCqq65i1113rZ83aNAg7rvvPt58800WLlzI1Vdfze67787gwYO5//77+fvf/w7Av//97/rX9O3bl1/+8pccdNBBvP7666tcx5AhQ7j22muB0hE8b7/99iq/dr/99uM3v/kN8+bNA+C1117jX//6F3vuuSfXXXcdb7311hJ1vvPOO3ziE58A4Morr2x0mXvttRe/+MUvAFi4cCHvvPPOKtdTZDZ+JEmSJElag/To0YOf//zn9OzZk7fffptjjz22ft5mm23GuHHj2GOPPejTpw/9+/fn4IMPZuONN+byyy9nxIgR9OnTh5EjRy6xzF133ZULLriAz3zmM8sdoHlpZ555JnfccQc1NTVcd911bLrppnTp0mWVXrvvvvtyxBFHsPPOO9OrVy8OO+ww5s6dy4477sj3vvc9dt99d/r06cO3vvUtoHTZ+c9//vP079+//jSwpV100UVMnDiRXr160b9/f5555plVqqXoIqXUZisbMGBAmjJlSputT5IkSZKkSpk+fTo9e/asdBmF9d///pf27dvToUMHHn74YY499ljq6uoqXVbhNbZdRcTUlNKAxp7v4M6SJEmSJKnNvfLKK3zhC19g0aJFrLXWWlxxxRWVLilLNn4kSZIkSVKb23bbbXn88ceXmPbWW2+x1157LfPcu+++m27durVVaVmx8dNGFt07tk3W027YhW2yHkmSJEmSWlq3bt083auFObizJEmSJElSpmz8SJIkSZIkZcrGjyRJkiRJUqZs/EiSJEmStAY466yzuOCCC1ZrGV/72td45plnWqiiprv11lsZN27ccufX1dVx++23r9Y6zjvvvNV6fdE4uLMkSZIkSW3g6sdntejyDu+7RYsub1X86le/avN1NnTQQQdx0EEHLXd+XV0dU6ZMYfjw4c1ex3nnncd3v/vdZr++aDziR5IkSZKkTJ177rlst9127Lrrrjz33HMADBs2jFNPPZVBgwax3Xbb8cADDwAwbdo0Bg0aRG1tLb1792bGjBnLLG/YsGFMmTIFgM6dO/O9732PPn36MHjwYN544w0A3njjDQ455BD69OlDnz59eOihhwD4yU9+Qk1NDTU1NVx44YUAzJw5k549e/L1r3+dHXfckX333Zf58+cD8LOf/YwddtiB3r1788UvfhGA8ePH841vfAOA6667jpqaGvr06cNuu+3GBx98wBlnnMGECROora1lwoQJvPvuu3zlK19h0KBB9O3bl1tuuaV+OSNGjGD//fdn22235ZRTTgHgtNNOY/78+dTW1jJq1KgW/3lUgkf8SJIkSZKUoalTp3LNNddQV1fHggUL6NevH/379wdgwYIFPProo9x+++2cffbZ3HXXXVx22WWcdNJJjBo1ig8++ICFCxeucPnvvvsugwcP5txzz+WUU07hiiuu4PTTT+fEE09k991356abbmLhwoXMmzePqVOn8tvf/pa//e1vpJTYaaed2H333dlwww2ZMWMGV199NVdccQVf+MIXuOGGGzjyyCMZN24cf//731l77bWZM2fOMus/55xz+Otf/8onPvEJ5syZw1prrcU555zDlClTuOSSSwD47ne/y5577slvfvMb5syZw6BBg9h7772B0tFBjz/+OGuvvTY9evTghBNOYNy4cVxyySVZXVLeI34kSZIkScrQAw88wCGHHMK6667L+uuvv8QpUiNGjACgf//+zJw5E4Cdd96Z8847j/PPP5+XX36ZTp06rXD5a621FgceeOAyy7nnnns49thjAWjfvj1du3Zl0qRJHHLIIay33np07tyZESNG1B9ptM0221BbW7vMcnr37s2oUaP4v//7Pzp0WPa4lSFDhjB69GiuuOKK5Tap7rjjDsaNG0dtbS3Dhg3j/fff55VXXgFgr732omvXrqyzzjrssMMOvPzyyyt5R6uTjR9JkiRJktYwa6+9NlBqzCxYsACAI444gltvvZVOnToxfPhw7rnnnhUuo2PHjkTEMstpbi1LL+dPf/oTxx9/PI899hgDBw5cZvmXXXYZP/zhD3n11Vfp378/b7311jLLTilxww03UFdXR11dHa+88go9e/Zc4XpzY+NHkiRJkqQM7bbbbtx8883Mnz+fuXPnctttt63w+S+99BKf/OQnOfHEEzn44IN58sknm7Xevfbai1/84hcALFy4kHfeeYehQ4dy880389577/Huu+9y0003MXTo0OUuY9GiRbz66qvssccenH/++bzzzjvMmzdviee8+OKL7LTTTpxzzjlsvPHGvPrqq3Tp0oW5c+fWP2e//fbj4osvJqUEwOOPP77S+jt27MiHH37YnOiFZONHkiRJkqQM9evXj5EjR9KnTx8OOOAABg4cuMLnX3vttdTU1FBbW8vTTz/NUUcdBcDw4cN5/fXXV3m9F110ERMnTqRXr17079+fZ555hn79+jF69GgGDRrETjvtxNe+9jX69u273GUsXLiQI488kl69etG3b19OPPFENthggyWec/LJJ9OrVy9qamrYZZdd6NOnD3vssQfPPPNM/eDO3//+9/nwww/p3bs3O+64I9///vdXWv+YMWPqTzPLQSzuerWFAQMGpMWjf69pFt07tk3W027YhW2yHkmSJEnSik2fPr3+tCKppTS2XUXE1JTSgMae7xE/kiRJkiRJmbLxI0mSJEmSlCkbP5IkSZIkSZmy8SNJkiRJkpQpGz+SJEmSJEmZsvEjSZIkSZKUKRs/kiRJkiRlaubMmdTU1Cwzffz48bz++uv1jy+88ELee++9tiyt3uzZs9lpp53o27cvDzzwAMOHD2fOnDmtvt5hw4YxZcqUVl9PpXWodAGSJEmSJK0Jbpv54xZd3me7n9zs144fP56amho233xzoNT4OfLII1l33XVbqrxVdvfdd9OrVy9+9atfATB06NBlnpNSIqVEu3Yev9JUvmOSJEmSJGVs4cKFfP3rX2fHHXdk33335fe//z1Tpkxh1KhR1NbWctFFF/H666+zxx57sMceewDQuXNnvvnNb7Ljjjuy1157MXv27GWWO2/ePL785S/Tq1cvevfuzQ033ADA1VdfTa9evaipqeHUU0+tf37nzp353ve+R58+fRg8eDBvvPEGdXV1nHLKKdxyyy3U1tYyf/58unfvzptvvsnMmTPp0aMHRx11FDU1NTzwwANsv/32jB49mu22245Ro0Zx1113MWTIELbddlseffRRAN59912+8pWvMGjQIPr27cstt9wCwPz58/niF79Iz549OeSQQ5g/f35rv/WFYONHkiRJkqSMzZgxg+OPP55p06axwQYbEBEMGDCAP/zhD9TV1XHSSSex+eabM3HiRCZOnAiUmicDBgxg2rRp7L777px99tnLLPcHP/gBXbt25amnnuLJJ59kzz335PXXX+fUU0/lnnvuoa6ujsmTJ3PzzTfXL3Pw4ME88cQT7LbbblxxxRXU1tZyzjnnMHLkSOrq6ujUqdMytR933HFMmzaNrbfemhdeeIH/+Z//4dlnn+XZZ5/lqquuYtKkSVxwwQWcd955AJx77rnsueeePProo0ycOJGTTz6Zd999l1/84hesu+66TJ8+nbPPPpupU6e27htfEDZ+JEmSJEnK2DbbbENtbS0A/fv3Z+bMmSt9Tbt27Rg5ciQARx55JJMmTVrmOXfddRfHH398/eMNN9yQyZMnM2zYMDbeeGM6dOjAqFGjuP/++wFYa621OPDAA5tUx9Zbb83gwYOXyNKrVy/atWtXfzRSRNCrV6/65d1xxx2MGzeO2tpahg0bxvvvv88rr7zC/fffz5FHHglA79696d2790rXnwPH+JEkSZIkKWNrr712/f327ds36xSniFjtOjp27Fi/nPbt27NgwYKVvma99dZb4nHDLO3atat/3K5du/rlpZS44YYb6NGjx2rXnAOP+JEkSZIkaQ3TpUsX5s6du9zHixYt4vrrrwfgqquuYtddd11mGfvssw8///nP6x+//fbbDBo0iPvuu48333yThQsXcvXVV7P77ru3YpJl7bffflx88cWklAB4/PHHAdhtt9246qqrAHj66ad58skn27SuSrHxI0mSJEnSGmb06NEcc8wx9QMqjxkzhv33379+cOf11luPRx99lJqaGu655x7OOOMMAC677DIuu+wyAE4//XTefvttampq6NOnDxMnTmSzzTZj3Lhx7LHHHvTp04f+/ftz8MEHt2m273//+3z44Yf07t2bHXfcke9///sAHHvsscybN4+ePXtyxhln0L9//zatq1JicQesLQwYMCBNmTKlzdZXJIvuHdsm62k37MI2WY8kSZIkacWmT59Oz549K11Gs3Tu3Jl58+ZVugw1orHtKiKmppQGNPZ8j/iRJEmSJEnKlI0fSZIkSZK0BI/2yYeNH0mSJEmSpEzZ+JEkSZIkScqUjR9JkiRJkqRM2fiRJEmSJEnKlI0fSZIkSZKkTHWodAGSJEmSJK0JFlxxeYsur8PXx6z0OTNnzuTAAw/k6aefXmL6+PHj2Xfffdl8880BuPDCCxkzZgzrrrvuKq//rLPOonPnznz7299eYvqcOXO46qqrOO644+preOihhzjiiCNWedmrss4zzjiD3Xbbjb333psHHniAY445ho4dO/Lwww9zxhlncPvttzN8+HB+/OMfr/Z6q5lH/EiSJEmStIYZP348r7/+ev3jCy+8kPfee69Flj1nzhwuvfTS+sczZ87kqquuapFlN3TOOeew9957A/CHP/yB73znO9TV1dGpUycuv/xynnzyyTW+6QMe8SNJkiRJUtYWLlzI17/+dR566CE+8YlP8KUvfYkpU6YwatQoOnXqxJe//GVef/119thjDzbaaCMmTpxI586d+frXv84dd9zBpptuyjXXXMPGG2+8zLKfeeYZhg0bxiuvvMLYsWM58cQTOe2003jxxRepra1ln3324YEHHmD69OnU1tZy9NFHs+GGG3LTTTfxzjvv8Nprr3HkkUdy5plnLrf+c889lyuvvJKPf/zjbLnllvTv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J59MTU0NvXr1YsKECUCp6TJs2DAOO+wwtt9+e0aNGkVKabnvVffu3Tn11FPp168f1113HXfccQc777wz/fr14/Of/zzz5s2rf0932GEHevfuzbe//e3lZpk5cyaXXXYZP/3pT6mtreWBBx5o3g+xBXiqlyRJkiRJGRo3bhxPP/00dXV19ad6AVx22WWcdNJJjBo1ig8++GCZI1w++OADRo4cyYQJExg4cCD/+c9/6NSpExdddBERwVNPPcWzzz7Lvvvuy/PPPw9AXV0djz/+OGuvvTY9evTghBNOYMstt+Tdd99l8ODBnHvuuZxyyilcccUVnH766Zx00kl885vfZNddd+WVV15hv/32Y/r06fzgBz+ga9euPPXUUwC8/fbbHHrooVxyySXU1dUtk/HGG2+krq6OJ554gjfffJOBAwey2267AfD4448zbdo0Nt98c4YMGcKDDz7Irrvuutz3q1u3bjz22GO8+eabjBgxgrvuuov11luP888/n5/85Cccf/zx3HTTTTz77LNEBHPmzAFYbpZjjjmGzp071zeIKsXGjyRJkiRJa5Cdd96Zc889l1mzZjFixAi23XbbJeY/99xzbLbZZgwcOBCA9ddfH4BJkyZxwgknALD99tuz9dZb1zd+9tprL7p27QrADjvswMsvv8yWW27JWmutVd9w6t+/P3feeScAd911F88880z9Ov/zn/8wb9487rrrLq655pr66RtuuOEKs0yaNInDDz+c9u3bs8kmm7D77rszefJk1l9/fQYNGsQWW2wBQG1tLTNnzlxh42fkyJEAPPLIIzzzzDMMGTIEKDXCdt55Z7p27co666zDV7/6VQ488MD6XMvLUhQ2fiRJkiRJWoMcccQR7LTTTvzpT39i+PDh/PKXv2TPPfdcrWWuvfba9ffbt2/PggULAOjYsSMRscz0RYsW8cgjj7DOOuus1nqbU9PyrLfeekDp9LF99tmHq6++epnnPProo9x9991cf/31XHLJJdxzzz1tkmV1OMaPJEmSJEkZ6tKlC3Pnzl1m+ksvvcQnP/lJTjzxRA4++GCefPLJJeb36NGDf/zjH0yePBmAuXPnsmDBAoYOHcof/vAHAJ5//nleeeUVevTo0aza9t13Xy6++OL6x4tP49pnn334+c9/Xj/97bffBkoNpA8//HCZ5QwdOpQJEyawcOFCZs+ezf3338+gQYOaVdNigwcP5sEHH+SFF14A4N133+X5559n3rx5vPPOOwwfPpyf/vSnPPHEEyvMsrz3v615xI8kSZIkSW1gZZdfb2ndunVjyJAh1NTU0LPnR+u+9tpr+f3vf0/Hjh3ZdNNN6y+TPnz4cH71q1+x+eabM2HCBE444QTmz59Pp06duOuuuzjuuOM49thj6dWrFx06dGD8+PFLHFXTFD/72c84/vjj6d27NwsWLGC33Xbjsssu4/TTT+f444+npqaG9u3bc+aZZzJixAjGjBlD79696devX33zCeCQQw7h4Ycfpk+fPkQEP/rRj9h000159tlnm/2+bbzxxowfP57DDz+c//73vwD88Ic/pEuXLhx88MG8//77pJT4yU9+ssIsn/3sZznssMO45ZZbuPjiixk6dGiza1odsaJRrVvagAED0pQpU9psfUWy6N6xbbKedsMubJP1SJIq69YjWv+L40FXTW/1dUiSlLPp06cv0XCRWkJj21VETE0pDWjs+Z7qJUmSJEmSlClP9ZIkSZIkSWuEQw45hL///e9LTDv//PPZb7/9KlRR67PxI0mSJEmS1gg33XRTpUtoc57qJUmSJEmSlCkbP5IkSZIkSZmy8SNJkiRJkpQpGz+SJEmSJEmZsvEjSZIkSVKbuLyFbys2Z84cLr30UgBmzpxJTU1Ni6ZpS+edd94Sj3fZZZcWXf6FF17Ie++9V/94+PDhzJkzp0XXsaqWzrq6bPxIkiRJkpShho2fard0M+Shhx5q0eUv3fi5/fbb2WCDDVp0HavKxo8kSZIkSVqp0047jRdffJHa2lpOPvnk+unTpk1j0KBB1NbW0rt3b2bMmLHMaydPnswuu+xCnz59GDRoEHPnzuX999/ny1/+Mr169aJv375MnDgRgPHjxzNixAj2339/tt12W0455ZT65XTu3Jnvfe979OnTh8GDB/PGG28AMHv2bA499FAGDhzIwIEDefDBBwGYN29e/Tp69+7NDTfcwGmnncb8+fOpra1l1KhR9csFSClx8sknU1NTQ69evZgwYQIA9957L8OGDeOwww5j++23Z9SoUaSUGn2ffvazn/H666+zxx57sMceewDQvXt33nzzTWbOnMn222/P6NGj2W677Rg1ahR33XUXQ4YMYdttt+XRRx8F4N133+UrX/kKgwYNom/fvtxyyy0AK3zPvvGNb9TXcOCBB3Lvvfc2mnV1dWiRpUiSJEmSpEIZN24cTz/9NHV1dcycOZMDDzwQgMsuu4yTTjqJUaNG8cEHH7Bw4cIlXvfBBx8wcuRIJkyYwMCBA/nPf/5Dp06duOiii4gInnrqKZ599ln23Xdfnn/+eQDq6up4/PHHWXvttenRowcnnHACW265Je+++y6DBw/m3HPP5ZRTTuGKK67g9NNP56STTuKb3/wmu+66K6+88gr77bcf06dP5wc/+AFdu3blqaeeAuDtt9/m0EMP5ZJLLqGurm6ZjDfeeCN1dXU88cQTvPnmmwwcOJDddtsNgMcff5xp06ax+eabM2TIEB588EF23XXXZZZx4okn8pOf/ISJEyey0UYbLTP/hRde4LrrruM3v/kNAwcO5KqrrmLSpEnceuutnHfeedx8882ce+657LnnnvzmN79hzpw5DBo0iL333pvLLrtsue/Z8n5my8vaXDZ+JEmSJElag+y8886ce+65zJo1ixEjRrDtttsuMf+5555js802Y+DAgQCsv/76AEyaNIkTTjgBgO23356tt966vomx11570bVrVwB22GEHXn75ZbbcckvWWmut+oZT//79ufPOOwG46667eOaZZ+rX+Z///Id58+Zx1113cc0119RP33DDDVeYZdKkSRx++OG0b9+eTTbZhN13353Jkyez/vrrM2jQILbYYgsAamtrmTlzZqONn5XZZptt6NWrFwA77rgje+21FxFBr169mDlzJgB33HEHt956KxdccAFQOtLnlVdeWeF71lZs/EiSJEmStAY54ogj2GmnnfjTn/7E8OHD+eUvf8mee+65Wstce+216++3b9+eBQsWANCxY0ciYpnpixYt4pFHHmGdddZZrfU2p6bVWU67du3qH7dr165+mSklbrjhBnr06LFKy+zQoQOLFi2qf/z+++83q7ZV4Rg/kiRJkiRlqEuXLsydO3eZ6S+99BKf/OQnOfHEEzn44IN58sknl5jfo0cP/vGPfzB58mQA5s6dy4IFCxg6dCh/+MMfAHj++ed55ZVXVrnRsbR9992Xiy++uP7x4lOb9tlnH37+85/XT3/77beBUgPpww8/XGY5Q4cOZcKECSxcuJDZs2dz//33M2jQoCbXs7z3alXtt99+XHzxxfXjCD3++OP19TX2nnXv3p26ujoWLVrEq6++Wj9WECw/a3N5xI8kSZIkSW1iTJuurVu3bgwZMoSamhp69uxZP/3aa6/l97//PR07dmTTTTflu9/9LlC6hPmvfvUrNt98cyZMmMAJJ5zA/Pnz6dSpE3fddRfHHXccxx57LL169aJDhw6MHz9+iaNhmuJnP/sZxx9/PL1792bBggXstttuXHbZZZx++ukcf/zx1NTU0L59e84880xGjBjBmDFj6N27N/369atvpAAccsghPPzww/Tp04eI4Ec/+hGbbropzz77bJPqGTNmDPvvvz+bb755/QDMTfH973+fsWPH0rt3bxYtWsQ222zDH//4x+W+Z0OGDGGbbbZhhx12oGfPnvTr12+JWhrL2lyxvFGtW8OAAQPSlClT2mx9RbLo3rFtsp52wy5sk/VIkirr1iN6rvxJq+mgq6a3+jokScrZ9OnTl2i4SC2hse0qIqamlAY09nxP9ZIkSZIkScqUp3pJkiRJkqQ1wiGHHMLf//73Jaadf/757LfffhWqqPXZ+JEkSZIkSWuEm266qdIltDlP9ZIkSZIkScqUjR9JkiRJkqRM2fiRJEmSJEnKlI0fSZIkSZIyNGfOHC699FIAZs6cSU1NTYsu//XXX+ewww4DoK6ujttvv71Fl6+W4eDOkiRJkiS1gVuP6NmiyzvoqukrnL+48XPccce16HoX23zzzbn++uuBUuNnypQpDB8+vFXWpebziB9JkiRJkjJ02mmn8eKLL1JbW8vJJ59cP33atGkMGjSI2tpaevfuzYwZM5Z5bffu3fnOd75DbW0tAwYM4LHHHmO//fbjU5/6FJdddhnw0VFEH3zwAWeccQYTJkygtraWCRMmcNZZZ3H00UczdOhQtt56a2688UZOOeUUevXqxf7778+HH37YZu/Dms7GjyRJkiRJGRo3bhyf+tSnqKur48c//nH99Msuu4yTTjqp/iidLbbYotHXb7XVVtTV1TF06FBGjx7N9ddfzyOPPMKZZ565xPPWWmstzjnnHEaOHEldXR0jR44E4MUXX+See+7h1ltv5cgjj2SPPfbgqaeeolOnTvzpT39qveBawiqd6hURM4G5wEJgQUppQER8DJgAdAdmAl9IKb3dOmVKkiRJkqSWsPPOO3Puuecya9YsRowYwbbbbtvo8w466CAAevXqxbx58+jSpQtdunRh7bXXZs6cOStdzwEHHEDHjh3p1asXCxcuZP/9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\n", "text/plain": [ "<figure size with axes>" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "plot_blocking('AS25513', 'www.bbc.com')" ] }, { "cell_type": "code", "execution_count": 96, "id": "b3c2abf1-c2ea-4529-8468-64eea1e83b63", "metadata": {}, "outputs": [], "source": [ "data_export = df_ru[\n", " df_ru['domain'].isin(relevant_domains)\n", "][['domain', 'measurement_start_time', 'probe_asn', 'report_id', 'blocking_recalc']]" ] }, { "cell_type": "code", "execution_count": 97, "id": "126aada6-c358-433c-92b9-a63c23c11a0c", "metadata": {}, "outputs": [], "source": [ "data_export['count'] = 1" ] }, { "cell_type": "markdown", "id": "ef704969-9aba-41e9-ad70-4b59c52a51dc", "metadata": {}, "source": [ "At this point we would iterate the process of filtering out any additional false positives and false negatives, until we feel quite confident that we have eliminated most of the outliers (or come up with an explaination as to why we are seeing them).\n", "\n", "Once this process is done, it might be desirable to create a CSV export of this cleaned data in preparation for publication ready charts (ex. through tools like Tableau).\n", "\n", "Since charting tools generally work best with data where the values you need to plot are in the cells and the columns indicate the category of the value, we will reshape the data using the `pivot_table` function. This basically takes the values of `blocking_recalc` and puts them as columns, the value of the cells, in this case, is always going to be one. It's generally quite easy to do further aggregation and grouping inside of the charting tool itself." ] }, { "cell_type": "code", "execution_count": 102, "id": "701e1bf0-27a5-41d8-90c1-6c563f57e59a", "metadata": {}, "outputs": [], "source": [ "data_export.pivot_table(\n", " index=['probe_asn', 'domain', 'measurement_start_time', 'report_id'], \n", " columns=['blocking_recalc'], \n", " values='count'\n", ").reset_index().to_csv('20220226-20220317-russia-relevant-sites-pivot.csv')" ] }, { "cell_type": "code", "execution_count": 103, "id": "eebeb35f-4ec9-4d30-b06a-1d2a49f4142a", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "66335 20220226-20220317-russia-relevant-sites-pivot.csv\n" ] } ], "source": [ "!wc -l 20220226-20220317-russia-relevant-sites-pivot.csv" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.9.2" } }, "nbformat": 4, "nbformat_minor": 5 } </figure></figure></figure></figure>