Skip to main content

DNS blocking in Indonesia

DNS based censorship and domain blocking in Indonesia is very inconsistent among ISPs. There’s a government mandated black list which the ISPs operating in the country should enforce. However, Indonesia lacks centralised internet infrastructure and has many separate ISPs. In addition, the Indonesian government granted ISPs the authority to block content at their own discretion. All of this leads to a very inconsistent DNS blocking in Indonesia.

Official DNS domain blacklist in Indonesia

The Government mandated DNS blacklist is published in a redacted form and can be downloaded here: https://trustpositif.kominfo.go.id/. This is where the blocked domains get redirected to. We can search the database and check if a domain is blocked.

In the screenshot below we can see that a popular cryptocurrency exchange is blocked (Ada) and that wikipedia.org is not (Tidak Ada) - thanks to Google Translate.

DNS block page Indonesia

Examples of blocked DNS queries

dig binance.com @182.253.45.122
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 28994
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;binance.com.            IN    A
;; ANSWER SECTION:
binance.com.        3600    IN    CNAME    trustpositif.kominfo.go.id.
trustpositif.kominfo.go.id. 1    IN    A    27.54.116.70


When we try to resolve binance.com we receive a redirected response with the following attributes:

  • CNAME pointing to trustpositif.kominfo.go.id.
  • A record for the above CNAME pointing to 27.54.116.70
  • the response is not-authoritative
  • the TTL for the A record is 1 sec

This is what it looks like at the packet level.

DNS blocking in Indonesia


The A record’s TTL of 1 second  is notable. Let’s query few more servers and see if it’s a coincidence:

dig binance.com @103.122.33.19 | grep -A 1 trustpositif  
dig binance.com @139.255.115.163 | grep -A 1 trustpositif
dig binance.com @202.58.200.38 | grep -A 1 trustpositif
dig binance.com @103.83.100.65 | grep -A 1 trustpositif
dig binance.com @182.253.45.122 | grep -A 1 trustpositif

binance.com.        3600    IN    CNAME    trustpositif.kominfo.go.id.
trustpositif.kominfo.go.id. 1    IN    A    27.54.116.70
binance.com.        3600    IN    CNAME    trustpositif.kominfo.go.id.
trustpositif.kominfo.go.id. 1    IN    A    27.54.116.70
binance.com.        3600    IN    CNAME    trustpositif.kominfo.go.id.
trustpositif.kominfo.go.id. 1    IN    A    27.54.116.70
binance.com.        3600    IN    CNAME    trustpositif.kominfo.go.id.
trustpositif.kominfo.go.id. 1    IN    A    27.54.116.70
binance.com.        3600    IN    CNAME    trustpositif.kominfo.go.id.
trustpositif.kominfo.go.id. 1    IN    A    27.54.116.70


The TTL in all the responses is the same.

Blocking pattern

Now we’ll analyse and infer the pattern used to redirect the requests.

We’ll try another popular crypto currency exchange.

dig gemini.com @182.253.45.122 | grep -A 1 trustpositif  
gemini.com.        3600    IN    CNAME    trustpositif.kominfo.go.id.
trustpositif.kominfo.go.id. 1    IN    A    202.89.117.64


This also resolves to the block page IP so the gemini.com domain is censored.

Firstly we’ll query a nonexistent domain name.

dig nonexistent.gemini.com @8.8.8.8       
; <<>> DiG 9.10.6 <<>> nonexistent.gemini.com @8.8.8.8
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 6988
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1


Google resolver returns NXDOMAIN confirming this record doesn’t exist. However when we query a censoring DNS resolver in Indonesia we get a reply.

dig nonexistent.gemini.com @182.253.45.122       
; <<>> DiG 9.10.6 <<>> nonexistent.gemini.com @182.253.45.122
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 53311
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;nonexistent.gemini.com.        IN    A
;; ANSWER SECTION:
nonexistent.gemini.com.    3600    IN    CNAME    trustpositif.kominfo.go.id.
trustpositif.kominfo.go.id. 1    IN    A    202.89.117.64


Let’s try prepending and appending to the domain:

dig aagemini.com @182.253.45.122 | grep status
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 6177

dig geminiaa.com @182.253.45.122 | grep status
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 25577

dig gemini.com.aa @182.253.45.122 | grep status
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 53728

dig gemini.aa @182.253.45.122 | grep status
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 36503

dig aa.aa.gemini.com @182.253.45.122 | grep status
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 9125


All queries return a NXDOMAIN response.

Based on this basic exercise we can infer that the blocking pattern is:

(example.com OR  *example.com)

Differences among ISPs

In the above examples the censored DNS queries were redirected to trustpositif.kominfo.go.id. CNAME.  However, the DNS censorship varies among ISPs.  Let's see some examples:

dig binance.com @182.23.44.6

