{
"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": [
"
"
],
"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",
"
domain
\n",
"
report_id
\n",
"
\n",
" \n",
" \n",
"
\n",
"
119
\n",
"
shajtanshop.com
\n",
"
1
\n",
"
\n",
"
\n",
"
59
\n",
"
instagram.com
\n",
"
1
\n",
"
\n",
"
\n",
"
34
\n",
"
facebook.com
\n",
"
1
\n",
"
\n",
"
\n",
"
36
\n",
"
fapreactor.com
\n",
"
1
\n",
"
\n",
"
\n",
"
89
\n",
"
nani24.cc
\n",
"
1
\n",
"
\n",
"
\n",
"
...
\n",
"
...
\n",
"
...
\n",
"
\n",
"
\n",
"
115
\n",
"
rutracker.org
\n",
"
477
\n",
"
\n",
"
\n",
"
156
\n",
"
www.bbc.com
\n",
"
513
\n",
"
\n",
"
\n",
"
58
\n",
"
imrussia.org
\n",
"
515
\n",
"
\n",
"
\n",
"
135
\n",
"
twitter.com
\n",
"
1873
\n",
"
\n",
"
\n",
"
182
\n",
"
www.facebook.com
\n",
"
1972
\n",
"
\n",
" \n",
"
\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": [
"
"
]
},
"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": [
"
"
]
},
"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": [
"