; <<>> DiG 9.10.6 <<>> binance.com @182.23.44.6
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 8753
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 13, ADDITIONAL: 7
;; QUESTION SECTION:
;binance.com.            IN    A
;; ANSWER SECTION:
binance.com.        0    IN    CNAME    dnsfilter2.idola.net.id.
dnsfilter2.idola.net.id. 1604    IN    A    103.169.16.2
dnsfilter2.idola.net.id. 1604    IN    A    202.152.4.67 
 
Linknet - another CNAME
 
dig binance.com @139.255.13.185      

; <<>> DiG 9.10.6 <<>> binance.com @139.255.13.185
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57748
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 13, ADDITIONAL: 1
;; QUESTION SECTION:
;binance.com.            IN    A
;; ANSWER SECTION:
binance.com.        3600    IN    CNAME    internetpositif3.firstmedia.com.
internetpositif3.firstmedia.com. 80870 IN A    202.137.1.74
 
PT Indonesia Comnets Plus - A record only

binance.com @103.144.208.134
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 60700
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 13, ADDITIONAL: 13
;; QUESTION SECTION:
;binance.com.            IN    A
;; ANSWER SECTION:
binance.com.        900    IN    A    202.62.8.232


Blocking pages

This sections shows examples of the blocking pages used by different DNS operators in Indonesia.

PT Jembatan Citra Nusantara
 

Indonesia internest censorship Biznet Networks

Biznet Networks


Indonesia internest censorship Indonesia Network Information Center

Indonesia Network Information Center 

 

Indonesia internest censorship Linknet

Linknet


Indonesia internest censorship PT Aplikanusa Lintasarta

PT Aplikanusa Lintasarta

 

Indonesia internest censorship PT Centrin Utama

PT Centrin Utama

 

Indonesia internest censorship PT Fiber Networks Indonesia

PT Fiber Networks Indonesia

 

Indonesia internest censorship PT Jaringanku Sarana Nusantara

PT Jaringanku Sarana Nusantara 

 

 Indonesia internest censorship PT Mitra Lintas Multimedia

PT Mitra Lintas Multimedia

 

Indonesia internest censorship PT Solnet Indoonesia

 PT Solnet Indoonesia


Indonesia internest censorship Qiandra Information Technology

Qiandra Information Technology


Indonesia internest censorship PT Indonesia Comnets Plus

PT Indonesia Comnets Plus

 

Indonesia internest censorship Varnion Technology Semesta
Varnion Technology Semesta


This is a high-level introduction to the DNS censorship in Indonesia. For a detailed research on the effectiveness of the blocking using a much larger sample of DNS servers check our DNS Poisoning in Indonesia deep dive article.

Comments

Popular posts from this blog

x.509 Certificates - Critical vs non-critical extensions

Extensions are used to associate additional information with the user or the key.  Each certificate extension has three attributes - extnID, critical, extnValue extnID - Extension ID - an OID that specifies the format and definitions of the extension critical - Critical flag - Boolean value extnValue - Extension value  Criticality flag specifies whether the information in an extension is important. If an application doesn't recognize the extension marked as critical, the certificate cannot be accepted. If an extension is not marked as critical (critical value False) it can be ignored by an application. In Windows, critical extensions are marked with a yellow exclamation mark,  View certificate extensions using OpenSSL: # openssl x509 -inform pem -in cert.pem -text -noout (output abbreviated)         X509v3 extensions:             X509v3 Key Usage: critical                 Digital Signature, Key Encipherment             X509v3 Subject Key Identifier

Cisco ASA Certificate Revocation Checking

ASA supports status verification using CRLs and OCSP. CRL can be retrieved using HTTP, LDAP or SCEP. Revocation checking using CRL: Over HTTP: ciscoasa(config)# crypto ca trustpoint ASDM_TrustPoint2 ciscoasa(config-ca-trustpoint)# revocation-check crl ciscoasa(config-ca-crl)# protocol http By default ASA will use address listed in CDP extension of the certificate that is being validated.  To override default behaviour we need to add the following in the CRL configuration context. ciscoasa(config-ca-crl)# policy static ciscoasa(config-ca-crl)# url 1 http://cdpurl.kp.local/crl.crl Over LDAP: Certificate I'm using for this lab, doesn't have LDAP address in its CDP extension. Therefore I'm using "policy static"  to specify LDAP URL where CRL can be retrieved.  ciscoasa(config)# crypto ca trustpoint ASDM_TrustPoint2 ciscoasa(config-ca-trustpoint)# revocation-check crl ciscoasa(config-ca-trustpoint)# crl configure ciscoasa

Count number of lines - 'findstr'

How do I count number of lines in a command output? findstr /r/n "^" | find /c ":" Above commands will display number of lines output by whatever command (well, nearly whatever) you specify in the front.  For example:  C:\>ping localhost | findstr /r/n "^" | find /c ":" FINDSTR: // ignored 12 This comes handy if you want to find out how many OUs you have in Active Directory: dsquery ou  -limit 0 | findstr /r/n "^" | find /c ":" How many user accounts there are: dsquery user -limit 0 | findstr /r/n "^" | find /c ":" Computers: dsquery computer -limit | findstr /r/n "^" | find /c ":"