<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>DevNull</title><link href="//devnull.web.id/" rel="alternate"></link><link href="//devnull.web.id/feed/atom.xml" rel="self"></link><id>//devnull.web.id/</id><updated>2019-12-01T09:45:00+08:00</updated><entry><title>Jaringan Layer 3, IP routing</title><link href="//devnull.web.id/networking/jaringan-layer-3.html" rel="alternate"></link><published>2019-12-01T09:45:00+08:00</published><updated>2019-12-01T09:45:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2019-12-01:/networking/jaringan-layer-3.html</id><summary type="html">&lt;p&gt;Selamat datang teman-teman pembaca. Saya meneruskan tulisan yang lama tentang
jaringan layer 1, 2, dan 3. Saya lihat demand tulisan itu lumayan bagus, jadi
saya terpikir buat sedikit lebih dalam membahas apa yang terjadi di layer 3.&lt;/p&gt;
&lt;p&gt;Layer 3 ini di standar OSI dinamakan network layer dan di layer ini …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Selamat datang teman-teman pembaca. Saya meneruskan tulisan yang lama tentang
jaringan layer 1, 2, dan 3. Saya lihat demand tulisan itu lumayan bagus, jadi
saya terpikir buat sedikit lebih dalam membahas apa yang terjadi di layer 3.&lt;/p&gt;
&lt;p&gt;Layer 3 ini di standar OSI dinamakan network layer dan di layer ini ada beberapa
protokol yang berjalan, salah satunya yang paling populer dan hanya
itu yang akan saya bahas, yaitu IP atau Internet Protocol. IP ini yang sekarang
kita pakai buat akses web, sosial media, email, dll.&lt;/p&gt;
&lt;p&gt;Sebelum kita bahas IP dan proses routing-nya, saya mau kita samakan persepsi
dulu tentang IP supaya tidak membingungkan. Jadi kalau saya sebut IP, yang saya
maksud bukan seperti 192.168.1.1, ini bukan IP, tapi ini alamat IP atau IP address.&lt;/p&gt;
&lt;p&gt;Jadi apa itu IP?&lt;br /&gt;
IP atau Internet Protocol bisa kita bayangkan seperti Bahasa
Indonesia, satu bahasa yang dimengerti semua suku di Indonesia, kecuali mungkin
yang di pedalaman. Itulah IP, satu bahasa atau protokol yang dimengerti semua
perangkat layer 3 apapun jenis dan merek nya. Smartphone, PC, Laptop, server dan
router yang jenis dan mereknya berbeda-beda itu, tapi mereka semua mengerti satu
bahasa, bahasa IP.&lt;/p&gt;
&lt;p&gt;Kemudian di dalam IP ini ada yang namanya alamat IP dan paket IP. Alamat IP,
sama seperti alamat pada umumnya, ini informasi di mana perangkat IP
ini lokasinya, tidak ditulis dengan nama jalan tapi pakai notasi
192.168.1.100 misalnya.&lt;/p&gt;
&lt;p&gt;Paket IP, sama seperti paket umumnya, ada
alamat IP pengirim, ada alamat IP penerima, ada isi paket yang dalam
bahasa IP disebut Payload. Payload ini bisa berisi data TCP misalnya,
yang kalau kita akses web atau email kita pakai TCP.
Payload bisa juga berisi UDP yang kalau kita request DNS pakai UDP.
Bisa juga berisi ICMP yang biasanya kita kirim pakai program PING.
Atau bahkan IP payload ini bisa berisi paket IP, IP dalam IP yang biasa disebut
IP tunnel.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="proses-routing-ip"&gt;Proses routing IP&lt;/h2&gt;
&lt;p&gt;Nah sekarang, setelah paham apa itu IP, kita bahas masalah routing IP.  Apa itu?
proses routing IP ini, cara bagaimana satu paket IP dari alamat pengirim bisa
sampai di alamat IP penerima, melewati beberapa atau banyak IP forwarder yang
disebut router.&lt;/p&gt;
&lt;p&gt;Router-router ini bertugas menerima paket dari pengirim atau
dari router lainnya, kemudian meneruskan ke router lain atau menyerahkan paket
IP tersebut ke penerima kalau dia yang terhubung ke alamat penerima atau dia router
yang terakhir. Bayangkan pengiriman paket lewat jasa ekspedisi yang melewati
beberapa pos transit sebelum sampai ke penerima, pos-pos ini fungsinya sama
dengan router.&lt;/p&gt;
&lt;p&gt;Kemudian bagaimana cara sebuah router menentukan jalur yang harus dilewati
paket IP? seperti sebuah rumah yang punya beberapa pintu, paket IP ke tujuan
tertentu harus lewat pintu mana? salah jalur maka paket tidak bisa sampai
tujuan.&lt;/p&gt;
&lt;p&gt;Di sinilah peran routing protocol, routing protocol menentukan jalur A
untuk tujuan alamat IP A, dan jalur B untuk tujuan B, dst. Dan setelah
diputuskan jalurnya, informasi ini dicatat di sebuah database yang disebut
routing table atau &lt;em&gt;routing information base (RIB)&lt;/em&gt;. Ya, jadi masing-masing router
punya data informasi routing table, jadi waktu ada paket masuk, dilihat
tujuannya dan alamat tujuan ini dicari di data routing table dan setelah didapat
jalurnya, paket IP diteruskan lewat jalur itu.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="routing-protocol"&gt;Routing Protocol&lt;/h2&gt;
&lt;p&gt;Secara garis besar, routing protocol dibagi jadi tiga. &lt;em&gt;Link&lt;/em&gt; atau &lt;em&gt;Connected&lt;/em&gt;,
&lt;em&gt;static routing&lt;/em&gt;, dan &lt;em&gt;dynamic routing&lt;/em&gt;. Kita bahas satu-satu.&lt;/p&gt;
&lt;h4 id="connected-link"&gt;Connected / Link.&lt;/h4&gt;
&lt;p&gt;Link atau juga disebut connected routing, ini informasi router dalam satu
broadcast domain.
Informasi routing yang otomatis terbuat kalau kita assign ip address di
interface router. Misal router A punya 2 interface, eth0 dan eth1. Kita
set ip address 192.168.1.1/24 di eth0, maka secara otomatis router akan
membuat informasi routing bahwa network 192.168.1.0/24 lewat eth0.
Informasi ini kemudian disimpan di data routing table.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;[root: ~] Endor #&lt;/span&gt; ip route
&lt;span class="go"&gt;default via 10.10.10.28 dev eth0&lt;/span&gt;
&lt;span class="go"&gt;10.10.10.0/24 dev eth0 proto kernel scope link src 10.10.10.96&lt;/span&gt;
&lt;span class="gp"&gt;[root: ~] Endor #&lt;/span&gt; ip addr add &lt;span class="m"&gt;192&lt;/span&gt;.168.1.1/24 dev eth0
&lt;span class="gp"&gt;[root: ~] Endor #&lt;/span&gt; ip route
&lt;span class="go"&gt;default via 10.10.10.28 dev eth0&lt;/span&gt;
&lt;span class="go"&gt;10.10.10.0/24 dev eth0 proto kernel scope link src 10.10.10.96&lt;/span&gt;
&lt;span class="go"&gt;192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.1&lt;/span&gt;
&lt;span class="gp"&gt;[root: ~] Endor #&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Seperti terlihat di atas, routing 192.168.1.0/24 otomatis terbuat waktu saya set
ip address 192.168.1.1/24 di interface eth0.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id="static-routing-protocol"&gt;Static routing protocol&lt;/h4&gt;
&lt;p&gt;Static routing protocol. Protokol ini diset secara manual oleh administrator
jaringan. Jadi misal saya mau informasikan ke router A di atas bahwa tujuan
alamat 172.16.1.0/24 lewat 192.168.1.100, maka saya harus secara manual inputkan
data ini ke router, baru kemudian router tulis data ini ke routing table. Maka
ketika ada paket masuk router A dengan tujuan 172.16.1.1 misalnya, router A cek
routing table dan ternyata 172.16.1.1 masuk ke network 172.16.1.0/24.&lt;/p&gt;
&lt;p&gt;Berdasarkan informasi routing table bahwa 172.16.1.0/24 harus lewat
192.168.1.100, maka paket ini akan diteruskan ke 192.168.1.100.&lt;br /&gt;
Tapi di mana router 192.168.1.100 ini? sekali lagi router A cek routing
table dan didapat bahwa 192.168.1.100 masuk network 192.168.1.0/24 dan
192.168.1.0/24 lewat interface eth0.&lt;/p&gt;
&lt;p&gt;Dan itulah yang terjadi, paket dengan
tujuan 172.16.1.1 diteruskan ke 192.168.1.100 lewat interface eth0.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;[root: ~] Endor #&lt;/span&gt; ip route show
&lt;span class="go"&gt;default via 10.10.10.28 dev eth0&lt;/span&gt;
&lt;span class="go"&gt;10.10.10.0/24 dev eth0 proto kernel scope link src 10.10.10.96&lt;/span&gt;
&lt;span class="go"&gt;192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.1&lt;/span&gt;
&lt;span class="gp"&gt;[root: ~] Endor #&lt;/span&gt;
&lt;span class="gp"&gt;[root: ~] Endor #&lt;/span&gt; ip route add &lt;span class="m"&gt;172&lt;/span&gt;.16.1.0/24 via &lt;span class="m"&gt;192&lt;/span&gt;.168.1.100
&lt;span class="gp"&gt;[root: ~] Endor #&lt;/span&gt;
&lt;span class="gp"&gt;[root: ~] Endor #&lt;/span&gt; ip route show
&lt;span class="go"&gt;default via 10.10.10.28 dev eth0&lt;/span&gt;
&lt;span class="go"&gt;10.10.10.0/24 dev eth0 proto kernel scope link src 10.10.10.96&lt;/span&gt;
&lt;span class="go"&gt;172.16.1.0/24 via 192.168.1.100 dev eth0&lt;/span&gt;
&lt;span class="go"&gt;192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.1&lt;/span&gt;
&lt;span class="gp"&gt;[root: ~] Endor #&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Satu, dua, atau sepuluh informasi routing masih oke, tapi bagaimana kalau saya
punya ratusan atau bahkan ribuan network yang melibatkan banyak sekali router?
di sinilah peran dynamic routing protocol.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id="dynamic-routing-protocol"&gt;Dynamic Routing Protocol&lt;/h4&gt;
&lt;p&gt;Dynamic routing ini protokol routing yang kita tidak perlu input satu-satu
entri routing secara manual. Misal saya punya 100 router yang saling
terhubung, saya input routing di router ke 100, maka secara otomatis 99 router
yang lainnya akan meng-update data routing table mereka tanpa intervensi manual.&lt;/p&gt;
&lt;p&gt;Di sini saya bahas 2 saja untuk dynamic routing, &lt;strong&gt;Border gateway protocol (BGP)&lt;/strong&gt;
dan &lt;strong&gt;Open Shortest Path First (OSPF)&lt;/strong&gt;. Dua protokol ini yang paling banyak
dipakai di jaringan yang besar. BGP dan OSPF akan kita bahas nanti.&lt;/p&gt;
&lt;p&gt;Dynamic routing protocol, seperti yang sudah disebutkan, dia didesain buat
memudahkan administrasi routing. Pakai dynamic protocol, admin jaringan bisa
me-manage banyak sekali router tanpa takut looping.&lt;/p&gt;
&lt;p&gt;Routing loop ini misalnya router A mengatakan tujuan C harus lewat router B,
sementara router B mengatakan tujuan C harus lewat router A. Jadinya paket IP
ke C cuma bolak balik antara router A sama B, tidak bisa sampai C.&lt;/p&gt;
&lt;p&gt;Looping ini sangat mungkin dan umum terjadi di jaringan yang pakai static routing, karena
admin yang salah setting static route. Nah dynamic routing menjamin routing
yang bebas loop, biarpun banyak sekali router yang terlibat di jaringan.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="administrative-distance-ad"&gt;Administrative Distance (AD)&lt;/h2&gt;
&lt;p&gt;Di satu router, bisa saja ada beberapa routing protocol yang jalan, tapi entri
di routing table cuma ada satu yang bisa aktif dan inilah yang jadi rujukan
router buat memproses pengiriman paket IP. Maksudnya begini, kalau misalnya ada
dua atau lebih routing protokol menulis ke routing table untuk tujuan yang sama,
misal saja ada connected untuk tujuan 10.10.10.0/24 lewat eth0, ada juga routing
yang sama dari protokol static untuk route 10.10.10.0/24.&lt;/p&gt;
&lt;p&gt;Nah di routing table bakal ada dua entri untuk route yang sama, 10.10.10.0/24.
Tapi yang aktif cuma bisa satu, dan penentuan jalur ini berdasarkan rangking
yang disebut &lt;em&gt;administrative distance&lt;/em&gt;, semakin kecil nilai distance, dia yang
akan dipilih.&lt;/p&gt;
&lt;p&gt;Pengecualian buat &lt;em&gt;Equal Cost Multipath&lt;/em&gt; atau &lt;strong&gt;ECMP&lt;/strong&gt; dimana beberapa jalur bisa aktif
bersamaan, tapi ini teknik yang agak advance.&lt;/p&gt;
&lt;p&gt;Secara default distance untuk masing-masing protokol:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Connected / Link  : 0&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Static            : 1&lt;/strong&gt; dan bisa diset di angka lain sesuka hati admin. Misal
                        supaya routing table memprioritaskan ospf daripada yang static ini, nilai
                        distance harus lebih besar dari ospf yang angkanya 110.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;OSPF              : 110&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;BGP               : 200&lt;/strong&gt; untuk internal bgp (ibgp) dan &lt;strong&gt;20&lt;/strong&gt; untuk external bgp
(ebgp)&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/ip_route/rib.png" alt="Routing table" title="Routing Table" /&gt;
&lt;/div&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Baik teman-teman, di atas tadi gambaran tentang bagaimana proses routing dan
routing protocol.&lt;/p&gt;
&lt;p&gt;Di bawah saya coba bahas dua routing protokol yang termasuk dynamic routing,
BGP sama OSPF.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="bgp-border-gateway-protocol"&gt;BGP (Border Gateway Protocol)&lt;/h3&gt;
&lt;p&gt;BGP ini protokol yang sekarang dipakai backbone Internet, jadi penyedia jasa
semacam isp atau nap, termasuk juga institusi seperti kampus yang berbeda-beda
semua terhubung lewat bgp. Masing-masing bgp dari router yang berbeda
saling bertukar informasi tentang jaringan masing-masing.&lt;/p&gt;
&lt;p&gt;Silakan coba cek looking glass OpenIXP di &lt;a href="http://lg.mohonmaaf.com"&gt;http://lg.mohonmaaf.com&lt;/a&gt;, pilih show ip
bgp summary dan submit.&lt;/p&gt;
&lt;p&gt;Ada ratusan bgp dari perusahaan dan institusi yang bermacam-macam saling
terkoneksi di sini.&lt;/p&gt;
&lt;p&gt;Dari output looking glass ini ada beberapa informasi yang perlu dicatat; &lt;em&gt;Neighbor&lt;/em&gt;,
&lt;em&gt;AS&lt;/em&gt;, sama &lt;em&gt;State/Pfx&lt;/em&gt;. Satu-satu dijelaskan di bawah:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Neighbor.&lt;/strong&gt; Ini alamat IP router bgp yang ada di satu broadcast domain.
Misal Indosat di OpenIXP beralamat IP di 218.100.36.110 dan
Telkom di 218.100.36.59.&lt;/p&gt;
&lt;p&gt;Jadi misal dari Indosat menuju Telkom kalau di OpenIXP berarti lewat
218.100.36.59, begitu juga sebaliknya menuju Indosat lewat 218.100.36.110.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;AS (Autonomous System)&lt;/strong&gt; AS ini representasi perusahaan, institusi atau organisasi.
Jadi ada AS Telkom, AS Indosat, AS Telkomsel, dan seterusnya.
Nah masing masing AS ini punya nomor yang disebut &lt;strong&gt;ASN&lt;/strong&gt; atau &lt;em&gt;Autonomous System Number&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Nomor AS atau ASN ini sifatnya publik juga unik, tidak ada nomor ASN yang sama.
Pengalokasian ASN ini di bawah IANA atau Internet Assigned Numbers Authority.
Artinya setiap perusahaan atau institusi harus daftar kalau mau punya nomor AS.&lt;/p&gt;
&lt;p&gt;Karena AS ini informasi publik, siapa saja bisa lihat. Kalau teman-teman mau cek
misalnya BGP Telkom, Telkom punya ASN salah satunya 7713, silakan cek BGP Telkom
terkoneksi kemana saja, bisa lewat &lt;a href="https://bgp.he.net/AS7713"&gt;https://bgp.he.net/AS7713&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Peering bgp ini bisa antar AS artinya ASN nya beda nomor, bisa juga dalam satu
autonomous system atau nomor AS nya sama. Peer bgp antar AS disebut &lt;em&gt;external bgp&lt;/em&gt;
atau &lt;strong&gt;ebgp&lt;/strong&gt;, sementara peer bgp dalam satu AS namanya &lt;em&gt;internal bgp&lt;/em&gt; atau
&lt;strong&gt;ibgp&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;State/Pfx.&lt;/strong&gt; Ada dua informasi di sini, state sama Prefix.
State ini kondisi koneksi bgp, dia bisa open, connect, atau established.&lt;/p&gt;
&lt;p&gt;Prefix, ini jumlah prefix yang diterima dari neighbor.&lt;br /&gt;
Terus prefix ini apa? Prefix ini alamat network, seperti 192.168.0.0/24 misalnya.
Nah berarti jumlah prefix yang diterima dari neighbor ini berarti jumlah
network yang diumumkan oleh neighbor atau peer itu.&lt;/p&gt;
&lt;p&gt;Misalkan Telkom yang punya ASN 7713 mengumumkan ke OpenIXP lewat
routernya 218.100.36.59 kalau ada sebanyak 2000 network yang kalau mau menuju
network ini bisa lewat router Telkom.&lt;/p&gt;
&lt;p&gt;Kalau mau tau networknya apa saja, bisa cek di &lt;a href="http://lg.mohonmaaf.com"&gt;http://lg.mohonmaaf.com&lt;/a&gt; pilih
&lt;code&gt;show ip bgp neighbor 218.100.x.x received-routes&lt;/code&gt;, isikan neighbor Telkom
218.100.36.59 di kolom isian, klik submit.&lt;/p&gt;
&lt;p&gt;Prefix ini yang ada di bgp semuanya publik, kalau kita cari prefix private
seperti 192.168.1.0/24 tidak ada di sini. Juga netmask yang lebih besar dari 24
juga tidak ada, tidak ada /25, /26 dst. Seperti ASN yang publik dan unik,
prefix IP address juga diatur IANA.&lt;/p&gt;
&lt;p&gt;Kembali ke hasil looking glass sebelumnya yang received-routes. Di belakang itu
ada informasi path, oke artinya? Ini artinya kalau mau menuju prefix tertentu
jalurnya lewat AS ini.&lt;/p&gt;
&lt;p&gt;Dari sini kita tau ternyata yang diumumkan Telkom ke OpenIXP atau dalam
istilah bgp namanya advertise, bukan cuma perfix Telkom, ternyata ada prefix
dari AS lain.&lt;/p&gt;
&lt;p&gt;Kenapa begitu? Ini mungkin pelanggan Telkom yang ada di daerah yang mereka tidak
terkoneksi langsung ke OpenIXP karena OpenIXP adanya di gedung IDC Jakarta.
Jadi para member OpenIXP kalau mau menuju alamat ini bisa lewat Telkom.&lt;/p&gt;
&lt;p&gt;Terus bagaimana misalnya pelanggan Telkom ini juga jadi pelanggan Indosat, yang
Indosat juga ada di OpenIXP, terus masing-masing Indosat sama Telkom advertise
prefix pelanggan ini ke OpenIXP.&lt;/p&gt;
&lt;p&gt;Maka di OpenIXP bakal ada dua jalur menuju prefix yang sama, tapi cuma satu
yang bisa aktif.
Yang mana yang jadi aktif kalau begitu? Em.. di bgp ada flag namanya localpref
yang bisa diset secara manual oleh admin bgp, semakin tinggi nilai localpref
maka dia yang bakal dipilih.&lt;/p&gt;
&lt;p&gt;Tapi secara default localpref untuk bgp sama semua bobotnya, kalau begitu bgp bakal pilih
yang jalur AS path nya yang paling pendek. Artinya kalau misalnya lewat Telkom
lewat 3 AS sementara Indosat cuma 2 AS, maka Indosat yang aktif.&lt;/p&gt;
&lt;p&gt;Coba sekarang kita cek untuk prefix 175.184.248.0/24 di OpenIXP. Buka lagi
&lt;a href="http://lg.mohonmaaf.com"&gt;http://lg.mohonmaaf.com&lt;/a&gt;, pilih show ip bgp, isikan 175.184.248.0, klik submit,
hasilnya ada di paling bawah.&lt;/p&gt;
&lt;p&gt;Dari sini ternyata ada 3 jalur menuju prefix 175.184.248.0/24.
kita juga tau prefix ini terdaftar untuk AS 46028.
Dari 3 jalur yang ada ini yang aktif yang ada kata Best, dan jalur ini dipilih karena
jalur AS atau AS Path nya yang paling pendek, ini karena nilai localpref untuk
tiga path ini semuanya sama.&lt;/p&gt;
&lt;p&gt;Ada yang menarik dari salah satu hasil AS path, waktu ini ditulis dan kalau
belum berubah, ada yang AS path nya 17922 46028 46028 46028, AS 17922 AS nya
Indosat.&lt;/p&gt;
&lt;p&gt;Apa ini, kenapa AS 46028 diulang tiga kali? Ini artinya kalau mau
menuju prefix 175.184.248.0/22 harus melalui pertama AS Indosat, kemudian 46028,
46028 lagi, baru terakhir 46028 juga.&lt;/p&gt;
&lt;p&gt;Sebenarnya AS path nya cuma dua saja, 17922 sama 46028.
Metode ini di BGP namanya AS path prepending, path prepending ini cara membuat
bagaimana seolah-olah jalur as path nya kelihatan panjang ada empat AS,
padahal cuma dua.&lt;/p&gt;
&lt;p&gt;Kemudian as path prepend ini yang set dari admin bgp nya AS 46028,
bukan Indosat bukan juga OpenIXP. Nah Karena as path nya kelihatan
panjang di OpenIXP, jalur ini tidak terpilih.&lt;/p&gt;
&lt;p&gt;Jadi misalnya kita punya dua atau lebih koneksi bgp, dalam istilah bgp namanya
&lt;em&gt;multihoming&lt;/em&gt;, kita bisa misalnya atur bagaimana caranya salah satu jalur kelihatan
panjang pakai as path prepend, yang harapannya jalur yang di prepend ini nanti
tidak terpilih di bgp.&lt;/p&gt;
&lt;p&gt;Kita cuma berharap karena panjang as path ini pertimbangan kedua
setelah localpref, jadi kalau kita sudah prepend sampai panjang sepuluh
AS tapi ternyata tetangga bgp kita set localpref maka as path prepend ini
tidak ada gunanya. Tapi dalam kasus OpenIXP ini as path prepend berhasil
karena nilai localpref sama bobotnya.&lt;/p&gt;
&lt;p&gt;Terakhir masalah BGP, semua yang dibahas di atas itu bgp publik.
BGP juga ada private bgp, yang bisa dipakai siapa saja
tanpa harus punya nomor AS. ASN atau nomor AS private yang dialokasikan IANA
dari 64512 sampai 65534. ASN ini bisa dipakai siapa saja di jaringan internal,
tidak ada batasan prefix harus publik, juga tidak ada batasan netmask harus
24 atau di bawahnya, bebas.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="konfigurasi-bgp"&gt;Konfigurasi BGP&lt;/h3&gt;
&lt;p&gt;Baik sekarang setelah sedikit paham tentang gambaran BGP, kita coba detail
teknisnya.&lt;/p&gt;
&lt;p&gt;Ada tiga mode konfigurasi BGP yang bisa dipakai, &lt;em&gt;full mesh&lt;/em&gt;, &lt;em&gt;route reflect&lt;/em&gt;, sama
&lt;em&gt;route server&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Anggap sekarang ini kita punya tiga router yang terkoneksi di satu broadcast
domain, router A, B, dan C.&lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/ip_route/full_mesh.png" alt="BGP Full mesh" title="BGP Full mesh" /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Full mesh.&lt;/strong&gt; Pakai full mesh, setiap router peering bgp ke semua router, misal A
peer ke B sama C. Router B peering ke A sama C, C peering ke B sama A.&lt;/p&gt;
&lt;p&gt;Dengan begini, kalau misalnya link dari A ke B terputus, maka A ke B bisa lewat
router C.
Mode full mesh ini ada kelamahannya, apa itu? Ribet. Bagaimana kalau ada sepuluh
router? masing-masing router punya sembilan peer, dan kalau ada nambah satu
router lagi, kita harus tambah konfigurasi di sepuluh router yang eksisting.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Route reflector.&lt;/strong&gt; Mode ini menyederhanakan problem full mesh di atas. Kalau kita
punya banyak router di satu broadcast domain, kita bisa pilih salah satu router
jadi route reflector. Router yang lainnya, semuanya peering ke route reflector.
Jadi di masing-masing route reflector client cuma ada satu peer bgp, ke route
reflector.&lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/ip_route/route_reflect.png" alt="BGP Route reflector" title="BGP Route reflector" /&gt;
&lt;/div&gt;

&lt;p&gt;Anggap router yang dijadikan route reflector ini seperti cermin, jadi prefix
yang di advertise dari client akan di reflect atau dipantulkan ke client yang
lain.&lt;/p&gt;
&lt;p&gt;Kelemahannya, route reflector jadi &lt;strong&gt;spof&lt;/strong&gt; atau &lt;em&gt;single point of failure&lt;/em&gt;. Route
reflector mati, maka semua peer bgp mati. Untuk meminimalisir ini, kita bisa
misalnya buat dua route reflector sebagai backup kalau yang utama bermasalah.
Route reflector ini ekstensi iBGP atau internal BGP.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Route server.&lt;/strong&gt; Route server sama seperti route reflector, jadi ada satu atau
lebih yang jadi bgp server, semua router peering ke route server. Bedanya sama
route reflector, route server beroperasi di external bgp dan biasa dipakai di
exchange point.&lt;/p&gt;
&lt;p&gt;Route server ini tugasnya cuma jadi server, tidak mem-forward traffic IP seperti
router lainnya. Bahkan biasanya hardware yang dipakai juga server Linux yang
diinstall software BGP semacam BIRD atau Quagga.&lt;/p&gt;
&lt;p&gt;Banyak route server publik yang bisa teman-teman coba akses di luar sana,
biasanya dipakai buat troubleshooting masalah inbound route, coba cek
&lt;a href="http://www.routeservers.org"&gt;http://www.routeservers.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Oke, kita coba config bgp. Apa yang diperlukan buat setting BGP? kita harus punya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;IP address, IP address harus dalam satu broadcast domain.
   Di contoh ini address kita 172.16.3.2/30 sementara address peer kita 172.16.3.1.&lt;/li&gt;
&lt;li&gt;AS number kita yang disebut local AS. Di sini kita pakai 64512, private ASN.&lt;/li&gt;
&lt;li&gt;AS number peer atau neighbor yang disebut remote AS. Remote AS, atau AS
   tetangga BGP kita 65000 yang juga private.&lt;/li&gt;
&lt;li&gt;Prefix apa saja yang mau kita umumkan atau advertise ke peer. Kita punya dua
   prefix, 10.10.10.0/24 sama 192.168.1.0/24. Dua prefix ini yang nantinya kita
   advertise ke neighbor dan dua prefix ini tipenya connected. Masih ingat
   protokol connected di atas?&lt;/li&gt;
&lt;li&gt;Prefix yang kita terima dari neighboor atau peer, yang ini optional.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Command konfigurasi yang dipakai di sini pakai VyOS, sistem operasi
router yang Open Source. Kompatibel sama Vyatta, atau mungkin juga Juniper
JunOS.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;vyos@ROUTER2:~$ #&lt;/span&gt; masuk mode konfiugrasi pakai &lt;span class="nb"&gt;command&lt;/span&gt; configure
&lt;span class="gp"&gt;vyos@ROUTER2:~$&lt;/span&gt; configure
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2# ##&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; IP address, contoh saja di eth0
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; interfaces ethernet eth0 address &lt;span class="m"&gt;172&lt;/span&gt;.16.3.2/30
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2# ##&lt;/span&gt; commit dulu supaya ip address terset di eth0
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; commit
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2# ##&lt;/span&gt; kemudian &lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nb"&gt;local&lt;/span&gt; AS &lt;span class="m"&gt;64512&lt;/span&gt;
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; protocols bgp &lt;span class="m"&gt;64512&lt;/span&gt;
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2# ##&lt;/span&gt; kemudian &lt;span class="nb"&gt;set&lt;/span&gt; alamat neighbor
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; protocols bgp &lt;span class="m"&gt;64512&lt;/span&gt; neighbor &lt;span class="m"&gt;172&lt;/span&gt;.16.3.1
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2# ##&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; remote as buat neighbor
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; protocols bgp &lt;span class="m"&gt;64512&lt;/span&gt; neighbor &lt;span class="m"&gt;172&lt;/span&gt;.16.3.1 remote-as &lt;span class="m"&gt;65000&lt;/span&gt;
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2# ##&lt;/span&gt; ini konfigurasi minimal buat peering bgp, kita commit dan seharunya bgp bisa running
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; commit
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2:~$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Di router peer nya, kalau belum di set, konfigurasinya sama dengan konfig di
atas, tinggal disesuaikan address, as number sama neighbor nya.&lt;/p&gt;
&lt;p&gt;Di router VyOS, Vyatta dan keluarganya, cek status bgp bisa pakai &lt;code&gt;show ip bgp summary&lt;/code&gt; atau bisa
juga cek neighbor &lt;code&gt;show ip bgp neigh 172.16.3.1&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;vyos@ROUTER2:~$&lt;/span&gt; show ip bgp neighbors &lt;span class="m"&gt;172&lt;/span&gt;.16.3.1
&lt;span class="go"&gt;BGP neighbor is 172.16.3.1, remote AS 65000, local AS 64512, external link&lt;/span&gt;
&lt;span class="go"&gt;  BGP version 4, remote router ID 172.16.3.1&lt;/span&gt;
&lt;span class="go"&gt;  BGP state = Established, up for 00:02:05&lt;/span&gt;
&lt;span class="go"&gt;  Last read 00:00:09, hold time is 180, keepalive interval is 60 seconds&lt;/span&gt;
&lt;span class="go"&gt;  Neighbor capabilities:&lt;/span&gt;
&lt;span class="go"&gt;    4 Byte AS: advertised and received&lt;/span&gt;
&lt;span class="go"&gt;    Route refresh: advertised and received(old &amp;amp; new)&lt;/span&gt;
&lt;span class="go"&gt;    Address family IPv4 Unicast: advertised and received&lt;/span&gt;
&lt;span class="go"&gt;    Graceful Restart Capabilty: received&lt;/span&gt;
&lt;span class="go"&gt;      Remote Restart timer is 120 seconds&lt;/span&gt;
&lt;span class="go"&gt;      Address families by peer:&lt;/span&gt;
&lt;span class="go"&gt;        IPv4 Unicast(not preserved)&lt;/span&gt;
&lt;span class="go"&gt;  Graceful restart informations:&lt;/span&gt;
&lt;span class="go"&gt;    End-of-RIB send: IPv4 Unicast&lt;/span&gt;
&lt;span class="go"&gt;    End-of-RIB received: IPv4 Unicast&lt;/span&gt;
&lt;span class="go"&gt;  Message statistics:&lt;/span&gt;
&lt;span class="go"&gt;    Inq depth is 0&lt;/span&gt;
&lt;span class="go"&gt;    Outq depth is 0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;BGP state = Established&lt;/code&gt;, berarti bgp sudah running.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id="bgp-advertisement"&gt;BGP Advertisement&lt;/h4&gt;
&lt;p&gt;Setelah bgp peering bisa established, konfigurasi belum selesai. Kita advertise
atau umumkan ke tetangga bgp kita kalau kita punya prefix sekian dan sekian.&lt;/p&gt;
&lt;p&gt;Secara default, bgp cuma meng-advertise prefix yang juga bgp. Artinya kalau
misal kita punya beberapa peering bgp, prefix yang kita terima dari peer A
misalnya, prefix-prefix ini bakal di-advertise ke peer lain. Sedangkan tipe
routing lain seperti ospf, connected, dan static tidak di distribusikan ke bgp.&lt;/p&gt;
&lt;p&gt;Praktek umumnya, kita juga perlu meng-advertise prefix yang bukan bgp ke bgp.
Contoh saja misalnya kita punya static route di router kita yang kita mau prefix
static ini dimasukkan ke bgp buat di-advertise. Dan di protokol dynamic routing,
yang seperti ini disebut &lt;em&gt;route redistribution&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Di contoh ini kita punya dua prefix, yang dua-duanya connected. Connected
artinya salah satu interface di router ini terhubung ke network prefix. Dua
prefix yang kita punya, 10.10.10.0/24 sama 192.168.1.0/24.&lt;/p&gt;
&lt;p&gt;Bagaimana cara kita meng-advertise dua prefix connected di atas? di VyOS kita
cuma perlu set bgp dengan redistribute connected.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;vyos@ROUTER2:~$ #&lt;/span&gt; cek prefix yang termasuk connected
&lt;span class="gp"&gt;vyos@ROUTER2:~$&lt;/span&gt; show ip route connected
&lt;span class="go"&gt;Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,&lt;/span&gt;
&lt;span class="go"&gt;       I - ISIS, B - BGP, &amp;gt; - selected route, * - FIB route&lt;/span&gt;

&lt;span class="go"&gt;C&amp;gt;* 10.10.10.0/24 is directly connected, lo&lt;/span&gt;
&lt;span class="go"&gt;C&amp;gt;* 127.0.0.0/8 is directly connected, lo&lt;/span&gt;
&lt;span class="go"&gt;C&amp;gt;* 172.16.3.0/30 is directly connected, eth0&lt;/span&gt;
&lt;span class="go"&gt;C&amp;gt;* 192.168.1.0/24 is directly connected, lo&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2:~$&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2:~$ #&lt;/span&gt; cek advertise prefix awalnya kosong karena tidak ada
&lt;span class="gp"&gt;vyos@ROUTER2:~$ #&lt;/span&gt; bgp lain, juga tidak ada protocol lain yang di redistribute
&lt;span class="gp"&gt;vyos@ROUTER2:~$&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2:~$&lt;/span&gt; show ip bgp neighbors &lt;span class="m"&gt;172&lt;/span&gt;.16.3.1 advertised-routes
&lt;span class="gp"&gt;vyos@ROUTER2:~$&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2:~$&lt;/span&gt; configure
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; protocols bgp &lt;span class="m"&gt;64512&lt;/span&gt; redistribute connected
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; commit
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; save
&lt;span class="go"&gt;Saving configuration to &amp;#39;/config/config.boot&amp;#39;...&lt;/span&gt;
&lt;span class="go"&gt;Done&lt;/span&gt;
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; &lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2:~$ #&lt;/span&gt; kita perlu refresh bgp advertisement
&lt;span class="gp"&gt;vyos@ROUTER2:~$&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2:~$&lt;/span&gt; reset ip bgp &lt;span class="m"&gt;172&lt;/span&gt;.16.3.1 out
&lt;span class="gp"&gt;vyos@ROUTER2:~$&lt;/span&gt; show ip bgp neighbors &lt;span class="m"&gt;172&lt;/span&gt;.16.3.1 advertised-routes
&lt;span class="go"&gt;BGP table version is 0, local router ID is 172.16.3.2&lt;/span&gt;
&lt;span class="go"&gt;Status codes: s suppressed, d damped, h history, * valid, &amp;gt; best, i - internal,&lt;/span&gt;
&lt;span class="go"&gt;              r RIB-failure, S Stale, R Removed&lt;/span&gt;
&lt;span class="go"&gt;Origin codes: i - IGP, e - EGP, ? - incomplete&lt;/span&gt;

&lt;span class="go"&gt;   Network          Next Hop            Metric LocPrf Weight Path&lt;/span&gt;
&lt;span class="go"&gt;*&amp;gt; 10.10.10.0/24    172.16.3.2               1         32768 ?&lt;/span&gt;
&lt;span class="go"&gt;*&amp;gt; 172.16.3.0/30    172.16.3.2               1         32768 ?&lt;/span&gt;
&lt;span class="go"&gt;*&amp;gt; 192.168.1.0/24   172.16.3.2               1         32768 ?&lt;/span&gt;

&lt;span class="go"&gt;Total number of prefixes 3&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2:~$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Begitu kita distribusikan protokol connected, maka prefix yang masuk tipe
connected di-import ke bgp kemudian di-advertise ke peer 172.16.3.1&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id="prefix-filter"&gt;Prefix filter&lt;/h4&gt;
&lt;p&gt;Seperti terlihat di atas, ada tiga prefix connected yang di advertise ke peer
bgp 172.16.3.1.
Umumnya kita tidak mau advertise semua prefix yang kita punya, contoh di atas
itu ada prefix 172.16.3.0/30, prefix ini dipakai buat koneksi inter-router antar
peer bgp, kita tidak mau prefix ini ikut di-advertise ke bgp neighbor.&lt;/p&gt;
&lt;p&gt;Di VyOS, ada dua cara filter prefix yang nantinya di-advertise ke peer. Pertama,
kita bisa filter waktu import prefix dari protokol lain, connected misalnya.
Kedua, kita filter di bgp advertisement.&lt;/p&gt;
&lt;p&gt;Maksudnya begini, jadi di kasus ini kita punya dua prefix connected yang mau
kita advertise ke peer bgp 172.16.3.1. Nah, prosesnya pertama dua prefix ini
diimport dari connected ke bgp, setelah itu baru di advertise ke peer bgp.
Nah kita bisa filter waktu import dari connected, atau filter prefix waktu
advertise ke peer bgp.
Kita bisa filter waktu prefix ini masuk bgp, jadi di internal bgp prefix sudah
tersaring. Atau kita bisa import prefix semuanya ke bgp tanpa filter, kemudian
waktu advertise ke peer baru difilter.&lt;/p&gt;
&lt;p&gt;Saya secara pribadi prefer filter di advertisement. Karena filter import kita
perlu filter masing-masing protokol non bgp, misalnya ada filter untuk
connected, filter buat static, filter buat ospf, dst.
Kalau filter advertisement, maka cukup satu rule filter saja.&lt;/p&gt;
&lt;p&gt;Kemudian filter prefix ke peer bgp ini harus ada supaya tidak ada route leak.
Misal saja kalau di bgp multihoming antar isp, biasanya bgp punya peer ke banyak
upstream, misal saja Indosat sama Telkom.&lt;/p&gt;
&lt;p&gt;Seperti yang saya sebutkan di atas, bgp secara default meng-advertise semua
prefix yang diterima dari bgp lain. Nah kita tidak mau misalnya prefix yang
kita terima dari Indosat kita advertise lagi ke Telkom, begitu juga sebaliknya.
Kecuali kalau kita jadi penyedia jasa ip transit, tapi bukan itu yang kita bahas
di sini.&lt;/p&gt;
&lt;p&gt;Di sini kita coba filter prefix 172.16.3.0/30 supaya tidak di-advertise ke peer
172.16.3.1.&lt;/p&gt;
&lt;p&gt;Langkah-langkah nya ada tiga:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Buat prefix list, kita kasih nama &lt;code&gt;LIST-ALLOW-PREFIX&lt;/code&gt;. List ini isinya semua
  prefix yang nantinya di-advertise ke peer bgp&lt;/li&gt;
&lt;li&gt;Buat route-map, nama route-map nya &lt;code&gt;BGP-EXPORT&lt;/code&gt;. Di route-map ini rule nya,
  pertama kita allow yang di prefix-list &lt;code&gt;LIST-ALLOW-PREFIX&lt;/code&gt;, kemudian prefix
  lainnya yang tidak ada di list di drop.&lt;/li&gt;
&lt;li&gt;Ketiga, route-map yang sudah dibuat di set ke peer 172.16.3.1 untuk export.
  route-map export dipakai buat filter prefix yang kita advertise ke peer, kalau
  route-map import dipakai buat filter prefix yang diterima dari 172.16.3.1.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Pertama, buat prefix list yang isinya prefix yang mau di-advertise. Ada dua
prefix-nya 192.168.1.0/24 sama 10.10.10.0/24&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;vyos@ROUTER2:~$&lt;/span&gt; configure
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; policy prefix-list LIST-ALLOW-PREFIX rule &lt;span class="m"&gt;10&lt;/span&gt; action permit
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; policy prefix-list LIST-ALLOW-PREFIX rule &lt;span class="m"&gt;10&lt;/span&gt; prefix &lt;span class="m"&gt;192&lt;/span&gt;.168.1.0/24
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; policy prefix-list LIST-ALLOW-PREFIX rule &lt;span class="m"&gt;11&lt;/span&gt; action permit
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; policy prefix-list LIST-ALLOW-PREFIX rule &lt;span class="m"&gt;11&lt;/span&gt; prefix &lt;span class="m"&gt;10&lt;/span&gt;.10.10.0/24
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; commit
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; show policy prefix-list LIST-ALLOW-PREFIX
&lt;span class="go"&gt; rule 10 {&lt;/span&gt;
&lt;span class="go"&gt;     action permit&lt;/span&gt;
&lt;span class="go"&gt;     prefix 192.168.1.0/24&lt;/span&gt;
&lt;span class="go"&gt; }&lt;/span&gt;
&lt;span class="go"&gt; rule 11 {&lt;/span&gt;
&lt;span class="go"&gt;     action permit&lt;/span&gt;
&lt;span class="go"&gt;     prefix 10.10.10.0/24&lt;/span&gt;
&lt;span class="go"&gt; }&lt;/span&gt;
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kedua, buat route-map yang isinya rule terima prefix dari prefix-list di atas,
kemudian drop prefix yang tidak ada di list.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; policy route-map BGP-EXPORT rule &lt;span class="m"&gt;10&lt;/span&gt; action permit
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; policy route-map BGP-EXPORT rule &lt;span class="m"&gt;10&lt;/span&gt; match ip address prefix-list LIST-ALLOW-PREFIX
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; policy route-map BGP-EXPORT rule &lt;span class="m"&gt;50&lt;/span&gt; action deny
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; commit
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; show policy route-map
&lt;span class="go"&gt; route-map BGP-EXPORT {&lt;/span&gt;
&lt;span class="go"&gt;     rule 10 {&lt;/span&gt;
&lt;span class="go"&gt;         action permit&lt;/span&gt;
&lt;span class="go"&gt;         match {&lt;/span&gt;
&lt;span class="go"&gt;             ip {&lt;/span&gt;
&lt;span class="go"&gt;                 address {&lt;/span&gt;
&lt;span class="go"&gt;                     prefix-list LIST-ALLOW-PREFIX&lt;/span&gt;
&lt;span class="go"&gt;                 }&lt;/span&gt;
&lt;span class="go"&gt;             }&lt;/span&gt;
&lt;span class="go"&gt;         }&lt;/span&gt;
&lt;span class="go"&gt;     }&lt;/span&gt;
&lt;span class="go"&gt;     rule 50 {&lt;/span&gt;
&lt;span class="go"&gt;         action deny&lt;/span&gt;
&lt;span class="go"&gt;     }&lt;/span&gt;
&lt;span class="go"&gt; }&lt;/span&gt;
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ketiga, setelah rule di route-map BGP-EXPORT kita set ke peer&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; protocols bgp &lt;span class="m"&gt;64512&lt;/span&gt; neighbor &lt;span class="m"&gt;172&lt;/span&gt;.16.3.1 route-map &lt;span class="nb"&gt;export&lt;/span&gt; BGP-EXPORT
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; commit
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; save
&lt;span class="go"&gt;Saving configuration to &amp;#39;/config/config.boot&amp;#39;...&lt;/span&gt;
&lt;span class="go"&gt;Done&lt;/span&gt;
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2# ##&lt;/span&gt; refresh bgp untuk out advertisement supaya pakai rule baru
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; run reset ip bgp &lt;span class="m"&gt;172&lt;/span&gt;.16.3.1 out
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2# ##&lt;/span&gt; cek prefix yang di advertise
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; run sh ip bgp neigh &lt;span class="m"&gt;172&lt;/span&gt;.16.3.1 adv
&lt;span class="go"&gt;BGP table version is 0, local router ID is 172.16.3.2&lt;/span&gt;
&lt;span class="go"&gt;Status codes: s suppressed, d damped, h history, * valid, &amp;gt; best, i - internal,&lt;/span&gt;
&lt;span class="go"&gt;              r RIB-failure, S Stale, R Removed&lt;/span&gt;
&lt;span class="go"&gt;Origin codes: i - IGP, e - EGP, ? - incomplete&lt;/span&gt;

&lt;span class="go"&gt;   Network          Next Hop            Metric LocPrf Weight Path&lt;/span&gt;
&lt;span class="go"&gt;*&amp;gt; 10.10.10.0/24    172.16.3.2               1         32768 ?&lt;/span&gt;
&lt;span class="go"&gt;*&amp;gt; 192.168.1.0/24   172.16.3.2               1         32768 ?&lt;/span&gt;

&lt;span class="go"&gt;Total number of prefixes 2&lt;/span&gt;
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Berhasil, cuma prefix yang ada di list LIST-ALLOW-PREFIX yang di advertise ke
172.16.3.1&lt;/p&gt;
&lt;p&gt;Bagaimana dengan &lt;em&gt;route-map import?&lt;/em&gt; &lt;em&gt;route-map import&lt;/em&gt; kita pakai kalau kita perlu
filter atau modifikasi atribut routing yang kita terima dari peer bgp.&lt;/p&gt;
&lt;p&gt;Ada banyak yang bisa kita buat di route-map. Di bgp multihoming misalnya, contoh
saja kita punya dua peer bgp, dua-duanya meng-advertise ke bgp kita prefix yang
sama, anggap saja prefix Google 8.8.8.0/24.&lt;/p&gt;
&lt;p&gt;Kita mau traffic ke network Google ini lewat peer A, kita bisa buat prefix-list
yang isinya 8.8.8.0/24, kemudian kita buat rule di route-map buat modifikasi
atribut localpref ke angka yang lebih besar dari default, kemudian route-map
ini kita set ke neighbor A untuk import.&lt;/p&gt;
&lt;p&gt;Jadi fungsi route-map bukan cuma buat filter prefix, tapi juga bisa buat
modifikasi atribut routing bgp. Silakan bereksperimen dengan route-map.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="ospf-open-shortest-path-first"&gt;OSPF (Open Shortest Path First)&lt;/h3&gt;
&lt;p&gt;Dynamic protocol berikutnya, OSPF. OSPF masuk dalam kategori &lt;em&gt;Interior Gateway
Protocol&lt;/em&gt; atau &lt;strong&gt;IGP&lt;/strong&gt;, kategori lainnya &lt;strong&gt;EGP&lt;/strong&gt; atau &lt;em&gt;Exterior Gateway Protocol&lt;/em&gt;, BGP di
atas masuk kategori EGP. IGP artinya protokol ini cuma hidup dan berjalan di
satu lingkup AS saja, bukan seperti BGP di atas yang bisa nyeberang antar AS.
Karena itu OSPF cuma dipakai internal saja dalam satu Autonous System.&lt;/p&gt;
&lt;p&gt;Kemudian OSPF ini tipe protokolnya link-state routing protocol. Yang artinya,
apa yang diumumkan atau di advertise ke tetangga ospf bukan routing
tapi kondisi terkini link router.&lt;/p&gt;
&lt;p&gt;Jadi cara kerjanya ospf seperti ini, masing-masing router ospf punya database
yang namanya link state database.
Kondisi link interface, berapa bandwidth link itu, ada yang
100 Mbps ada yang 1 Gbps, network nya di link itu apa saja, semuanya
disimpan di link state database atau &lt;strong&gt;lsdb&lt;/strong&gt;. Nah, kondisi terkini link
router ini di advertise ke semua tetangga ospf, proses pengumuman atau
advertising ini di ospf namanya &lt;em&gt;Link State Advertisement&lt;/em&gt; atau &lt;strong&gt;LSA&lt;/strong&gt;. Jadi
setiap router yang terkoneksi ospf saling kirim LSA yang pada akhirnya,
masing-masing router ospf punya database LSDB yang identik, dan LSDB
inilah gambaran topologi jaringan OSPF.&lt;/p&gt;
&lt;p&gt;Misal ada 10 router ospf yang saling terhubung, kesepuluh router ini punya
gambaran lsdb yang sama. Waktu ada salah satu router mengalami perubahan kondisi
link, anggap saja link nya down, maka perubahan ini di-broadcast ke semua
neighbor atau tetangga ospf. Jadi kalau router pertama ada link yang down,
router kesepuluh bakal tau.&lt;/p&gt;
&lt;p&gt;Selanjutnya dari gambaran topologi yang ada di LSDB ini, masing-masing router
secara independen malakukan kalkulasi jalur routing.&lt;/p&gt;
&lt;p&gt;Buat memperjelas gambaran Link-State protocol ini dengan yang lain seperti
distance vector, bayangkan teman-teman ada di sebuah kota yang belum pernah
ke situ sebelumnya, jadi jalan-jalan di situ asing. Anggap sekarang ada di titik
A mau menuju ke titik B. Untuk yang non link-state, maka teman-teman tinggal
jalan saja ikuti petujuk jalan, kalau ketemu simpangan terus ada tanda ke arah B
belok kanan, maka belok kanan, tandanya ke kiri maka ikuti ke kiri. Kalau ikuti
terus petunjuk jalan ini, nanti pada akhirnya sampai di titik B.&lt;/p&gt;
&lt;p&gt;Kalau untuk link-state protocol, beda. Link state protocol kita pegang map atau
peta, jadi dari awal kita sudah tau gambaran jalan-jalannya, di mana posisi kita
sekarang dan di mana posisi titik B. Dari map ini kita bisa hitung lewat mana
sih jalan yang tercepat kalau mau ke titik B, jadi tidak perlu ikuti petunjuk
jalan. Kalau ada gang-gang kecil tapi lewat situ lebih cepat, bisa lewat situ.&lt;/p&gt;
&lt;p&gt;Kira-kira seperti itu apa yang dilihat oleh router ospf, jadi masing-masing
punya map di lsdb yang setiap router map nya sama, dari map ini masing-masing
router secara independen menghitung jarak terpendek menuju tujuan. Pakai map
lsdb ini maka jaringan bebas loop, ingat looping di atas yang cuma bolak-balik
tidak bisa sampai tujuan, kondisi looping ini tidak bisa terjadi di ospf karena
jalurnya sudah dihitung berdasarkan gambaran topologi lsdb.&lt;/p&gt;
&lt;p&gt;Bayangkan kalau pakai non link-state seperti di atas yang kita cuma ikuti
petunjuk jalan. Kita cuma tau belok kiri, belok kanan atau lurus. Kemudian setelah
beberapa belokan ternyata kita sampai di simpangan yang sebelumnya sudah
dilewati, akhirnya cuma berputar-putar di situ-situ saja tidak bisa sampai
tujuan. Karena setelah diperiksa ternyata petunjuk jalannya salah pasang, dan di
dunia routing hal itu juga bisa saja terjadi.&lt;/p&gt;
&lt;p&gt;Sampai sini kita sudah paham bahwa OSPF masuk kategori IGP yang cuma beroperasi
dalam satu lingkup Autonomous System. Kemudian OSPF adalah salah satu tipe link
state routing protocol.&lt;/p&gt;
&lt;p&gt;Sebelum kita lanjut, saya informasikan kalau ospf ini detail teknisnya agak rumit
dan saya tidak bahas ospf sampai detail karena sepertinya butuh bab sendiri buat
ospf dan bakal panjang dan membosankan.&lt;/p&gt;
&lt;p&gt;Di sini saya cuma usahakan bagaimana ospf bisa up dan running tanpa tau detail
bagaimana ospf itu kerjanya. Anggap seperti orang yang belajar nyetir mobil, dia
tidak perlu tau detail bagaimana cara kerja mesin.&lt;/p&gt;
&lt;p&gt;Minimalnya kalau mau buat jaringan OSPF, paling tidak ada dua informasi yang
perlu kita tau; Area sama Network.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Area&lt;/strong&gt;. Area di ospf fungsinya segmentasi logis router. Jadi ada sekelompok
router di area A, ada lagi sekelompok router di area B, dan seterusnya.&lt;/p&gt;
&lt;p&gt;Bayangkan kalau misalnya kita punya 100 router yang terkoneksi ospf di satu
area, ukuran lsdb pasti bengkak, terus kalau salah satu router mengalami perubahan
link state, maka LSA akan membanjiri jaringan.&lt;/p&gt;
&lt;p&gt;Di sini fungsi area, kita bisa secara logis mengelompokkan router-router ke
beberapa area terpisah. Dengan pengelompokan area ini, router ospf cuma
me-maintain lsdb di area yang sama. Artinya router-router ini cuma tau topologi
di areanya saja, topologi di area lain tidak kelihatan.&lt;/p&gt;
&lt;p&gt;Ada beberapa tipe area di ospf, di sini dua saja yang akan saya bahas. Pertama
standard area, dan kedua stub area. Area di ospf ditulis seperti format ip
address, misal 0.0.0.0 atau 192.168.1.0, dst.&lt;/p&gt;
&lt;p&gt;Ada satu standard area yang wajib ada di ospf, namanya area backbone atau area 0.
Area backbone bisa ditulis pakai 0.0.0.0 atau cukup 0. Semua area selain
backbone harus terkoneksi ke area ini.&lt;/p&gt;
&lt;p&gt;Area yang satu lagi namanya stub area. Tipe area ini area tertutup, artinya
jalan keluar masuk area ini cuma lewat satu pintu saja, satu router.
Jadi di area stub ini ada satu router yang fungsinya jadi gateway ke network di
luar area, router ini disebut ABR atau Area Border Router.&lt;/p&gt;
&lt;p&gt;Fungsi router ABR ini meng-inject default route ke area stub, jadi nantinya
semua router di area stub ini punya entri routing default route 0.0.0.0/0 yang
gateway-nya router ABR.&lt;/p&gt;
&lt;p&gt;Jadi di area stub ini tidak semua routing ospf ada, cuma ada routing intra-area
atau routing di area stub ini saja, plus satu routing untuk default gateway
lewat router ABR. Karena itu traffic LSA di area ini tidak besar, jadinya ukuran
lsdb juga kecil.&lt;/p&gt;
&lt;p&gt;Karena ukuran lsdb-nya yang kecil, tipe area ini cocok buat router-router kecil
yang tidak punya memori besar.&lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/ip_route/ospf_area.png" alt="OSPF Area" title="OSPF Area" /&gt;
&lt;/div&gt;

&lt;p&gt;Jadi kapan kita pakai area stub? Pertimbangannya, kalau area ini area jalan
buntu, keluar masuk area cuma ada satu jalan saja, lewat router ABR. Kedua,
kalau router-router di area ini router kecil yang cuma perlu default route.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Network&lt;/strong&gt;. Di dalam area ospf, apakah itu standard area atau stub area, di
dalam area ini ada network nya, misal network 10.10.10.0/24 masuk area backbone,
dan network 192.168.1.0/24 masuk area 192.168.1.0 yang tipe areanya stub. Di
dalam satu area bisa ada lebih dari satu network.&lt;/p&gt;
&lt;p&gt;Misal kalau kita set network 10.10.10.0/24 ke area backbone, maka ospf bakal cek
interface router yang mana saja yang masuk ke network 10.10.10.0/24. Kalau
misalnya interface eth0 ada ip address 10.10.10.1 maka eth0 dimasukkan ke ospf
dan ospf mulai mem-broadcast LSA lewat eth0.&lt;/p&gt;
&lt;p&gt;Ospf membentuk adjacency kalau router ada deteksi router ospf lain yang punya
network sama dan ada di area yang sama.
Jadi kalau ada dua atau lebih router ospf di satu broadcast domain, punya
network yang sama dan network ini ada di area yang sama maka bakal terbentuk
adjcency antar router ospf yang saling bertetangga. Kalau sudah terbentuk
adjacency, router bisa saling broadcast LSA masing-masing.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id="route-redistribution"&gt;Route redistribution&lt;/h4&gt;
&lt;p&gt;Seperti juga bgp di atas, kita juga bisa import routing dari protokol lain ke
ospf supaya router yang lain tau jalur ke prefix ini.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h4 id="konfigurasi-ospf"&gt;Konfigurasi OSPF&lt;/h4&gt;
&lt;p&gt;Kita pakai lagi router untuk setting bgp di atas buat ospf. Jadi router1 ip
addressnya 172.16.3.1/30 dan router router2 172.16.3.2/30.
Router2 punya dua prefix connected, 10.10.10.0/24 sama 192.168.1.0/24 yang dua
prefix connected ini nantinya kita inject ke ospf.&lt;/p&gt;
&lt;p&gt;Router1 dan router2 terkoneksi satu broadcast domain di network 172.16.3.0/30.
Network ini yang kita pakai dan set ke area 0 atau area backbone.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;vyos@ROUTER1:~$&lt;/span&gt; configure
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER1#&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; protocols ospf area &lt;span class="m"&gt;0&lt;/span&gt; network &lt;span class="m"&gt;172&lt;/span&gt;.16.3.0/30
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER1#&lt;/span&gt; show protocols ospf
&lt;span class="go"&gt;+area 0 {&lt;/span&gt;
&lt;span class="go"&gt;+    network 172.16.3.0/30&lt;/span&gt;
&lt;span class="go"&gt;+}&lt;/span&gt;
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER1#&lt;/span&gt; commit
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER1#&lt;/span&gt; save
&lt;span class="go"&gt;Saving configuration to &amp;#39;/config/config.boot&amp;#39;...&lt;/span&gt;
&lt;span class="go"&gt;Done&lt;/span&gt;
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER1#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Router1 sudah terset, tinggal router2.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;vyos@ROUTER2:~$&lt;/span&gt; configure
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; protocols ospf area &lt;span class="m"&gt;0&lt;/span&gt; network &lt;span class="m"&gt;172&lt;/span&gt;.16.3.0/30
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; commit
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kalau sudah berhasil terbentuk adjacency, kita bisa lihat detail tetangga ospf
kita.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; run show ip ospf neighbor

&lt;span class="go"&gt;    Neighbor ID Pri State           Dead Time Address         Interface            RXmtL RqstL DBsmL&lt;/span&gt;
&lt;span class="go"&gt;172.16.3.1        1 2-Way/DROther     34.366s 172.16.3.1      eth0:172.16.3.2          0     0     0&lt;/span&gt;
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Berhasil, neighbor 172.16.3.1 terbaca dari router2.
Di salah satu router ospf kita bisa cek routing ospf pakai command &lt;code&gt;show ip
route ospf&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;vyos@ROUTER1:~$&lt;/span&gt; show ip route ospf
&lt;span class="go"&gt;Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,&lt;/span&gt;
&lt;span class="go"&gt;       I - ISIS, B - BGP, &amp;gt; - selected route, * - FIB route&lt;/span&gt;

&lt;span class="go"&gt;O   172.16.3.0/30 [110/10] is directly connected, eth1, 00:08:32&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER1:~$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Cuma ada satu prefix 172.16.3.0/30.
Berikutnya di router2 kita coba import prefix connected ke ospf.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; &lt;span class="nb"&gt;set&lt;/span&gt; protocols ospf redistribute connected
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt; commit
&lt;span class="go"&gt;[edit]&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER2#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Cek lagi di router1, apa sudah ada prefix yang diimport.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;vyos@ROUTER1:~$&lt;/span&gt; show ip route ospf
&lt;span class="go"&gt;Codes: K - kernel route, C - connected, S - static, R - RIP, O - OSPF,&lt;/span&gt;
&lt;span class="go"&gt;       I - ISIS, B - BGP, &amp;gt; - selected route, * - FIB route&lt;/span&gt;

&lt;span class="go"&gt;O   10.10.10.0/24 [110/20] via 172.16.3.2, 00:00:03&lt;/span&gt;
&lt;span class="go"&gt;O   172.16.3.0/30 [110/10] is directly connected, eth1, 00:11:09&lt;/span&gt;
&lt;span class="go"&gt;O   192.168.1.0/24 [110/20] via 172.16.3.2, 00:00:03&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER1:~$&lt;/span&gt;
&lt;span class="gp"&gt;vyos@ROUTER1:~$&lt;/span&gt; ping &lt;span class="m"&gt;10&lt;/span&gt;.10.10.1
&lt;span class="go"&gt;PING 10.10.10.1 (10.10.10.1) 56(84) bytes of data.&lt;/span&gt;
&lt;span class="go"&gt;64 bytes from 10.10.10.1: icmp_req=1 ttl=64 time=0.677 ms&lt;/span&gt;
&lt;span class="go"&gt;64 bytes from 10.10.10.1: icmp_req=2 ttl=64 time=1.13 ms&lt;/span&gt;
&lt;span class="go"&gt;^C&lt;/span&gt;
&lt;span class="go"&gt;--- 10.10.10.1 ping statistics ---&lt;/span&gt;
&lt;span class="go"&gt;2 packets transmitted, 2 received, 0% packet loss, time 1001ms&lt;/span&gt;
&lt;span class="go"&gt;rtt min/avg/max/mdev = 0.677/0.905/1.133/0.228 ms&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Prefix 10.10.10.0/24 sama 192.168.1.0/24 terbaca dari router1 dan gatewaynya
router2 yang address nya 172.16.3.2.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Baik, saya rasa sudah cukup panjang dan saya cuma sampai di sini. Selanjutnya
silakan teman-teman lanjutkan sendiri eksperimen nya.&lt;/p&gt;
&lt;p&gt;Kalau ada koreksi, saran, kritik atau komentar silakan disampaikan.&lt;/p&gt;
&lt;p&gt;Terima kasih dan semoga bermanfaat.&lt;/p&gt;</content><category term="Networking"></category></entry><entry><title>Test-driven development (TDD) bukan sekedar unit testing</title><link href="//devnull.web.id/programming/test-driven-development.html" rel="alternate"></link><published>2018-08-18T07:35:00+08:00</published><updated>2018-08-18T07:35:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2018-08-18:/programming/test-driven-development.html</id><summary type="html">&lt;p&gt;TDD atau Test-driven development?&lt;/p&gt;
&lt;p&gt;Yes.., istilah yang lagi ngetrend di dunia software development. Apa dan bagaimana TDD ini? di bawah, saya tuliskan apa itu TDD menurut apa yang saya pahami. Mungkin tidak terlalu akurat tapi paling tidak itulah pemahaman saya tentang metode development ini, silakan dilanjut.&lt;/p&gt;
&lt;p&gt;Jadi sebenarnya, istilah Test-driven …&lt;/p&gt;</summary><content type="html">&lt;p&gt;TDD atau Test-driven development?&lt;/p&gt;
&lt;p&gt;Yes.., istilah yang lagi ngetrend di dunia software development. Apa dan bagaimana TDD ini? di bawah, saya tuliskan apa itu TDD menurut apa yang saya pahami. Mungkin tidak terlalu akurat tapi paling tidak itulah pemahaman saya tentang metode development ini, silakan dilanjut.&lt;/p&gt;
&lt;p&gt;Jadi sebenarnya, istilah Test-driven development ini sudah lama saya baca dan dengar sekilas, tapi kurang menarik minat saya untuk mempelajari lebih lanjut. Alasannya karena satu, karena koding cuma sekedar hobi dan bukan hal serius buat saya waktu itu, saya belum pernah terlibat di project software development yang kompleks. Kedua, karena menurut saya developer yang pakai metode ini seperti kurang kerjaan, siapa yang punya waktu buat nulis kode yang dipakai buat ngetes kodenya sendiri? yang bahkan kode tes ini bisa lebih rumit dan lebih panjang dari kode yang dites.&lt;/p&gt;
&lt;p&gt;Dan akhir-akhir ini waktu saya mulai belajar lagi tentang praktek software engineering yang kekinian, termasuk konsep TDD yang saya review lagi. Dan ada sepotong kalimat di Wikipedia, mengatakan bahwa &lt;a href="https://en.wikipedia.org/wiki/Test-driven_development#Test-driven_development_cycle"&gt;kode tes ditulis lebih dulu dari kode yang dites&lt;/a&gt; dan ini yang malah yang jadi core idea nya TDD.&lt;br /&gt;
Nah apa maksudnya ini, tulis kode tes buat ngetes kode yang belum ada? jawabannya karena inti dari TDD bukan tentang tes. Ya, setelah baca sana sini, saya berkesimpulan bahwa Test-driven development atau TDD ini bukan tentang &lt;strong&gt;test&lt;/strong&gt;, memang ada kata &lt;em&gt;test&lt;/em&gt; tapi bukan itu intinya.&lt;br /&gt;
Jadi selama ini saya salah karena memahami bahwa TDD dan unit testing itu sama. Ternyata bukan begitu, TDD ini lebih tentang &lt;strong&gt;Spesifikasi dan Implementasi&lt;/strong&gt;, TDD lebih ke desain daripada praktek unit testing.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id="spesifikasi-dan-implementasi"&gt;Spesifikasi dan Implementasi&lt;/h3&gt;
&lt;p&gt;Kalau tentang spesifikasi dan implementasi, saya rasa ini tidak asing. Di bahasa pemrograman C misalnya ada C89 dan C99. Bahkan diluar programming pun, banyak contohnya, seperti protokol komunikasi yang spesifikasinya dirumuskan di artikel rfc.&lt;/p&gt;
&lt;p&gt;Spesifikasi ini lebih seperti desain dan rule set, sedangkan implementasi seperti.. ya implementasi. Contoh saja begini, dalam komunikasi protokol HTTP misalnya, ada beberapa server http yang kita kenal seperti Apache, Nginx, atau Lighttpd. Ini servernya, sedangkan http client ada web browser yang lebih banyak lagi macamnya, ada Google Chrome atau Mozilla Firefox, dan sebagainya.&lt;br /&gt;
Mereka yang bermacam-macam ini berbicara dengan bahasa yang sama, bahasa http. Prosesnya, client semisal web browser request resource di web, kalau sukses servernya membalas dengan kode 200. Semua web browser paham ini, kalau kode 200 berarti OK. Atau kalau misalnya file yang diminta tidak ditemukan, kode balasannya error 404. Server apa saja kode balasannya sama, dan client apa saja bisa mengerti ini.&lt;/p&gt;
&lt;p&gt;Nah dari sini, protokol komunikasi http ini dinamakan spesifikasi, sementara server dan client yang bermacam-macam itu implementasinya, mereka mengimplementasikan spesifikasi http. Tapi biarpun mengimplementasikan spesifikasi yang sama, bisa jadi cara implementasinya tidak sama, karena itu kadang implementasi yang satu lebih baik dari yang lain. Contoh Nginx dan Apache2 yang sama-sama web server populer, Apache dikenal karena full feature sedangkan Nginx dikenal dengan kecepatannya, ini karena cara implementasi yang tidak sama. Begitu juga client http nya, antara Chrome dan Firefox tentu saja ada perbedaan.&lt;/p&gt;
&lt;p&gt;Lebih spesifik ke programming, ambil contoh di bahasa C. Bahasa C ini bahasa pemrograman yang terstandar dan library nya ada yang namanya standard library.&lt;br /&gt;
Ambil contoh untuk konversi string ke integer, kita bisa pakai function &lt;code&gt;atoi()&lt;/code&gt;. Function &lt;code&gt;atoi()&lt;/code&gt; ini didefinisikan di header &lt;em&gt;stdlib.h&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Kalau kita baca manualnya &lt;code&gt;atoi()&lt;/code&gt;, function ini meng-convert string ke integer, inputnya pointer ke char dan outputnya integer. Char pointer bisa disebut saja dengan string kalau di bahasa lain, di C tidak ada tipe data string tapi anggap saja string.&lt;/p&gt;
&lt;p&gt;Jadi spesifikasi &lt;code&gt;atoi()&lt;/code&gt; ini jelas, fungsinya merubah huruf ke angka, inputnya string outputnya angka integer. Nah sedangkan implementasinya, ada beberapa yang umum di instalasi Linux, ada glibc atau GNU C Library ada juga uClibc yang lebih ringan dan biasa dipakai di system embed.&lt;br /&gt;
Dua library ini mengimplementasikan spesifikasi yang sama, entah kita pakai library dari GNU atau uClibc, function &lt;code&gt;atoi()&lt;/code&gt; bisa dipakai dan fungsinya sama, hasilnya juga sama biarpun mungkin yang satu lebih bagus atau lebih cepat dari yang lain.&lt;/p&gt;
&lt;p&gt;Di bahasa pemrograman lain, seperti Python pun sama. Python ini sebenarnya spesifikasi bahasa pemrograman yang implementasinya ada lebih dari satu. Ada yang implementasinya pakai bahasa C yang disebut CPython, ada yang pakai Java yang disebut Jython, bahkan ada yang diimplementasikan pakai framework .NET, namanya IronPython.&lt;/p&gt;
&lt;p&gt;Sekarang setelah paham tentang spesifikasi dan implementasi, kita kembali ke TDD, Test-driven development. Di TDD, kalau kita mau buat function atau class method, kita tidak langsung koding ngetik kodenya. Tapi, langkah pertama adalah mendefinisikan spesifikasi. Spesifikasi dibuat sejelas mungkin, nama function atau methodnya ini, fungsinya untuk ini, inputnya ini dan outputnya itu. Spesifikasi tidak membahas bagaimana cara implementasinya, karena itu tidak terlalu penting, yang penting adalah apa yang dilakukannya, bukan bagaimana cara melakukannya.&lt;/p&gt;
&lt;p&gt;Setelah ada gambaran spesifikasi, kemudian dibuat dokumentasi, ini berguna kalau ada programmer lain yang nantinya pakai function atau method ini. Setelah itu, kita buat kode test. Jadi, kode test disini fungsinya memastikan apakah function atau method yang kita buat itu sesuai dengan spesifikasi yang sudah dibuat diawal atau tidak. Kalau lolos tes, berarti kode kita sesuai dengan spesifikasi kalau tidak berarti ada yang salah dengan implementasinya.&lt;/p&gt;
&lt;p&gt;Untuk implementasinya, ada tiga rule yang direkomendasikan. Rule ini tidak strict harus diikuti, tapi saya tulis saja di sini:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Make it work.&lt;/li&gt;
&lt;li&gt;Make it right, dan&lt;/li&gt;
&lt;li&gt;Make it fast.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Jadi waktu koding implementasi, yang penting lolos uji dulu biarpun kodenya kurang bagus. Setelah lolos tes pertama, baru selanjutnya diperbaiki dan terakhir baru optimasi.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 id="tdd-dengan-python-dan-unittest"&gt;TDD dengan Python dan Unittest&lt;/h2&gt;
&lt;p&gt;Sekarang kita coba pakai contoh TDD pakai bahasa Python, test pakai library unittest.&lt;br /&gt;
Misal kita perlu sebuah function untuk hitung kelipatan dua dari angka yang diinput, misal inputnya 5 hasilnya 10, inputnya 3 hasilnya 6.&lt;/p&gt;
&lt;p&gt;Pertama, deskripsikan dengan jelas spesifikasinya.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Nama function : kali_dua(input)&lt;/li&gt;
&lt;li&gt;Fungsi        : Menghitung kelipatan 2 dari input&lt;/li&gt;
&lt;li&gt;Input         : Integer yang akan dihitung&lt;/li&gt;
&lt;li&gt;Output        : Integer hasil proses&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Siapapun yang baca spesifikasi ini pasti paham penggunaannya.&lt;/p&gt;
&lt;p&gt;Selanjutnya, buat kode tes di file yang terpisah dari kode yang dites. Misal nama filenya &lt;em&gt;test_hitung.py&lt;/em&gt; dan nama file kode nya &lt;em&gt;hitung.py&lt;/em&gt;&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/env python&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;unittest&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;hitung&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestHitung&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_kali_dua&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertTrue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hitung&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kali_dua&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Di kode tes di atas itu kita coba tes dengan input angka 5 dan cek hasilnya apa benar hasilnya 10.&lt;br /&gt;
Dan kalau test ini dijalankan:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;test_hitung&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;

&lt;span class="n"&gt;E&lt;/span&gt;
&lt;span class="o"&gt;======================================================================&lt;/span&gt;
&lt;span class="n"&gt;ERROR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;test_kali_dua&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestHitung&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;----------------------------------------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="k"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="ss"&gt;&amp;quot;test_hitung.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;test_kali_dua&lt;/span&gt;
    &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertTrue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hitung&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kali_dua&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;AttributeError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;module&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;object&lt;/span&gt; &lt;span class="n"&gt;has&lt;/span&gt; &lt;span class="k"&gt;no&lt;/span&gt; &lt;span class="n"&gt;attribute&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;kali_dua&amp;#39;&lt;/span&gt;

&lt;span class="c1"&gt;----------------------------------------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Ran&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;

&lt;span class="n"&gt;FAILED&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;errors&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Error, karena di file hitung.py belum ada function &lt;code&gt;kali_dua()&lt;/code&gt;. Berikutnya mulai tulis kode implementasi. Kita buat kode yang sangat simpel saja yang penting lolos tes. Di file hitung.py, kita bisa buat kode seperti di bawah:&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/env python&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;kali_dua&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Kode ini sangat sederhana, return value nya terus 10 berapapun inputnya. Kita buat return value nya 10 karena di kode tes nya kita sudah lihat, tes itu ngecek apa benar hasilnya 10.&lt;/p&gt;
&lt;p&gt;Tes lagi.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;test_hitung&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;

&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="c1"&gt;----------------------------------------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Ran&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;

&lt;span class="n"&gt;OK&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Hasilnya OK, dari sini kita sudah tahu bahwa kode implementasi itu lolos tes.&lt;br /&gt;
Berikutnya, coba modifikasi kode tes, tes dengan input yang berbeda, 6 misalnya.&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/env python&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;unittest&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;hitung&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;TestHitung&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestCase&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_kali_dua&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertTrue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hitung&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kali_dua&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertTrue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hitung&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kali_dua&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;unittest&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Test.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;test_hitung&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;
&lt;span class="n"&gt;F&lt;/span&gt;
&lt;span class="o"&gt;======================================================================&lt;/span&gt;
&lt;span class="n"&gt;FAIL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;test_kali_dua&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;__main__&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TestHitung&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="c1"&gt;----------------------------------------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Traceback&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;most&lt;/span&gt; &lt;span class="n"&gt;recent&lt;/span&gt; &lt;span class="k"&gt;call&lt;/span&gt; &lt;span class="k"&gt;last&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;span class="n"&gt;File&lt;/span&gt; &lt;span class="ss"&gt;&amp;quot;test_hitung.py&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;test_kali_dua&lt;/span&gt;
    &lt;span class="k"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;assertTrue&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hitung&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;kali_dua&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;AssertionError&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;False&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="k"&gt;not&lt;/span&gt; &lt;span class="k"&gt;true&lt;/span&gt;

&lt;span class="c1"&gt;----------------------------------------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Ran&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;

&lt;span class="n"&gt;FAILED&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;failures&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Gagal, karena input 6 hasinya tetap 10, bukan 12. Selanjutnya rule nomor 2, &lt;em&gt;make it right&lt;/em&gt;. Modifikasi kode supaya berapapun inputnya hasilnya kelipatan duanya.&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/env python&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;kali_dua&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Test lagi, hasilnya OK.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;test_hitung&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;

&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="c1"&gt;----------------------------------------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Ran&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;

&lt;span class="n"&gt;OK&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dengan begini, berapapun angka input hasilnya benar.&lt;br /&gt;
Tapi bagaimana kalau nantinya yang manggil function ini kasih input bukan angka tapi huruf? misalnya &lt;code&gt;kali_dua("abcd")&lt;/code&gt;. Kita bisa tambahkan verifikasi input, misalnya:&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/env python&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;kali_dua&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Input not an integer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Berikutnya, rule nomor 3 &lt;em&gt;make it fast&lt;/em&gt;.&lt;br /&gt;
Dari sudut pandang spesifikasi, kode kita sudah benar karena tidak ada error. Tapi kita bisa misalnya, optimasi kode supaya lebih efisien atau lebih cepat tanpa mempengaruhi hasil output, contoh:&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;1
2
3
4
5
6&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/env python&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;kali_dua&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nb"&gt;isinstance&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Input not an integer&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Kalau di tes lagi, hasilnya tetap OK, tidak ada yang berubah dari sudut pandang eksternal, biarpun di sisi internal implementasi ada perubahan.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;python&lt;/span&gt; &lt;span class="n"&gt;test_hitung&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;py&lt;/span&gt;

&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="c1"&gt;----------------------------------------------------------------------&lt;/span&gt;
&lt;span class="n"&gt;Ran&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="n"&gt;test&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;

&lt;span class="n"&gt;OK&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Jadi kita bisa modifikasi implementasi kode supaya lebih bagus dan setelah itu jalankan tes lagi supaya kita yakin bahwa perubahan itu tetap conform atau sesuai dengan spesifikasi dan tidak merusak fungsi program yang lain.&lt;/p&gt;
&lt;p&gt;Tentu saja ada saatnya kita pikir bahwa spesifikasi yang sekarang kurang bagus dan perlu diupdate, maka dokumentasi juga perlu diupdate dan juga kode tes nya harus diupdate.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id="benefits"&gt;Benefits&lt;/h3&gt;
&lt;p&gt;Sekarang bicara masalah benefit. Dari apa yang saya rasakan pakai metode ini, ada beberapa kelebihannya. Tapi, ini menurut saya pribadi yang tentu saja subjektif dan tidak merepresentasikan TDD.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Waktu debugging yang berkurang&lt;/strong&gt;&lt;br /&gt;
Sebelumnya, biasanya saya koding panjang sambil berharap kode ini nanti bakalan tidak error. Nyatanya, berjam-jam kemudian waktunya untuk debugging cari sumber problem.&lt;/p&gt;
&lt;p&gt;Dengan TDD tidak begitu, bukan berarti tidak ada bug, tapi lebih sedikit. Karena dengan TDD, kode dimulai dari sederhana, pastikan tidak ada error, kemudian improve dan improve.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Design program yang lebih modular&lt;/strong&gt;&lt;br /&gt;
Artinya, keterikatan antar modul jadi berkurang. Setiap function atau method bisa dengan gampang diganti kode implementasinya tanpa ada pengaruh ke bagian program yang lain.&lt;/p&gt;
&lt;p&gt;Problem ini disebut software regression, ketika satu bagian dimodifikasi, bagian lain jadi rusak, bug ini fix malah muncul bug baru yang lain. Dengan desain yang lebih decoupled atau modular, problem ini bisa diminimalisir.&lt;/p&gt;
&lt;p&gt;Satu rule function yang sering dilupakan, bahwa suatu function, method atau subroutine seharusnya cuma melakukan satu hal saja, tapi melakukannya dengan baik. TDD, bisa sedikit memaksa kita berpikir seperti ini.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Lebih reliable&lt;/strong&gt;&lt;br /&gt;
Biasanya, kalau kode program sudah panjang dan kompleks, modifikasi bagian program jadi agak ragu karena bisa jadi bagian yang lain jadi rusak. TDD dengan tes nya bisa buat kita lebih yakin dengan kode yang dibuat atau dirubah, karena tes itu memastikan kode tetap pada jalur.&lt;/p&gt;
&lt;p&gt;Paling tidak, beberapa hal di atas ini yang saya rasakan sisi lebihnya. Kalau minusnya, nulis kode jadi lebih lama, selain karena harus nulis tes juga karena berpikir lebih lama diawal.&lt;/p&gt;
&lt;p&gt;Terakhir, Test-driven development bukanlah satu-satunya development model, bukan juga senjata yang ampuh disemua keadaan. Tapi menurut saya pribadi, TDD pantas untuk dipelajari.&lt;br /&gt;
Saya yakin tidak semua sepakat dengan saya :)&lt;/p&gt;</content><category term="Programming"></category><category term="Programming"></category><category term="Python"></category></entry><entry><title>Subnetting IPv6 bisa semudah IPv4, bahkan lebih mudah.</title><link href="//devnull.web.id/networking/subnetting-ipv6-mudah.html" rel="alternate"></link><published>2017-10-18T13:55:00+08:00</published><updated>2017-10-18T13:55:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2017-10-18:/networking/subnetting-ipv6-mudah.html</id><summary type="html">&lt;div class="fimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/ipv6/fimg.jpg" alt="IPv6 Ready" title="IPv6" /&gt;
    &lt;p&gt;Image: ipv6forum.com&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Halo teman-teman pembaca, ini revisi tulisan saya sebelumnya tentang subnetting IPv6. Di tulisan sebelumnya ada sedikit kesalahan yang perlu saya koreksi, terima kasih kepada pembaca yang sudah mengoreksi.&lt;/p&gt;
&lt;p&gt;Jadi, ini dia.. sebut saja Subnetting IPv6 edisi revisi atau Subnetting IPv6 v2. :)&lt;/p&gt;
&lt;p&gt;Di tulisan sebelumnya ada beberapa rumus …&lt;/p&gt;</summary><content type="html">&lt;div class="fimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/ipv6/fimg.jpg" alt="IPv6 Ready" title="IPv6" /&gt;
    &lt;p&gt;Image: ipv6forum.com&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Halo teman-teman pembaca, ini revisi tulisan saya sebelumnya tentang subnetting IPv6. Di tulisan sebelumnya ada sedikit kesalahan yang perlu saya koreksi, terima kasih kepada pembaca yang sudah mengoreksi.&lt;/p&gt;
&lt;p&gt;Jadi, ini dia.. sebut saja Subnetting IPv6 edisi revisi atau Subnetting IPv6 v2. :)&lt;/p&gt;
&lt;p&gt;Di tulisan sebelumnya ada beberapa rumus, tapi di tulisan yang ini saya pakai lebih banyak gambar yang mungkin saja lebih memudahkan.&lt;/p&gt;
&lt;p&gt;Saya berasumsi teman-teman yang membaca ini sudah paling tidak sedikit memahami apa itu IPv6, perbedaannya dengan IPv4, penulisannya, dsb. Tapi kalau ternyata belum ngeh apa itu IPv6, jangan belajar subnetting dulu tapi baca artikel yang ini &lt;a href="http://devnull.web.id/networking/pengenalan-ipv6.html"&gt;&amp;ldquo;Hampir&amp;rdquo; Semua Tentang IPv6&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Baik, sebelum ke cara subnetting saya tulis lagi apa-apa saja yang perlu diketahui di IPv6.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 id="ipv4-dan-ipv6"&gt;IPv4 dan IPv6&lt;/h2&gt;
&lt;p&gt;Saya masih menemui ada teknisi jaringan yang beranggapan bahwa IPv4 dan IPv6 sama, hanya saja IPv6 jumlah IP address nya lebih banyak dari IPv4 dan penulisan alamatnya berbeda.&lt;br /&gt;
Tidak benar, IPv4 dan IPv6 tidak sama. IP (Internet Protocol), ada kata protokol di situ. Protokol itu satu set aturan yang sudah dirumuskan dan disepakati bersama.&lt;br /&gt;
Jadi apa pun perangkat jaringannya selama dia perangkat IP di layer 3, entah itu server, router, atau smartphone, mereka berbicara dengan bahasa yang sama, bahasa IP atau protokol IP.&lt;br /&gt;
Nah protokol IP saat ini di ada dua, protokol versi 4 (IPv4) dan protokol versi 6 (IPv6). Keduanya ini biarpun masih sama-sama IP tapi bahasanya sudah berbeda, jadi tidak kompatibel satu sama lain.&lt;/p&gt;
&lt;p&gt;Kemudian di IPv4, kita terbiasa subnetting sampai bit terpanjang, misalnya /30 dari IPv4 yang 32 bit.&lt;br /&gt;
Di IPv6, rule nya beda. IPv6 sepanjang 128 bit, tapi subnet terkecil cuma sampai /64. Artinya dari bit ke 65 sampai bit ke 128 jadi alamat host, tidak ada subnetting /72 atau /96.&lt;sup&gt;[1]&lt;/sup&gt;&lt;br /&gt;
Jadi IPv6 itu /64 everywhere, biarpun network isinya cuma 10 host, tetap /64 yang dipakai. Tapi ada pengecualian untuk link inter-router, satu network yang isinya dua router. Untuk yang ini dipakai /127.&lt;sup&gt;[2]&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Lagi, di IPv4 biasanya kalau subnetting yang diingat itu alamat pertama network, alamat terakhir broadcast, ditengah-tengah alamat unicast atau alamat untuk host.&lt;br /&gt;
Di IPv6, tidak ada broadcast, jadi alamat terakhir bisa dipakai untuk host.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h2 id="subnetting-ipv6"&gt;Subnetting IPv6&lt;/h2&gt;
&lt;p&gt;Saya rasa kita punya masalah yang sama kalau berurusan sama IPv6, bilangan hex. Kita, atau paling tidak saya terbiasa pakai desimal, heksadesimal kelihatannya asing dan sulit.&lt;/p&gt;
&lt;p&gt;Tapi sesuai judulnya, subnetting IPv6 bisa lebih mudah dari IPv4. Bagaimana bisa?&lt;br /&gt;
Karena penulisannya pakai hex, itu yang bikin gampang. Iya, jadi hex itu malah mempermudah, karena subnetting itu tidak lepas dari bit bilangan biner, sedangkan satu karakter heksadesimal sama dengan 4 bit biner.  &lt;/p&gt;
&lt;p&gt;Saya ulangi lagi, &lt;em&gt;&lt;strong&gt;Satu karakter heksadesimal sama dengan 4 bit biner&lt;/strong&gt;&lt;/em&gt;  &lt;/p&gt;
&lt;p&gt;Contoh biner &lt;code&gt;11111111&lt;/code&gt; kalau di desimal ditulis &lt;code&gt;255&lt;/code&gt; tapi di hex ditulis &lt;code&gt;ff&lt;/code&gt; atau &lt;code&gt;0xff&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Dengan gambar mungkin bisa lebih dipahami.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Gambar 1.&lt;/strong&gt;
&lt;div class="aimg"&gt;
&lt;img src="//devnull.web.id/images/networking/ipv6/ipv6.png" title="IPv6" alt="IPv6" /&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;Kita pakai prefix &lt;code&gt;2002:db8:abcd:dead::/64&lt;/code&gt; di contoh ini. Prefix ini, &lt;code&gt;2001:db8::/32&lt;/code&gt; memang dikhususkan untuk dokumentasi, tutorial, dsb. &lt;sup&gt;[3]&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Keterangan gambar di bawah:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Notasi Hex IPv6: Ini prefix IPv6 yang kita pakai untuk contoh.&lt;/li&gt;
&lt;li&gt;Nomor Hex: Nomor kolom karakter heksadesimal.&lt;/li&gt;
&lt;li&gt;Jumlah bit: Panjang bit di kolom hex ke sekian. Misal hex &lt;code&gt;2001&lt;/code&gt;, karena &lt;code&gt;2001&lt;/code&gt; ada 4 kolom, panjang bit nya adalah 16, di notasi biner ditulis seperti ini &lt;code&gt;0010 0000 0000 0001&lt;/code&gt;. Paham? Jadi hex ke biner nya seperti ini &lt;code&gt;2=0010, 0=0000, 0=0000, 1=0001&lt;/code&gt;, satu hex sama dengan 4 bit biner.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kalau sudah bisa dipahami, kita ambil contoh.&lt;br /&gt;
Network &lt;code&gt;2001:db8::/32&lt;/code&gt;, bagi ke jaringan kecil &lt;code&gt;/34&lt;/code&gt;.&lt;br /&gt;
Dari sini ada beberapa istilah di bawah:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Network: di contoh ini &lt;code&gt;2001:db8::/32&lt;/code&gt; Ini network besarnya, artinya &lt;code&gt;/32&lt;/code&gt;, bit dari &lt;code&gt;33&lt;/code&gt; sampai &lt;code&gt;128&lt;/code&gt; punya kita dan bisa diatur semau kita, sedangkan bit &lt;code&gt;1&lt;/code&gt; sampai bit &lt;code&gt;32&lt;/code&gt; bukan punya kita dan tidak bisa kita rubah.&lt;/li&gt;
&lt;li&gt;Sub network atau subnet: subnet ini cabang dari network. Di contoh ini &lt;code&gt;/34&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Lebih jelasnya seperti gambar di bawah:&lt;/p&gt;
&lt;div class="aimg"&gt;
&lt;img src="//devnull.web.id/images/networking/ipv6/ipv6-subnetting.png" title="IPv6 Subnetting" alt="Subnetting IPv6" /&gt;
&lt;/div&gt;

&lt;p&gt;Jadi subnetting itu membagi network ke sub network atau subnet.  &lt;/p&gt;
&lt;p&gt;Nah pertanyaan di subnetting kan biasanya, berapa jumlah subnet, apa saja subnet-nya, berapa jumlah host, dsb.&lt;/p&gt;
&lt;p&gt;Baik, saya perkenalkan variabel lagi:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jumlah subnet (y):&lt;/strong&gt; kita sebut saya jumlah subnet dengan &lt;code&gt;y&lt;/code&gt;. Cara menghitungnya, &lt;code&gt;2 ^ (subnet - network)&lt;/code&gt;. Di contoh ini network /32 dibagi ke subnet /34. Jadi &lt;code&gt;2 ^ 34-32 = 2 ^ 2 = 4&lt;/code&gt;.&lt;br /&gt;
Lihat lagi gambar di atas, network /32 kalau dibagi ke /34, jadinya 4 subnet /34. Jadi &lt;code&gt;y = 4&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Jumlah host dalam subnet:&lt;/strong&gt; Gampang, &lt;code&gt;2 ^ 128 - subnet&lt;/code&gt;. Di contoh berarti &lt;code&gt;2 ^ 128-34 = 2 ^ 94&lt;/code&gt;. Silakan dihitung berapa hasil 2 pangkat 94.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Alamat subnet:&lt;/strong&gt; Ini yang agak tricky. Untuk menghitung alamat subnetnya, kita perlu beberapa variabel.&lt;br /&gt;
- &lt;em&gt;Nomor kolom hex (x)&lt;/em&gt;. Kembali ke gambar pertama, &lt;code&gt;x&lt;/code&gt; ini nomor kolom di bit subnet. Di contoh ini bit subnet 34, jadi &lt;code&gt;x&lt;/code&gt; atau nomor kolom di kolom 9.&lt;br /&gt;
Kenapa nomor 9? karena, ingat lagi satu hex = 4 bit biner, dan kolom nomor 9 ada 4 bit dari bit ke 33 sampai 36.&lt;/p&gt;
&lt;div class="aimg"&gt;
&lt;img src="//devnull.web.id/images/networking/ipv6/ipv6-cols.png" title="IPv6" alt="IPv6" /&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Kelipatan subnet (z)&lt;/em&gt;. &lt;code&gt;z&lt;/code&gt; ini dipakai untuk menghitung subnet selanjutnya. Di contoh, /32 dibagi ke /34 dan hasilnya ada 4 subnet /34. Jadi untuk mengetahui subnet /34 pertama, /34 ke dua, ke tiga, dan ke empat, caranya nomor kolom &lt;strong&gt;(x)&lt;/strong&gt; ditambah kelipatan subnet &lt;strong&gt;(z)&lt;/strong&gt; sama dengan subnet berikutnya.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="aimg"&gt;
&lt;img src="//devnull.web.id/images/networking/ipv6/ipv6-inc.png" title="IPv6" alt="IPv6" /&gt;
&lt;/div&gt;

&lt;p&gt;Perhatikan gambar di atas, jadi setiap kolom ada 4 bit, dan bit ini diberi nomor 1 sampai 4. Kalau bit subnet ada di nomor bit 1, maka kelipatan subnet berikutnya dengan menambahkan 8, &lt;em&gt;z = 8&lt;/em&gt;, kalau di nomor 2, maka &lt;em&gt;z = 4&lt;/em&gt;, nomor 3 &lt;em&gt;z = 2&lt;/em&gt; dan kalau di nomor 4 maka &lt;em&gt;z = 1&lt;/em&gt;.&lt;br /&gt;
Jadi untuk menghitung subnet berikutnya nomor kolom &lt;strong&gt;(x)&lt;/strong&gt; ditambah &lt;strong&gt;(z)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Di contoh ini, network &lt;code&gt;2001:db8::/32&lt;/code&gt; dibagi ke subnet /34, kita bisa terapkan perhitungannya.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;x&lt;/code&gt; nomor kolom. /34 ada di kolom 9.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;y&lt;/code&gt; atau jumlah subnet = 4. &lt;code&gt;2 ^ 34-32 = 2 ^ 2 = 4&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z&lt;/code&gt; kelipatan. /34 ada di nomor bit ke 2, jadi &lt;code&gt;z = 4&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jadi, tambahkan nomor kolom &lt;code&gt;x (9)&lt;/code&gt; dengan kelipatan &lt;code&gt;z (4)&lt;/code&gt; sampai jumlah subnet &lt;code&gt;y&lt;/code&gt; sama dengan 4.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="o"&gt;::/&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt;&lt;span class="o"&gt;::/&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt; &lt;span class="n"&gt;atau&lt;/span&gt; &lt;span class="n"&gt;bisa&lt;/span&gt; &lt;span class="n"&gt;ditulis&lt;/span&gt; &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="o"&gt;::/&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="o"&gt;::/&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="o"&gt;::/&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;
&lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c000&lt;/span&gt;&lt;span class="o"&gt;::/&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Kita lanjut dengan contoh lain.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Contoh 1.&lt;/strong&gt;&lt;br /&gt;
Diberikan network 2001:db8::/32, subnetting ke jaringan kecil /36. Berapa jumlah subnet, dan apa saja networknya?  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;x&lt;/code&gt; nomor kolom. /36 ada di kolom 9.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;y&lt;/code&gt; atau jumlah subnet = 16. &lt;code&gt;2 ^ 36-32 = 2 ^ 4 = 16&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z&lt;/code&gt; kelipatan. /36 ada di nomor bit ke 4, jadi &lt;code&gt;z = 1&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jadi, tambahkan nomor kolom &lt;code&gt;x&lt;/code&gt; dengan kelipatan &lt;code&gt;z&lt;/code&gt; sampai jumlah subnet &lt;code&gt;y&lt;/code&gt; sama dengan 16.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Hitung&lt;/span&gt; &lt;span class="n"&gt;dari&lt;/span&gt; &lt;span class="n"&gt;kiri&lt;/span&gt; &lt;span class="n"&gt;ke&lt;/span&gt; &lt;span class="n"&gt;kanan&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;karakter&lt;/span&gt; &lt;span class="n"&gt;ke&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="n"&gt;heksadesimal&lt;/span&gt; &lt;span class="n"&gt;kita&lt;/span&gt; &lt;span class="n"&gt;tambahkan&lt;/span&gt; &lt;span class="n"&gt;dengan&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Ulangi&lt;/span&gt; &lt;span class="n"&gt;terus&lt;/span&gt; &lt;span class="n"&gt;sampai&lt;/span&gt; &lt;span class="n"&gt;jumlah&lt;/span&gt; &lt;span class="n"&gt;subnet&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;atau&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;========================&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt;    &lt;span class="n"&gt;subnet&lt;/span&gt;
&lt;span class="o"&gt;========================&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;    &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt; &lt;span class="n"&gt;atau&lt;/span&gt; &lt;span class="n"&gt;bisa&lt;/span&gt; &lt;span class="n"&gt;ditulis&lt;/span&gt; &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;    &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;    &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;    &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;5&lt;/span&gt;    &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;6&lt;/span&gt;    &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;7&lt;/span&gt;    &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;8&lt;/span&gt;    &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;9&lt;/span&gt;    &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;10&lt;/span&gt;   &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;11&lt;/span&gt;   &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;12&lt;/span&gt;   &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;13&lt;/span&gt;   &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;14&lt;/span&gt;   &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;15&lt;/span&gt;   &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;16&lt;/span&gt;   &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Contoh 2.&lt;/strong&gt;&lt;br /&gt;
Dari network 2001:db8:c000::/34, bagi ke dalam 3 jaringan kecil.  &lt;/p&gt;
&lt;p&gt;Bisa kah?&lt;br /&gt;
Tidak bisa, kita pelu ingat bahwa &lt;code&gt;y&lt;/code&gt;, atau jumlah subnet adalah pangkat 2. Yaitu 1, 2, 4, 8, 16, 32, 64, dan seterusnya. Jadi membagi jaringan kedalam 3 jaringan kecil itu tidak bisa. Bisanya, kita ambil yang mendekati tapi tidak lebih kecil. Yang mendekati 3 tapi tidak lebih kecil dari 3 adalah 4, atau 2&lt;sup&gt;2&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Jadi, kita akan bagi &lt;code&gt;2001:db8:c000::/34&lt;/code&gt; kedalam 4 subnet kecil, atau y = 4.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;network&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt;
&lt;span class="n"&gt;subnet&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;tidak&lt;/span&gt; &lt;span class="n"&gt;diketahui&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt;       &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;

&lt;span class="n"&gt;Kita&lt;/span&gt; &lt;span class="n"&gt;cari&lt;/span&gt; &lt;span class="n"&gt;subnet&lt;/span&gt; &lt;span class="n"&gt;dengan&lt;/span&gt; &lt;span class="n"&gt;sedikit&lt;/span&gt; &lt;span class="n"&gt;aljabar&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

            &lt;span class="n"&gt;y&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;subnet&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt;
            &lt;span class="mi"&gt;4&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="o"&gt;^&lt;/span&gt; &lt;span class="n"&gt;subnet&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subnet&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;akar&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
 &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;subnet&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="n"&gt;subnet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
        &lt;span class="n"&gt;subnet&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;

&lt;span class="n"&gt;Jadi&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
 &lt;span class="n"&gt;network&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;34&lt;/span&gt;
 &lt;span class="n"&gt;subnet&lt;/span&gt;  &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;36&lt;/span&gt;
       &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;&lt;code&gt;x&lt;/code&gt; nomor kolom. /36 ada di kolom 9.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;y&lt;/code&gt; atau jumlah subnet = 4. &lt;code&gt;2 ^ 36-34 = 2 ^ 2 = 4&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z&lt;/code&gt; kelipatan. /36 ada di nomor bit ke 4, jadi &lt;code&gt;z = 1&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Hitung&lt;/span&gt; &lt;span class="n"&gt;dari&lt;/span&gt; &lt;span class="n"&gt;kiri&lt;/span&gt; &lt;span class="n"&gt;ke&lt;/span&gt; &lt;span class="n"&gt;kanan&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="n"&gt;atau&lt;/span&gt; &lt;span class="n"&gt;karakter&lt;/span&gt; &lt;span class="n"&gt;ke&lt;/span&gt; &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="n"&gt;heksadesimal&lt;/span&gt; &lt;span class="n"&gt;kita&lt;/span&gt; &lt;span class="n"&gt;tambahkan&lt;/span&gt; &lt;span class="n"&gt;dengan&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;karena&lt;/span&gt; &lt;span class="n"&gt;z&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;Ulangi&lt;/span&gt; &lt;span class="n"&gt;terus&lt;/span&gt; &lt;span class="n"&gt;sampai&lt;/span&gt; &lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="o"&gt;======================&lt;/span&gt;
&lt;span class="n"&gt;y&lt;/span&gt;   &lt;span class="n"&gt;subnet&lt;/span&gt;
&lt;span class="o"&gt;======================&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;   &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt; &lt;span class="n"&gt;atau&lt;/span&gt; &lt;span class="n"&gt;bisa&lt;/span&gt; &lt;span class="n"&gt;ditulis&lt;/span&gt; &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt;   &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;   &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;span class="mi"&gt;4&lt;/span&gt;   &lt;span class="mi"&gt;2001&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;db8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f000&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;br /&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Contoh 3.&lt;/strong&gt;&lt;br /&gt;
Di dalam network 2001:db8:e000::/36, berapa jumlah host yang ada di network tersebut, berapa alamat ip host pertama dan berapa alamat ip host terakhir?&lt;br /&gt;
Karena IPv6 sepanjang 128 bit, maka jumlah host untuk /36 adalah:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;2 ^ 128-36&lt;/span&gt;
&lt;span class="err"&gt;2 ^ 92&lt;/span&gt;
&lt;span class="err"&gt;4.951.760.157.000.000.000.000.000.000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Saya tidak tahu bagaimana menyebut angka diatas.&lt;/p&gt;
&lt;p&gt;Dalam network 2001:db8:e000::/36, host awal dan terakhir sbb:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;host pertama  : 2001:db8:e000:0000:0000:0000:0000:0001 atau bisa ditulis 2001:db8::1&lt;/span&gt;
&lt;span class="err"&gt;host terakhir : 2001:db8:efff:ffff:ffff:ffff:ffff:ffff&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Mengapa host terakhir &lt;code&gt;2001:db8:efff:ffff:ffff:ffff:ffff:ffff&lt;/code&gt;?&lt;br /&gt;
Karena alamat ini kalau ditambahkan 1 sudah masuk subnet /36 berikutnya yang alamat subnetnya &lt;code&gt;2002:db8:f000::/36&lt;/code&gt;, dan alamat host terakhir ini bukan alamat broadcast karena tidak ada broadcast di IPv6.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Contoh terakhir, contoh ke 4.&lt;/strong&gt;&lt;br /&gt;
Bagi network 2001:db8:e000::/36 ke subnet /41.&lt;/p&gt;
&lt;p&gt;Silahkan dihitung, kemudian bandingkan hasilnya dengan yang di bawah.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;=======================&lt;/span&gt;
&lt;span class="err"&gt;y   Subnet&lt;/span&gt;
&lt;span class="err"&gt;=======================&lt;/span&gt;
&lt;span class="err"&gt;1   2001:0db8:e000::/41&lt;/span&gt;
&lt;span class="err"&gt;2   2001:0db8:e080::/41&lt;/span&gt;
&lt;span class="err"&gt;3   2001:0db8:e100::/41&lt;/span&gt;
&lt;span class="err"&gt;4   2001:0db8:e180::/41&lt;/span&gt;
&lt;span class="err"&gt;5   2001:0db8:e200::/41&lt;/span&gt;
&lt;span class="err"&gt;6   2001:0db8:e280::/41&lt;/span&gt;
&lt;span class="err"&gt;7   2001:0db8:e300::/41&lt;/span&gt;
&lt;span class="err"&gt;8   2001:0db8:e380::/41&lt;/span&gt;
&lt;span class="err"&gt;9   2001:0db8:e400::/41&lt;/span&gt;
&lt;span class="err"&gt;10  2001:0db8:e480::/41&lt;/span&gt;
&lt;span class="err"&gt;11  2001:0db8:e500::/41&lt;/span&gt;
&lt;span class="err"&gt;12  2001:0db8:e580::/41&lt;/span&gt;
&lt;span class="err"&gt;13  2001:0db8:e600::/41&lt;/span&gt;
&lt;span class="err"&gt;14  2001:0db8:e680::/41&lt;/span&gt;
&lt;span class="err"&gt;15  2001:0db8:e700::/41&lt;/span&gt;
&lt;span class="err"&gt;16  2001:0db8:e780::/41&lt;/span&gt;
&lt;span class="err"&gt;17  2001:0db8:e800::/41&lt;/span&gt;
&lt;span class="err"&gt;18  2001:0db8:e880::/41&lt;/span&gt;
&lt;span class="err"&gt;19  2001:0db8:e900::/41&lt;/span&gt;
&lt;span class="err"&gt;20  2001:0db8:e980::/41&lt;/span&gt;
&lt;span class="err"&gt;21  2001:0db8:ea00::/41&lt;/span&gt;
&lt;span class="err"&gt;22  2001:0db8:ea80::/41&lt;/span&gt;
&lt;span class="err"&gt;23  2001:0db8:eb00::/41&lt;/span&gt;
&lt;span class="err"&gt;24  2001:0db8:eb80::/41&lt;/span&gt;
&lt;span class="err"&gt;25  2001:0db8:ec00::/41&lt;/span&gt;
&lt;span class="err"&gt;26  2001:0db8:ec80::/41&lt;/span&gt;
&lt;span class="err"&gt;27  2001:0db8:ed00::/41&lt;/span&gt;
&lt;span class="err"&gt;28  2001:0db8:ed80::/41&lt;/span&gt;
&lt;span class="err"&gt;29  2001:0db8:ee00::/41&lt;/span&gt;
&lt;span class="err"&gt;30  2001:0db8:ee80::/41&lt;/span&gt;
&lt;span class="err"&gt;31  2001:0db8:ef00::/41&lt;/span&gt;
&lt;span class="err"&gt;32  2001:0db8:ef80::/41&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Contoh sudah selesai, sekarang &lt;strong&gt;kuis&lt;/strong&gt;&lt;br /&gt;
Saya punya network &lt;code&gt;2001:db8::/32&lt;/code&gt;. Kemudian saya delegasikan 1 prefix /48 ke teman-teman. Prefix network-nya &lt;code&gt;2001:db8:abcd::/48&lt;/code&gt;.
Saya minta teman-teman bagi prefix network ini ke /56.&lt;/p&gt;
&lt;p&gt;Pertanyaan saya, berapa jumlah subnet nya, dan apa saja alamat subnet nya.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Baik saya rasa cukup, silakan kalau ada yang kurang jelas atau ada yang perlu dikoreksi lagi bisa tuliskan di komen.
Jangan lupa bantu share kalau artikel ini membantu pemahaman subnetting IPv6.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artikel berkaitan:&lt;/strong&gt;&lt;br /&gt;
&lt;a href="//devnull.web.id/networking/pengenalan-ipv6.html"&gt;&amp;ldquo;Hampir&amp;rdquo; Semua Tentang IPv6&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;Pengenalan dan Penjelasan yang berusaha biarpun gagal tapi lumayan komprehensif tentang IPv6, dari sejarah sampai pengalamatannya ditulis dengan Layman&amp;rsquo;s terms&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="//devnull.web.id/networking/jaringan-komputer-dasar.html"&gt;Belajar Jaringan Komputer Dasar - Layer OSI 1, 2, dan 3&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;Teori yang harus diketahui oleh setiap network engineer. Layer OSI 1, 2, dan 3, frame Ethernet dan paket IP, serta proses routing paket IP.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Refs:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;[1] RFC 5375 - Considerations for /64 Prefixes &lt;a href="https://tools.ietf.org/html/rfc5375#section-3.1"&gt;https://tools.ietf.org/html/rfc5375#section-3.1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2] RFC 6164 - Using 127-Bit IPv6 Prefixes on Inter-Router Links &lt;a href="https://tools.ietf.org/html/rfc6164"&gt;https://tools.ietf.org/html/rfc6164&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[3] RFC 3849 - IPv6 Address Prefix Reserved for Documentation &lt;a href="https://www.ietf.org/rfc/rfc3849"&gt;https://www.ietf.org/rfc/rfc3849&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content><category term="Networking"></category><category term="IPv6"></category></entry><entry><title>BlackBerry Messenger Rentan Mitm Attack</title><link href="//devnull.web.id/networking/bbm-mitm.html" rel="alternate"></link><published>2017-01-12T13:19:00+08:00</published><updated>2017-01-12T13:19:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2017-01-12:/networking/bbm-mitm.html</id><summary type="html">&lt;p&gt;Awalnya dari saya baca-baca tentang HSTS (HTTP Strict Transport Security). HSTS ini metode buat mencegah Man-in-the-middle (MitM) attack di komunikasi secure SSL/TLS. &lt;/p&gt;
&lt;p&gt;Salah satu cara attack komunikasi SSL/TLS sebelum adanya HSTS ini biasanya pakai protocol downgrade. 
Caranya, si attacker secara diam-diam menempatkan diri di tengah-tengah komunikasi SSL antara …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Awalnya dari saya baca-baca tentang HSTS (HTTP Strict Transport Security). HSTS ini metode buat mencegah Man-in-the-middle (MitM) attack di komunikasi secure SSL/TLS. &lt;/p&gt;
&lt;p&gt;Salah satu cara attack komunikasi SSL/TLS sebelum adanya HSTS ini biasanya pakai protocol downgrade. 
Caranya, si attacker secara diam-diam menempatkan diri di tengah-tengah komunikasi SSL antara client sama server, terus dia meng-interupsi komunikasi antara client ke server.&lt;br /&gt;
Di sini attacker bisa downgrade komunikasi client ke server yang awalnya secure pakai SSL didowngrade ke plain HTTP. 
Kalau user kurang teliti bisa tanpa sadar masuk jebakan ini karena tidak ada warning apa-apa di browser.&lt;/p&gt;
&lt;p&gt;HSTS fungsinya mencegah tipe MitM ini. Caranya, server menginformasikan ke client bahwa komunikasi ke server ini harus pakai SSL/TLS. Jadinya kalau protokol di-downgrade 
ke plain HTTP koneksi bakal di terminate dan client menolak berkomunikasi sama server pakai plain HTTP.&lt;/p&gt;
&lt;p&gt;Kelemahannya, koneksi yang pertama kali ke server yang belum pernah diakses tetap tidak terproteksi jadi tetap ada kemungkinan protokol downgrade di sini. 
Karena itu client serperti browser Firefox atau Chrome sudah dimasukkan list situs-situs yang dikenal pakai HSTS supaya koneksi ke situs-situs ini biarpun pertama kalinya tetap 
terproteksi.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Begitu HSTS ini mulai diaplikasikan, metode attack SSL/TLS downgrade jadi tidak bisa lagi dipakai di server yang ada HSTS nya.&lt;/p&gt;
&lt;p&gt;Karena itu tes HSTS saya coba &lt;em&gt;eavesdropping&lt;/em&gt; komunikasi bukan dengan cara downgrade SSL tapi pakai cara redirect komunikasi secure nya. 
Pakai cara ini komunikasi client tetap pakai SSL/TLS cuma CA atau &lt;em&gt;Certificate Authority&lt;/em&gt; dipalsukan pakai CA buatan sendiri.&lt;/p&gt;
&lt;p&gt;Ini gambaran bagaimana gambaran MitM komunikasi SSL/TLS.&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/networking/mitm.png" alt="Man-in-the-middle attack" title="Man-in-the-middle attack" /&gt;
&lt;/div&gt;

&lt;p&gt;Tool yang saya pakai namanya SSLsplit. Metodenya, attacker ada di tengah-tengah komunikasi fungsinya jadi client sekaligus server. Jadi client buat ambil data dari server yang sebenarnya, jadi server buat meneruskan data ke client yang sebenarnya.&lt;/p&gt;
&lt;p&gt;Pas client kirim message &lt;em&gt;client hello&lt;/em&gt; waktu SSL handshake, attacker juga kirim &lt;em&gt;client hello&lt;/em&gt; ke server. Berikutnya, server kirim &lt;em&gt;server hello&lt;/em&gt; sama &lt;em&gt;certificate&lt;/em&gt;. Attacker ambil informasi dari digital certificate ini, terus dia buat &lt;em&gt;certificate signing request&lt;/em&gt; yang informasinya sama seperti yang asli, Subject DN, Common Name, dll semuanya disamakan. CSR yang sudah digenerate ini terus di-&lt;em&gt;sign&lt;/em&gt; pakai CA buatan sendiri dan jadilah digital certificate yang sama dengan certificate aslinya.&lt;/p&gt;
&lt;p&gt;Certificate buatan ini terus dikirim ke client. Client coba verifikasi validitas certificate ini dan normalnya, kalau client itu bagus dia langsung terminate komunikasi karena CA yang menandatangani certificate itu tidak ada di trusted database. Client modern semacam Firefox atau Google Chrome pasti muncul warning karena certificate tidak trusted.&lt;/p&gt;
&lt;p&gt;Nah pas waktu tes malah saya secara tidak sengaja temukan BlackBerry Messenger atau BBM dia vulnerable sama attack jenis MitM, tepatnya SSL Man-in-the-middle attack.&lt;/p&gt;
&lt;p&gt;Problemnya, client BBM dia tidak ada warning yang muncul, komunikasi juga tidak di-stop biarpun certificate dipalsukan, chatting tetap bisa jalan. Parahnya lagi, BBM bukan seperti WhatsApp atau Telegram yang pakai end-to-end encryption, jadi ya pesan chatting bisa dibaca.&lt;/p&gt;
&lt;p&gt;Ini hasil percobaan saya:&lt;/p&gt;
&lt;p&gt;Pertama, client BBM sudah yang paling baru dari Google Play Store.&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/networking/bbm-version.png" alt="BBM version" title="BBM version" /&gt;
&lt;/div&gt;

&lt;p&gt;Saya pakai port 8443 dan jalankan SSLsplit mode debug.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;sslsplit -D \&lt;/span&gt;
&lt;span class="err"&gt;-S /home/dhani/void/ \&lt;/span&gt;
&lt;span class="err"&gt;-c /home/dhani/vpn/keys/ca.crt \&lt;/span&gt;
&lt;span class="err"&gt;-k /home/dhani/vpn/keys/ca.key \&lt;/span&gt;
&lt;span class="err"&gt;https 0.0.0.0 8443&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-D&lt;/code&gt;: Debug.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-S&lt;/code&gt;: Directory tempat log. Log komunikasi ditulis di direktori ini.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-c&lt;/code&gt;: CA certificate&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-k&lt;/code&gt;: CA key&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https 0.0.0.0 8443&lt;/code&gt;: Buat socket dan bind semua ip address di tcp port 8443. &lt;code&gt;https&lt;/code&gt; berasumsi bahwa ini komunikasi http dan SSLsplit secara otomatis bisa men-&lt;em&gt;decode&lt;/em&gt; log ke http. Selain &lt;code&gt;https&lt;/code&gt; bisa pakai &lt;code&gt;ssl&lt;/code&gt; sama &lt;code&gt;tcp&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;Generated RSA key for leaf certs.&lt;/span&gt;
&lt;span class="err"&gt;SSLsplit 0.5.0 (built 2017-01-10)&lt;/span&gt;
&lt;span class="err"&gt;Copyright (c) 2009-2016, Daniel Roethlisberger &amp;lt;daniel@roe.ch&amp;gt;&lt;/span&gt;
&lt;span class="c"&gt;http://www.roe.ch/SSLsplit&lt;/span&gt;
&lt;span class="err"&gt;Build info: V:GIT&lt;/span&gt;
&lt;span class="c"&gt;Features: -DHAVE_NETFILTER&lt;/span&gt;
&lt;span class="err"&gt;NAT engines: netfilter* tproxy&lt;/span&gt;
&lt;span class="c"&gt;netfilter: IP_TRANSPARENT SOL_IPV6 !IPV6_ORIGINAL_DST&lt;/span&gt;
&lt;span class="err"&gt;Local process info support: no&lt;/span&gt;
&lt;span class="err"&gt;compiled against OpenSSL 1.0.1t  3 May 2016 (1000114f)&lt;/span&gt;
&lt;span class="err"&gt;rtlinked against OpenSSL 1.0.1t  3 May 2016 (1000114f)&lt;/span&gt;
&lt;span class="err"&gt;OpenSSL has support for TLS extensions&lt;/span&gt;
&lt;span class="err"&gt;TLS Server Name Indication (SNI) supported&lt;/span&gt;
&lt;span class="err"&gt;OpenSSL is thread-safe with THREADID&lt;/span&gt;
&lt;span class="err"&gt;Using SSL_MODE_RELEASE_BUFFERS&lt;/span&gt;
&lt;span class="err"&gt;SSL/TLS protocol availability: ssl3 tls10 tls11 tls12 &lt;/span&gt;
&lt;span class="err"&gt;SSL/TLS algorithm availability: RSA DSA ECDSA DH ECDH EC&lt;/span&gt;
&lt;span class="err"&gt;OpenSSL option availability: SSL_OP_NO_COMPRESSION SSL_OP_NO_TICKET SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION SSL_OP_DONT_INSERT_EMPTY_FRAGMENTS SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION SSL_OP_TLS_ROLLBACK_BUG&lt;/span&gt;
&lt;span class="err"&gt;compiled against libevent 2.0.21-stable&lt;/span&gt;
&lt;span class="err"&gt;rtlinked against libevent 2.0.21-stable&lt;/span&gt;
&lt;span class="err"&gt;4 CPU cores detected&lt;/span&gt;
&lt;span class="err"&gt;SSL/TLS protocol: negotiate&lt;/span&gt;
&lt;span class="c"&gt;proxyspecs:&lt;/span&gt;
&lt;span class="err"&gt;- [0.0.0.0]:8443 ssl|http netfilter&lt;/span&gt;
&lt;span class="err"&gt;Loaded CA: &amp;#39;/C=ID/ST=Kalimantan Timur/L=Balikpapan/O=DevNull/OU=DevNull/CN=DevNull Authority/name=ca/emailAddress=dhani.stx@gmail.com&amp;#39;&lt;/span&gt;
&lt;span class="err"&gt;Created self-pipe [r=3,w=4]&lt;/span&gt;
&lt;span class="err"&gt;Created chld-pipe [r=5,w=6]&lt;/span&gt;
&lt;span class="err"&gt;Created socketpair 0 [p=7,c=8]&lt;/span&gt;
&lt;span class="err"&gt;Created socketpair 1 [p=9,c=10]&lt;/span&gt;
&lt;span class="err"&gt;Created socketpair 2 [p=11,c=12]&lt;/span&gt;
&lt;span class="err"&gt;Using libevent backend &amp;#39;epoll&amp;#39;&lt;/span&gt;
&lt;span class="err"&gt;Event base supports: edge yes, O(1) yes, anyfd no&lt;/span&gt;
&lt;span class="err"&gt;Received privsep req type 03 sz 9 on srvsock 7&lt;/span&gt;
&lt;span class="err"&gt;Received privsep req type 00 sz 1 on srvsock 7&lt;/span&gt;
&lt;span class="err"&gt;Inserted events:&lt;/span&gt;
&lt;span class="err"&gt;Received privsep req type 00 sz 1 on srvsock 11&lt;/span&gt;
&lt;span class="err"&gt;  0x1f6af50 [fd 6] Read Persist&lt;/span&gt;
&lt;span class="err"&gt;  0x1f6b470 [fd 7] Read Persist&lt;/span&gt;
&lt;span class="err"&gt;  0x1f6ad88 [fd 5] Read Persist&lt;/span&gt;
&lt;span class="err"&gt;  0x1f65140 [fd 3] Signal Persist&lt;/span&gt;
&lt;span class="err"&gt;  0x1f6b6b0 [fd 1] Signal Persist&lt;/span&gt;
&lt;span class="err"&gt;  0x1f6b7e0 [fd 2] Signal Persist&lt;/span&gt;
&lt;span class="err"&gt;  0x1f6b910 [fd 13] Signal Persist&lt;/span&gt;
&lt;span class="err"&gt;  0x1f6bae0 [fd 10] Signal Persist&lt;/span&gt;
&lt;span class="err"&gt;Initialized 8 connection handling threads&lt;/span&gt;
&lt;span class="err"&gt;Started 8 connection handling threads&lt;/span&gt;
&lt;span class="err"&gt;Starting main event loop.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Di output line &lt;code&gt;Loaded CA&lt;/code&gt; itu informasi CA yang saya pakai.&lt;/p&gt;
&lt;p&gt;Selanjutnya, parameter kernel untuk routing perlu diaktifkan sama nat tcp port 443 ke port 8443&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;echo 1 &amp;gt;/proc/sys/net/ipv4/ip_forward&lt;/span&gt;
&lt;span class="err"&gt;iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 8443&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Masalah bagaimana traffic packet IP bisa masuk ke interface dan di-&lt;em&gt;capture&lt;/em&gt; tidak saya bahas karena tujuan tulisan ini buat 
informasi ke user BBM sekligus pembuktian kalau BBM bisa disadap, bukan bagaimana cara attack MitM.&lt;/p&gt;
&lt;p&gt;Nah waktu buka BBM, di output debug SSLsplit ada informasi certificate yang original sama yang buatan seperti ini.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;===&amp;gt; Original server certificate:&lt;/span&gt;
&lt;span class="err"&gt;Subject DN: /C=CA/ST=Ontario/L=Waterloo/O=BlackBerry Ltd/OU=IT/CN=*.bbm.blackberry.com&lt;/span&gt;
&lt;span class="err"&gt;Common Names: *.bbm.blackberry.com/*.bbm.blackberry.com&lt;/span&gt;
&lt;span class="c"&gt;Fingerprint: 23:25:C7:DA:28:27:F9:54:AE:09D8:AD:C3:C9:9C:61:B5:3F:09:95&lt;/span&gt;
&lt;span class="err"&gt;Certificate cache: HIT&lt;/span&gt;
&lt;span class="err"&gt;===&amp;gt; Forged server certificate:&lt;/span&gt;
&lt;span class="err"&gt;Subject DN: /C=CA/ST=Ontario/L=Waterloo/O=BlackBerry Ltd/OU=IT/CN=*.bbm.blackberry.com&lt;/span&gt;
&lt;span class="err"&gt;Common Names: *.bbm.blackberry.com/*.bbm.blackberry.com&lt;/span&gt;
&lt;span class="c"&gt;Fingerprint: E6:C8:E4:AB:EC:C3:2D:43:EA:D035:2C:30:98:E0:E6:9C:DC:26:81&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Semuanya sama kecuali signature, atau fingerprint.&lt;/p&gt;
&lt;p&gt;Saya tidak tau apa BBM ini verifikasi CA sama certificate fingerprint atau tidak, yang jelas komunikasi tidak ada interupsi.&lt;/p&gt;
&lt;p&gt;Ini tes chatting BBM&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/networking/bbm.png" alt="Chat BBM" title="Chat BBM" /&gt;
&lt;/div&gt;

&lt;p&gt;Dan ini log SSLsplit.&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/networking/sslsplit.png" alt="SSLsplit" title="SSLsplit" /&gt;
&lt;/div&gt;

&lt;p&gt;Problem ini, saya sudah kirim email ke support BlackBerry, semoga saja mereka perbaiki. &lt;br /&gt;
Saran saya sebelum vulnerability ini hilang, sebaiknya tidak kirim informasi sensitif lewat BBM. Lewat WhatsApp atau Telegram saja yang lebih secure.&lt;/p&gt;
&lt;p&gt;Saya tidak tau apa lembaga semacam ID-SIRTII atau ID-CERT mereka juga lihat isi IP payload atau tidak, kalau iya kan berarti mereka bisa baca chatting pengguna BBM di Indonesia.&lt;/p&gt;
&lt;p&gt;Wheeww..!!&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artikel berkaitan:&lt;/strong&gt;&lt;br /&gt;
&lt;a href="//devnull.web.id/misc/ssl-tls-letsencrypt.html"&gt;Tentang SSL/TLS + sertifikat TLS gratis dari Let&amp;rsquo;s Encrypt&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;Pembahasan yang lumayan komprehensif tentang Public Key Infrastructure atau PKI&lt;/em&gt;&lt;/p&gt;</content><category term="Networking"></category></entry><entry><title>Blockchain: Teknologi dibalik Bitcoin</title><link href="//devnull.web.id/misc/blockchain-bitcoin.html" rel="alternate"></link><published>2017-01-07T22:19:00+08:00</published><updated>2017-01-07T22:19:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2017-01-07:/misc/blockchain-bitcoin.html</id><summary type="html">&lt;div class="fimg"&gt;
        &lt;img src="//devnull.web.id/images/misc/blockchain/bitcoin.png" alt="bitcoin" title="bitcoin" /&gt;
        &lt;p&gt;Gambar: pinterest.com&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Bayangkan sebuah sistem tanpa otoritas. Bayangkan kalau kita bisa transaksi tanpa perlu bank, atau buat kontrak tanpa perlu notaris. Bayangkan kalau ada sistem yang bisa mengganti fungsi pihak ketiga itu, bank atau notaris itu, tanpa ribet dan tanpa mahal.&lt;/p&gt;
&lt;p&gt;Bisakah? Mungkin sekarang belum, tapi nanti bisa sangat …&lt;/p&gt;</summary><content type="html">&lt;div class="fimg"&gt;
        &lt;img src="//devnull.web.id/images/misc/blockchain/bitcoin.png" alt="bitcoin" title="bitcoin" /&gt;
        &lt;p&gt;Gambar: pinterest.com&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Bayangkan sebuah sistem tanpa otoritas. Bayangkan kalau kita bisa transaksi tanpa perlu bank, atau buat kontrak tanpa perlu notaris. Bayangkan kalau ada sistem yang bisa mengganti fungsi pihak ketiga itu, bank atau notaris itu, tanpa ribet dan tanpa mahal.&lt;/p&gt;
&lt;p&gt;Bisakah? Mungkin sekarang belum, tapi nanti bisa sangat mungkin. Teknologi atau sistem itu sekarang lagi populer, namanya blockchain, teknologi dibalik kesuksesan &lt;em&gt;cryptocurrency&lt;/em&gt; Bitcoin.&lt;/p&gt;
&lt;p&gt;Bitcoin ini kurang lebih sama seperti mata uang umunya seperti Rupiah atau Euro, bedanya Bitcoin bentuknya digital. Bedanya lagi, kalau Euro dipakai di negara-negara Eropa atau Rupiah dipakai di Indonesia, Bitcoin dipakai di negara Internet. Perbedaan lainnya, tidak ada otoritas seperti bank yang mengelola Bitcoin. Proses otorisasi, autentikasi, dan verifikasi semuanya ada di sistem blockchain.&lt;/p&gt;
&lt;p&gt;Sebelum terlalu jauh tulisannya, buat teman-teman yang mendarat di halaman ini karena pengen tau apa itu Bitcoin, siapa Satoshi Nakamoto, cara transaksi Bitcoin, atau cari tau tentang jual beli Bitcoin, tulisan ini bukan tentang itu, tapi lebih ke masalah teknologinya.&lt;/p&gt;
&lt;p&gt;Jadi seperti apa blockchain itu?&lt;br /&gt;
Blockchain itu database. Dalam konteks Bitcoin, database ini isinya record transaksi siapa kirim berapa bitcoin ke siapa. Yang bikin beda sama database umumnya, blockchain ini sistemnya ter-desentralisasi, terbuka, &lt;em&gt;read only&lt;/em&gt;, &lt;em&gt;read only&lt;/em&gt; artinya begitu transaksi sudah tercatat, record itu tidak bisa lagi dirubah. Sebenarnya bukan tidak bisa dirubah, tapi hampir mustahil ada orang bisa memanipulasi data yang tercatat.&lt;/p&gt;
&lt;p&gt;Blockchain ini database yang data-datanya ditempatkan di blok-blok. Satu &lt;em&gt;block&lt;/em&gt; itu isinya banyak record transaksi. &lt;em&gt;Block-block&lt;/em&gt; ini tersusun berdasarkan urutan waktu terus masing-masing &lt;em&gt;block&lt;/em&gt; ini punya link ke &lt;em&gt;block&lt;/em&gt; sebelumnya, link ini bentuknya hash sha256.&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/misc/blockchain/blockchain.png" alt="blockchain" title="blockchain" /&gt;
&lt;/div&gt;

&lt;p&gt;Biar bisa paham cara kerja blockchain, kita harus paham dulu pengetahuan dasar tentang &lt;em&gt;Public Key Encryption&lt;/em&gt;. Jadi kalau ada di antara teman-teman yang belum paham apa itu &lt;em&gt;Digital Signature&lt;/em&gt;, &lt;em&gt;Public Key Infrastructure&lt;/em&gt; sama algoritma &lt;em&gt;hash&lt;/em&gt;, sebaiknya pelajari dulu. Beberapa waktu lalu saya ada publish post tentang SSL/TLS. Memang tentang SSL/TLS tapi di dalamnya ada pembahasan yang lumayan komprehensif tentang &lt;em&gt;PKI (Public Key Infrastructure)&lt;/em&gt;, judulnya &lt;a href="//devnull.web.id/misc/ssl-tls-letsencrypt.html"&gt;Tentang SSL/TLS + sertifikat TLS gratis dari Let&amp;rsquo;s Encrypt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Lanjut, ambil contoh transaksi bitcoin. Alice minum kopi di warung kopi punya Bob, warkopnya Bob ini terima pembayaran Bitcoin. Alice, yang juga punya Bitcoin coba bayar kopi pakai Bitcoin, harganya kalau dalam Rupiah 15 ribu tapi dikonversi ke Bitcoin sekitar 0.001 BTC. Alice buka aplikasi Bitcoin di hapenya, terus transfer 0.001 BTC ke alamat bitcoin Bob.&lt;/p&gt;
&lt;p&gt;Supaya bisa transaksi pakai Bitcoin, Alice sama Bob sebelumnya harus punya bitcoin wallet, kita bisa analogikan bitcoin wallet ini seperti rekening bank. Kalau rekening bank ada identitasnya, bitcoin wallet juga ada tapi identitas bitcoin wallet ini bukan nama seperti rekening tapi &lt;em&gt;key pair&lt;/em&gt; enkripsi asimetris, ada &lt;em&gt;public key&lt;/em&gt; sama &lt;em&gt;private key&lt;/em&gt;. Terus yang pasti, kalau mau bisa transaksi Bitcoin, di bitcoin wallet itu harus ada nilai bitcoin atau semacam saldo kalau di rekening. Bitcoin ini bisa dibeli di market pakai mata uang tradisional seperti Rupiah. Alice di walletnya sudah punya bitcoin 0.5 BTC yang sebelumnya dia beli dari local market seharga 6 juta.&lt;/p&gt;
&lt;p&gt;Alamat bitcoin contohnya seperti &lt;code&gt;3HCSJQA3zji58dJmifL5q1DA7p2hX5rGAZ&lt;/code&gt; yang bisa dibuat gratis di banyak provider bitcoin wallet, salah satunya seperti &lt;a href="https://www.coinbase.com/"&gt;Coinbase&lt;/a&gt;. Itu alamat bitcoin yang valid, kalau mau coba silahkan transfer bitcoin, itu alamat Bitcoin saya :)&lt;br /&gt;
Panjang alamat bitcoin ini sepanjang 20 byte atau 160 bit yang berarti 2&lt;sup&gt;160&lt;/sup&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;    2 ^ 160 = 1461501637330000000000000000000000000000000000000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kalau alamat bitcoin sebanyak itu, alamat bitcoin ini tidak bakal habis biarpun masing-masing penduduk bumi punya sejuta alamat bitcoin yang berbeda.&lt;/p&gt;
&lt;p&gt;Terus dibalik bitcoin ini ada jaringan yang disebut bitcoin network, network ini yang ngatur semua transaksi bitcoin. Jaringan atau bitcoin network ini isinya komputer, sebutannya node. Node ini diinstal software Bitcoin terus mereka ini terhubung satu sama lainnya, node-node ini bisa komputer seperti PC umumnya atau komputer yang didesain khusus buat jalankan software Bitcoin.&lt;br /&gt;
Network ini sistemnya &lt;em&gt;peer to peer&lt;/em&gt; yang artinya tidak ada servernya, masing-masing node saling terkoneksi seperti aplikasi Bittorrent. &lt;/p&gt;
&lt;p&gt;Apa yang terjadi waktu Alice transfer bitcoin ke alamat bitcoin Bob? Prosesnya, aplikasi wallet Alice buat dua request transfer seperti ini:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Transfer 0.001 BTC dari wallet Alice ke wallet Bob.&lt;/li&gt;
&lt;li&gt;Transfer 0.498 BTC dari wallet Alice ke wallet Alice.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dari sisi pengguna, Alice cuma tau kalau saldonya berkurang. Tapi dari sisi network bitcoin transfer itu ada dua, satu transfer ke alamat Bitcoin Bob, satunya ke alamat Alice sendiri.&lt;br /&gt;
Jadi di Bitcoin itu tidak ada namanya saldo, yang ada input sama output. Yang dianggap saldo itu cuma input yang belum jadi output. Input itu bitcoin yang masuk, output bitcoin yang keluar dari wallet. Terus input sama output ini harus balance, bitcoin yang masuk sama yang keluar harus imbang.&lt;/p&gt;
&lt;p&gt;Nah di contoh ini, input wallet Alice yang 0.5 BTC dari market. Nah waktu transaksi, input 0.5 BTC ini harus habis jadi output semua. Karena itu dibuat dua output seperti di atas itu, output pertama bayar kopi, output kedua transfer ke wallet sendiri.&lt;br /&gt;
Tapi kalau diperhatikan &lt;code&gt;0.001 + 0.0498 = 0.499&lt;/code&gt; bukan &lt;code&gt;0.5&lt;/code&gt;, kemana yang &lt;code&gt;0.001&lt;/code&gt;? 0.001 BTC ini jadi fee buat network atas jasa mereka memproses transaksi itu. Jadi fee network itu selisih dari transaksi, kalau misalnya Alice di output kedua transfer 0.497 BTC ke wallet sendiri, berarti fee buat network jumlahnya 0.002 BTC.&lt;/p&gt;
&lt;p&gt;Jadi, request wallet Alice ke network kurang lebih seperti ini:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Halo, saya Alice. Saya punya input 0.5 BTC yang mau dijadikan output.&lt;br /&gt;
Output 1, 0.001 BTC ke wallet Bob.&lt;br /&gt;
Output 2, 0.498 BTC ke wallet sendiri.&lt;br /&gt;
Sisanya yang 0.001 BTC silahkan diambil buat fee.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Fee ini sifatnya opsional, artinya tanpa fee pun transaksi tetap diproses sama network. Cuma fee ini bisa menentukan prioritas, semakin besar fee semakin cepat diproses.&lt;/p&gt;
&lt;p&gt;Request Alice di atas itu kemudian ditandatangani secara digital pakai private key Alice terus di-&lt;em&gt;broadcast&lt;/em&gt; ke network. Para node di network yang terima pesan broadcast itu mereka coba verifikasi, apa benar Alice yang kirim pesan itu. Verifikasi ini pakai public key Alice, kalau tandatangan atau digital signature yang di-broadcast cocok dengan public key Alice berarti request itu valid.&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/misc/blockchain/sign.png" alt="blockchain digital signature" title="blockchain digital signature" /&gt;
&lt;/div&gt;

&lt;p&gt;Begitu transaksi itu valid dan berhasil diverifikasi, request itu diproses, record transaksi itu dicatat terus dimasukkan ke &lt;em&gt;block&lt;/em&gt; bersama record banyak transaksi lainnya. Block ini kemudian ditempatkan ke database blockchain sebagai &lt;em&gt;block&lt;/em&gt; baru.&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/misc/blockchain/new-block.png" alt="blockchain new block" title="blockchain new block" /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id="struktur-block"&gt;Struktur block.&lt;/h3&gt;
&lt;p&gt;Seperti apa bentuknya block itu?&lt;/p&gt;
&lt;p&gt;Struktur block kurang lebih seperti di bawah:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4 byte        : block size. Berisi informasi berapa besar block ini.&lt;/li&gt;
&lt;li&gt;80 byte       : header block.&lt;/li&gt;
&lt;li&gt;1-9 byte      : berisi informasi berapa transaksi yang ada di block ini.&lt;/li&gt;
&lt;li&gt;bervariasi    : berisi list transaksi bitcoin yang tercatat di block ini.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Rincian header block yang 80 byte di atas seperti ini:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;4 byte        : versi software bitcoin yang dipakai.&lt;/li&gt;
&lt;li&gt;32 byte       : berisi &lt;em&gt;hash&lt;/em&gt; block sebelumnya.&lt;/li&gt;
&lt;li&gt;32 byte       : hash dari merkle root atau root data structure binary hash tree.&lt;/li&gt;
&lt;li&gt;4 byte        : berisi timestamp kapan waktu block ini dibuat. Hitungan detik dari &lt;em&gt;Unix Epoch&lt;/em&gt; (1 Januari 1970).&lt;/li&gt;
&lt;li&gt;4 byte        : tingkat kesulitan algoritma proof-of-work.&lt;/li&gt;
&lt;li&gt;4 byte        : nonce. Atau nilai proof-of-work yang berhasil ditemukan.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Merkle root&lt;/em&gt;, &lt;em&gt;Nonce&lt;/em&gt; sama &lt;em&gt;proof-of-work&lt;/em&gt; dibahas nanti.&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/misc/blockchain/block-structure.png" alt="blockchain block structure" title="blockchain block structure" /&gt;
&lt;/div&gt;

&lt;p&gt;Seperti terlihat, setiap block di headernya ada hash dari block sebelumnya atau bisa dianggap link ke block sebelumnya. Begitu terus dan kalau link ini ditelusuri terus, ujungnya ada di block yang paling pertama dibuat. Block yang paling pertama dibuat ini namanya &lt;em&gt;Genesis Block&lt;/em&gt; yang dibuat di tahun 2009. Baca lebih lanjut tentang &lt;a href="https://en.bitcoin.it/wiki/Genesis_block"&gt;Genesis Block&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Merkle root&lt;/strong&gt;. Data structure-nya namanya merkle tree atau binary hash tree. Skip.. skip.. tanpa terlalu detail, adanya hash dari merkle root ini dipakai buat membuktikan dengan cepat apakah di block ini transaksi yang dicari ada atau tidak. Satu block, isinya bisa 500 sampai diatas seribu transaksi bitcoin, kalau cari satu-satu diurut dari awal sampai transaksi terakhir tidak efektif, nah adanya &lt;em&gt;root hash&lt;/em&gt; ini bisa dipakai buat pembuktian bahwa transaksi yang dicari ada di dalam block tanpa perlu lihat record satu per satu. Wikipedia tentang data structure &lt;a href="https://en.wikipedia.org/wiki/Merkle_tree"&gt;Merkle tree&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Kembali ke &lt;em&gt;Network&lt;/em&gt;. Salah satu jenis node di &lt;em&gt;Network&lt;/em&gt; ini ada yang kerjanya mem-validasi, verifikasi transaksi, terus kalau transaksi itu valid, mereka catat transaksi itu dalam block, node ini namanya &lt;strong&gt;Miner&lt;/strong&gt;. Ada banyak &lt;em&gt;Miner&lt;/em&gt; di network bitcoin, ribuan atau mungkin jutaan miner yang saling terkoneksi satu sama lain.&lt;/p&gt;
&lt;p&gt;Terus network blockchain ini tidak ter-sentralisasi, artinya tidak ada server yang terpusat. Database blockchain itu tersebar di semua node, masing-masing node punya database yang sama yang saling singkron terus menerus.&lt;/p&gt;
&lt;p&gt;Waktu ada pesan broadcast dari Alice, database blockchain pada waktu itu sampai block ke 99 misalnya. Berarti para miner waktu itu semuanya kerja secara independen buat block berikutnya, block ke 100 yang transaksi kopi Alice bakal masuk di block ini.&lt;/p&gt;
&lt;p&gt;Di sini muncul problem. Karena masing-masing miner memproses block berikutnya, block ke 100 secara independen, block ini bisa beda-beda isinya antara miner satu sama yang lainnya. Bahkan mungkin ada node miner yang lokasinya jauh dari Alice dia tidak terima pesan broadcast-nya karena misalnya latency jaringan Internetnya tinggi, jadi di miner ini transaksi Alice tidak masuk di block ke 100, tapi di miner lain ada.&lt;/p&gt;
&lt;p&gt;Solusinya, ada semacam tantangan buat para miner ini, siapa yang berhasil menang lomba ini, dia yang berhak menempatkan block ke 100 ke chain database blockchain. Bukan cuma itu, miner ini juga dapat reward atau imbalan bitcoin atas hasil usahanya. Selain reward, miner ini juga punya hak ambil fee dari setiap transaksi termasuk fee 0.001 BTC dari Alice, ditambah banyak fee dari ratusan bahkan ribuan transaksi yang masuk di block ke 100.&lt;/p&gt;
&lt;p&gt;Tantangan ini yang di blockchain dinamai &lt;em&gt;Proof-of-work&lt;/em&gt;. Para miner ini beradu cepat menebak angka yang disebut angka &lt;em&gt;nonce&lt;/em&gt;. Siapa berhasil menemukan &lt;em&gt;nonce&lt;/em&gt; paling cepat dia pemenangnya.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id="bitcoin-mining"&gt;Bitcoin mining&lt;/h3&gt;
&lt;p&gt;Reward bitcoin buat miner yang berhasil menang ini satu-satunya cara pembuatan Bitcoin baru. Jadi bitcoin yang beredar sekarang ini awalnya dari para miner itu, karena itu mereka disebut miner atau penambang Bitcoin.&lt;br /&gt;
Berapa banyak coin yang didapat miner kalau berhasil menebak &lt;em&gt;nonce&lt;/em&gt;? banyak.&lt;/p&gt;
&lt;p&gt;Reward buat miner itu 50 BTC. Tapi jumlah ini dikurangi setenganya setiap 210.000 block baru. Setiap kurang lebih 10 menit muncul block baru di blockchain, ini berarti sekitar 4 tahun sekali reward dipotong setengah. &lt;em&gt;Genesis block&lt;/em&gt; atau block yang paling pertama dibuat di tahun 2009, reward buat miner 50 BTC. Tahun 2012 jadi setengahnya, 25 BTC dan di tahun 2016 dipotong lagi setengah jadi 12.5 BTC. Jadi sekarang ini reward buat miner yang berhasil menebak &lt;em&gt;nonce&lt;/em&gt; reward-nya 12.5 BTC.&lt;/p&gt;
&lt;p&gt;Reward ini bakalan dipotong setengahnya terus sampai total bitcoin yang beredar totalnya 21 juta bitcoin. Ini batasan Bitcoin, kalau sudah sampai 21 juta bitcoin tidak ada lagi bitcoin yang bisa dibuat. Reward buat para miner setelah ini cuma dari fee transaksi saja&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id="proof-of-work"&gt;Proof-of-work&lt;/h3&gt;
&lt;p&gt;Proof-of-work ini data yang jadi syarat supaya block bisa dimasukkan ke blockchain. Data Proof-of-work ini susah sekali buatnya, perlu waktu sama &lt;em&gt;computing power&lt;/em&gt; yang besar, tapi gampang buat diverifikasi kebenarannya. Proses pembuatan data ini caranya acak dan tebak-tebakan, terus probabilitas tebakan itu benar kemungkinannya kecil sekali.&lt;/p&gt;
&lt;p&gt;Caranya, para miner harus mencari nilai hash SHA256 yang inputnya &lt;code&gt;header block + nilai nonce&lt;/code&gt; yang hasil hash ini nilainya &lt;em&gt;sama dengan atau lebih kecil&lt;/em&gt; dari &lt;code&gt;target&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;   hash (header block + nonce) &amp;lt;= target&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Nonce&lt;/strong&gt; ini panjangnya 4 byte atau 32 bit. Para miner, mereka cari nilai &lt;em&gt;nonce&lt;/em&gt; ini, &lt;em&gt;nonce&lt;/em&gt; berubah maka hash yang dihasilkan berubah. Mereka tebak nonce terus menerus sampai hasil hash sama atau lebih kecil dari &lt;em&gt;target&lt;/em&gt;. Tingkat kesulitannya ada di &lt;em&gt;target&lt;/em&gt; ini, kalau &lt;em&gt;target&lt;/em&gt; nilainya besar berarti kemungkinan hasil hash lebih kecil dari target juga besar. Tapi kalau nilai target ini kecil, probabilitas menemukan nonce yang tepat juga jadi kecil.&lt;br /&gt;
Tingkat kesulitan ini namanya &lt;em&gt;Difficulty&lt;/em&gt; dan ini disesuaikan terus menerus. Kalau para miner bisa gampang nebak &lt;em&gt;nonce&lt;/em&gt;, maka &lt;em&gt;difficulty&lt;/em&gt; dinaikkan yang berarti nilai target turun. &lt;em&gt;Difficulty&lt;/em&gt; ini dipakai buat menjaga supaya rata-rata &lt;em&gt;Proof-of-work&lt;/em&gt; itu bisa dihasilkan setiap 10 menit sekali, yang berarti block baru masuk ke database blockchain setiap sekitar 10 menit.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Evolusi hardware miner&lt;/strong&gt;&lt;br /&gt;
Dulu, awal-awal bitcoin para miner biasa pakai PC biasa yang diinstall software Bitcoin Core terus dijadikan node miner. Kemudian muncul tren pakai GPU atau &lt;em&gt;Graphical Processing Unit&lt;/em&gt; buat dijadikan miner. GPU lebih cepat dari CPU biasa, jadi bisa lebih banyak menebak hash per detiknya dibandingkan CPU.&lt;/p&gt;
&lt;p&gt;Karena Bitcoin yang tambah lama tambah populer ditambah kompetitifnya persaingan mining, para produsen hardware mereka produksi &lt;em&gt;Field-programmable gate array&lt;/em&gt; atau FPGA card buat hardware mining yang tentu saja lebih cepat dibanding GPU. Persaingan tambah sengit, sekarang ini tren mining sudah jadi hardware ASIC (Application Specific Integrated Circuit) yang punya power sekian ratus ribu mega hash per detiknya, jauh kalau dibandingkan sama FPGA yang punya power rata-rata dibawah seribu mega hash per detiknya.&lt;/p&gt;
&lt;p&gt;Tentu saja para miner yang awal-awal pakai ASIC bisa kaya mendadak, tapi karena sekarang rata-rata miner semuanya ASIC jadinya ya tetap kompetitif. Dan saking ketatnya persaingan hardware mining ini, sekarang mining biarpun pakai hardware ASIC yang mahal pun tetap susah bersaing. Karena itu rata-rata para miner sekarang mereka buat grup miner yang disebut &lt;em&gt;mining pool&lt;/em&gt;, pool ini isinya banyak hardware mining yang ngumpul jadi satu terus beban kerja nebak hash dibagi ke anggota pool itu. Kalau pool ini berhasil menghasilkan Proof-of-work, reward bitcoinnya dibagi ke anggota pool berdasarkan kontribusi hardware miner itu.&lt;/p&gt;
&lt;p&gt;Karena kemampuan hardware yang tambah hari tambah cepat ini makanya &lt;em&gt;difficulty&lt;/em&gt; proof-of-work mengikuti tren ini biar pembuatan block baru bisa tetap di rata-rata sepuluh menit.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Miner yang berhasil menemukan nilai &lt;em&gt;nonce&lt;/em&gt;, dia kirim pesan broadcast ke network. Node lain yang terima pesan broadcast ini coba verifikasi apa benar &lt;em&gt;nonce&lt;/em&gt; ini menghasilkan data proof-of-work dibawah nilai target. Kalau benar, para node ini mereka ambil block yang dibuat penemu nonce terus block ini dimasukkan ke database blockchain mereka. Mereka para miner ini kemudian mulai lagi kerja nebak nonce buat block berikutnya, begitu seterusnya.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id="fork"&gt;Fork&lt;/h3&gt;
&lt;p&gt;Biarpun kemungkinannya kecil sekali tapi bisa terjadi di waktu yang hampir bersamaan dua node miner atau lebih mereka berhasil menemukan &lt;em&gt;nonce&lt;/em&gt;. Ini bisa muncul kalau pesan broadcast penemu &lt;em&gt;nonce&lt;/em&gt; pertama belum sampai ke node kedua, bisa jadi karena jarak atau latency jaringan.&lt;br /&gt;
Kalau begini, ada dua block baru yang sama-sama valid dimasukkan ke database blockchain, problem ini disebut &lt;strong&gt;fork&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/misc/blockchain/blockchain-fork.png" alt="blockchain fork" title="blockchain fork" /&gt;
&lt;/div&gt;

&lt;p&gt;karena problem fork ini, network jadi terbagi.&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/misc/blockchain/blockchain-network-split.png" alt="blockchain network split" title="blockchain network split" /&gt;
&lt;/div&gt;

&lt;p&gt;Fork ini tidak boleh dibiarkan, network harus memilih salah satu dari dua block yang sama-sama valid itu. Caranya, para miner harus memprioritaskan salah satu dari dua block, terserah yang mana. Begitu salah satu dari dua block ini dapat block baru, maka block ini yang diambil. Gampangnya, cabang mana yang paling panjang rentetan block-nya, dia yang diambil.&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/misc/blockchain/blockchain-fork2.png" alt="blockchain fork" title="blockchain fork" /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id="security"&gt;Security&lt;/h3&gt;
&lt;p&gt;Blockchain ini sistemnya open, semua transaksi bisa dilihat siapa saja yang punya Internet, software-nya pun Open Source. Bagaimana keamanan datanya?&lt;/p&gt;
&lt;p&gt;Ada beberapa tipe penggunaan database blockchain yang tidak legal.&lt;br /&gt;
Pertama &lt;em&gt;Unauthorized transaction&lt;/em&gt;. Setiap akun bitcoin wallet diproteksi pakai sepasang asymetric encryption key. Artinya bitcoin yang tercatat di wallet itu cuma yang punya private key yang bisa transaksi, orang tidak bisa seenaknya pakai bitcoin orang lain buat transaksi karena kalau digital signature mismatch pasti ditolak sama network. Kecuali akun bitcoin wallet jatuh ke orang lain ini lain ceritanya, weak link nya ada di user bukan di sistem.&lt;/p&gt;
&lt;p&gt;Kedua &lt;em&gt;alter data&lt;/em&gt;. Bagaimana kalau ada attacker yang coba merubah data yang tercatat di blockchain?&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/misc/blockchain/blockchain.png" alt="blockchain" title="blockchain" /&gt;
&lt;/div&gt;

&lt;p&gt;Misal attacker merubah transaksi yang ada di block 96. Karena transaksi berubah, maka data &lt;em&gt;merkle root&lt;/em&gt; di header juga berubah yang berarti hash header juga berubah yang juga berarti &lt;em&gt;Proof-of-work&lt;/em&gt; sama &lt;em&gt;nonce&lt;/em&gt; jadi invalid. Kalau begini, attacker harus cari nilai &lt;em&gt;nonce&lt;/em&gt; sampai benar. Kalau para miner saja harus join pool buat cari proof-of-work, bayangkan bagaimana lamanya attacker yang sendirian itu menebak nonce.&lt;/p&gt;
&lt;p&gt;Oke kalau dianggap attacker ini punya hardware yang sangat super cepat yang bisa menebak nonce dalam hitungan menit, dia masih punya tugas lagi. Hash 96 punya attacker ini valid tapi karena data berubah maka hash pun berubah, dan karena setiap block punya link hash ke block sebelumnya, maka block 96 dan 97 jadi terputus karena hash block 96 yang tercatat di block 97 tidak sama lagi.&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/misc/blockchain/blockchain-attack.png" alt="blockchain attack" title="blockchain attack" /&gt;
&lt;/div&gt;

&lt;p&gt;Dengan kondisi begini, attacker mau tidak mau dia harus rubah block 97 juga. Dia harus rubah hash block sebelumnya di block 97 supaya sama dengan hash block 96, akibatnya header block 97 berubah. Kalau header berubah berarti proof-of-work jadinya tidak valid lagi. Artinya, tebak nonce lagi. Ketemu nonce block 97, dia masih punya block 98, 99, sama block 100 yang harus dimodifikasi juga.&lt;/p&gt;
&lt;p&gt;Kalaupun attacker ini berhasil, biarpun kemungkinan itu hampir mustahil, dia harus ingat bahwa blockchain ini databasenya tersebar di semua node yang terkoneksi ke network. Artinya, attacker ini harus merubah database di semua node itu, bayangkan bagaimana susahnya itu.&lt;/p&gt;
&lt;p&gt;Ketiga &lt;em&gt;double spending&lt;/em&gt;. Double spending ini, input bitcoin yang sama dipakai di dua ouput transaksi yang berbeda di waktu yang hampir bersamaan. Node yang terima pesan transaksi ini cuma bisa terima satu transaksi saja, transaksi yang lain dianggap tidak valid. Masalahnya tidak semua node bisa sepakat transaksi mana yang valid sama mana yang tidak. Kalau kondisi network normal, double spend ini tidak terlalu jadi masalah karena begitu proof-of-work berhasil dibuat, data di block miner penemu nonce itu yang valid. Karena itu, double spend ini kalau mau berhasil, maka network harus terpecah dan satu-satunya waktu network tidak sepakat itu waktu ada problem &lt;em&gt;fork&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Kembali ke fork lagi, fork ini kan cuma bisa muncul kalau ada dua atau lebih miner yang menemukan nonce secara bersamaan. Nah si attacker harus pikirkan bagaimana caranya itu bisa terjadi terus terusan, karena kalau salah satu cabang fork lebih panjang, cabang yang satunya jadi tidak valid lagi.&lt;/p&gt;
&lt;p&gt;Sampai sini kita bisa ambil kesimpulan bahwa semakin lama umur block maka semakin solid. Karena itu biasanya kalau transaksi bitcoin yang jumlahnya besar, transaksi ditunggu sampai sekitar satu jam biar block tempat transaksi itu ditumpuk 6 block di depannya. 6 Block atau 6 konfirmasi ini disepakati jadi batas aman block tidak bisa lagi dimanipulasi.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id="blockchain-vulnerablity"&gt;Blockchain vulnerablity&lt;/h3&gt;
&lt;p&gt;Kalau dilihat dari masalah keamanan di atas bisa disimpulkan bahwa keamanan data blockchain ini ada di kerumitan komputasi sama race melawan network miner. Tapi ada cara yang memudahkan attack di atas itu, namanya &lt;strong&gt;51% attack&lt;/strong&gt;. 51% attack ini kalau attacker bisa menguasai 51% network miner, maka dia bisa mengontrol network karena kemungkinan menemukan proof-of-work jadi lebih besar kalau sebagian besar network miner dikuasai. Tapi biarpun begitu, cuma &lt;em&gt;alter data&lt;/em&gt; sama &lt;em&gt;double spend&lt;/em&gt; saja yang mungkin bisa curangi, masalah &lt;em&gt;unauthorized transaction&lt;/em&gt; tetap aman karena diproteksi pakai digital signature.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id="conclusion"&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;Teknologi blockchain ini memang masih belum diadopsi luas, tapi adanya Bitcoin ini blockchain jadi populer.&lt;/p&gt;
&lt;p&gt;Bayangkan kemungkinan-kemungkinan apa saja nanti yang bisa muncul karena blockchain. Mungkin kita tidak perlu ICANN buat mengatur nama domain lagi. Mungkin sistem DNS kita tidak lagi diatur sama root server yang 13 itu. Mungkin masalah legal yang selama ini bergantung sama notaris bisa dialihkan ke blockchain.&lt;/p&gt;
&lt;p&gt;Kalau saya bayangkan bagaimana kalau semua masyarakat Indonesia masing-masing punya identitas digital yang diproteksi pakai encryption key. Terus kalau ada voting semacam pemilu atau pikada, identitas digital dipakai buat voting terus hasil voting ditempatkan di database blockchain. Voting bisa lewat smartphone atau komputer yang tersambung ke Internet. Tidak ada pilihan yang tidak valid karena semua pilihan ditandatangani pakai digital signature. Tidak ada yang bisa memanipulasi data karena data ada di database blockchain, bukan di KPU.&lt;/p&gt;
&lt;p&gt;Itu imajinasi Saya, rekans Linuxer mungkin saja imajinasinya lebih liar lagi dari itu :)&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Refs:&lt;/strong&gt;&lt;br /&gt;
Sumber diambil dari e-book &lt;a href="https://github.com/bitcoinbook/bitcoinbook"&gt;Mastering Bitcoin&lt;/a&gt; yang ditulis oleh Andreas M. Antonopoulos.&lt;/p&gt;</content><category term="Misc"></category></entry><entry><title>Tentang SSL/TLS + sertifikat TLS gratis dari Let's Encrypt</title><link href="//devnull.web.id/misc/ssl-tls-letsencrypt.html" rel="alternate"></link><published>2016-12-19T14:35:00+08:00</published><updated>2016-12-19T14:35:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-12-19:/misc/ssl-tls-letsencrypt.html</id><summary type="html">&lt;p&gt;Kalau teman-teman lihat di address bar blog ini, protokolnya pakai https yang berarti koneksi ke blog ini pakai secure connection.&lt;br /&gt;
Atau coba cek pakai command&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;openssl s_client -connect devnull.web.id:443&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Aman tidak harus mahal. Sertifikat ssl yang dipakai blog ini gratis dari Let&amp;rsquo;s Encrypt. 
Beda sama sertifikat …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Kalau teman-teman lihat di address bar blog ini, protokolnya pakai https yang berarti koneksi ke blog ini pakai secure connection.&lt;br /&gt;
Atau coba cek pakai command&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;openssl s_client -connect devnull.web.id:443&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Aman tidak harus mahal. Sertifikat ssl yang dipakai blog ini gratis dari Let&amp;rsquo;s Encrypt. 
Beda sama sertifikat gratis lainnya yang mensyaratkan harus langganan hosting di provider tertentu, 
Let&amp;rsquo;s Encrypt tidak, kita cuma perlu membuktikan kalau kita owner website tersebut.&lt;/p&gt;
&lt;p&gt;Sebelum ke free certificate dari Let&amp;rsquo;s Encrypt, kita pelajari dulu apa itu &lt;strong&gt;Public Key Infrastructure (PKI)&lt;/strong&gt; dan &lt;strong&gt;SSL/TLS&lt;/strong&gt;. 
Buat teman-teman pembaca yang mau langsung lompat ke cara install sertifikat, silahkan langsung ke bagian &lt;a href="#letsencrypt"&gt;&lt;strong&gt;Let&amp;rsquo;s Encrypt&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
&lt;strong&gt;Pentingkah security?&lt;/strong&gt;&lt;br /&gt;
Kalau mau jawab pertanyaan ini, kita bisa bayangkan jaringan Internet itu seperti komunikasi yang sifatnya terbuka. 
Bayangkan kita bicara satu lawan satu tapi di tengah-tengah kerumunan banyak orang, mereka bisa dengar apa yang kita bicarakan. &lt;br /&gt;
Kalau di jaringan, komunikasi satu lawan satu ini disebut unicast, beda sama broadcast yang komunikasinya satu ke banyak. 
Jenis-jenis komunikasi ini ada saya bahas sedikit di artikel tentang IPv6, &lt;a href="//devnull.web.id/networking/pengenalan-ipv6.html"&gt;&amp;ldquo;Hampir&amp;rdquo; Semua Tentang IPv6&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Tapi ceritanya jadi lain kalau pembicaraan ini sifatnya harus privat, yang tidak boleh ada yang tahu kecuali dua pihak unicast itu. 
Dan di era Internet sekarang ini ada yang namanya e-commerce, Internet banking, dan lainnya yang sifat komunikasinya harus aman.&lt;/p&gt;
&lt;p&gt;Internet kita ini berjalan di atas protokol IP dan routing yang ada di layer 3 OSI. Routing artinya untuk bisa berkomunikasi secara unicast, kita tidak bisa 
langsung bicara ke pihak yang dituju. Pesan kita itu dirouting seperti kalau kirim paket lewat jasa ekspedisi, pesan kita itu diserahkan secara 
estafet dari hop ke hop sampai ke tujuan.&lt;/p&gt;
&lt;p&gt;Masalahnya adalah, di setiap hop itu siapapun yang berwenang bisa melihat isi pesan kita, bahkan bukan tidak mungkin mereka bisa merubah isinya. 
Siapa mereka itu? Mereka itu adalah provider Internet kita, Telkom, Indosat, dll. saya juga bekerja di provider Internet dan paham sekali yang seperti ini, jadi jangan 
percaya mereka.&lt;/p&gt;
&lt;p&gt;Praktik mendengarkan percakapan (eavesdropping) dan merubah pesan yang dikirim ini dalam bahasa security disebut &lt;em&gt;MITM&lt;/em&gt; atau &lt;em&gt;Man-in-the-middle&lt;/em&gt; attack.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id="public-key-infrastructure-pki"&gt;Public Key Infrastructure (PKI)&lt;/h3&gt;
&lt;p&gt;PKI ini seperti satu set aturan buat me-manage digital certificate. PKI memverifikasi identitas baik itu server atau client, 
mengasosiasikan public key ke identitas tertentu. Gampangnya, PKI itu seperti password. Password itu cara sederhana buat memastikan identitas user, 
artinya identitas user diproteksi dengan password yang password ini cuma user tersebut yang tahu.&lt;/p&gt;
&lt;p&gt;PKI juga kurang lebih seperti itu, memproteksi identitas, bukan pakai password tapi pakai encryption key.&lt;br /&gt;
Lebih dari itu, PKI menyelesaikan tiga problem komunikasi sekaligus:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Confidentiality.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Authentication.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Integrity.&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Kita bahas satu-satu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1) Confidentiality&lt;/strong&gt;&lt;br /&gt;
Confidentiality atau kerahasiaan data diatur dalam PKI. Bagaimana caranya kita berkomunikasi satu lawan satu secara rahasia? sementara Internet itu kan 
jaringan publik, siapa saja bisa &lt;em&gt;eavesdropping&lt;/em&gt; atau mendengarkan pembicaraan itu. Caranya, komunikasinya pakai kode atau bahasa yang cuma bisa dimengerti 
dua pihak ini, yang lain bisa dengar tapi tidak paham maksudnya.&lt;/p&gt;
&lt;p&gt;Cara ini disebut encryption atau encipherment, istilah yang awal lebih umum dan sering dipakai. Encryption atau enkripsi ini caranya mengacak pesan digital, 
bit-bit digital diacak dan dibuat jadi seolah-olah tidak beraturan. Data digital ini bisa dikembalikan lagi seperti aslinya sebelum diacak, prosesnya disebut decrypt. Proses decrypt ini 
pakai kunci yang disebut encryption key. Jadi, cuma pemegang kunci saja yang bisa decrypt pesan itu.&lt;/p&gt;
&lt;p&gt;Ada dua metode enkripsi yang ada saat ini, metode simetris atau &lt;em&gt;symmetric encryption&lt;/em&gt; sama metode asimetris atau &lt;em&gt;asymmetric encryption&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Symmetric encryption&lt;/strong&gt; menggunakan kunci atau key yang sama untuk encrypt atau decrypt. Jadi antara kedua pihak yang bertukar informasi key-nya sama. 
Pesan di-&lt;em&gt;encrypt&lt;/em&gt; pakai key itu, di-&lt;em&gt;decrypt&lt;/em&gt; pakai key itu juga.&lt;/p&gt;
&lt;p&gt;Kelebihan enkripsi metode ini, lebih cepat dibanding asymmetric encryption. Enkripsi ini juga biasanya lebih secure. Key yang dipakai untuk enkripsi ini biasanya pendek, 
cuma 128 bit atau 256 bit. Biarpun pendek tapi bisa lebih secure dari key asymmetric yang lebih panjang.&lt;br /&gt;
Algoritma enkripsi untuk tipe ini semisal &lt;strong&gt;AES (Advanced Encryption Standard)&lt;/strong&gt; dan &lt;strong&gt;DES (Data Encryption Standard)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Kekurangannya, karena pihak yang berkomunikasi pakai key yang sama, distribusi key ini jadi problem sendiri. Karena kalau tidak hati-hati, key bisa jatuh ke tangan yang salah. 
Supaya aman, distribusi key ini bisa pakai cara tradisional, misalnya key disimpan ke flash disk untuk kemudian dikirim fisiknya. Kalau key ditransfer lewat jaringan Internet, 
ada kemungkinan key tersebut di hijack dan diterima orang yang salah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Asymmetric encryption&lt;/strong&gt; pakai key yang berbeda antara yang buat encrypt sama yang buat decrypt. Satu key bersifat publik yang disebut &lt;em&gt;public key&lt;/em&gt; terus satunya lagi 
disebut &lt;em&gt;private key&lt;/em&gt; yang cuma owner nya saja yang bisa akses. Siapapun yang punya public key bisa meng-encrypt data pakai public key tersebut dan yang bisa decrypt cuma 
pemilik private key nya.&lt;/p&gt;
&lt;p&gt;Kelebihan metode ini, tidak ada problem distribusi key karena cuma public key saja yang di distribusikan sedangkan private key tetap aman.&lt;/p&gt;
&lt;p&gt;Kekurangannya, biasanya metode enkripsi ini lebih lambat dari yang symmetric. Key nya juga biasanya panjang dari 1024 bit sampai 4096 bit. 
Algoritma enkripsi untuk metode &lt;em&gt;asymmetric encryption&lt;/em&gt; ini seperti &lt;strong&gt;RSA (Rivest-Shamir-Adleman)&lt;/strong&gt; dan &lt;strong&gt;DSA (Digital Signature Algorithm)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Contoh penggunaan &lt;em&gt;asymmetric encryption&lt;/em&gt; yang populer seperti &lt;strong&gt;PGP&lt;/strong&gt;, &lt;strong&gt;OpenPGP&lt;/strong&gt;, dan &lt;strong&gt;GPG&lt;/strong&gt;. Siapa saja bisa download &lt;em&gt;public key&lt;/em&gt; dari keyserver terus pakai key ini buat encrypt file. 
File yang sudah terenkripsi ini kemudian bisa dikirim secara aman, seseorang bisa saja membajak file itu tapi karena dia tidak punya file &lt;em&gt;private key&lt;/em&gt;-nya, file tidak bisa di-&lt;em&gt;decrypt&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Ini contoh &lt;em&gt;public key&lt;/em&gt; GPG punya saya dengan id &lt;code&gt;0x2d6783968595c582&lt;/code&gt; yang ada di keyserver &lt;a href="https://sks-keyservers.net/pks/lookup?op=vindex&amp;amp;search=0x2d6783968595c582"&gt;https://sks-keyservers.net/pks/lookup?op=vindex&amp;amp;search=0x2d6783968595c582&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2) Authentication&lt;/strong&gt;&lt;br /&gt;
Problem komunikasi berikutnya masalah autentikasi. Autentikasi ini buat memastikan bahwa lawan bicara kita adalah benar dia, bukan orang yang berpura-pura. 
Dalam komunikasi IP begitu juga, user atau client yang berkomunikasi dengan situs online banking misalnya, 
harus memastikan bahwa yang diaksesnya itu benar-benar situs bank yang dimaksud dan bukannya situs tiruan buatan pencuri.&lt;/p&gt;
&lt;p&gt;Teknik kejahatan cyber yang seperti ini, misalnya membuat halaman situs yang mirip situs resmi online banking supaya si user tidak sadar masuk 
jebakan disebut teknik &lt;em&gt;phising&lt;/em&gt;. Salah satu tujuan PKI untuk mencegah hal ini dengan cara memastikan identitas server dengan encryption key.&lt;/p&gt;
&lt;p&gt;Caranya, kembali ke asymmetric encryption. Selain untuk encrypt dan decrypt, metode asymmetric juga bisa buat tanda tangan digital atau istilahnya digital signature.&lt;br /&gt;
Kalau untuk encrypt dan decrypt, data digital di encrypt pakai public key kemudian pemilik private key yang bisa decrypt data itu. Untuk signing berlaku sebaliknya, 
pemilik private key menandatangani atau sign data pakai private key, kemudian siapa saja yang punya public key bisa verifikasi tanda tangan tersebut dan memastikan
keasliannya.&lt;/p&gt;
&lt;p&gt;Contoh saja, kita akses halaman situs https://www.google.com. Pertama, browser kita yang bertindak sebagai client download digital certificate dari website tersebut. 
Di dalam digital certificate itu ada public key dengan identitas www.google.com. Dengan begitu, client bisa encrypt data pakai public key yang sudah didownload, terus 
server yang bisa decrypt. Begitu juga server bisa tandatangani data digital dengan private key-nya dan client yang sudah punya public key bisa verifikasi signature tersebut.&lt;/p&gt;
&lt;p&gt;Nah, sampai sini timbul masalah. Bagaimana kita bisa memastikan bahwa digital certificate yang didownload tadi benar-benar dari Google dan bukan server yang mengaku sebagai Google?&lt;br /&gt;
Kita tidak bisa memastikan, karena siapa saja bisa mengaku sebagai Google dengan membuat certificate dengan identitas www.google.com.&lt;/p&gt;
&lt;p&gt;Terus solusinya bagaimana?&lt;br /&gt;
Setidaknya ada dua metode yang mengatasi problem ini, &lt;strong&gt;Certificate Authority (CA)&lt;/strong&gt; dan &lt;strong&gt;Web of trust&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Certificate Authority&lt;/strong&gt; atau &lt;strong&gt;CA&lt;/strong&gt; ini berfungsi seperti organisasi yang punya otoritas menandatangani digital certificate. 
Ada banyak organisasi CA, contoh saja seperti Comodo, GeoTrust, DigiCert, dan Symantec yang dulu namanya VeriSign. Digital certificate dari para CA ini secara default sudah dimasukkan di database 
client, misal browser seperti Google Chrome atau Firefox. Certificate dari CA ini dianggap trusted atau terpercaya karena reputasi organisasi yang bagus dan mereka ini diaudit secara berkala.&lt;/p&gt;
&lt;p&gt;Para CA ini yang memastikan nama identitas di digital certificate itu valid atau tidak. Misalnya Google membuat digital certificate untuk domain www.google.com, kemudian Google 
membuat file &lt;em&gt;Certificate Signing Request (CSR)&lt;/em&gt; ke CA GeoTrust supaya GeoTrust menandatangani digital certificate-nya Google. Di sini GeoTrust melakukan verifikasi apakah request 
itu benar-benar dari Google atau tidak. Caranya bisa bermacam-macam, mulai dari verifikasi website, telepon, sampai penggunaan legal dokumen buat membuktikan identitas.&lt;br /&gt;
Kemudian setelah GeoTrust memastikan validitas request tersebut, CA ini signing atau secara digital menandatangani digital certificate Google, certificate ini kemudian dipakai di 
server Google.&lt;/p&gt;
&lt;p&gt;Nah waktu kita browsing Google misalnya, browser melihat bahwa digital certificate punya Google ini ditandatangani oleh GeoTrust. Karena certificate GeoTrust ada di database dan 
dianggap terpercaya, maka digital certificate Google ini juga secara otomatis dipercaya oleh client atau browser.&lt;/p&gt;
&lt;p&gt;Tapi biarpun begitu, CA ini jadi &lt;em&gt;The weakest link&lt;/em&gt; di PKI. Karena kalau misalnya private key punya CA berhasil dicuri, maka pencuri tersebut bisa seenaknya menandatangani atau signing certificate apa saja, 
termasuk situs phising. Atau misalnya organisasi CA ini secara diam-diam bekerjasama atau berbagi private key dengan organisasi rahasia untuk memata-matai pengguna Internet, kita tidak akan tahu bedanya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Web of trust&lt;/strong&gt;. Ini alternatif lain selain CA. Web of trust ini dipakai di PGP/OpenPGP/GPG. Bedanya, tidak ada satupun otoritas di sini. Web of trust ini seperti jaring, misalnya 
kita set public key teman kita si B sebagai trusted, dan si B juga mempercayai public key si C, maka public key punya si C juga dianggap trusted. Begitu seterusnya sampai membentuk jaringan kepercayaan.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3) Integrity&lt;/strong&gt;&lt;br /&gt;
Satu lagi masalah data integrity. Bagaimana PKI meyakinkan dua pihak yang berkomunikasi secara digital bahwa data atau pesan yang dikirim dan diterima itu tidak mengalami perubahan di tengah jalan, 
bahwa data yang diterima itu benar data yang dikirim.&lt;/p&gt;
&lt;p&gt;Ada beberapa cara buat mengecek integritas data.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Digital Signature.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Message digest atau Hash.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Message Authentication code (MAC).&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Digital Signature&lt;/strong&gt; seperti yang sudah dibahas di atas tentang autentikasi. Digital signing ini caranya si pengirim menggunakan private key-nya untuk sign data digital, tandatangan digital sama datanya 
kemudian dikirim bersama. Si penerima yang sudah punya public key memeriksa validitas signature tersebut. Kalau misalnya di tengah jalan data ini mengalami perubahan, maka signature tersebut jadi tidak 
valid dan si penerima tahu bahwa data ini tidak sama dengan data yang dikirim.&lt;/p&gt;
&lt;p&gt;Mari dicoba.&lt;br /&gt;
Misal saya buat file &lt;code&gt;text&lt;/code&gt; yang isinya &lt;em&gt;&amp;ldquo;abcde&amp;rdquo;&lt;/em&gt;, kemudian file tersebut Saya sign. File signature terpisah dengan nama &lt;code&gt;text.signature&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dhani: ~&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Endor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;echo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;abcde&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;text&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dhani: ~&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Endor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;gpg&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;u&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dhani&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stx&lt;/span&gt;&lt;span class="nv"&gt;@gmail&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;com&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;armor&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="k"&gt;output&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;detach&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;sig&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;text&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="n"&gt;You&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;need&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;passphrase&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;to&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;unlock&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;key&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;for&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;Dhani Setiawan &amp;lt;dhani.stx@gmail.com&amp;gt;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mi"&gt;2048&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;bit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;RSA&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;8595&lt;/span&gt;&lt;span class="n"&gt;C582&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;created&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2016&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Hasil signature seperti di bawah:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;dhani&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="n"&gt;Endor&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="nb"&gt;text&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;signature&lt;/span&gt; 
&lt;span class="c1"&gt;-----BEGIN PGP SIGNATURE-----&lt;/span&gt;
&lt;span class="k"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;GnuPG&lt;/span&gt; &lt;span class="n"&gt;v1&lt;/span&gt;

&lt;span class="n"&gt;iQEcBAABAgAGBQJYU5YtAAoJEC1ng5aFlcWCrA8H&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;vZI0&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;CBAW0NwrewslSDmFi&lt;/span&gt;
&lt;span class="n"&gt;WKvUiCV1JQQtZcjT6ljCFLIk7MvtN5s00aEgySTLKRbnOWeL4HO2oNaI0LgjCfB9&lt;/span&gt;
&lt;span class="n"&gt;b46LO74Z&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;DSBattr5dWG&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;fusAcOQDblakSItHUG3BpeFQOaPhdjctk4hEm2FKmj&lt;/span&gt;
&lt;span class="n"&gt;JVkbSqLWf6VOZe2&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;F0Zz81tYuJkVlIO7oxW6rzZCYucO98&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;piyoJQzrrupOio8jr&lt;/span&gt;
&lt;span class="n"&gt;N9uxTeNJBuAKMprU9rEHf0VSwMw4baPKzgf&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;wGht7E&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;EQgkz9RVuN8zWNxpFgdDI&lt;/span&gt;
&lt;span class="n"&gt;fbfCGgMvxxuC2&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="n"&gt;dzUASz6Ca2jZMOM6k8r8OXdtTpSd5erf1FI88U9df4oh2kDjs&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;
&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;K&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;SY&lt;/span&gt;
&lt;span class="c1"&gt;-----END PGP SIGNATURE-----&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Coba diverifikasi signature itu.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; gpg --verify text.signature text&lt;/span&gt;
&lt;span class="c"&gt;gpg: Signature made Fri 16 Dec 2016 03:22:21 PM WITA using RSA key ID 8595C582&lt;/span&gt;
&lt;span class="c"&gt;gpg: Good signature from &amp;quot;Dhani Setiawan &amp;lt;dhani@deltatux.com&amp;gt;&amp;quot;&lt;/span&gt;
&lt;span class="c"&gt;gpg:                 aka &amp;quot;Dhani Setiawan &amp;lt;dhani.stx@gmail.com&amp;gt;&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Apa yang terjadi kalau isi file &lt;code&gt;text&lt;/code&gt; dirubah, misalnya rubah huruf terakhir jadi huruf besar, kemudian verifikasi signature-nya.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; echo &amp;quot;abcdE&amp;quot; &amp;gt; text&lt;/span&gt;
&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; gpg --verify text.signature text&lt;/span&gt;
&lt;span class="c"&gt;gpg: Signature made Fri 16 Dec 2016 03:22:21 PM WITA using RSA key ID 8595C582&lt;/span&gt;
&lt;span class="c"&gt;gpg: BAD signature from &amp;quot;Dhani Setiawan &amp;lt;dhani@deltatux.com&amp;gt;&amp;quot;&lt;/span&gt;
&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kalihatan antara file dengan signaturenya tidak cocok.&lt;/p&gt;
&lt;p&gt;Kelemahan metode ini, karena pakai public dan private key yang berarti asymmetric, maka prosesnya lebih lambat dibanding cara yang lain.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Message digest atau Hash&lt;/strong&gt;. Hampir sama dengan digital signing, hanya saja tidak pakai encryption key apapun, cuma algoritma hashing. Data digital yang dikirim terlebih dulu di hash, kemudian data 
sama hash-nya dikirm. Si penerima data juga kalkulasi hash data itu, terus membandingkan apa hash yang dihasilkan sama atau tidak. Kalau sama berarti data itu valid kalau tidak berarti data itu sudah 
dimodifikasi.&lt;/p&gt;
&lt;p&gt;Beberapa algoritma hashing misalnya MD5, SHA1 dan SHA256. hash MD5 panjangnya 128 bit, SHA1 160 bit, dan SHA256 sepanjang 256 bit.&lt;/p&gt;
&lt;p&gt;Perhatikan hasil hash text &amp;ldquo;abcde&amp;rdquo; di bawah:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; echo &amp;quot;abcde&amp;quot; | md5sum&lt;/span&gt;
&lt;span class="err"&gt;9b9af6945c95f1aa302a61acf75c9bd6  -&lt;/span&gt;
&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; echo &amp;quot;abcde&amp;quot; | sha1sum&lt;/span&gt;
&lt;span class="err"&gt;ec11312386ad561674f724b8cca7cf1796e26d1d  -&lt;/span&gt;
&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; echo &amp;quot;abcde&amp;quot; | sha256sum&lt;/span&gt;
&lt;span class="err"&gt;0283da60063abfb3a87f1aed845d17fe2d9ba8c780b478dc4ae048f5ee97a6d5  -&lt;/span&gt;
&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Hash MD5 dan SHA1, sekarang ini sudah dianggap tidak lagi secure karena pendek. Artinya kemungkinan dua data yang berbeda menghasilkan hash yang sama lebih besar dibanding hash yang panjang.&lt;/p&gt;
&lt;p&gt;Kita ambil contoh hash SHA256, data &amp;ldquo;abcde&amp;rdquo; dirubah ke &amp;ldquo;abcdE&amp;rdquo;, cuma berubah di karakter terakhir.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; echo &amp;quot;abcde&amp;quot; | sha256sum&lt;/span&gt;
&lt;span class="err"&gt;0283da60063abfb3a87f1aed845d17fe2d9ba8c780b478dc4ae048f5ee97a6d5  -&lt;/span&gt;
&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; echo &amp;quot;abcdE&amp;quot; | sha256sum&lt;/span&gt;
&lt;span class="err"&gt;98f2c74c952a79ac39fffc5c6beb301c267cfeaeb898d840b1482350fc4e9b91  -&lt;/span&gt;
&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Biarpun perbedaan itu cuma antara huruf kecil dan besar, hasil hash berbeda.&lt;/p&gt;
&lt;p&gt;Perlu diingat bahwa hash cuma berguna buat memastikan integritas data, tidak bisa memastikan identitas pengirim data.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Message Authentication Code (MAC)&lt;/strong&gt;. Kurang lebih seperti digital signature, hanya saja key yang dipakai di sini shared key yang berarti symmetric encryption. Kalau hash inputnya cuma satu, data saja, 
MAC inputnya dua, data sama key. MAC fungsinya hampir sama dengan digital signature, selain buat memastikan integritas data juga sebagai autentikasi bahwa data yang dikirim itu berasal dari pengirim 
yang memegang key-nya. Penerima data digital menerima data bersamaan dengan kode MAC-nya, kalau data ini dibuat dari key yang berbeda maka kode MAC itu jadi tidak valid. Begitu juga kalau data 
dimodifikasi di tengah jalan, kode MAC juga akan berbeda.&lt;/p&gt;
&lt;p&gt;Kelebihan MAC, karena pakai symmetric encryption jadinya lebih cepat proses generate kode sama proses verifikasinya dibanding digital signature. Kelemahannya juga sama seperti symmetric encryption, 
tidak bisa memastikan dari siapa data itu dikirim karena siapa saja yang punya enryption key bisa mengirim data yang valid.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id="x509"&gt;X.509&lt;/h3&gt;
&lt;p&gt;Baik, setelah membahas tentang &lt;em&gt;Public Key Infrastructure&lt;/em&gt; atau &lt;em&gt;PKI&lt;/em&gt; di atas, sekarang kita lihat seperti apa digital certificate itu.&lt;/p&gt;
&lt;p&gt;Salah satu standar format digital certificate PKI adalah &lt;strong&gt;X.509&lt;/strong&gt;. Digital certificate standar X.509 ini yang dipakai di SSL dan TLS.&lt;/p&gt;
&lt;p&gt;Digital certificate yang pakai standard X.509 berisi informasi-informasi atau struktur seperti di bawah:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Version&lt;/strong&gt; atau versi X.509. Ada X.509 versi 1, 2 dan 3.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Serial Number&lt;/strong&gt;. Serial dari pembuat digital certificate yang membedakan dari certificate lainnya.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Algorithm&lt;/strong&gt;. Informasi tentang algoritma yang dipakai untuk membuat digital certificate. Algoritma seperti yang sudah dibahas sebelumnya tentang 
confidentiality PKI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Issuer&lt;/strong&gt; atau organisasi &lt;em&gt;Certificate Authority&lt;/em&gt; (CA) yang mengeluarkan digital certificate.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validity&lt;/strong&gt; berisi informasi tentang mulai kapan sampai kapan certificate ini validnya, tanggal expire nya.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Subject DN&lt;/strong&gt;. Isinya tentang identitas pemilik digital certificate ini, dari nama sampai alamat email.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Public key&lt;/strong&gt;. Public key asymmetric encryption seperti yang sudah dibahas sebelumnya.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Selain yang di atas itu, ada beberapa informasi yang sifatnya opsional seperti extension X.509.&lt;/p&gt;
&lt;p&gt;Sebagai contoh, di bawah ini digital certificate X.509 yang dipakai blog DevNull ini.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;openssl&lt;/span&gt; &lt;span class="n"&gt;x509&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;noout&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nb"&gt;text&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;devnull&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;fullchain&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pem&lt;/span&gt; 
&lt;span class="n"&gt;Certificate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;Data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;Version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;x2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="nb"&gt;Serial&lt;/span&gt; &lt;span class="nb"&gt;Number&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ac&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ba&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ea&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;76&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;af&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;89&lt;/span&gt;
    &lt;span class="n"&gt;Signature&lt;/span&gt; &lt;span class="n"&gt;Algorithm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sha256WithRSAEncryption&lt;/span&gt;
        &lt;span class="n"&gt;Issuer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;C&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;US&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;O&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;Let&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;s Encrypt, CN=Let&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;Encrypt&lt;/span&gt; &lt;span class="n"&gt;Authority&lt;/span&gt; &lt;span class="n"&gt;X3&lt;/span&gt;
        &lt;span class="n"&gt;Validity&lt;/span&gt;
            &lt;span class="k"&gt;Not&lt;/span&gt; &lt;span class="k"&gt;Before&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Dec&lt;/span&gt;  &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="mi"&gt;2016&lt;/span&gt; &lt;span class="n"&gt;GMT&lt;/span&gt;
            &lt;span class="k"&gt;Not&lt;/span&gt; &lt;span class="k"&gt;After&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Mar&lt;/span&gt;  &lt;span class="mi"&gt;9&lt;/span&gt; &lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt; &lt;span class="mi"&gt;2017&lt;/span&gt; &lt;span class="n"&gt;GMT&lt;/span&gt;
        &lt;span class="n"&gt;Subject&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;CN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;devnull&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
        &lt;span class="n"&gt;Subject&lt;/span&gt; &lt;span class="k"&gt;Public&lt;/span&gt; &lt;span class="k"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;Info&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;Public&lt;/span&gt; &lt;span class="k"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;Algorithm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;rsaEncryption&lt;/span&gt;
                &lt;span class="k"&gt;Public&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;Key&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2048&lt;/span&gt; &lt;span class="nb"&gt;bit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;Modulus&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;bf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;bc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;bc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;77&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;12&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;92&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;eb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;05&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;77&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;62&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ea&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;cb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;79&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;af&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;53&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="mi"&gt;97&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;bf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;63&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;dc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="mi"&gt;21&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;89&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ef&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;77&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ba&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ea&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;96&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;70&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;97&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;da&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="mi"&gt;78&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;66&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;62&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;94&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;e7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ba&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;bc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;44&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="mi"&gt;85&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;fd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;f9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;eb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;eb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;53&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;a9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ea&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;eb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ca&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;88&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;90&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;ea&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;63&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;01&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;bd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;78&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;61&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;78&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;22&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;81&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;91&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;b5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;53&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;74&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;77&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;fa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;93&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;87&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="mi"&gt;28&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;69&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;86&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;97&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ea&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;03&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;07&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;ea&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;
                &lt;span class="n"&gt;Exponent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;65537&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;x10001&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;X509v3&lt;/span&gt; &lt;span class="n"&gt;extensions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;X509v3&lt;/span&gt; &lt;span class="k"&gt;Key&lt;/span&gt; &lt;span class="k"&gt;Usage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;critical&lt;/span&gt;
                &lt;span class="n"&gt;Digital&lt;/span&gt; &lt;span class="n"&gt;Signature&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;Encipherment&lt;/span&gt;
            &lt;span class="n"&gt;X509v3&lt;/span&gt; &lt;span class="n"&gt;Extended&lt;/span&gt; &lt;span class="k"&gt;Key&lt;/span&gt; &lt;span class="k"&gt;Usage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
                &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;Web&lt;/span&gt; &lt;span class="n"&gt;Server&lt;/span&gt; &lt;span class="n"&gt;Authentication&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;TLS&lt;/span&gt; &lt;span class="n"&gt;Web&lt;/span&gt; &lt;span class="n"&gt;Client&lt;/span&gt; &lt;span class="n"&gt;Authentication&lt;/span&gt;
            &lt;span class="n"&gt;X509v3&lt;/span&gt; &lt;span class="n"&gt;Basic&lt;/span&gt; &lt;span class="k"&gt;Constraints&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;critical&lt;/span&gt;
                &lt;span class="n"&gt;CA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="k"&gt;FALSE&lt;/span&gt;
            &lt;span class="n"&gt;X509v3&lt;/span&gt; &lt;span class="n"&gt;Subject&lt;/span&gt; &lt;span class="k"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;Identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
                &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;A5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;A9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;96&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;A7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;D0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;53&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;E&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;D9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;B2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;A0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;06&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;CD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;F&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;E&lt;/span&gt;
            &lt;span class="n"&gt;X509v3&lt;/span&gt; &lt;span class="n"&gt;Authority&lt;/span&gt; &lt;span class="k"&gt;Key&lt;/span&gt; &lt;span class="n"&gt;Identifier&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
                &lt;span class="n"&gt;keyid&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;A8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;A&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;63&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="n"&gt;D&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;DD&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;BA&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;E6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;D1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;B7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;A6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;EF&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;F3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;A8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;EC&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;A1&lt;/span&gt;

            &lt;span class="n"&gt;Authority&lt;/span&gt; &lt;span class="n"&gt;Information&lt;/span&gt; &lt;span class="k"&gt;Access&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
                &lt;span class="n"&gt;OCSP&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;URI&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;ocsp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
                &lt;span class="n"&gt;CA&lt;/span&gt; &lt;span class="n"&gt;Issuers&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;URI&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;cert&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;x3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;

            &lt;span class="n"&gt;X509v3&lt;/span&gt; &lt;span class="n"&gt;Subject&lt;/span&gt; &lt;span class="n"&gt;Alternative&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
                &lt;span class="n"&gt;DNS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;devnull&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;web&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;
            &lt;span class="n"&gt;X509v3&lt;/span&gt; &lt;span class="n"&gt;Certificate&lt;/span&gt; &lt;span class="n"&gt;Policies&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; 
                &lt;span class="n"&gt;Policy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;140&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
                &lt;span class="n"&gt;Policy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;44947&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
                &lt;span class="n"&gt;CPS&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;cps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;
                &lt;span class="k"&gt;User&lt;/span&gt; &lt;span class="n"&gt;Notice&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;Explicit&lt;/span&gt; &lt;span class="nb"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;This&lt;/span&gt; &lt;span class="n"&gt;Certificate&lt;/span&gt; &lt;span class="n"&gt;may&lt;/span&gt; &lt;span class="k"&gt;only&lt;/span&gt; &lt;span class="n"&gt;be&lt;/span&gt; &lt;span class="n"&gt;relied&lt;/span&gt; &lt;span class="n"&gt;upon&lt;/span&gt; &lt;span class="k"&gt;by&lt;/span&gt; &lt;span class="n"&gt;Relying&lt;/span&gt; &lt;span class="n"&gt;Parties&lt;/span&gt; &lt;span class="k"&gt;and&lt;/span&gt; &lt;span class="k"&gt;only&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;accordance&lt;/span&gt; &lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Certificate&lt;/span&gt; &lt;span class="n"&gt;Policy&lt;/span&gt; &lt;span class="k"&gt;found&lt;/span&gt; &lt;span class="k"&gt;at&lt;/span&gt; &lt;span class="n"&gt;https&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;letsencrypt&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;repository&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;

    &lt;span class="n"&gt;Signature&lt;/span&gt; &lt;span class="n"&gt;Algorithm&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;sha256WithRSAEncryption&lt;/span&gt;
        &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;42&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;cf&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;86&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ae&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;b7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;31&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;be&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;53&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;34&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;68&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;97&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;29&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;fa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ab&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;99&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="mi"&gt;39&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;af&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ea&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;61&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;17&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;cc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;76&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ea&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ec&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;41&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;61&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;54&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;14&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ba&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;c8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;84&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ac&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;48&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;92&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ae&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;a1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;86&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ac&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;a7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;11&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;81&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;25&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;bc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;15&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;51&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;88&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;f3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;78&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;36&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;60&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;18&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;75&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;eb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;08&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;bd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;76&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;bc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;77&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ca&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c5&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;43&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;bb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;46&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ab&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;67&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;c8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;7&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;52&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ea&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;04&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="mi"&gt;59&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;69&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;44&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;fb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ba&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ae&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;97&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;fa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;fc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;73&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;fa&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;94&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;47&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="mi"&gt;93&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;cd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="k"&gt;c&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;45&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;94&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c6&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;84&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c9&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;38&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;e4&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;fe&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;49&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;d7&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;a0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;71&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;c8&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;02&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;23&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ab&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;95&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ca&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;eb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;72&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;b6&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Jadi, kata &amp;ldquo;sertifikat SSL&amp;rdquo; yang sering kita dengar itu sebenarnya istilah marketing, istilah teknis yang benar adalah sertifikat X.509. Cuma karena sertifikat ini sering dipakai di SSL, makanya 
jadi lebih terkenal sebagai &amp;ldquo;sertifikat SSL&amp;rdquo;, padahal TLS juga pakai standar sertifikat X.509 yang sama.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id="ssltls"&gt;SSL/TLS&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;SSL (Secure Socket Layer)&lt;/strong&gt; dan &lt;strong&gt;TLS (Transport Layer Security)&lt;/strong&gt;, dua kata yang kadang membingungkan, paling tidak buat saya begitu. Maksudnya begini, kadang SSL dan TLS ini dua hal yang berbeda yang tidak bisa ketemu. Tapi kadang SSL dan TLS 
ini adalah hal yang sama. SSL ya TLS, TLS ya SSL, karena itu biasanya ditulis SSL/TLS. saya rasa ini penting untuk dipahami bahwa ada maksud yang ambigu di dua kata ini.&lt;/p&gt;
&lt;p&gt;SSL/TLS ini sama-sama implementasi security &lt;em&gt;PKI&lt;/em&gt; dan pakai digital certificate X.509.&lt;/p&gt;
&lt;p&gt;Kita bahas dulu perbedaannya, bahwa SSL dan TLS ini dua hal yang berbeda yang tidak bisa ketemu.&lt;br /&gt;
Kalau membahas perbedaannya, yang dimaksud dengan SSL dan TLS adalah protokolnya. Mereka ini SSL dan TLS 
berbicara dengan bahasa yang berbeda, karena itu tidak bisa ketemu.&lt;br /&gt;
TLS ini seperti evolusi dari SSL, SSL awalnya didevelop dari Netscape. saya ambil dari &lt;a href="https://en.wikipedia.org/wiki/Transport_Layer_Security#SSL_1.0.2C_2.0_and_3.0"&gt;Wikipedia&lt;/a&gt;, 
bahwa versi pertama SSL yaitu versi 1.0 tidak pernah dirilis karena banyak celah keamanan. 
Begitu juga SSL 2.0 yang masih banyak kekurangan, yang akhirnya melahirkan versi ketiga SSL 3.0 yang merupakan hasil design ulang protokol sebelumnya.&lt;/p&gt;
&lt;p&gt;Terus kemudian muncul TLS 1.0 sebagai successor dari SSL 3.0. Bedanya, TLS ini standar dari &lt;em&gt;Internet Engineering Task Force&lt;/em&gt; atau IETF dan bukan dari Netscape lagi yang berarti bahwa TLS ini standar terbuka. 
Tapi biarpun TLS 1.0 ini penerus SSL 3.0, dua protokol ini tidak kompatibel. saya tidak memahami detailnya, tapi salah satu perbedaan mendasar adalah di &lt;em&gt;Message Authentication Code&lt;/em&gt; atau &lt;em&gt;MAC&lt;/em&gt; yang sudah 
dibahas di atas. MAC di SSL pakai block cipher sedangkan di TLS pakai hash yang lebih dikenal dengan HMAC.&lt;/p&gt;
&lt;p&gt;Setelah TLS 1.0, disusul TLS 1.1 dan yang sekarang adalah TLS 1.2. Versi TLS yang selanjutnya TLS 1.3 yang sekarang masih berbentuk draft di IETF.&lt;/p&gt;
&lt;p&gt;Waktu komunikasi secure antara server sama client, terlebih dulu ada proses &lt;em&gt;handshake&lt;/em&gt; atau negosiasi parameter antara TLS di server dan client. Client akan meng-&lt;em&gt;advertise&lt;/em&gt; ke server bahwa 
dia support SSL 3.0, TLS 1.0, TLS 1.1, dan TLS 1.2 misalnya. Berdasarkan informasi ini, server akan memilih protokol yang cocok dan secara default akan memilih yang paling baru. Misalnya 
si server cuma bisa sampai TLS 1.1 maka ini yang dipilih.&lt;/p&gt;
&lt;p&gt;Sekarang ini SSL 3.0 dianggap sudah tidak lagi aman, karena itu kebanyakan server tidak menyertakan protokol ini waktu proses &lt;em&gt;handshake&lt;/em&gt;. Salah satu penyebab SSL 3.0 ditolak server 
karena ada vulnerability yang dikenal dengan POODLE, baca lebih lanjut tentang POODLE di &lt;a href="https://en.wikipedia.org/wiki/POODLE"&gt;https://en.wikipedia.org/wiki/POODLE&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Kemudian kita bahas persamaan dua kata ini SSL dan TLS. Kalau sebelumnya, perbedaan mereka ini ada di protokol atau bahasa yang dipakai, persamaan ini lebih ke pembedaan saja antara komunikasi yang aman 
sama yang tidak.&lt;/p&gt;
&lt;p&gt;Contohnya begini, &lt;em&gt;Hypertext Transfer Protocol&lt;/em&gt; atau &lt;em&gt;HTTP&lt;/em&gt; itu berjalan di atas protokol TCP di port 80 yang sifatnya terbuka dan tidak aman. Ada HTTP yang sifatnya secure yang disebut &lt;em&gt;HTTPS&lt;/em&gt;, dan ini 
berjalan di atas protokol TCP port 443. Jadi ada dua &lt;em&gt;HTTP&lt;/em&gt;, yang aman di port 443 dan yang tidak terenkripsi di port 80. Kalau di address bar browser, url untuk SSL/TLS diawali &lt;code&gt;https://&lt;/code&gt; sedangkan non 
SSL/TLS &lt;code&gt;http://&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Contoh yang lain seperti protokol email:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SMTP&lt;/strong&gt;. SMTP di port 25 dan SMTP SSL/TLS di port 465, umumnya disebut smtps.&lt;br /&gt;
&lt;strong&gt;POP3&lt;/strong&gt;. POP3 di port 110 dan POP3 SSL/TLS di port 995, disebut pop3s.&lt;br /&gt;
&lt;strong&gt;IMAP&lt;/strong&gt;. IMAP di port 143 dan IMAP SSL/TLS di port 993, atau imaps.&lt;/p&gt;
&lt;p&gt;Secara teknis, port yang secure itu pakai protokol TLS. Tapi mengapa masih disebut juga SSL itu saya kurang paham, mengapa tidak disebut saja HTTP TLS atau SMTP TLS.&lt;/p&gt;
&lt;p&gt;Dari sini, kita jadi paham bahwa maksud penulisan SSL/TLS ini adalah bahwa SSL dan TLS ini hal yang sama.&lt;/p&gt;
&lt;p&gt;Terus kalau diperhatikan, masing-masing komunikasi itu ada di dua port yang berbeda. Sekarang ini yang seperti itu dianggap wasted atau buang-buang resource, karena itu sekarang ini 
ada lagi yang namanya &lt;strong&gt;STARTTLS&lt;/strong&gt;.&lt;br /&gt;
Apa bedanya? bedanya kalau SSL/TLS pakai port yang berbeda untuk komunikasi yang secure, STARTTLS pakai port yang sama. Jadi SMTP tetap di port 25, komunikasi dimulai dari tidak terenkripsi 
kemudian diswitch atau dirubah ke komunikasi terenkripsi yang aman tapi tetap di port yang sama.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id="ssltls-handshake"&gt;SSL/TLS Handshake&lt;/h3&gt;
&lt;p&gt;Sebelum bisa bertukar data secara secure, antara client dan server perlu negosiasi dulu, proses ini namanya &lt;em&gt;handshake&lt;/em&gt;. Proses ini diperlukan karena implementasi dan support algoritma enkripsi 
antara client dan server bisa beda, jadi perlu adanya kesepakatan.&lt;/p&gt;
&lt;p&gt;Proses SSL/TLS Handshake kurang lebih seperti di bawah:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Client mengirim &lt;em&gt;&amp;ldquo;client hello&amp;rdquo;&lt;/em&gt; ke server. &amp;ldquo;client hello&amp;rdquo; ini berisi informasi CipherSuite atau algoritma apa saja yang disupport oleh client, versi SSL atau TLS juga diinformasikan di sini.&lt;/li&gt;
&lt;li&gt;Server membalas &lt;em&gt;&amp;ldquo;client hello&amp;rdquo;&lt;/em&gt; itu dengan &lt;em&gt;&amp;ldquo;server hello&amp;rdquo;&lt;/em&gt; yang berisi CipherSuite yang dipilih server. Bersamaan &amp;ldquo;server hello&amp;rdquo; ini dikirim juga digital certificate server.&lt;/li&gt;
&lt;li&gt;Client memeriksa validitas digital certificate yang dikirm server. Kalau digital certificate itu tidak valid entah karena alasan apapun, misalnya sudah expired atau digital certificate itu tidak dipercayai 
oleh client, maka proses handshake berhenti.&lt;/li&gt;
&lt;li&gt;Sebaliknya, kalau digital certificate itu valid dan trusted, maka client membuat semacam password yang disebut pre-master secret yang diambil dari byte string yang acak. Pre-master secret ini kemudian dienkripsi 
dengan public key server, public key ini ada di dalam certificate. Kemudian pre-master secret yang sudah terenkripsi dikirim ke server.&lt;/li&gt;
&lt;li&gt;Server kemudian men-&lt;em&gt;decrypt&lt;/em&gt; pre-master secret itu dengan private key-nya.&lt;/li&gt;
&lt;li&gt;Sampai di sini, client dan server yang sudah punya pre-master secret yang sama. Kemudian mereka berdua membuat symmetric encryption key berdasarkan pre-master secret tadi. Key ini yang nantinya dipakai buat encrypt dan decrypt data.&lt;/li&gt;
&lt;li&gt;Client mengirim pesan &lt;em&gt;&amp;ldquo;finished&amp;rdquo;&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Server mengirim pesan &lt;em&gt;&amp;ldquo;finished&amp;rdquo;&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Setelah proses &lt;em&gt;handshake&lt;/em&gt; di atas selesai, masing-masing client dan server bisa kirim dan terima data dengan terenkripsi pakai symmetric key. Perlu diingat bahwa symmetric encryption key yang dibuat tadi cuma berlaku 
di session itu, session lain lagi key-nya baru lagi.&lt;/p&gt;
&lt;p&gt;Kelihatan dari sini bahwa SSL/TLS ini pakai dua metode enkripsi yang berbeda, asymmetric dan symmetric. Asymmetric encryption dipakai waktu handshake supaya symmetric key bisa dibuat dengan aman, sedangkan symmetric key 
dipakai untuk komunikasi data.  &lt;/p&gt;
&lt;p&gt;Kita ingat lagi di atas, kelebihan symmetric encryption adalah kecepatannya. Sedangkan kelemahannya adalah distribusi key, dan penggunaan asymmetric encryption dipakai menutupi kekurangan itu. Di proses &lt;em&gt;handshake&lt;/em&gt; di 
atas tidak ada distribusi key, tapi masing-masing client dan server membuat key berdasarkan pre-master secret yang dienkripsi pakai public key server.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id="free-digital-certificate-dari-lets-encrypt"&gt;&lt;a name="letsencrypt"&gt;&lt;/a&gt;Free digital certificate dari Let&amp;rsquo;s Encrypt&lt;/h3&gt;
&lt;p&gt;Baik, pertama saya kutip dulu dari situs &lt;a href="https://letsencrypt.org"&gt;https://letsencrypt.org&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Let’s Encrypt is a free, automated, and open certificate authority (CA), run for the public’s benefit. It is a service provided by the Internet Security Research Group (ISRG).&lt;/p&gt;
&lt;p&gt;We give people the digital certificates they need in order to enable HTTPS (SSL/TLS) for websites, for free, in the most user-friendly way we can. We do this because we want to create a more secure and privacy-respecting Web.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sebelum Let&amp;rsquo;s Encrypt, sudah ada beberapa CA yang punya certificate gratis. Kebanyakan mereka itu provider hosting, yang kalau kita langganan hosting di situ kita dapat free SSL/TLS certificate. Ada juga StartSSL, CA dari 
perusahaan StartCom yang berbasis di.. &lt;s&gt;batuk..&lt;/s&gt; Israel.  &lt;/p&gt;
&lt;p&gt;Ada juga CAcert, oraganisi CA non profit. saya sendiri sudah lama pakai certificate dari CA ini, kekurangannya CA ini adopsinya kurang luas. Debian sendiri yang dulu defaultnya ada certificate dari CA ini sekarang sudah tidak 
di-include-kan lagi.&lt;/p&gt;
&lt;p&gt;Certificate authority atau CA ada yang namanya &lt;strong&gt;Root CA&lt;/strong&gt; sama &lt;strong&gt;Intermediate CA&lt;/strong&gt;. Jadi CA aslinya yang root, hanya saja untuk keamanan root CA ini tidak langsung mengeluarkan SSL/TLS certificate. Root CA ini mengeluarkan atau 
secara digital menandatangani certificate untuk CA lain yang disebut Intermediate CA. Intermediate CA ini yang kemudian melayani permintaan certificate atas nama root CA.&lt;br /&gt;
Root CA bisa saja punya lebih dari satu Intermediate CA, dan karena proses penandatanganan certificate sudah didelegasikan ke Intermediate CA, private key dari root CA bisa disimpan secara offline di tempat yang aman, aman 
dari pencurian termasuk juga aman dari force majeure seperti kebakaran.&lt;/p&gt;
&lt;p&gt;Nah, Let&amp;rsquo;s Encrypt di sini perannya adalah sebagai Intermediate CA, sedangkan root CA nya adalah DST Root CA X3 yang secara default sudah ada di browser atau SSL/TLS client.&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/misc/crt-chain.png" alt="certificate chain" title="Certificate Chain" /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id="instalasi"&gt;Instalasi&lt;/h3&gt;
&lt;p&gt;Untuk instalasinya, Let&amp;rsquo;s Encrypt perlu memastikan bahwa kita adalah benar sebagai pemilik domain dan website. Salah satu dari tiga cara bisa diambil buat verifikasi ini.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Memanfaatkan web server yang sudah running, misal Apache2 atau Nginx.&lt;/li&gt;
&lt;li&gt;Standalone web server dari Let&amp;rsquo;s Encrypt client.&lt;/li&gt;
&lt;li&gt;Manual, cara terakhir yang agak ribet. Cara ini diambil kalau kita tidak punya akses ke web server, misalnya website kita ada di shared hosting yang tidak punya fasilitas install Let&amp;rsquo;s Encrypt.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Karena system yang saya pakai Debian Jessie, mungkin saja cara di bawah ini tidak bisa diaplikasikan ke system lain.&lt;/p&gt;
&lt;p&gt;Pertama, install Let&amp;rsquo;s Encrypt client yang bernama certbot pakai user root.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;apt-get update &amp;amp;&amp;amp; apt-get install -y certbot&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kalau kita mau pakai web server yang sudah running, mungkin karena alasan traffic website yang tinggi sehingga web server tidak bisa di shutdown, kita perlu install plugin buat web server itu.&lt;br /&gt;
Untuk plugin Apache2&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;apt-get install python-certbot-apache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Untuk Nginx, ganti saja &lt;code&gt;apache&lt;/code&gt; dengan &lt;code&gt;nginx&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Yang perlu kita input ke program certbot adalah nama domain dan email untuk keperluan registrasi dan recovery. Kalau di server yang sama ada lebih dari satu domain, kita bisa buat satu sertifikat saja untuk semua domain tersebut.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cara pertama&lt;/strong&gt;, pakai existing web server, Apache2 misalnya:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;certbot certonly --apache --agree-tos --email hostmaster@example.com --domain example.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;&lt;code&gt;certonly&lt;/code&gt; di sini kita maksudkan bahwa kita cuma perlu certificate saja.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--agree-tos&lt;/code&gt; Term of service dari protokol komunikasi &lt;em&gt;Automated Certificate Management Environment&lt;/em&gt; (ACME).&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--email&lt;/code&gt; Sesuaikan email yang valid.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--domain&lt;/code&gt; nama domain sebagai identitas di certificate.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Untuk domain yang lebih dari satu, bisa seperti di bawah:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;certbot certonly --apache --agree-tos --email hostmaster@example.com --domain example.com --domain example2.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Cara kedua&lt;/strong&gt; pakai builtin web server certbot.&lt;br /&gt;
kalau web server masih running, kill dulu.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;killall apache2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Saya pakai command &lt;code&gt;killall apache2&lt;/code&gt; karena entah alasan apa command &lt;code&gt;systemctl stop apache2&lt;/code&gt; tidak bisa shutdown service apache2.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;certbot certonly --standalone --agree-tos --email hostmaster@example.com --domain example.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Setelah proses selesai, hidupkan lagi web server.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;systemctl start apache2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Cara ketiga&lt;/strong&gt;, manual. Ini dipakai kalau misalnya kita langganan shared hosting yang kita tidak punya akses ssh ke server, web hosting tersebut tidak ada fitur install Let&amp;rsquo;s Encrypt, dan support mereka tidak bisa membantu 
instalasi Let&amp;rsquo;s Encrypt atau bahkan tidak tahu apa itu Let&amp;rsquo;s Encrypt.&lt;/p&gt;
&lt;p&gt;Caranya adalah, &lt;code&gt;certbot&lt;/code&gt; kita install di laptop atau pc desktop misalnya, kemudian dari laptop itu eksekusi command &lt;code&gt;certbot&lt;/code&gt; seperti dibawah:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;certbot certonly --manual --agree-tos --email hostmaster@example.com --domain example.com&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Untuk cara manual, akan muncul warning dari &lt;code&gt;certbot&lt;/code&gt; bahwa ip address kita dilog di server Let&amp;rsquo;s Encrypt.&lt;br /&gt;
Lewat cara ini, Let&amp;rsquo;s Encrypt akan menginformasikan bahwa kita perlu upload file ke website, file ini berisi string sesuai instruksi &lt;code&gt;certbot&lt;/code&gt;. Cara verifikasi ini mirip seperti verifikasi Google, yang kita perlu upload 
file tertentu ke website kita.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p&gt;Begitu sukses instalasi, digital certificate ada di &lt;code&gt;/etc/letsencrypt/live/example.com/&lt;/code&gt; example.com cuma contoh saja. Ada 4 file yang keterangannya seperti di bawah:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;chain.pem&lt;/code&gt; Ini adalah file digital certificate Let&amp;rsquo;s Encrypt, Intermediate CA kita.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cert.pem&lt;/code&gt; Ini digital certificate kita yang sudah ditandatangani Let&amp;rsquo;s Encrypt.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;fullchain.pem&lt;/code&gt; Gabungan antara &lt;code&gt;chain.pem&lt;/code&gt; dan &lt;code&gt;cert.pem&lt;/code&gt;. File ini yang nantinya dipakai di web server karena kebanyakan browser tidak ada certificate Lets&amp;rsquo;s Encrypt, maka certificate dari Intermediate CA kita 
perlu disertakan supaya membentuk chain lengkap dari kita ke Let&amp;rsquo;s Encrypt sampai ke Digital Signature Trust (DST Root CA) yang root CA ini sudah ada di browser client.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;privkey.pem&lt;/code&gt; Ini adalah private key kita seperti yang sudah dibahas sebelumnya tentang asymmetric encryption. File ini yang harus kita jaga kerahasiannya.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Setelah itu, tinggal kita pakai file-file ini di konfigurasi web server, contoh untuk Apache2.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;SSLEngine               on&lt;/span&gt;
&lt;span class="err"&gt;SSLCertificateFile      /etc/letsencrypt/live/example.com/fullchain.pem&lt;/span&gt;
&lt;span class="err"&gt;SSLCertificateKeyFile   /etc/letsencrypt/live/example.com/privekey.pem&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;br /&gt;&lt;/p&gt;
&lt;h3 id="renewal"&gt;Renewal&lt;/h3&gt;
&lt;p&gt;Untuk renewal, caranya sama dengan instalasi, hanya saja &lt;code&gt;certonly&lt;/code&gt; diganti &lt;code&gt;renew&lt;/code&gt;. Kemudian &lt;code&gt;renew&lt;/code&gt; juga tidak perlu parameter &lt;code&gt;--email&lt;/code&gt; dan &lt;code&gt;--domain&lt;/code&gt;.&lt;br /&gt;
Misalnya:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;certbot renew --standalone --agree-tos&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Atau&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;certbot renew --apache --agree-tos&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Untuk yang manual.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;certbot renew --manual --agree-tos&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Terkecuali untuk yang &lt;code&gt;manual&lt;/code&gt;, &lt;code&gt;renew&lt;/code&gt; bisa dieksekusi lewat &lt;code&gt;cron&lt;/code&gt; supaya bisa renew certificate secara otomatis kalau sudah mendekati masa expire. Dan tidak seperti digital certificate yang mahal, certificate 
dari Let&amp;rsquo;s Encrypt ini umurnya pendek, cuma tiga bulan saja. Tapi karena renewal bisa diproses secara otomatis lewat &lt;code&gt;cron&lt;/code&gt; saya rasa tidak ada bedanya.&lt;/p&gt;
&lt;p&gt;&lt;br /&gt;
Baik, sampai sini semoga tulisan ini bisa dipahami. Silahkan di-share, dikomentari dan dikoreksi kalau ada yang salah atau kurang.&lt;/p&gt;
&lt;p&gt;Terima kasih.&lt;/p&gt;</content><category term="Misc"></category></entry><entry><title>Belajar Linux Dasar - File Permission</title><link href="//devnull.web.id/linux-padawan/linux-dasar-4.html" rel="alternate"></link><published>2016-07-24T00:00:00+08:00</published><updated>2016-07-24T00:00:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-07-24:/linux-padawan/linux-dasar-4.html</id><summary type="html">&lt;p&gt;Selamat pagi, siang, atau malam teman-teman Linuxers. Tulisan ini yang keempat seri pembelajaran Linux dasar, buat teman-teman yang belum baca tulisan sebelumnya, ini link-nya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="//devnull.web.id/linux-padawan/linux-dasar-1.html"&gt;Belajar Linux Dasar - Pengenalan Input &amp;amp; Output&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//devnull.web.id/linux-padawan/linux-dasar-2.html"&gt;Belajar Linux Dasar - Manajemen file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//devnull.web.id/linux-padawan/linux-dasar-3.html"&gt;Belajar Linux Dasar - Manipulasi Teks dan Stream&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Yang keempat ini kita bakal belajar tentang permissions …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Selamat pagi, siang, atau malam teman-teman Linuxers. Tulisan ini yang keempat seri pembelajaran Linux dasar, buat teman-teman yang belum baca tulisan sebelumnya, ini link-nya:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="//devnull.web.id/linux-padawan/linux-dasar-1.html"&gt;Belajar Linux Dasar - Pengenalan Input &amp;amp; Output&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//devnull.web.id/linux-padawan/linux-dasar-2.html"&gt;Belajar Linux Dasar - Manajemen file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="//devnull.web.id/linux-padawan/linux-dasar-3.html"&gt;Belajar Linux Dasar - Manipulasi Teks dan Stream&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Yang keempat ini kita bakal belajar tentang permissions. Permission ini kurang lebih seperti cara mengatur siapa yang bisa berbuat apa di file tertentu. Satu orang cuma bisa baca saja, orang lainnya bisa baca sama edit file, dan sebagainya. &lt;/p&gt;
&lt;p&gt;Buat memahami permission, paling tidak ada dua hal yang perlu kita pahami, yaitu pengelompokan user sama mode akses nya. Cara manipulasi permission dan penjelasan tentang SUID, SGID, dan Sticky bit juga ada di tulisan ini.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="user-group-dan-other"&gt;User, Group, dan Other.&lt;/h2&gt;
&lt;p&gt;Ada tiga jenis user di Unix dan Linux yang berhubungan dengan file permission; mereka itu &lt;em&gt;User&lt;/em&gt;, &lt;em&gt;Group&lt;/em&gt;, dan &lt;em&gt;Other&lt;/em&gt;. Seperti apakah mereka? di bawah:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;User&lt;/strong&gt;&lt;br /&gt;
Ini user yang punya file atau pemilik file. Kalau misalnya saya buat file bernama &amp;ldquo;blah&amp;rdquo; pakai command &lt;code&gt;touch blah&lt;/code&gt;, maka file &lt;code&gt;blah&lt;/code&gt; ini punya Saya, kecuali kepemilikan atau ownership file ini dialihkan ke user lain pakai command &lt;code&gt;chown&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Di Linux masing-masing user punya id yang unik. Kalau kita mau cek nama user kita yang lagi login, pakai command &lt;code&gt;whoami&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;whoami&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kalau mau cek nomor id user kita yang lagi login:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;id -u $(whoami)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Untuk nama-nama user yang lain bisa dilihat di file &lt;code&gt;/etc/passwd&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Group&lt;/strong&gt;&lt;br /&gt;
Beberapa user bisa digabungkan ke dalam satu grup. Sama seperti &lt;em&gt;User&lt;/em&gt;, &lt;em&gt;Group&lt;/em&gt; ini masing-masing juga punya nama dan nomor id yang unik.&lt;/p&gt;
&lt;p&gt;Nama-nama grup bisa dilihat di file &lt;code&gt;/etc/group&lt;/code&gt;. Kalau kita mau lihat user yang kita pakai sekarang tergabung di grup mana saja, ketik command &lt;code&gt;id&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Other&lt;/strong&gt;&lt;br /&gt;
Kalau yang ini berlaku buat semua user yang bukan pemilik file, juga tidak tergabung dalam grup pemilik file.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="mode-akses"&gt;Mode akses.&lt;/h2&gt;
&lt;p&gt;Berikutnya mode akses. Mode akses, atau permission ini yang menentukan hak akses masing-masing user yang sudah dijelaskan sebelumnya.&lt;br /&gt;
Setiap file, termasuk file direktori punya tiga mode akses seperti di bawah:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;read&lt;/strong&gt;. User yang punya akses &lt;strong&gt;read&lt;/strong&gt; dia bisa melihat isi file atau melihat atribut file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;write&lt;/strong&gt;. User yang punya akses &lt;strong&gt;write&lt;/strong&gt; berarti dia bisa update, edit, rename, move dan hapus file.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;execute&lt;/strong&gt;. Mode akses yang ini biasanya cuma diterapkan ke file program atau script, file program atau script tidak bisa dieksekusi kalau tidak punya mode &lt;strong&gt;execute&lt;/strong&gt;. Jadi user yang punya akses &lt;strong&gt;execute&lt;/strong&gt; ke file, dia bisa mengeksekusi file program atau script itu.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Berikutnya coba kita lihat contoh output command &lt;code&gt;ls -l&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ls -l blah &lt;/span&gt;
&lt;span class="err"&gt;-rwxr-xr-- 1 administrator admins 0 Jul 19 13:45 blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;File &lt;code&gt;blah&lt;/code&gt; di atas itu kepunyaan user &lt;code&gt;administrator&lt;/code&gt; sama grup &lt;code&gt;admins&lt;/code&gt;.&lt;br /&gt;
Permission-nya ada di kolom yang pertama, itu yang &lt;code&gt;-rwxr-xr--&lt;/code&gt;.&lt;br /&gt;
bagaimana cara bacanya ini?&lt;/p&gt;
&lt;div class="aimg"&gt;
  &lt;img src="//devnull.web.id/images/linux/lp/perm.png" /&gt;
&lt;/div&gt;

&lt;p&gt;Keterangannya seperti ini:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1) File type&lt;/strong&gt;&lt;br /&gt;
Karakter yang pertama itu menunjukkan jenis file, ada beberapa tipe seperti list di bawah:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-&lt;/code&gt; : Regular file atau gampangnya file biasa.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;d&lt;/code&gt; : File direktori atau folder, seperti yang dibuat pakai command &lt;code&gt;mkdir&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;l&lt;/code&gt; : Menunjukkan file jenis link seperti yang dibuat pakai command &lt;code&gt;ln -s&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;b&lt;/code&gt; : Block device, seperti flash disk, partisi hard drive, dsb.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;c&lt;/code&gt; : File character class seperti serial console.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;s&lt;/code&gt; : File socket jenis Unix.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2) User permission&lt;/strong&gt;&lt;br /&gt;
Permission ini berlaku buat pemilik file. Dalam contoh ini &lt;code&gt;rwx&lt;/code&gt; yang berarti si user pemilik file bisa &lt;strong&gt;baca (r)&lt;/strong&gt;, &lt;strong&gt;edit, rename, move dan hapus (w)&lt;/strong&gt;, dan &lt;strong&gt;execute (x)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3) Group Permission&lt;/strong&gt;&lt;br /&gt;
Permission yang ini berlaku buat grup pemilik file, grup ini isinya bisa nol user atau lebih. Di contoh, permission untuk grup &lt;code&gt;r-x&lt;/code&gt; yang berarti para user yang tergabung di grup ini, mereka bisa &lt;strong&gt;baca (r)&lt;/strong&gt; dan &lt;strong&gt;execute (x)&lt;/strong&gt; tapi tidak bisa edit, rename, move atau hapus file karena grup ini tidak punya permission &lt;strong&gt;write (w)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4) Other Permission&lt;/strong&gt;&lt;br /&gt;
Triad permission yang terakhir ini berlaku buat semua user selain nomor 2 dan nomor 3 di atas. Di contoh ini, para user yang tergolong &lt;strong&gt;other&lt;/strong&gt; cuma bisa baca file karena cuma ada permission baca atau &lt;strong&gt;read (r)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="manipulasi-permission"&gt;Manipulasi Permission&lt;/h2&gt;
&lt;p&gt;Hak akses atau permission untuk ketiga jenis user; user, group, dan other itu tidak statik yang artinya permission ini bisa dirubah. Untuk merubah permission kita pakai command &lt;code&gt;chmod&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Kalau mau rubah permission, kita bisa pilih salah satu dari dua mode &lt;code&gt;chmod&lt;/code&gt;, mode text sama numeric.&lt;br /&gt;
Kita lihat satu-satu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mode text&lt;/strong&gt;&lt;br /&gt;
Mode chmod yang ini pakai karakter huruf untuk masing-masing jenis user:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;u&lt;/code&gt; : yang berarti user pemilik file.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;g&lt;/code&gt; : grup pemilik file.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;o&lt;/code&gt; : other.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;a&lt;/code&gt; : semua user &lt;code&gt;u&lt;/code&gt;, &lt;code&gt;g&lt;/code&gt;, dan &lt;code&gt;o&lt;/code&gt;. Kita bisa pakai &lt;code&gt;a&lt;/code&gt; ini daripada harus ketik &lt;code&gt;ugo&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Contoh untuk set permission grup supaya bisa baca, edit dan hapus file:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# chmod g=rw blah&lt;/span&gt;
&lt;span class="err"&gt;# ls -l blah &lt;/span&gt;
&lt;span class="err"&gt;-rwxrw-r-- 1 administrator admins 0 Jul 19 13:45 blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Supaya &lt;code&gt;other&lt;/code&gt; tidak punya permission apa-apa, tidak bisa baca, edit dan execute:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# chmod o= blah&lt;/span&gt;
&lt;span class="err"&gt;# ls -l blah &lt;/span&gt;
&lt;span class="err"&gt;-rwxrw---- 1 administrator admins 0 Jul 19 13:45 blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;User pemilik file dengan akses penuh:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# chmod u=rwx blah&lt;/span&gt;
&lt;span class="err"&gt;# ls -l blah &lt;/span&gt;
&lt;span class="err"&gt;-rwxrw---- 1 administrator admins 0 Jul 19 13:45 blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Semua user punya akses penuh:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# chmod ugo=rwx blah&lt;/span&gt;
&lt;span class="err"&gt;# ls -l blah &lt;/span&gt;
&lt;span class="err"&gt;-rwxrwxrwx 1 administrator admins 0 Jul 19 13:45 blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Selain &lt;code&gt;ugo&lt;/code&gt; bisa juga pakai &lt;code&gt;a&lt;/code&gt; untuk semua user.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# chmod a=rwx blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Di mode ini, selain pakai tanda sama dengan &lt;code&gt;(=)&lt;/code&gt;, kita juga bisa pakai tanda minus &lt;code&gt;(-)&lt;/code&gt; atau plus &lt;code&gt;(+)&lt;/code&gt;.&lt;br /&gt;
Misalnya kalau &lt;code&gt;g=rwx&lt;/code&gt; itu berarti berikan hak akses penuh ke grup, &lt;code&gt;g-w&lt;/code&gt; berarti hilangkan permission &lt;code&gt;w&lt;/code&gt; dari grup. &lt;code&gt;g+w&lt;/code&gt; berarti tambahkan permission &lt;code&gt;write (w)&lt;/code&gt; ke grup.&lt;/p&gt;
&lt;p&gt;Contoh, kita hilangkan permission &lt;code&gt;w&lt;/code&gt; dan &lt;code&gt;x&lt;/code&gt; dari &lt;em&gt;group&lt;/em&gt; dan &lt;em&gt;other&lt;/em&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# chmod go-wx blah&lt;/span&gt;
&lt;span class="err"&gt;# ls -l blah&lt;/span&gt;
&lt;span class="err"&gt;-rwxr--r-- 1 administrator admins 0 Jul 19 13:45 blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Mode Numeric&lt;/strong&gt;&lt;br /&gt;
Kalau mode yang ini kita tidak pakai huruf-huruf seperti &lt;code&gt;u&lt;/code&gt;, &lt;code&gt;g&lt;/code&gt;, atau &lt;code&gt;o&lt;/code&gt;, tapi pakai angka oktal. Oktal? Bilangan yang angkanya cuma 8, dari 0 sampai 7.&lt;/p&gt;
&lt;p&gt;Caranya begini, tiga permission &lt;code&gt;r&lt;/code&gt;, &lt;code&gt;w&lt;/code&gt;, dan &lt;code&gt;x&lt;/code&gt; anggap saja seperti tiga kolom terus masing-masing kolom ini punya switch atau saklar on/off pakai bilangan biner yang bersifat boolean. Bilangan biner angkanya cuma &lt;code&gt;1&lt;/code&gt; sama &lt;code&gt;0&lt;/code&gt;, &lt;code&gt;1&lt;/code&gt; berarti hidup dan &lt;code&gt;0&lt;/code&gt; berarti mati.&lt;/p&gt;
&lt;p&gt;Contoh &lt;strong&gt;&lt;code&gt;r-x&lt;/code&gt;&lt;/strong&gt; berarti &lt;strong&gt;&lt;code&gt;101&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;rwx&lt;/code&gt;&lt;/strong&gt; berarti &lt;strong&gt;&lt;code&gt;111&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;r--&lt;/code&gt;&lt;/strong&gt; berarti &lt;strong&gt;&lt;code&gt;100&lt;/code&gt;&lt;/strong&gt;.&lt;br /&gt;
Angka &lt;strong&gt;&lt;code&gt;101&lt;/code&gt;&lt;/strong&gt; yang mewakili &lt;strong&gt;&lt;code&gt;r-x&lt;/code&gt;&lt;/strong&gt; itu bilangan biner, jadi angka &lt;strong&gt;&lt;code&gt;101&lt;/code&gt;&lt;/strong&gt; bukan berarti seratus satu, tapi &lt;strong&gt;&lt;code&gt;5&lt;/code&gt;&lt;/strong&gt; kalau dalam oktal.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;chmod&lt;/code&gt; mode numeric pakai tiga angka oktal; angka pertama mewakili permission untuk user, angka kedua mewakili group, dan angka ketiga mewakili permission other.&lt;/p&gt;
&lt;p&gt;Contoh untuk set permission jadi &lt;code&gt;rwxr-xr--&lt;/code&gt; :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# chmod 754 blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;command di atas kalau dalam mode text seperti ini :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# chmod u=rwx,g=rx,o=r blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Saya rasa gambar lebih bisa menjelaskan mode numeric ini.&lt;/p&gt;
&lt;div class="aimg"&gt;
  &lt;img src="//devnull.web.id/images/linux/lp/754.png" /&gt;
&lt;/div&gt;

&lt;p&gt;Gampangnya bisa kita ingat mode-mode permission-nya seperti ini :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;r&lt;/code&gt; = 4, atau dalam biner ditulis &lt;code&gt;100&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;w&lt;/code&gt; = 2, dalam biner ditulis &lt;code&gt;010&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;x&lt;/code&gt; = 1, dalam biner ditulis &lt;code&gt;001&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jadi &lt;code&gt;rwx&lt;/code&gt; sama dengan &lt;code&gt;421&lt;/code&gt; yang kalau angka-angka ini dijumlahkan sama dengan 7.&lt;br /&gt;
&lt;code&gt;r-x&lt;/code&gt; berarti &lt;code&gt;401&lt;/code&gt;, dijumlahkan jadi 5.
&lt;code&gt;r--&lt;/code&gt; berarti &lt;code&gt;400&lt;/code&gt;, ketiga angka ini dijumlahkan hasilnya 4.&lt;/p&gt;
&lt;p&gt;Itulah kenapa &lt;code&gt;754&lt;/code&gt; sama dengan &lt;code&gt;rwxr-xr--&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Contoh lain, mode &lt;code&gt;644&lt;/code&gt; :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# chmod 644 blah&lt;/span&gt;
&lt;span class="err"&gt;# ls -l blah&lt;/span&gt;
&lt;span class="err"&gt;-rw-r--r-- 1 administrator admins 0 Jul 19 13:45 blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Mode &lt;code&gt;644&lt;/code&gt; dengan gambar.&lt;/p&gt;
&lt;div class="aimg"&gt;
  &lt;img src="//devnull.web.id/images/linux/lp/644.png" /&gt;
&lt;/div&gt;

&lt;p&gt;Mode &lt;code&gt;777&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# chmod 777 blah&lt;/span&gt;
&lt;span class="err"&gt;# ls -l blah&lt;/span&gt;
&lt;span class="err"&gt;-rwxrwxrwx 1 administrator admins 0 Jul 19 13:45 blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;div class="aimg"&gt;
  &lt;img src="//devnull.web.id/images/linux/lp/777.png" /&gt;
&lt;/div&gt;

&lt;p&gt;Biar lebih gampang lagi, kita bisa lihat tabel di bawah:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th align="center"&gt;&lt;strong&gt;chmod numeric&lt;/strong&gt;&lt;/th&gt;
&lt;th align="center"&gt;&lt;strong&gt;Oktal&lt;/strong&gt;&lt;/th&gt;
&lt;th align="center"&gt;&lt;strong&gt;Biner&lt;/strong&gt;&lt;/th&gt;
&lt;th align="center"&gt;&lt;strong&gt;Teks&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td align="center"&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;0+0+0&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;000&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;---&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;0+0+1&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;001&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;--x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;0+2+0&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;010&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;-w-&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;0+2+1&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;011&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;-wx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;4+0+0&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;100&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;r--&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;&lt;code&gt;5&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;4+0+1&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;101&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;r-x&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;&lt;code&gt;6&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;4+2+0&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;110&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;rw-&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td align="center"&gt;&lt;code&gt;7&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;4+2+1&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;111&lt;/code&gt;&lt;/td&gt;
&lt;td align="center"&gt;&lt;code&gt;rwx&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Buat Saya, pakai numeric ini lebih ringkas daripada harus pakai &lt;code&gt;u&lt;/code&gt;, &lt;code&gt;g&lt;/code&gt;, atau &lt;code&gt;o&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="suid-sgid-sticky-bit"&gt;SUID, SGID, Sticky bit.&lt;/h2&gt;
&lt;p&gt;Pernah pakai command &lt;code&gt;sudo&lt;/code&gt;? Ya, pakai command &lt;code&gt;sudo&lt;/code&gt; kita bisa jalankan program pakai user lain, root misalnya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SUID&lt;/strong&gt; atau &lt;em&gt;Set User ID&lt;/em&gt; ini kurang lebih seperti &lt;code&gt;sudo&lt;/code&gt; tapi tanpa perlu pakai perintah &lt;code&gt;sudo&lt;/code&gt;. SUID ini cuma bisa dipakai di file executable seperti file program. Artinya file program executable yang ada flag &lt;em&gt;suid&lt;/em&gt; kalau dieksekusi, maka sistem Linux menjalankan prosesnya dengan user pemilik file, bukan user yang mengeksekusinya.&lt;/p&gt;
&lt;p&gt;Contoh file &lt;code&gt;/usr/bin/passwd&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ls -l /usr/bin/passwd&lt;/span&gt;
&lt;span class="err"&gt;-rwsr-xr-x 1 root root 53112 Nov 20  2014 /usr/bin/passwd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Coba kita perhatikan di permission yang pertama &lt;code&gt;(rws)&lt;/code&gt;, karakter &lt;code&gt;s&lt;/code&gt; menandakan SUID.&lt;br /&gt;
File itu punya user root dan dengan suid, siapapun bisa mengeksekusi file itu dan sistem akan menjalankannya dengan user &lt;code&gt;root&lt;/code&gt;. Karena itu user reguler bisa mengganti passwordnya sendiri biarpun tidak punya akses &lt;code&gt;write&lt;/code&gt; ke file &lt;code&gt;/etc/passwd&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;SGID&lt;/strong&gt; atau &lt;em&gt;Set Group ID&lt;/em&gt; kurang lebih seperti &lt;code&gt;SUID&lt;/code&gt; hanya saja untuk &lt;code&gt;group&lt;/code&gt;. Jadi program dengan sgid yang dijalankan oleh siapapun dianggap &lt;code&gt;group&lt;/code&gt; yang mengeksekusinya.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ls -l /usr/bin/bsd-write &lt;/span&gt;
&lt;span class="err"&gt;-rwxr-sr-x 1 root tty 9680 Oct 18  2014 /usr/bin/bsd-write&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sama seperti SUID, karakter &lt;code&gt;s&lt;/code&gt; menandakan sgid tapi di permission triad yang tengah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sticky bit&lt;/strong&gt; ini berguna buat mencegah file dihapus oleh user yang bukan pemilik file, biarpun di dalam direktori publik yang open access.&lt;/p&gt;
&lt;p&gt;Contohnya direktori &lt;code&gt;/tmp&lt;/code&gt;. Direktori ini punya mode &lt;code&gt;777&lt;/code&gt; yang artinya siapa saja punya akses penuh ke file-file yang ada di direktori ini, siapa saja bisa buat dan hapus file. Tapi kalau ada &lt;strong&gt;Sticky bit&lt;/strong&gt;, file tidak bisa dihapus, move, atau rename begitu saja oleh sembarang user, cuma user pemilik dan user &lt;code&gt;root&lt;/code&gt; saja yang bisa hapus, move, atau rename.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ls -ld /tmp&lt;/span&gt;
&lt;span class="err"&gt;drwxrwxrwt 16 root root 4096 Jul 20 15:15 /tmp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Karakter pertama &lt;code&gt;(d)&lt;/code&gt; menandakan file &lt;code&gt;/tmp&lt;/code&gt; itu file direktori. Tiga karakter berikutnya &lt;code&gt;(rwx)&lt;/code&gt; artinya user pemilik folder &lt;code&gt;/tmp&lt;/code&gt; punya akses penuh. Tiga karakter berikutnya untuk group &lt;code&gt;(rwx)&lt;/code&gt; yang juga berarti akses penuh. Terakhir &lt;code&gt;(rwt)&lt;/code&gt; untuk &lt;em&gt;Other&lt;/em&gt; yang berarti &lt;em&gt;read&lt;/em&gt;, &lt;em&gt;write&lt;/em&gt;, dan &lt;em&gt;sticky bit&lt;/em&gt;. Jadi karakter &lt;code&gt;t&lt;/code&gt; itu menandakan &lt;em&gt;sticky bit&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="bagaimana-set-suid-sgid-atau-sticky-bit"&gt;Bagaimana set SUID, SGID atau Sticky bit?&lt;/h3&gt;
&lt;p&gt;Sama seperti setting permission hanya saja kita pakai 4 angka, angka pertama untuk suid, sgid, dan sticky bit, tiga angka berikutnya permission untuk user, group, dan other.&lt;/p&gt;
&lt;p&gt;Angka oktal kurang lebih sama seperti permission &lt;code&gt;rwx&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SUID : 4 atau dalam biner 100.&lt;/li&gt;
&lt;li&gt;SGID : 2 atau dalam biner 010, dan.&lt;/li&gt;
&lt;li&gt;Sticky bit : 1 atau 001 dalam angka biner.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Contoh untuk set suid dan permission 755 di file &lt;code&gt;blah&lt;/code&gt; :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# chmod 4755 blah&lt;/span&gt;
&lt;span class="err"&gt;# ls -l blah&lt;/span&gt;
&lt;span class="err"&gt;-rwsr-xr-x 1 administrator admins 0 Jul 19 13:45 blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Set SGID:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# chmod 2755 blah&lt;/span&gt;
&lt;span class="err"&gt;# ls -l blah&lt;/span&gt;
&lt;span class="err"&gt;-rwxr-sr-x 1 administrator admins 0 Jul 19 13:45 blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Untuk Sticky bit:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# chmod 1755 blah&lt;/span&gt;
&lt;span class="err"&gt;# ls -l blah&lt;/span&gt;
&lt;span class="err"&gt;-rwxr-xr-t 1 administrator admins 0 Jul 19 13:45 blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kita bisa set dua flag atau lebih, misal &lt;code&gt;suid + sgid&lt;/code&gt; yang berarti &lt;code&gt;4 + 2 = 6&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# chmod 6755 blah&lt;/span&gt;
&lt;span class="err"&gt;# ls -l blah&lt;/span&gt;
&lt;span class="err"&gt;-rwsr-sr-x 1 administrator admins 0 Jul 19 13:45 blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Atau &lt;code&gt;suid + sticky bit&lt;/code&gt; yang berarti &lt;code&gt;4 + 1 = 5&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# chmod 5755 blah&lt;/span&gt;
&lt;span class="err"&gt;# ls -l blah&lt;/span&gt;
&lt;span class="err"&gt;-rwsr-xr-t 1 administrator admins 0 Jul 19 13:45 blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Selain mode numeric, kita juga bisa pakai mode text:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;SUID : s.&lt;/li&gt;
&lt;li&gt;SGID : s.&lt;/li&gt;
&lt;li&gt;Sticky bit : t.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;chmod u+s&lt;/code&gt; untuk set suid, &lt;code&gt;chmod g+s&lt;/code&gt; untuk set sgid, dan &lt;code&gt;chmod o+t&lt;/code&gt; untuk set sticky bit.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="merubah-ownership"&gt;Merubah Ownership&lt;/h2&gt;
&lt;p&gt;Ownership, atau kepemilikan file baik &lt;em&gt;user&lt;/em&gt; atau &lt;em&gt;group&lt;/em&gt; bisa diganti atau dialihkan ke user atau group lain.&lt;/p&gt;
&lt;p&gt;Untuk merubah user ownership pakai command &lt;code&gt;chown&lt;/code&gt;. Contoh merubah kepemilikan file &lt;code&gt;blah&lt;/code&gt; yang awalnya punya user &lt;code&gt;administrator&lt;/code&gt; dialihkan ke user &lt;code&gt;root&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# ls -l blah&lt;/span&gt;
&lt;span class="err"&gt;rwx-r-xr-x 1 administrator admins 0 Jul 19 13:45 blah&lt;/span&gt;
&lt;span class="err"&gt;# chown root blah&lt;/span&gt;
&lt;span class="err"&gt;# ls -l blah&lt;/span&gt;
&lt;span class="err"&gt;rwx-r-xr-x 1 root admins 0 Jul 19 13:45 blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Untuk mengganti &lt;em&gt;group&lt;/em&gt; kita pakai command &lt;code&gt;chgrp&lt;/code&gt;. Contoh rubah group admins ke group root.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# chgrp root blah&lt;/span&gt;
&lt;span class="err"&gt;# ls -l blah&lt;/span&gt;
&lt;span class="err"&gt;rwx-r-xr-x 1 root root 0 Jul 19 13:45 blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kita juga bisa rubah user sama grupnya pakai satu command &lt;code&gt;chown&lt;/code&gt;. Di bawah contoh buat rubah user ke &lt;code&gt;administrator&lt;/code&gt; dan grup ke &lt;code&gt;admins&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# chown administrator:admins blah&lt;/span&gt;
&lt;span class="err"&gt;# ls -l blah&lt;/span&gt;
&lt;span class="err"&gt;rwx-r-xr-x 1 administrator admins 0 Jul 19 13:45 blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Jadi, user dan grup dipisahkan dengan titik dua &lt;code&gt;(:)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Semua command di atas; &lt;code&gt;chmod&lt;/code&gt;, &lt;code&gt;chown&lt;/code&gt;, dan &lt;code&gt;chgrp&lt;/code&gt; bisa juga dipakai di direktori secara recursive. Artinya kalau kita rubah satu direktori, semua file sama direktori yang ada di dalamnya semua ikut berubah tanpa perlu eksekusi command ke file satu per satu.&lt;/p&gt;
&lt;p&gt;Untuk recursive pakai argumen &lt;code&gt;-R&lt;/code&gt;. Contoh, supaya tidak ada yang bisa baca isi folder &lt;code&gt;Documents&lt;/code&gt; selain yang punya.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;chmod -R 600 Documents&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dengan &lt;code&gt;-R&lt;/code&gt; semua file dan folder termasuk isinya semua permission-nya berubah.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Baik, semoga tulisan tentang Linux file permission ini bisa dipahami dengan mudah.&lt;br /&gt;
Silahkan dikomentari, kritik, share, atau abaikan.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Terima kasih.&lt;/p&gt;</content><category term="Linux Padawan"></category><category term="Linux"></category></entry><entry><title>Virus Ubiquiti v5.5.x error "Invalid Credentials"</title><link href="//devnull.web.id/misc/ubnt-virus-exploit.html" rel="alternate"></link><published>2016-06-08T14:35:00+08:00</published><updated>2016-06-08T14:35:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-06-08:/misc/ubnt-virus-exploit.html</id><summary type="html">&lt;p&gt;Beberapa hari lalu kami dibuat pusing karena tiba-tiba saja banyak perangkat radio Ubiquiti tidak bisa diakses. Kalau coba login ke perangkat-perangkat itu muncul pesan error &amp;ldquo;Invalid Credentials&amp;rdquo; yang berarti username atau password tidak valid.&lt;/p&gt;
&lt;p&gt;Tidak ada satu pun manusia yang merubah password. Lagi pula perangkat yang error itu jumlahnya banyak …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Beberapa hari lalu kami dibuat pusing karena tiba-tiba saja banyak perangkat radio Ubiquiti tidak bisa diakses. Kalau coba login ke perangkat-perangkat itu muncul pesan error &amp;ldquo;Invalid Credentials&amp;rdquo; yang berarti username atau password tidak valid.&lt;/p&gt;
&lt;p&gt;Tidak ada satu pun manusia yang merubah password. Lagi pula perangkat yang error itu jumlahnya banyak, jadi kecil kemungkinan password dirubah secara manual dengan waktu yang hampir bersamaan. Karena itu dugaan saya pertama kali ini pasti lewat scripting.&lt;/p&gt;
&lt;p&gt;Barangkali di antara rekan-rekan ada yang juga mengalami hal ini, ini karena virus yang menamakan dirinya &lt;em&gt;mf&lt;/em&gt; (motherfu**er), nama virus yang sama sekali tidak keren. Ciri-cirinya, sebagian kasus halaman login web bisa dibuka tapi gagal login. Sebagian kasus lainnya halaman login web tidak bisa dibuka tapi perangkat router atau radio itu reply kalau di-ping. untuk yang terakhir ini akses cuma bisa lewat ssh.&lt;/p&gt;
&lt;p&gt;Normalnya, kalau username dan password perangkat sudah berubah dan tidak bisa diakses lagi, berarti harus reset ke konfigurasi default. Ini yang buat saya agak sedikit horor karena banyaknya jumlah perangkat radio yang harus direset. Untungnya cara ini tidak perlu diambil.&lt;/p&gt;
&lt;p&gt;Saya kemudian coba cari-cari di database bug Ubiquiti AirMAX barangkali ada bug AirOS yang jadi sumber malapetaka ini. Benar saja, di HackerOne ada bug yang tergolong baru dan bug ini bisa dieksploitasi untuk bypass autentikasi.&lt;/p&gt;
&lt;p&gt;Sebelumnya kalau rekan-rekan ada yang belum tahu AirOS, ini OS embedded untuk perangkat jaringan (Radio dan router) Ubiquiti. OS ini pakai kernel Linux yang dibuat dari OpenWRT.&lt;/p&gt;
&lt;p&gt;Bug ini karena tidak adanya boundscheck untuk verifikasi user input lewat webserver lighttpd. Attacker bisa eksploitasi bug ini dengan upload file tanpa autentikasi. Parahnya lagi, file yang diupload itu bisa ditempatkan di mana saja karena punya hak akses root.&lt;/p&gt;
&lt;p&gt;Bayangkan saja kalau yang diupload itu &lt;code&gt;ssh public key&lt;/code&gt; atau file &lt;code&gt;passwd&lt;/code&gt;. File &lt;code&gt;passwd&lt;/code&gt; bisa buat overwrite file &lt;code&gt;/etc/passwd&lt;/code&gt;, si attacker bisa login tanpa perlu autentikasi. Apa bukan mimpi buruk ini namanya, heh?&lt;/p&gt;
&lt;p&gt;Saya lihat log bug ini di HackerOne, penemu bug ini dapat ganjaran 18.000 dolar dari Ubiquiti, whew&amp;hellip;!&lt;br /&gt;
Ubiquiti kemudian menutup bug ini di AirOS versi 5.6.2.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Kembali ke virus &lt;em&gt;motherfucker&lt;/em&gt; yang mengeksploitasi bug ini.&lt;/p&gt;
&lt;h3 id="apa-yang-dilakukan-virus-ini"&gt;Apa yang dilakukan virus ini?&lt;/h3&gt;
&lt;p&gt;Virus ini di awal-awal akan download virus dari &lt;a href="http://pastebin.com/raw/heNFjBVK" target="_blank"&gt;http://pastebin.com/raw/heNFjBVK&lt;/a&gt; terus extract virus mf.tgz ke direktori &lt;code&gt;/etc/persistent&lt;/code&gt; terus buat direktori hidden &lt;code&gt;/etc/persistent/.mf&lt;/code&gt;. Virus ini kemudian menghapus user &lt;code&gt;ubnt&lt;/code&gt;, mengganti file &lt;code&gt;/etc/passwd&lt;/code&gt; dengan file &lt;code&gt;passwd&lt;/code&gt; versi virus.&lt;/p&gt;
&lt;p&gt;Ada user baru di &lt;code&gt;passwd&lt;/code&gt; dengan nama user &lt;code&gt;moth3r&lt;/code&gt; dan password hash &lt;code&gt;$1$RpWdAhdc$cNgp9llO5jKApRaG8b4nK1&lt;/code&gt;. Belakangan diketahui password hash itu &lt;code&gt;fuck.3r&lt;/code&gt;, seseorang di belahan bumi yang lain berhasil brut force hash itu pakai &lt;em&gt;John the Ripper&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Selanjutnya virus ini merubah mode wireless ke master, mengganti ssid, disable dhcp server, dan disable tombol reset. Untungnya semua itu gagal, jadi tidak ada yang terubah.&lt;/p&gt;
&lt;p&gt;Virus ini menyebar dengan melihat &lt;code&gt;ip neighbor&lt;/code&gt; dan menyebar ke perangkat yang bertetangga dengan perangkat yang terinfeksi itu.&lt;/p&gt;
&lt;p&gt;Siapa yang vulnerable dengan virus ini? mereka adalah perangkat radio atau router Ubiquiti AirMAX yang pakai OS dibawah 5.6.2.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="cara-hapus-virus"&gt;Cara hapus virus&lt;/h3&gt;
&lt;p&gt;Cara paling gampang kalau bisa login ssh ke router pakai username &lt;code&gt;moth3r&lt;/code&gt; dan password &lt;code&gt;fuck.3r&lt;/code&gt;. Dari sini hapus direktori &lt;code&gt;/etc/persistent/.mf&lt;/code&gt; sama &lt;code&gt;/etc/persistent/rc.poststart&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;for i in $(ps | grep mf | awk &amp;#39;{print $1}&amp;#39; | sed &amp;#39;s/ //&amp;#39;); do kill $i; done&lt;/span&gt;
&lt;span class="err"&gt;rm -rf /etc/persistent/.mf&lt;/span&gt;
&lt;span class="err"&gt;rm -f /etc/persistent/rc.poststart&lt;/span&gt;
&lt;span class="err"&gt;cfgmtd -w -f /tmp/system.cfg -p /etc/&lt;/span&gt;
&lt;span class="err"&gt;reboot&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Masalahnya, ada sebagian perangkat yang user dan password itu invalid. Jadi kita tidak tahu apa passwordnya, jadi kita harus cari cara yang lain.&lt;/p&gt;
&lt;p&gt;Kita bisa login kembali ke perangkat Ubiquiti itu dengan cara yang sama yang dipakai exploit. saya pakai file &lt;code&gt;passwd&lt;/code&gt; sama file &lt;code&gt;ssh public key&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1) user di file passwd&lt;/strong&gt;&lt;br /&gt;
Kita bisa pakai file &lt;code&gt;passwd&lt;/code&gt; dari mana saja. Yang di bawah ini juga bisa dipakai.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;blah&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Ddc96rtq5NYfG&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Administrator&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="sr"&gt;/persistent:/bin/s&lt;/span&gt;&lt;span class="n"&gt;h&lt;/span&gt;
&lt;span class="n"&gt;ubnt&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;IXpEhRnqWrjjI&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;Administrator&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="sr"&gt;/persistent:/bin/&lt;/span&gt;&lt;span class="kc"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Tidak penting apa passwordnya karena nantinya kita login pakai ssh key.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2) Buat ssh key&lt;/strong&gt;&lt;br /&gt;
Ssh key bisa dibuat pakai command &lt;code&gt;ssh-keygen&lt;/code&gt;, passphrase kosong saja biar nantinya bisa login tanpa password.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;Endor &amp;gt; ssh-keygen -t rsa -C &amp;quot;blah@blah.com&amp;quot;&lt;/span&gt;
&lt;span class="err"&gt;Generating public/private rsa key pair.&lt;/span&gt;
&lt;span class="err"&gt;Enter file in which to save the key (/home/user/.ssh/id_rsa): blah_rsa&lt;/span&gt;
&lt;span class="err"&gt;Enter passphrase (empty for no passphrase): &lt;/span&gt;
&lt;span class="err"&gt;Enter same passphrase again: &lt;/span&gt;
&lt;span class="err"&gt;Your identification has been saved in blah_rsa.&lt;/span&gt;
&lt;span class="err"&gt;Your public key has been saved in blah_rsa.pub.&lt;/span&gt;
&lt;span class="err"&gt;The key fingerprint is:&lt;/span&gt;
&lt;span class="c"&gt;ff:98:31:3b:3b:ec:70:8f:3c:34:6b:09:e0:2b:f4:d6 blah@blah.com&lt;/span&gt;
&lt;span class="err"&gt;The key&amp;#39;s randomart image is:&lt;/span&gt;
&lt;span class="err"&gt;+---[RSA 2048]----+&lt;/span&gt;
&lt;span class="err"&gt;|                 |&lt;/span&gt;
&lt;span class="err"&gt;|                 |&lt;/span&gt;
&lt;span class="err"&gt;|                 |&lt;/span&gt;
&lt;span class="err"&gt;|      .          |&lt;/span&gt;
&lt;span class="err"&gt;|     . .S        |&lt;/span&gt;
&lt;span class="err"&gt;|    . . ..o      |&lt;/span&gt;
&lt;span class="err"&gt;|   . . o.+=+     |&lt;/span&gt;
&lt;span class="err"&gt;|    . + E+OX     |&lt;/span&gt;
&lt;span class="err"&gt;|     o   oO=o    |&lt;/span&gt;
&lt;span class="err"&gt;+-----------------+&lt;/span&gt;
&lt;span class="err"&gt;Endor &amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;3) Upload file passwd dan ssh public key&lt;/strong&gt;&lt;br /&gt;
Di sini bug itu, kita bisa seenaknya upload file terus tempatkan file itu di mana saja tanpa perlu autentikasi. Fatal kan?&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;curl -F &amp;quot;file=@passwd;filename=../../etc/passwd&amp;quot; -H &amp;quot;Expect:&amp;quot; &amp;quot;https://192.168.1.20/login.cgi&amp;quot; -k&lt;/span&gt;
&lt;span class="err"&gt;curl -F &amp;quot;file=@blah_rsa.pub;filename=../../etc/dropbear/authorized_keys&amp;quot; -H &amp;quot;Expect:&amp;quot; &amp;quot;https://192.168.1.20/login.cgi&amp;quot; -k&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ip address 192.168.1.20 itu contoh saja.&lt;/p&gt;
&lt;p&gt;Kemudian coba login ssh&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="n"&gt;blah_rsa&lt;/span&gt; &lt;span class="n"&gt;blah&lt;/span&gt;&lt;span class="mf"&gt;@192.168.1.20&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Saya berhasil login pakai ssh key, fiuhh..!! rasanya lega sekali.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4) Hapus virus&lt;/strong&gt;&lt;br /&gt;
Sebelum hapus virus, kita harus kill dulu semua proses yang ada hubungannya sama mf.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;for i in $(ps | grep mf | awk &amp;#39;{print $1}&amp;#39; | sed &amp;#39;s/ //&amp;#39;); do kill $i; done&lt;/span&gt;
&lt;span class="err"&gt;rm -rf /etc/persistent/.mf&lt;/span&gt;
&lt;span class="err"&gt;rm -f /etc/persistent/rc.poststart&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Masih di shell Ubiquiti, kembalikan password ke default&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;/usr/bin/sed -i &amp;#39;s/users\.1\.password=.*/users\.1\.password=35YnFRwmUdGzc/&amp;#39; /tmp/system.cfg&lt;/span&gt;
&lt;span class="err"&gt;cfgmtd -w -f /tmp/system.cfg -p /etc/&lt;/span&gt;
&lt;span class="err"&gt;reboot&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Lokasi &lt;code&gt;sed&lt;/code&gt; kalau di Ubiquiti AirOS memang di &lt;code&gt;/usr/bin/sed&lt;/code&gt;, beda sama kebanyakan Linux yang &lt;code&gt;sed&lt;/code&gt; nya ada di &lt;code&gt;/bin/sed&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Setelah selesai reboot, kita bisa login ke router pakai password default &amp;ldquo;&lt;code&gt;ubnt&lt;/code&gt;&amp;rdquo; terus upgrade ke firmware yang baru.&lt;/p&gt;
&lt;p&gt;Selain di atas, ada cara lain lagi yang bisa diambil.&lt;br /&gt;
Virus ini awal-awal masuk ke router, dia bakalan download &lt;code&gt;curl&lt;/code&gt; dari &lt;a href="http://downloads.openwrt.org" target="_blank"&gt;http://downloads.openwrt.org&lt;/a&gt; dan &lt;a href="http://bo.mirror.garr.it/mirrors/openwrt" target="_blank"&gt;http://bo.mirror.garr.it/mirrors/openwrt&lt;/a&gt;. Kita bisa buat file &lt;code&gt;curl&lt;/code&gt; palsu yang isinya script buat hapus virus. Jadi waktu virus itu coba download &lt;code&gt;curl&lt;/code&gt; dari openwrt.org, kita alihkan supaya download dari web server lokal yang isinya file &lt;code&gt;curl&lt;/code&gt; palsu. Begitu virus ini eksekusi &lt;code&gt;curl&lt;/code&gt;, yang ada bukannya menginfeksi tetangganya tapi malah bunuh diri.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Virus ini sudah mendunia, di forum Ubiquiti ada yang mengaku punya ribuan perangkat yang terinfeksi dalam semalam saja. saya membayangkannya saja seperti mimpi buruk, apalagi mengalaminya. Saran, kalau teman-teman punya Ubiquiti dengan firmware dibawah 5.6.2 dan belum kena, segera saja upgrade ke firmware baru.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Info:&lt;/strong&gt;&lt;br /&gt;
Tulisan ini salah satu sumbernya saya ambil dari situs www.exploit-db.com. IDWebhost yang jadi hosting provider blog ini ternyata punya policy tidak boleh nge-link ke situs yang ada kata &amp;ldquo;exploit&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Saya chatting panjang kali lebar dengan support IDWebhost karena begitu tulisan ini online malah tidak bisa diakses dengan kode 404, ternyata penyebabnya karena link itu.&lt;/p&gt;
&lt;p&gt;Jadi source-nya yang untuk exploit-db sedikit saya sensor. Rubah &lt;code&gt;https://www.exploxx-db.com/exploxxx/39853/&lt;/code&gt; ke &lt;code&gt;https://www.exploit-db.com/exploits/39853/&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Source:&lt;/strong&gt;  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.exploxx-db.com/exploxxx/39853/" target="_blank"&gt;https://www.exploit-db.com/exploits/39853/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://hackerone.com/reports/73480" target="_blank"&gt;https://hackerone.com/reports/73480&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.securityweek.com/worm-infects-many-ubiquiti-devices-old-vulnerability" target="_blank"&gt;http://www.securityweek.com/worm-infects-many-ubiquiti-devices-old-vulnerability&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cerita lainnya:&lt;/strong&gt;&lt;br /&gt;
&lt;a href="//devnull.web.id/networking/pengenalan-ipv6.html"&gt;&amp;ldquo;Hampir&amp;rdquo; Semua Tentang IPv6&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;Tulisan tentang IPv6 yang berusaha komprehensif tapi ternyata gagal membahas semua hal tentang IPv6. “Hampir” Semua Tentang IPv6, dari sejarah, kelebihan IPv6, sampai pengalamatannya.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="//devnull.web.id/openstack/pengenalan-openstack.html"&gt;Membumikan OpenStack&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;This is a story about How I Met &lt;s&gt;Your Mother&lt;/s&gt; OpenStack, ditulis dengan Layman&amp;rsquo;s term.&lt;/em&gt;&lt;/p&gt;</content><category term="Misc"></category><category term="Linux"></category><category term="Networking"></category></entry><entry><title>Solusi IPv6 di OpenStack Icehouse</title><link href="//devnull.web.id/openstack/ipv6-openstack-icehouse.html" rel="alternate"></link><published>2016-06-02T10:13:00+08:00</published><updated>2016-06-02T10:13:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-06-02:/openstack/ipv6-openstack-icehouse.html</id><summary type="html">&lt;p&gt;OpenStack yang pertama kali saya install pakai Debian 8, dan seperti anak kecil yang dapat mainan baru, Saya begitu excited sama OpenStack ini.&lt;br /&gt;
Icehouse, ini versi OpenStack yang default di Debian Jessie, versi OpenStack yang sebenarnya dirilis tahun 2014 lalu dan sekarang sudah masuk masa EOL atau &lt;em&gt;End of Life …&lt;/em&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;OpenStack yang pertama kali saya install pakai Debian 8, dan seperti anak kecil yang dapat mainan baru, Saya begitu excited sama OpenStack ini.&lt;br /&gt;
Icehouse, ini versi OpenStack yang default di Debian Jessie, versi OpenStack yang sebenarnya dirilis tahun 2014 lalu dan sekarang sudah masuk masa EOL atau &lt;em&gt;End of Life&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Budaya di Debian Stable memang begitu, lebih mengutamakan kestabilan daripada keterbaruan. saya yang pertama kalinya menginstall OpenStack Icehouse di Debian 8 merasakan itu, Saya tidak banyak menemui masalah waktu instalasi.&lt;/p&gt;
&lt;p&gt;Semua komponen OpenStack sudah running; Keystone, Nova, Cinder, Glance, dan Neutron semuanya sudah jalan. Kemudian saya buat vm, install OS Debian di vm itu terus migrasi konfigurasi dari server yang lama. Selanjutnya, Saya buat virtual router dan setup networking IPv4 buat guest OS, semuanya lancar jaya tidak ada masalah.&lt;/p&gt;
&lt;p&gt;Lalu problem itu muncul waktu saya coba setting koneksi IPv6, OpenStack Neutron tidak bisa buat external network pakai IPv6 padahal untuk internal network tidak ada masalah.&lt;br /&gt;
Berikutnya saya menghabiskan berjam-jam buat Googling dan berujung satu kesimpulan, OpenStack versi Icehouse ini belum sepenuhnya mendukung IPv6.&lt;/p&gt;
&lt;p&gt;Saya seperti nabrak dinding dan sedikit frustasi. Penyebabnya karena pertama, proses instalasi ini sudah terlanjur jauh dan tinggal satu potongan puzzle saja yang tidak bisa, IPv6 itu. Kedua, koneksi IPv6 ini penting karena sebelumnya para server ini juga sudah pakai IPv6 waktu masih pakai Xen. Jadi bagaimanapun caranya, para server itu harus punya koneksi IPv6.&lt;/p&gt;
&lt;p&gt;Saya punya tiga pilihan. Pertama uninstall OpenStack dan kembali ke Xen, yang ini tidak saya ambil. Kedua, baca kode Python OpenStack Neutron, cari tahu masalahnya di mana dan perbaiki. Cara kedua ini berat, Saya terlalu hebat kalau bisa memahami kode Neutron dalam satu atau dua hari. Tinggal pilihan ketiga, pelajari bagaimana cara kerja OpenStack Neutron dan lihat barangkali ada workaround yang bisa diambil.&lt;/p&gt;
&lt;p&gt;Pilihan ketiga saya ambil dan dua hari berikutnya Saya habiskan buat baca dokumentasi, Googling, sama utak-atik OpenStack. Begitu sudah paham cara kerja OpenStack Neutron, solusinya ternyata simpel, gampang dan agak konyol. Cuma tinggal tambah IP address sama tambah route ke routing table, sudah beres.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Karena saya belum paham kode OpenStack Neutron jadi Saya juga tidak paham penyebab masalah IPv6 ini, tapi mungkin saja karena desain networking yang dipakai.&lt;/p&gt;
&lt;p&gt;OpenStack punya istilah-istilah yang menurut saya aneh untuk IP addressing, ada yang namanya floating IP sama fixed IP. Floating IP ini IP address yang dipakai buat komunikasi guest OS dengan external network seperti Internet misalnya, floating IP ini bisa berubah-ubah dan biasanya floating IP ini IP address publik.&lt;/p&gt;
&lt;p&gt;Kalau fixed IP, ini IP address yang fix dipakai di guest OS, IP address yang ini tidak bakal berubah dan biasanya ini jenis IP address private.&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/openstack/openstack-router.png" alt="OpenStack Virtual Router" title="OpenStack Virtual Router" /&gt;
&lt;/div&gt;

&lt;p&gt;Dengan setup seperti di gambar itu, satu floating IP dipetakan ke satu fixed IP pakai NAT. Jadi untuk akses ke guest OS dari network luar, yang diakses floating IP-nya bukan yang fixed IP. NAT yang kemudian meneruskan paket IP ke fixed IP yang dipakai guest OS.&lt;/p&gt;
&lt;p&gt;Begitu juga kalau guest OS ke external network seperti Internet misalnya, IP address yang fixed IP itu diterjemahkan ke floating IP oleh NAT, jadi yang kelihatan dari Internet bukan yang fixed IP tapi yang floating IP.&lt;/p&gt;
&lt;p&gt;Dengan desain network yang seperti itu, kelihatan sekali kalau network itu buat IPv4. Kalau desain seperti ini dibuat IPv6 bakalan tidak bisa, karena di IPv6 tidak ada lagi yang namanya NAT. Di IPv6 kita punya 3,4x10&lt;sup&gt;38&lt;/sup&gt; IP address, jadi kita tidak perlu lagi NAT.&lt;/p&gt;
&lt;p&gt;Kalau IPv6 dan NAT ini masih asing buat Anda, saya sudah tulis artikel tentang IPv6 dengan judul &lt;a href="//devnull.web.id/networking/pengenalan-ipv6.html"&gt;&amp;ldquo;Hampir&amp;rdquo; Semua Tentang IPv6&lt;/a&gt;. Silahkan dibaca, artikel ini mungkin saja bisa sedikit mencerahkan tentang IPv6.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="sudah-cukup-sekarang-solusinya-bagaimana"&gt;Sudah cukup, sekarang solusinya bagaimana?&lt;/h3&gt;
&lt;p&gt;Salah satu dari dua opsi bisa diambil.&lt;br /&gt;
&lt;strong&gt;Pertama&lt;/strong&gt;, dengan mengeliminasi virtual router dan menggantikannya pakai router fisik.&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/openstack/openstack-ext.png" alt="OpenStack External Network" title="OpenStack External Network" /&gt;
&lt;/div&gt;

&lt;p&gt;Dengan begini, external network langsung di-attach ke guest OS dan IP address public bisa langsung di-set di guest OS. Dengan cara ini, kemungkinan juga firewall perlu disesuaikan.&lt;/p&gt;
&lt;p&gt;Buat saya sayangnya, Saya sudah terlanjur pakai virtual router untuk IPv4 dan merubah topologi itu ke cara pertama berarti Saya harus setup networking dari awal lagi. Saya cari cara yang lain saja.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cara kedua&lt;/strong&gt;, ugly workaround.&lt;/p&gt;
&lt;p&gt;Cara yang kedua ini tetap pakai virtual router seperti di gambar yang pertama, hanya saja saya menambahkan IPv6 address termasuk route nya ke virtual router.&lt;/p&gt;
&lt;p&gt;Kalau Anda belum ngeh apa itu Linux namespace, ada baiknya baca ini dulu &lt;a href="//devnull.web.id/openstack/openstack-network-namespace.html"&gt;Cara Kerja OpenStack Networking - Memahami Network Namespace&lt;/a&gt; karena virtual router OpenStack pakai Linux namespace.&lt;/p&gt;
&lt;p&gt;Lanjut, karena koneksi IPv4 di OpenStack ini sudah jalan, berarti saya sudah punya virtual router termasuk interface-nya.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;root@Controller:~# ip netns show&lt;/span&gt;
&lt;span class="err"&gt;qrouter-3b71f8b1-4f6f-4647-abd3-bac4b1aebe7d&lt;/span&gt;
&lt;span class="err"&gt;root@Controller:~# ip netns exec qrouter-3b71f8b1-4f6f-4647-abd3-bac4b1aebe7d ip link show&lt;/span&gt;
&lt;span class="c"&gt;1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default &lt;/span&gt;
&lt;span class="c"&gt;    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;/span&gt;
&lt;span class="c"&gt;7: qg-25efe5e5-07: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default &lt;/span&gt;
&lt;span class="c"&gt;    link/ether fa:16:3e:84:ca:5c brd ff:ff:ff:ff:ff:ff&lt;/span&gt;
&lt;span class="c"&gt;9: qr-6d6d8407-22: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default &lt;/span&gt;
&lt;span class="c"&gt;    link/ether fa:16:3e:7f:a5:23 brd ff:ff:ff:ff:ff:ff&lt;/span&gt;
&lt;span class="c"&gt;10: qr-cadd47a6-a2: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default &lt;/span&gt;
&lt;span class="c"&gt;    link/ether fa:16:3e:c9:b5:47 brd ff:ff:ff:ff:ff:ff&lt;/span&gt;
&lt;span class="c"&gt;12: qr-c5ad4b75-f0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default &lt;/span&gt;
&lt;span class="c"&gt;    link/ether fa:16:3e:69:23:ee brd ff:ff:ff:ff:ff:ff&lt;/span&gt;
&lt;span class="err"&gt;root@Controller:~#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Keterangan namespace dan port seperti di bawah:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;qrouter-3b71f8b1-4f6f-4647-abd3-bac4b1aebe7d&lt;/code&gt;. Ini nama namespace untuk virtual router yang dipakai. Kalau ada lebih dari satu router, namespace juga lebih dari satu.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lo&lt;/code&gt;. Interface loopback di virtual router.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qg-25efe5e5-07&lt;/code&gt;. Interface yang terkoneksi ke external network, sebut saja WAN.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qr-6d6d8407-22&lt;/code&gt;. Interface yang terkoneksi ke internal network 1, atau LAN 1 untuk IPv4.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qr-cadd47a6-a2&lt;/code&gt;. Interface internal network 2, LAN 2 buat IPv4.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;qr-c5ad4b75-f0&lt;/code&gt;. Interface internal network buat IPv6.&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/openstack/openstack-virtual-router.png" alt="OpenStack Virtual Router" title="OpenStack Virtual Router" /&gt;
&lt;/div&gt;

&lt;p&gt;Cara buat dual-stack IPv4 dan IPv6 di virtual router itu gampang saja.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Tambahkan IPv6 address di interface &lt;code&gt;qg-25efe5e5-07&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tambahkan default route IPv6 di router &lt;code&gt;qrouter-3b71f8b1-4f6f-4647-abd3-bac4b1aebe7d&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Tambahkan route di router fisik, entah dynamic atau static route terserah saja.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Untuk network IPv6 IP address-nya saya rubah, kita anggap saja untuk link inter-router pakai prefix &lt;code&gt;2001:db8:dead::/64&lt;/code&gt; dengan &lt;code&gt;2001:db8:dead::1&lt;/code&gt; di router fisik dan &lt;code&gt;2001:db8:dead::2&lt;/code&gt; di &lt;code&gt;qg-25efe5e5-07&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Untuk network guest OS, prefix anggap saja &lt;code&gt;2001:db8:cafe::/64&lt;/code&gt;, IPv6 address di interface &lt;code&gt;qr-c5ad4b75-f0&lt;/code&gt; kita pakai &lt;code&gt;2001:db8:cafe::1&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Gambarannya seperti di bawah:&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/openstack/openstack-dual-stack.png" alt="OpenStack Dual-stack" title="OpenStack Dual-stack" /&gt;
&lt;/div&gt;

&lt;p&gt;Langkah-langkahnya seperti ini,&lt;br /&gt;
&lt;strong&gt;Pertama&lt;/strong&gt;, Tambahkan IPv6 address di port &lt;code&gt;qg-25efe5e5-07&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;root@Controller:~# ip netns \&lt;/span&gt;
&lt;span class="err"&gt;&amp;gt; exec qrouter-3b71f8b1-4f6f-4647-abd3-bac4b1aebe7d \&lt;/span&gt;
&lt;span class="err"&gt;&amp;gt; ip -6 addr add 2001:db8:dead::2/64 dev qg-25efe5e5-07&lt;/span&gt;
&lt;span class="err"&gt;root@Controller:~#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Kedua&lt;/strong&gt;, default route di virtual router.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;root@Controller:~# ip netns \&lt;/span&gt;
&lt;span class="err"&gt;&amp;gt; exec qrouter-3b71f8b1-4f6f-4647-abd3-bac4b1aebe7d \&lt;/span&gt;
&lt;span class="err"&gt;&amp;gt; ip -6 route add default via 2001:db8:dead::1&lt;/span&gt;
&lt;span class="err"&gt;root@Controller:~#&lt;/span&gt;
&lt;span class="err"&gt;root@Controller:~# ip netns \&lt;/span&gt;
&lt;span class="err"&gt;&amp;gt; exec qrouter-3b71f8b1-4f6f-4647-abd3-bac4b1aebe7d \&lt;/span&gt;
&lt;span class="err"&gt;&amp;gt; ip -6 route show&lt;/span&gt;
&lt;span class="c"&gt;2001:db8:dead::/64 dev qg-25efe5e5-07  proto kernel  metric 256 &lt;/span&gt;
&lt;span class="c"&gt;2001:db8:cafe::/64 dev qr-c5ad4b75-f0  proto kernel  metric 256 &lt;/span&gt;
&lt;span class="c"&gt;fe80::/64 dev qr-6d6d8407-22  proto kernel  metric 256 &lt;/span&gt;
&lt;span class="c"&gt;fe80::/64 dev qr-c5ad4b75-f0  proto kernel  metric 256 &lt;/span&gt;
&lt;span class="c"&gt;fe80::/64 dev qr-cadd47a6-a2  proto kernel  metric 256 &lt;/span&gt;
&lt;span class="c"&gt;fe80::/64 dev qg-25efe5e5-07  proto kernel  metric 256 &lt;/span&gt;
&lt;span class="err"&gt;default via 2001:db8:dead::1 dev qg-25efe5e5-07  metric 1024&lt;/span&gt;
&lt;span class="err"&gt;root@Controller:~#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Ketiga&lt;/strong&gt;, tambahkan route &lt;code&gt;2002:db8:cafe::/64&lt;/code&gt; di router fisik .&lt;br /&gt;
Ini tergantung OS routernya, misalnya untuk router yang pakai OS Linux.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ip -6 route add 2001:db8:cafe::/64 via 2001:db8:dead::2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Vyatta dan VyOS.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;user@ROUTER:~$ configure&lt;/span&gt;
&lt;span class="err"&gt;user@ROUTER:~# set protocols static route6 2001:db8:cafe::/64 next-hop 2001:db8:dead::2&lt;/span&gt;
&lt;span class="err"&gt;user@ROUTER:~# commit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;MikroTik RouterOS.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;/ipv6 route add dst-address=2001:db8:cafe::/64 gateway=2001:db8:dead::2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Cisco IOS dan Quagga.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ipv6 route 2001:db8:cafe::/64 2001:db8:dead::2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Setelah selesai ini kemudian saya coba koneksi IPv6 dari server guest OS.&lt;/p&gt;
&lt;p&gt;IPv6 berhasil..! saya terselamatkan.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="dengan-script-hidup-jadi-lebih-mudah"&gt;Dengan script, hidup jadi lebih mudah&lt;/h3&gt;
&lt;p&gt;Kalau misalnya saja nantinya server perlu reboot, saya tidak harus mengulang command-command di atas. Jadi Saya ketik sedikit Shell script buat sedikit mengurangi beban hidup.&lt;/p&gt;
&lt;p&gt;Waktu itu saya belum tahu apa nantinya nama namespace sama nama interfacenya ini bisa berubah atau tidak kalau reboot, jadi namespace sama nama interfacenya Saya buat dinamis. Kemudian setelah benar-benar reboot baru Saya tahu nama-namanya tidak ada yang berubah, tapi karena sudah terlanjur diketik jadi Saya &lt;em&gt;paste&lt;/em&gt; saja di sini.&lt;/p&gt;
&lt;p&gt;IPv6 address-nya juga saya rubah jadi &lt;code&gt;2001:db8:dead::/64&lt;/code&gt; sama &lt;code&gt;2001:db8:cafe::/64&lt;/code&gt; sesuai gambar yang di atas.&lt;/p&gt;
&lt;p&gt;Script ini perlu MAC address router gateway buat menentukan mana interface yang mengarah ke external network.&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt; 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/bin/sh&lt;/span&gt;

&lt;span class="nv"&gt;ROUTER&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;00:1e:67:9d:c1:9d&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;GATEWAY&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2001:db8:dead::1&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;IP6_REGEX&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2001&amp;quot;&lt;/span&gt;
&lt;span class="nv"&gt;IP6_WAN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;2001:db8:dead::2/64&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; ns in &lt;span class="k"&gt;$(&lt;/span&gt;/sbin/ip netns show&lt;span class="k"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;do&lt;/span&gt;
        &lt;span class="nv"&gt;IFACE_WAN&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;/sbin/ip netns &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nv"&gt;$ns&lt;/span&gt; ip neigh show &lt;span class="se"&gt;\&lt;/span&gt;
                        &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$ROUTER&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; head -n1 &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;{print $3}&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;

        &lt;span class="nv"&gt;IP6_WAN_TMP&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;$(&lt;/span&gt;/sbin/ip netns &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nv"&gt;$ns&lt;/span&gt; ip -6 addr show &lt;span class="nv"&gt;$IFACE_WAN&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
            grep &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$IP6_REGEX&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; head -n1 &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
                        awk &lt;span class="s1"&gt;&amp;#39;{print $2}&amp;#39;&lt;/span&gt;&lt;span class="k"&gt;)&lt;/span&gt;

        &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$IP6_WAN_TMP&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$IP6_REGEX&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &amp;gt;/dev/null &lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&lt;span class="p"&gt;&amp;amp;&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="nv"&gt;$?&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;0&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;]&lt;/span&gt;
        &lt;span class="k"&gt;then&lt;/span&gt;
                &lt;span class="k"&gt;continue&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;
                /sbin/ip netns &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nv"&gt;$ns&lt;/span&gt; ip -6 addr add &lt;span class="nv"&gt;$IP6_WAN&lt;/span&gt; dev &lt;span class="nv"&gt;$IFACE_WAN&lt;/span&gt;
                /sbin/ip netns &lt;span class="nb"&gt;exec&lt;/span&gt; &lt;span class="nv"&gt;$ns&lt;/span&gt; ip -6 route replace default via &lt;span class="nv"&gt;$GATEWAY&lt;/span&gt;
        &lt;span class="k"&gt;fi&lt;/span&gt;

&lt;span class="k"&gt;done&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;Supaya script ini bisa jalan waktu sistem boot, script ini bisa dieksekusi dari &lt;code&gt;/etc/rc.local&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artikel Berkaitan:&lt;/strong&gt;&lt;br /&gt;
&lt;a href="//devnull.web.id/networking/pengenalan-ipv6.html"&gt;&amp;ldquo;Hampir&amp;rdquo; Semua Tentang IPv6&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;Tulisan tentang IPv6 yang berusaha komprehensif tapi ternyata gagal membahas semua hal tentang IPv6. &amp;ldquo;Hampir&amp;rdquo; Semua Tentang IPv6, dari sejarah, kelebihan IPv6, sampai pengalamatannya.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="//devnull.web.id/openstack/pengenalan-openstack.html"&gt;Membumikan OpenStack&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;Pengenalan yang &amp;ldquo;ramah&amp;rdquo; tentang OpenStack ditulis dengan Layman&amp;rsquo;s terms.&lt;/em&gt;&lt;/p&gt;</content><category term="OpenStack"></category><category term="Linux"></category><category term="OpenStack"></category><category term="Debian"></category><category term="IPv6"></category><category term="Networking"></category></entry><entry><title>"Hampir" Semua Tentang IPv6</title><link href="//devnull.web.id/networking/pengenalan-ipv6.html" rel="alternate"></link><published>2016-05-27T00:00:00+08:00</published><updated>2016-05-27T00:00:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-05-27:/networking/pengenalan-ipv6.html</id><summary type="html">&lt;div class="fimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/ipv6-logo.png" alt="World IPv6 Launch" title="World IPv6 Launch" /&gt;
    &lt;p&gt;Image: www.worldipv6launch.org&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Jaringan komputer awalnya dulu lahir di ARPANET (Advanced Research Projects Agency Network), ARPANET ini organisasi networking yang dibiayai sama Departemen Pertahanan Amerika Serikat &lt;sup&gt;[1]&lt;/sup&gt; waktu itu.&lt;/p&gt;
&lt;p&gt;Di ARPANET waktu itu, protokol komunikasi perangkat jaringan pakai protokol yang namanya NCP (Network Control Program). Terus di tanggal 1 …&lt;/p&gt;</summary><content type="html">&lt;div class="fimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/ipv6-logo.png" alt="World IPv6 Launch" title="World IPv6 Launch" /&gt;
    &lt;p&gt;Image: www.worldipv6launch.org&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Jaringan komputer awalnya dulu lahir di ARPANET (Advanced Research Projects Agency Network), ARPANET ini organisasi networking yang dibiayai sama Departemen Pertahanan Amerika Serikat &lt;sup&gt;[1]&lt;/sup&gt; waktu itu.&lt;/p&gt;
&lt;p&gt;Di ARPANET waktu itu, protokol komunikasi perangkat jaringan pakai protokol yang namanya NCP (Network Control Program). Terus di tanggal 1 Januari 1983, NCP ini dirubah ke protokol yang baru, namanya TCP/IP, Protokol baru pengganti NCP yang lebih baik. Transisi ini dikenal dengan &amp;ldquo;Flag Day&amp;rdquo; &lt;sup&gt;[2]&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;Lahirnya protokol IP ini mulainya era Internet modern, protokol IP ini juga yang kita pakai sampai sekarang.&lt;/p&gt;
&lt;p&gt;Awal-awal tahun 90-an waktu Internet mulai dipakai publik dan bukan lagi proyek militer, disini kelihatan kalau IPv4 address yang 4 milyar itu bakalan tidak cukup buat semua perangkat yang terhubung ke Internet nantinya.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="internet-kehabisan-ip-address"&gt;Internet kehabisan IP Address&lt;/h3&gt;
&lt;p&gt;Begitu Internet ini dilepas ke publik, jaringan Internet ini jadi booming. Salah satu aplikasi Internet yang populer waktu itu yang sampai sekarang juga masih populer, seperti WWW (World Wide Web). Boomingnya Internet ini jadi masalah sendiri, IP address yang 4 milyar yang awalnya untuk militer itu begitu dipakai publik jadi kelihatan kalau ini nanti bakalan kurang.&lt;/p&gt;
&lt;p&gt;Selain karena populernya Internet, ada satu hal lagi yang bikin Internet cepat sekali kehabisan IP address. Pada waktu itu, IP address dibagi menurut kelas-kelas, atau istilahnya Classful Network.&lt;/p&gt;
&lt;p&gt;Kenapa ini jadi masalah? Mari kita lihat gambar ini.&lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/classful-network.png" alt="Classful Network" title="Classful Network" /&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Class A: 2&lt;sup&gt;24&lt;/sup&gt; = 16.777.216 alamat.&lt;/li&gt;
&lt;li&gt;Class B: 2&lt;sup&gt;16&lt;/sup&gt; = 65.536 alamat.&lt;/li&gt;
&lt;li&gt;Class C: 2&lt;sup&gt;8&lt;/sup&gt; = 256 alamat.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jadi di Classful Network, subnet bit kelipatan 8.&lt;/p&gt;
&lt;p&gt;Ini masalahnya, kalau misalnya ada satu organisasi yang perlu 200 IP address, maka dia dialokasikan IP address kelas C yang isinya 256 IP address. Tapi kalau perlunya 500, dia dialokasikan address kelas B yang isinya 65 ribu ip address. Artinya? Itu berarti lebih dari 60 ribu IP address sia-sia tidak terpakai.&lt;/p&gt;
&lt;p&gt;Tentu saja para engineer tidak tinggal diam melihat ini. Supaya borosnya IP address ini bisa direm sedikit, ada dua metode yang efektif dipakai; &lt;em&gt;Classless Inter-Domain Routing&lt;/em&gt; (CIDR) sama &lt;em&gt;Network Address Translation&lt;/em&gt; (NAT).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="cidr"&gt;CIDR&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Classless Inter-Domain Routing&lt;/em&gt; (CIDR), dibaca &lt;em&gt;&amp;ldquo;sidr&amp;rdquo;&lt;/em&gt; atau &lt;em&gt;&amp;ldquo;saidr&amp;rdquo;&lt;/em&gt;. CIDR ini muncul di tahun 1993 menggantikan pembagian kelas-kelas IP address atau Classful Network di atas.&lt;sup&gt;[3]&lt;/sup&gt; Jadi, seharusnya pembagian IP address berdasarkan kelas-kelas A, B, C, D, dan E itu sudah tidak dipakai dan diajarkan lagi. Kalau Anda ketemu tutorial yang mengajarkan kelas-kelas IP address, abaikan saja karena kemungkinan itu ditulis sebelum tahun 1993.&lt;/p&gt;
&lt;p&gt;Lalu apa bedanya CIDR sama Classful Network?&lt;br /&gt;
Kalau Classful Network subnet bit di kelipatan 8, CIDR subnet bitnya bisa di bit ke berapa saja.&lt;/p&gt;
&lt;p&gt;Penulisan CIDR dengan menambahkan tanda &lt;code&gt;slash (/)&lt;/code&gt; diikuti network bit, misalnya 192.168.0.1/24. 192.168.0.1/24 berarti 24 bit diawal adalah network, sisanya yang 8 bit host nya.&lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/cidr-24.png" alt="CIDR 24" title="CIDR 24" /&gt;
&lt;/div&gt;

&lt;p&gt;Nah kalau misalnya perlu IP address lebih dari 256, 300 misalnya; tidak perlu langsung ke bit 16 seperti class B, tapi cukup di bit ke 23, penulisannya 192.168.0.1/23.&lt;br /&gt;
/23 menyisakan 9 bit untuk host, 9 bit ini maksimal bisa 510 host.&lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/cidr-23.png" alt="CIDR 23" title="CIDR 23" /&gt;
&lt;/div&gt;

&lt;p&gt;Atau /22 yang menyisakan 10 bit buat host. 10 bit berarti maksimal 1022 host.&lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/cidr-22.png" alt="CIDR 22" title="CIDR 22" /&gt;
&lt;/div&gt;

&lt;p&gt;Bahkan untuk subnet yang lebih kecil yang cuma perlu 10 IP address, kita bisa pakai /28 yang maksimal 14 IP address.&lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/cidr-28.png" alt="CIDR 28" title="CIDR 28" /&gt;
&lt;/div&gt;

&lt;p&gt;Jadi bedanya CIDR ini sama Classful Network, pakai CIDR subnet bisa di bit ke berapa saja tergantung kebutuhan, jadinya lebih hemat.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="nat"&gt;NAT&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Network Address Translation&lt;/em&gt; (NAT) ini juga salah satu cara penghematan IP address. Pakai NAT, satu IP address bisa dibagi ke banyak host.&lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/nat.png" alt="Network Address Translation" title="Network Address Translation" /&gt;
&lt;/div&gt;

&lt;p&gt;Di gambar itu ada 10 host tapi IP address yang dipakai buat koneksi Internet cukup dua saja, 1.1.1.1 dan 2.2.2.2. Dua IP address ini dipakai bersama oleh para host yang ada di belakang NAT.&lt;br /&gt;
Host yang ada di belakang NAT, kita bebas pakai IP address private berapa saja karena IP address private tidak terlihat dari Internet. Di gambar itu juga ada host yang sama-sama punya IP address 192.168.0.2, tapi tidak masalah karena mereka ada di belakang NAT.&lt;/p&gt;
&lt;p&gt;Kelemahan kalau pakai NAT, host yang ada di belakang NAT itu tersembunyi dari Internet. Jadi dari sudut pandang Internet, mereka ini tidak ada. Internet cuma bisa lihat IP address 1.1.1.1 dan 2.2.2.2 saja.&lt;/p&gt;
&lt;p&gt;Ini biasanya bukan masalah kalau para host itu cuma perlu akses email atau browsing web. Tapi kalau seperti server yang IP addressnya harus terlihat dari Internet, NAT tidak bisa dipakai. Biarpun sekarang sudah ada cara-cara supaya NAT bisa dipakai buat server, tapi tetap saja caranya ribet dibanding tanpa NAT.&lt;/p&gt;
&lt;p&gt;&amp;ndash;
&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Dua metode di atas, CIDR dan NAT sedikit bisa membantu mengurangi pemborosan IP address. Sedikit artinya IP address exhaustion tetap tidak bisa dihindari, cepat atau lambat IP address ini nantinya bakal habis juga.&lt;/p&gt;
&lt;p&gt;Mereka para engineer di &lt;em&gt;Internet Engineering Task Force&lt;/em&gt; (IETF) sudah menyadari ini dari lama. Mereka kemudian merumuskan tipe IP baru yang jumlahnya banyak, IP baru ini namanya &lt;em&gt;Internet Protocol Next Generation&lt;/em&gt; (IPng) yang kemudian menjadi IPv6 yang kita kenal sekarang.&lt;/p&gt;
&lt;p&gt;IPv6 adalah &lt;em&gt;Internet Protocol&lt;/em&gt; (IP) jenis baru penerus versi 4 yang hampir habis itu. Jadi sekarang Internet punya dua IP, IP yang lama disebut IPv4 dan IP yang baru disebut IPv6.&lt;/p&gt;
&lt;p&gt;Tapi biarpun IPv4 sama IPv6 ini sama-sama IP, ternyata mereka ini berbicara dengan bahasa berbeda. IPv6 yang baru ini tidak bisa berkomunikasi dengan IPv4 yang lama.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="internet-menjadi-ipv6"&gt;Internet menjadi IPv6&lt;/h2&gt;
&lt;p&gt;Mengapa Internet perlu beralih ke IPv6?&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;IPv4 address cuma 32 bit atau 4 milyar, ini tidak cukup buat semua perangkat di dunia.&lt;/li&gt;
&lt;li&gt;IPv6 lebih secure.&lt;/li&gt;
&lt;li&gt;Metode routing IPv6 lebih efisien.&lt;/li&gt;
&lt;li&gt;Tidak perlu alasan lagi.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;IPv6 sepanjang 128 bit, jumlahnya 3,4x10&lt;sup&gt;38&lt;/sup&gt;. Jumlah ini lebih dari cukup untuk semua bintang yang ada di langit, mungkin saja.&lt;br /&gt;
Buat Anda yang tidak terbiasa dengan notasi ilmiah 3,4x10&lt;sup&gt;38&lt;/sup&gt;, jumlah 2&lt;sup&gt;128&lt;/sup&gt; adalah:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;340.282.366.920.938.463.463.374.607.431.768.211.456&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Saya bahkan tidak tahu bagaimana cara membaca angka itu.&lt;/p&gt;
&lt;p&gt;Jaringan IP adalah jaringan yang sangat tidak aman. Kalau kita akses Internet pakai protokol yang tidak terenkripsi, bisa jadi paket IP yang kita kirim dan terima itu dilihat, dimonitor, bahkan sampai level yang ekstrem paket IP itu dimodifikasi tanpa kita sadar. &lt;em&gt;Virtual Private Network&lt;/em&gt; (VPN) muncul karena adanya problem ini, VPN dipakai buat enkripsi paket IP.&lt;/p&gt;
&lt;p&gt;Protokol IPSec&lt;sup&gt;[4]&lt;/sup&gt; banyak dipakai buat VPN yang biasanya buat komunikasi kantor pusat dan cabangnya, atau buat komunikasi data yang sifatnya sensitif. Di IPv4, kalau mau pakai IPSec ini kita perlu konfigurasi tambahan di router atau host dan biasanya tidak gampang.&lt;/p&gt;
&lt;p&gt;Di IPv6 IPsec ini bagian dari protokol, jadi kalau kita pakai IPv6 secara otomatis sudah pakai IPSec tanpa perlu konfigurasi apa-apa. Ini karena memang dari awalnya IPSec ini didesain untuk IPv6.&lt;/p&gt;
&lt;p&gt;IPSec memastikan enkripsi paket IP secara end-to-end. Artinya paket itu dienkripsi oleh host pengirim, terus di-decrypt oleh penerima. Siapa saja diantara pengirim dan penerima tidak ada yang bisa melihat, merubah, atau mengacaukan paket IP itu.&lt;/p&gt;
&lt;p&gt;Dari segi routing, IPv6 juga lebih efisien dibanding IPv4. Karena itu, routing IPv6 jadi lebih cepat.&lt;br /&gt;
Di IPv4, setiap router yang melakukan forward paket IP harus menghitung IP checksum untuk memastikan paket yang diterima itu utuh dan tidak rusak. Di IPv6 tidak ada IP checksum, IPv6 mengatakan bahwa kewajiban pemeriksaan paket ada di layer di atasnya, bukan di IP.&lt;/p&gt;
&lt;p&gt;Di protokol IP juga ada yang namanya packet fragmentation. Ini terjadi kalau paket yang akan dikirim lebih besar dari &lt;em&gt;Maximum Transmission Unit&lt;/em&gt; (MTU) di network interface. Jadi paket IP harus dipotong-potong jadi kecil supaya muat di MTU, terus potongan-potongan ini dikirim berulang-ulang sampai habis.&lt;br /&gt;
Si penerima yang menerima paket yang terpotong-potong ini harus menunggu sampai semua potongan terkumpul, terus potongan-potongan itu digabungkan lagi jadi satu paket IP yang utuh.&lt;/p&gt;
&lt;p&gt;Di IPv4, tugas memotong-motong paket dan menggabungkan paket ada di host dan router. Jadi, router sebelum meneruskan paket itu menunggu sampai semua potongan terkumpul terus menggabungkannya. Proses itu dilakukan semua router yang dilewati paket IP itu kalau MTU tidak cukup besar buat paket.&lt;/p&gt;
&lt;p&gt;Kelebihan IPv6, IPv6 menangani packet fragmentation ini dengan lebih cerdas, router tidak ikut-ikutan memotong-motong paket IP. Misalnya router menerima potongan paket IPv6, router tidak menunggu tapi dia langsung teruskan potongan paket itu ke hop berikutnya. Begitu seterusnya sampai potongan paket itu diterima di host terakhir.&lt;/p&gt;
&lt;p&gt;Host penerima yang terakhir inilah yang bertugas mengumpulkan potongan-potongan paket dan menggabungkannya jadi satu paket IPv6 yang utuh. Jadi proses fragmentasi itu ada di ujung-ujungnya saja. Dengan begini, proses routing lebih cepat dan efisien.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="ipv6-address"&gt;IPv6 Address&lt;/h2&gt;
&lt;p&gt;IPv6 address sepanjang 128 bit, ditulis dengan karakter Heksadesimal.&lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/ipv6.png" alt="IPv6 Address" title="IPv6 Address" /&gt;
&lt;/div&gt;

&lt;p&gt;Satu karakter heksadesimal itu sama dengan 4 bit biner, dan setiap 16 bit dipisahkan dengan titik dua.&lt;/p&gt;
&lt;p&gt;Angka &lt;code&gt;nol&lt;/code&gt; yang berdekatan bisa diringkas pakai dua titik dua &lt;code&gt;(::)&lt;/code&gt;, Misalnya &lt;code&gt;2001:db8:0:0:82c1:6eff:fe59:2e43&lt;/code&gt; menjadi &lt;code&gt;2001:db8::82c1:6eff:fe59:2e43&lt;/code&gt;.&lt;br /&gt;
Tapi kalau ada dua grup angka &lt;code&gt;nol&lt;/code&gt;, penulisan ringkas cuma bisa di salah satunya saja. Misalnya &lt;code&gt;2001:db8:0:0:82c1:0:0:2e43&lt;/code&gt; bisa ditulis &lt;code&gt;2001:db8::82c1:0:0:2e43&lt;/code&gt; atau &lt;code&gt;2001:db8:0:0:82c1::2e43&lt;/code&gt; tapi tidak &lt;code&gt;2001:db8::82c1::2e43&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Seperti di gambar itu, IPv6 yang 128 bit itu dibagi 2. 64 bit yang awal adalah bit untuk network, 64 bit yang terakhir untuk host.&lt;/p&gt;
&lt;p&gt;Penggunaan 64 bit untuk host ini diatur di RFC 5375&lt;sup&gt;[5]&lt;/sup&gt;. Jadi di IPv6, tidak ada subnet lebih kecil dari /64. Misalnya di satu jaringan cuma ada 10 host, network yang dipakai tetap /64.&lt;/p&gt;
&lt;p&gt;Ada satu pengecualian penggunaan network yang lebih kecil dari /64. Untuk link inter-router, link yang isinya cuma ada dua router dianjurkan pakai /127. Penggunaan /127 untuk link inter-router ditulis di RFC 6164&lt;sup&gt;[6]&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EUI-64&lt;/strong&gt;&lt;br /&gt;
EUI-64&lt;sup&gt;[7]&lt;/sup&gt; dipakai buat generate 64 bit host atau 64 bit terakhir IPv6 address berdasarkan MAC address. Cara penomoran alamat host bisa saja kita atur berurutan seperti waktu IPv4, alamat host 1, 2, 3 dan seterusnya, atau bisa acak diambilkan dari alamat MAC. Metode yang terakhir inilah yang namanya EUI-64.&lt;/p&gt;
&lt;p&gt;Tapi ada problemnya, alamat MAC itu cuma 48 bit, host IPv6 64 bit. Supaya bisa jadi 64 bit, ditambahkan 16 bit angka hex &lt;code&gt;0xfffe&lt;/code&gt; di tengah-tengah MAC address.&lt;/p&gt;
&lt;p&gt;Selain itu, bit ke tujuh juga harus dirubah ke 1 supaya menandakan bahwa EUI-64 ini diatur secara lokal.&lt;/p&gt;
&lt;p&gt;Saya pakai contoh buat EUI-64 dari MAC &lt;code&gt;80:c1:6e:59:2e:43&lt;/code&gt;. Step untuk membuat EUI-64 kurang lebih seperti di bawah:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1) Ambil MAC address dan bagi dua.&lt;/strong&gt;&lt;br /&gt;
MAC address dibagi jadi dua bagian, 24 bit &lt;em&gt;Organizationally Unique Identifier&lt;/em&gt; (OIU) dan 24 bit &lt;em&gt;Network Interface Card&lt;/em&gt; ID (NIC).&lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/mac-addr.png" alt="MAC Address" title="MAC Address" /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;2) Tempatkan 16 bit hex &lt;code&gt;0xfffe&lt;/code&gt; di tengah-tengah MAC address.&lt;/strong&gt;  &lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/fffe.png" alt="eui-64" title="eui-64" /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;3) Rubah bit ke 7 ke angka 1 untuk menandakan universal atau local.&lt;/strong&gt;&lt;br /&gt;
Setiap MAC address yang terdaftar dan di-assign oleh &lt;em&gt;Institute of Electrical and Electronics Engineers&lt;/em&gt; (IEEE), bit ke 7 pasti &lt;code&gt;0&lt;/code&gt; yang menandakan bahwa ini alamat yang universal. Di EUI-64, bit ke 7 ini harus dirubah ke &lt;code&gt;1&lt;/code&gt; yang menandakan bahwa alamat ini diadministrasi secara lokal.&lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/ul.png" alt="eui-64" title="eui-64" /&gt;
&lt;/div&gt;

&lt;p&gt;Jadinya, 64 bit host EUI-64 dari MAC address &lt;code&gt;80:c1:6e:59:2e:43&lt;/code&gt; adalah &lt;code&gt;82c1:6eff:fe59:2e43&lt;/code&gt;. Tinggal digabungkan dengan 64 bit networknya, untuk link-local misalnya &lt;code&gt;fe80::82c1:6eff:fe59:2e43&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sebenarnya EUI-64 ini kerjaannya software, bukan orang. Di OS router misalnya, kalau kita set EUI-64 software yang bakal hitung sama setting itu. Di OS modern seperti Linux juga, EUI-64 ini juga otomatis ter-set tanpa ada campur tangan user.&lt;/p&gt;
&lt;p&gt;Tapi biarpun begitu, saya rasa tidak ada salahnya kan memahami teori dibalik EUI-64 ini?&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="tipe-ipv6-address"&gt;Tipe IPv6 address&lt;/h2&gt;
&lt;p&gt;Sama seperti IPv4, IPv6 address juga dibagi ke beberapa tipe &lt;sup&gt;[8]&lt;/sup&gt; di bawah:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Unicast.&lt;/li&gt;
&lt;li&gt;Multicast.&lt;/li&gt;
&lt;li&gt;Anycast.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="unicast"&gt;Unicast&lt;/h3&gt;
&lt;p&gt;IPv6 Unicast address adalah tipe IPv6 address yang dipakai buat komunikasi satu lawan satu. Misalnya Anda ngobrol berdua dengan teman Anda secara privat, jenis obrolan seperti ini kalau di protokol IP namanya unicast.&lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/unicast.png" alt="IPv6 Unicast" title="IPv6 Unicast" /&gt;
&lt;/div&gt;

&lt;p&gt;Dalam obrolan unicast, pihak yang tidak berkepentingan tidak bisa mendengar obrolan itu, apalagi ikut menjawab.&lt;/p&gt;
&lt;p&gt;Di IPv6, unicast address ini dibagi lagi jadi tiga, &lt;em&gt;Global Unicast Address&lt;/em&gt;, &lt;em&gt;Link-local Address&lt;/em&gt;, sama &lt;em&gt;Unique Local Address&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A) Global Unicast Address&lt;/strong&gt;&lt;br /&gt;
Global Unicast Address ini jenis IPv6 unicast yang dipakai buat komunikasi di Internet, kalau di IPv4 namanya ip address publik. Ini jenis IP address yang diatur sama &lt;em&gt;Regional Internet Registry&lt;/em&gt; (RIR). Kalau kita di Indonesia, yang kelola IP address jenis ini ada di APNIC, RIR untuk wilayah Asia Pasifik.&lt;/p&gt;
&lt;p&gt;APNIC alokasikan alamat IPv6 tipe ini ke organisasi sama ISP, terus para ISP ini mendistribusikan IPv6 address ini ke pelanggan-pelanggan mereka.&lt;br /&gt;
Untuk di awal, biasanya alokasi IPv6 address untuk ISP sebanyak /32.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;B) Link-local Address&lt;/strong&gt;&lt;br /&gt;
Link-local address dipakai buat komunikasi unicast yang sifatnya lokal dan cuma sebatas link, jadi link-local ini tidak bisa melewati router. Block alamat IPv6 address yang dialokasikan untuk jenis ini adalah &lt;code&gt;fe80::/10&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Beda sama IPv4, kalau di IPv6 link-local ini wajib ada di setiap interface, IPv6 bakalan tidak berfungsi kalau jenis link-local ini tidak ada.&lt;br /&gt;
IPv6 address jenis ini biasanya di-set secara otomatis oleh OS pakai EUI-64, jadi user tidak perlu konfigurasi apa-apa.&lt;/p&gt;
&lt;p&gt;Kalau Anda punya mesin Linux yang modern, bisa dicek pakai command &lt;code&gt;ip&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# ip addr show wlan0&lt;/span&gt;
&lt;span class="c"&gt;3: wlan0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc mq state UP group default qlen 1000&lt;/span&gt;
&lt;span class="c"&gt;    link/ether 18:4f:32:59:88:33 brd ff:ff:ff:ff:ff:ff&lt;/span&gt;
&lt;span class="c"&gt;    inet 10.10.10.11/28 brd 10.10.10.15 scope global wlan0&lt;/span&gt;
&lt;span class="c"&gt;        valid_lft forever preferred_lft forever&lt;/span&gt;
&lt;span class="c"&gt;    inet6 2xxx:exxx:0:a:1a4f:32ff:fe59:8833/64 scope global mngtmpaddr dynamic &lt;/span&gt;
&lt;span class="c"&gt;        valid_lft 7180sec preferred_lft 1780sec&lt;/span&gt;
&lt;span class="c"&gt;    inet6 fe80::1a4f:32ff:fe59:8833/64 scope link &lt;/span&gt;
&lt;span class="c"&gt;        valid_lft forever preferred_lft forever&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;IPv6 yang paling bawah &lt;code&gt;fe80::1a4f:32ff:fe59:8833/64&lt;/code&gt; dengan scope link itu alamat link-local.&lt;/p&gt;
&lt;p&gt;IPv6 address jenis ini dipakai buat neighbor discovery, buat cari tahu ada router atau tidak, kalau ada router dimana alamat IPv6 nya. IPv6 address jenis ini juga dipakai protokol dynamic routing OSPFv3. Jadi IPv6 address unicast yang jenis ini penting sekali.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;C) Unique Local Address&lt;/strong&gt;&lt;br /&gt;
Kalau di IPv4 kita punya blok private IP address, salah satunya seperti &lt;code&gt;192.168.0.0/16&lt;/code&gt; yang kita bebas pakai di mana saja, di IPv6 juga ada. Alokasi IPv6 address untuk unicast jenis ini adalah &lt;code&gt;fc00::/7&lt;/code&gt;. Jadi buat jaringan yang sifatnya lokal, kita bisa pakai IP address jenis ini.&lt;/p&gt;
&lt;p&gt;Tapi ada bedanya sama IPv4, IPv6 address jenis ini tidak bisa dipakai buat Internet, cuma bisa lokal saja. Jadinya router kalau terima paket dari IPv6 address jenis ini, dia tidak mau meneruskan paket kalau tujuannya jenis Global Unicast, tapi paket diforward kalau tujuannya juga jenis Unique Local.&lt;/p&gt;
&lt;p&gt;Dulu ada satu lagi jenis unicast address, namanya site-local dengan blok address &lt;code&gt;fec0::/10&lt;/code&gt;. Tapi jenis yang ini tidak lagi dipakai dan digantikan Unique Local.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="multicast"&gt;Multicast&lt;/h3&gt;
&lt;p&gt;Multicast adalah metode komunikasi one-to-many dan many-to-many, multicast ini ada grup-grup. Misalnya kalau Anda ngobrol sama sekelompok orang di satu ruangan, komunikasi ini namanya multicast. Mungkin di ruangan itu juga ada kelompok yang lain lagi, tapi karena Anda tidak bicara sama mereka, grup itu juga tidak akan merespon Anda. Jadi cuma grup yang dituju saja yang merespon.&lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/multicast.png" alt="IPv6 Multicast" title="IPv6 Multicast" /&gt;
&lt;/div&gt;

&lt;p&gt;Jenis komunikasi multicast ini banyak dipakai buat tv broadcasting atau streaming. Pakai multicast, server tidak perlu buat banyak koneksi secara bersamaan, cukup satu koneksi saja.&lt;/p&gt;
&lt;p&gt;Di IPv6, blok untuk alamat multicast adalah &lt;code&gt;ff00::/8&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="anycast"&gt;Anycast&lt;/h3&gt;
&lt;p&gt;Kalau multicast ke satu grup, anycast ke salah satu member dari grup.&lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/anycast.png" alt="IPv6 Anycast" title="IPv6 Anycast" /&gt;
&lt;/div&gt;

&lt;p&gt;Paket IP yang ditujukan ke alamat anycast akan dikirim ke salah satu member dari grup anycast itu, tidak semua.&lt;/p&gt;
&lt;p&gt;Contoh penggunaan anycast misalnya di DNS root server. Root server ini di dunia ada 13 alamat IP nya, tapi jumlah fisiknya lebih dari itu.&lt;/p&gt;
&lt;p&gt;Misalnya kita query dns ke salah satu root server &lt;code&gt;a.root-servers.net&lt;/code&gt; yang IPv6 address-nya &lt;code&gt;2001:503:ba3e::2:30&lt;/code&gt;. User di belahan dunia lain yang juga query ke alamat IPv6 &lt;code&gt;2001:503:ba3e::2:30&lt;/code&gt; bisa jadi servernya tidak sama dengan kita biarpun IPv6 address-nya sama-sama &lt;code&gt;2001:503:ba3e::2:30&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Jadi, IP address anycast ini adalah IP address yang sama tapi ditempatkan di node yang berbeda. Paket IP yang ditujukan ke alamat anycast akan dikirim ke salah satu saja dari grup anycast dan biasanya yang paling dekat.&lt;/p&gt;
&lt;p&gt;IPv6 anycast ini juga bisa dipakai buat failover kalau misalnya salah satu node down, bisa digantikan yang lain secara otomatis.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="apa-yang-tidak-ada-di-ipv6"&gt;Apa yang tidak ada di IPv6?&lt;/h2&gt;
&lt;p&gt;Bukan cuma ada penambahan, di IPv6 juga ada pengurangan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Broadcast&lt;/strong&gt;&lt;br /&gt;
Tidak ada lagi komunikasi broadcast di IPv6, begitu juga tidak ada IPv6 address jenis broadcast. Broadcast ini komunikasi satu ke banyak. Kalau unicast Anda ambil ponsel dan telepon ke orang yang dituju, tapi kalau broadcast Anda ambil speaker supaya orang satu RT bisa dengar semua.&lt;/p&gt;
&lt;p&gt;Di IPv6, broadcast tidak ada tapi diganti sama multicast.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NAT&lt;/strong&gt;&lt;br /&gt;
Dengan jumlah IP address sebanyak 3,4x10&lt;sup&gt;38&lt;/sup&gt;, apakah kita masih perlu NAT? tentu saja tidak.&lt;/p&gt;
&lt;p&gt;Setiap perangkat yang terhubung ke Internet, apakah itu server, desktop, laptop sampai smartphone kalau terhubung lewat IPv6 semua terekspos ke Internet.&lt;/p&gt;
&lt;p&gt;Mungkin juga ada yang berpendapat dengan tidak adanya NAT, perangkat yang ber-IPv6 itu jadi tidak aman karena terekspos ke Internet.&lt;br /&gt;
Ini mungkin betul tapi juga salah. NAT, biarpun bisa menyembunyikan host di belakangnya tapi NAT ini bukanlah firewall, jadi jangan dianggap NAT ini seperti firewall.&lt;/p&gt;
&lt;p&gt;Jadi biarpun perangkat yang pakai IPv6 terekspos ke Internet, ini tanggung jawab administrator bagaimana mengatur firewall IPv6 supaya bisa secure.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Mungkin, mungkin saja IPv6 ini terlihat lebih horor daripada IPv4. Ini juga yang dulu saya pikirkan, dan Saya yakin banyak yang sependapat. Alasannya mungkin saja karena:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;128 bit, ini panjang sekali.&lt;/li&gt;
&lt;li&gt;Ditulis pakai heksadesimal, angka yang saya tidak pernah diajarkan waktu di SD.&lt;/li&gt;
&lt;li&gt;Karena bukan IPv4.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tapi apakah benar IPv6 ini susah?&lt;br /&gt;
Coba kita lihat kenapa Luke Skywalker gagal mengangkat pesawat X-wing.&lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/networking/yoda.png" alt="Yoda" /&gt;
    &lt;p style="font-size:13px;color:#a4a4a4;"&gt;Image source: picturequotes.com&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Karena menurutnya, X-wing itu terlalu besar.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Refs:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/ARPANET"&gt;Wikipedia - ARPANET&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Network_Control_Program#Transition_to_TCP.2FIP"&gt;Wikipedia - Network Control Program - Transition to TCP/IP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Classful_network#Replacement_of_classes"&gt;Wikipedia - Classful Network - Replacement of classes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.ietf.org/rfc/rfc2401.txt"&gt;IETF - IPSec&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc5375#section-3.1"&gt;IETF - RFC5375&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://tools.ietf.org/html/rfc6164"&gt;IETF - RFC6164&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tools.ietf.org/html/rfc4291#appendix-A"&gt;IETF - RFC4291  Appendix A - EUI-64&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.cidr-report.org/v6/as2.0/reserved-ipv6.html"&gt;CIDR Report - Reserved IPv6 Address&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artikel Berkaitan:&lt;/strong&gt;&lt;br /&gt;
&lt;a href="//devnull.web.id/networking/subnetting-ipv6-mudah.html"&gt;Subnetting IPv6 bisa semudah IPv4, bahkan lebih mudah.&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;Cara menghitung subnetting IPv6 dengan mudah.&lt;/em&gt;&lt;/p&gt;</content><category term="Networking"></category><category term="networking"></category><category term="ipv6"></category></entry><entry><title>Belajar Linux Dasar - Manipulasi Teks dan Stream</title><link href="//devnull.web.id/linux-padawan/linux-dasar-3.html" rel="alternate"></link><published>2016-05-20T02:47:00+08:00</published><updated>2016-05-20T02:47:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-05-20:/linux-padawan/linux-dasar-3.html</id><summary type="html">&lt;div class="fimg"&gt;
  &lt;img src="//devnull.web.id/images/linux/regex.png" alt="regex" title="Regular Expression" /&gt;
  &lt;p&gt;Image source: www.linuxnix.com&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Selamat pagi, siang, atau malam. Selamat datang kembali di seri pembelajaran Linux Dasar. Kalau Anda baru bergabung, Anda bisa lihat tulisan sebelumnya lewat link di bawah:&lt;/p&gt;
&lt;p&gt;1. &lt;a href="//devnull.web.id/linux-padawan/linux-dasar-1.html"&gt;Belajar Linux Dasar - Pengenalan Input &amp;amp; Output&lt;/a&gt;&lt;br /&gt;
2. &lt;a href="//devnull.web.id/linux-padawan/linux-dasar-2.html"&gt;Belajar Linux Dasar - Manajemen file&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Di artikel ini saya tuliskan tentang …&lt;/p&gt;</summary><content type="html">&lt;div class="fimg"&gt;
  &lt;img src="//devnull.web.id/images/linux/regex.png" alt="regex" title="Regular Expression" /&gt;
  &lt;p&gt;Image source: www.linuxnix.com&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Selamat pagi, siang, atau malam. Selamat datang kembali di seri pembelajaran Linux Dasar. Kalau Anda baru bergabung, Anda bisa lihat tulisan sebelumnya lewat link di bawah:&lt;/p&gt;
&lt;p&gt;1. &lt;a href="//devnull.web.id/linux-padawan/linux-dasar-1.html"&gt;Belajar Linux Dasar - Pengenalan Input &amp;amp; Output&lt;/a&gt;&lt;br /&gt;
2. &lt;a href="//devnull.web.id/linux-padawan/linux-dasar-2.html"&gt;Belajar Linux Dasar - Manajemen file&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Di artikel ini saya tuliskan tentang manipulasi teks dan stream. Teks sudah jelas, tapi stream?&lt;br /&gt;
Stream itu stdin, stdout, dan stderr yang sudah dibahas di tulisan yang pertama, proses manipulasi stream ada di I/O itu.&lt;/p&gt;
&lt;p&gt;Jadi misalnya input program dari stdin itu &lt;code&gt;A&lt;/code&gt;, keluar di stdout berubah jadi &lt;code&gt;B&lt;/code&gt;, nah proses merubah &lt;code&gt;A&lt;/code&gt; ke &lt;code&gt;B&lt;/code&gt; ini disebut manipulasi stream.&lt;/p&gt;
&lt;p&gt;Tahukan Anda? bahwa salah satu the greatest strength, atau kekuatan terbesar Unix dan Linux itu ada di kemampuannya memanipulasi teks dan stream.&lt;br /&gt;
Saya paham itu, karena dulu sekali saya juga pengguna Windows, dan tidak ada hal yang seperti ini di Windows. &lt;/p&gt;
&lt;p&gt;Karena itu sebagai Linux Engineer, hal yang satu ini wajib dikuasai. Sejenak kita tinggalkan GUI, pakai command dan rasakan kekuatan Linux sebenarnya.&lt;/p&gt;
&lt;p&gt;Benar GUI sudah maju, tapi sehebat-hebatnya GUI tidak bisa menandingi fitur teks dan stream manipulation ini. Pelajari dan buktikan sendiri.&lt;/p&gt;
&lt;p&gt;Baik, kita lihat apa saja program yang dibahas kali ini:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="#wildcard-n-regex"&gt;Wildcard &amp;amp; Regular Expression&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#cut"&gt;cut&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#head-n-tail"&gt;head &amp;amp; tail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#tr"&gt;tr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#sort"&gt;sort&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#uniq"&gt;uniq&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Selain program di atas, saya juga tambahkan beberapa program yang bukan dari Coreutils. Program-program ini krusial dan penting.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="#more-n-less"&gt;more &amp;amp; less&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#awk"&gt;awk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#grep"&gt;grep&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="#sed"&gt;sed&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="wildcard-regular-expression"&gt;&lt;a name="wildcard-n-regex"&gt;&lt;/a&gt;Wildcard &amp;amp; Regular Expression&lt;/h2&gt;
&lt;p&gt;Pernah lihat command yang mirip seperti ini?&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;grep &amp;#39;^[0-9]{1,3}.*$&amp;#39; data.txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Karakter-karakter aneh itu namanya karakter Regular Expression atau regex atau regexp.&lt;/p&gt;
&lt;p&gt;Wildcard dan regex itu karakter-karakter spesial yang diartikan secara berbeda oleh shell atau program.&lt;/p&gt;
&lt;p&gt;Mungkin Anda bertanya, apa pentingnya saya memahami ini?&lt;br /&gt;
Sebenarnya tanpa paham wildcard atau regex, kita sudah bisa pakai command di shell Linux. Tapi dengan sedikit memahami ini, banyak task yang ribet
bisa jadi mudah.&lt;/p&gt;
&lt;p&gt;Menurut saya tidak ada ruginya pelajari wildcard sama regex.&lt;/p&gt;
&lt;p&gt;Wildcard sama regex ini fungsinya kurang lebih sama, mencari pola karakter dalam string. Bedanya, karakter wildcard diproses di Linux Shell seperti
bash, dash, dan lainnya. Regex diproses oleh program, contoh di atas itu pakai program &lt;code&gt;grep&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="wildcard"&gt;Wildcard&lt;/h3&gt;
&lt;p&gt;Wildcard ini karakter-karakter spesial di shell Linux. Pakai wildcard kita bisa beroperasi di banyak file sekaligus.&lt;/p&gt;
&lt;p&gt;Masing-masing karakter wildcard artinya beda-beda, saya list dan jelaskan satu-satu.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;*&lt;/strong&gt;: Asterisk atau tanda bintang.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;?&lt;/strong&gt;: Question mark atau tanda tanya.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[]&lt;/strong&gt;: Square bracket atau kurung siku.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;[!]&lt;/strong&gt;: Exclamation mark, tanda seru dalam kurung siku.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;{}&lt;/strong&gt;: curly bracket atau kurung kurawal, dan.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;\&lt;/strong&gt;: Backslash.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Asterisk (*)&lt;/strong&gt;&lt;br /&gt;
Tanda bintang atau asterisk mewakili karakter apa saja, jumlahnya bisa berapa saja termasuk nol.&lt;/p&gt;
&lt;p&gt;Jadi &lt;code&gt;mp*&lt;/code&gt; bisa berarti &lt;code&gt;mp&lt;/code&gt;, &lt;code&gt;mp3&lt;/code&gt;, &lt;code&gt;mp4&lt;/code&gt;, atau &lt;code&gt;mp&lt;/code&gt; apa saja.&lt;/p&gt;
&lt;p&gt;Misalnya saja kita punya tiga file dengan nama berbeda:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;touch a.txt&lt;/span&gt;
&lt;span class="err"&gt;touch ab.txt&lt;/span&gt;
&lt;span class="err"&gt;touch abc.txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kita punya tiga file &lt;code&gt;a.txt&lt;/code&gt;, &lt;code&gt;ab.txt&lt;/code&gt;, dan &lt;code&gt;abc.txt&lt;/code&gt;.&lt;br /&gt;
Kita bisa filter output ls pakai bintang&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ls a*.txt&lt;/span&gt;
&lt;span class="err"&gt;abc.txt  ab.txt  a.txt&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Jadi, tanda bintang itu mewakili karakter apa saja, dengan jumlah berapapun.&lt;br /&gt;
&lt;code&gt;a*.txt&lt;/code&gt; artinya huruf &lt;code&gt;a&lt;/code&gt; diikuti karakter apa saja, jumlahnya berapa saja diikuti dengan &lt;code&gt;.txt&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tanda tanya (?)&lt;/strong&gt;&lt;br /&gt;
Karakter ini (?) mewakili karakter apa saja, tapi jumlahnya satu.&lt;/p&gt;
&lt;p&gt;Contohnya kalau kita mau filter command &lt;code&gt;ls&lt;/code&gt; untuk tipe file &lt;code&gt;mp3&lt;/code&gt;, &lt;code&gt;mp4&lt;/code&gt; misalnya:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ls *mp?&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;*mp?&lt;/code&gt; artinya, karakter apa saja dengan jumlah berapa saja, diikuti karakter &lt;code&gt;mp&lt;/code&gt;, dan diikuti satu karakter apa saja.&lt;/p&gt;
&lt;p&gt;Jadi &lt;code&gt;ls *mp?&lt;/code&gt; akan match file dengan ekstensi &lt;code&gt;mp3&lt;/code&gt;, &lt;code&gt;mp4&lt;/code&gt;, &lt;code&gt;mpg&lt;/code&gt;, &lt;code&gt;mp2&lt;/code&gt;, dan &lt;code&gt;mp apa saja&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Square bracket ([])&lt;/strong&gt;&lt;br /&gt;
Karakter yang ada di dalam kurung siku adalah satu set karakter. Gampangnya kita bisa baca set karakter di kurung siku ini dengan &lt;em&gt;&lt;code&gt;atau&lt;/code&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Contoh, &lt;code&gt;[abc]&lt;/code&gt; bisa dibaca &lt;code&gt;a&lt;/code&gt; atau &lt;code&gt;b&lt;/code&gt; atau &lt;code&gt;c&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Misalnya kita mau filter output command &lt;code&gt;ls&lt;/code&gt; untuk tipe file &lt;code&gt;jpg&lt;/code&gt; dan &lt;code&gt;mpg&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;mj&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="n"&gt;pg&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Jadi, &lt;code&gt;*.[mj]pg&lt;/code&gt; bisa dibaca karakter apa saja dengan jumlah berapa saja, diikuti &lt;code&gt;tanda titik (.)&lt;/code&gt;, terus diikuti karakter &lt;code&gt;m&lt;/code&gt; atau &lt;code&gt;j&lt;/code&gt;, dan diikuti karakter &lt;code&gt;pg&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tanda seru dalam kurung siku ([!])&lt;/strong&gt;&lt;br /&gt;
Ini sama dengan yang sebelumnya, hanya saja kebalikannya. Kalau &lt;code&gt;[mj]&lt;/code&gt; berarti &lt;code&gt;m&lt;/code&gt; atau &lt;code&gt;j&lt;/code&gt;, &lt;code&gt;[!mj]&lt;/code&gt; berarti apa saja selain &lt;code&gt;m&lt;/code&gt; dan &lt;code&gt;j&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Curly backets atau kurung kurawal ({})&lt;/strong&gt;&lt;br /&gt;
Kalau kurung siku bisa dibaca &lt;em&gt;&lt;code&gt;atau&lt;/code&gt;&lt;/em&gt;, kurung kurawal ini bisa dibaca &lt;em&gt;&lt;code&gt;dan&lt;/code&gt;&lt;/em&gt;. Bedanya juga, di kurung kurawal masing-masing pattern dipisah pakai koma.&lt;/p&gt;
&lt;p&gt;Jadi &lt;code&gt;{o,p}df&lt;/code&gt; berarti &lt;code&gt;odf&lt;/code&gt; dan &lt;code&gt;pdf&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Contoh saja, dari pada kita hapus satu-satu file &lt;code&gt;pdf&lt;/code&gt; dan &lt;code&gt;odf&lt;/code&gt;, kita bisa pakai satu command.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;rm *.{o,p}df&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Backslash ()&lt;/strong&gt;&lt;br /&gt;
Ini untuk escape karakter spesial. Kalau tanda tanya &lt;code&gt;?&lt;/code&gt; berarti satu karakter apa saja, tapi kalau ditempatkan backslash didepannya &lt;code&gt;\?&lt;/code&gt;, tanda tanya itu jadi hilang arti spesialnya, dan cuma berarti tanda tanya.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="regular-expression"&gt;Regular Expression&lt;/h3&gt;
&lt;p&gt;Regex ini karakternya sedikit lebih kompleks dari wildcard. Oke, bukan sedikit, tapi jauh lebih kompleks.&lt;/p&gt;
&lt;p&gt;Perhatikan set karakter regex dibawah.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;^([a-zA-Z0-9_\-\.]+)@([a-zA-Z0-9_\-\.]+)\.([a-zA-Z]{2,5})$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Biarpun terlihat rumit, arti regex di contoh itu cuma email address. Cuma gambaran saja bahwa Regular Expression karakternya lebih banyak dibanding wildcard.&lt;/p&gt;
&lt;p&gt;Seperti yang saya sebutkan di atas, regex ini prosesnya bukan di shell, tapi di program. Jadi command seperti di bawah ini tidak valid.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;^[&lt;/span&gt;&lt;span class="n"&gt;abc&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Tidak valid karena penggunaan regex di shell.&lt;/p&gt;
&lt;p&gt;Apa saja karakter Regular Expression?&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dot atau tanda titik (.)&lt;/strong&gt;&lt;br /&gt;
    Artinya satu karakter apa saja. Sama seperti tanda tanya kalau di wildcard. Jadi &lt;code&gt;mp.&lt;/code&gt; bisa berarti &lt;code&gt;mp3&lt;/code&gt; atau &lt;code&gt;mp4&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Backslash (\)&lt;/strong&gt;&lt;br /&gt;
    Artinya sama dengan backslash di wildcard, dipakai buat escape karakter spesial.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Asterisk (*)&lt;/strong&gt;&lt;br /&gt;
    Berarti match nol atau lebih untuk karakter seblumnya. &lt;code&gt;a*&lt;/code&gt; berarti &lt;code&gt;a&lt;/code&gt;, &lt;code&gt;aa&lt;/code&gt;, &lt;code&gt;aaa&lt;/code&gt;, dan seterusnya. 
        Sedangkan &lt;code&gt;.* (dot dan asterisk)&lt;/code&gt; berarti karakter apa saja dengan jumlah nol atau lebih. Ini karena &lt;code&gt;. (dot)&lt;/code&gt; berarti karakter apa saja di regex.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Plus (+)&lt;/strong&gt;&lt;br /&gt;
    Berarti satu atau lebih untuk karakter sebelumnya. &lt;code&gt;a+&lt;/code&gt; berarti &lt;code&gt;aa&lt;/code&gt;,  &lt;code&gt;aaa&lt;/code&gt;, &lt;code&gt;aaaa&lt;/code&gt;, dan seterusnya.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;{min,max}&lt;/strong&gt;&lt;br /&gt;
&lt;code&gt;min&lt;/code&gt; dan &lt;code&gt;max&lt;/code&gt; itu angka misalnya &lt;code&gt;{1,2}&lt;/code&gt;. Artinya jumlah karakter sebelumnya minimal &lt;code&gt;1&lt;/code&gt; dan maksimal &lt;code&gt;2&lt;/code&gt;.&lt;br /&gt;
    Jadi &lt;code&gt;a{2,3}&lt;/code&gt; bisa jadi &lt;code&gt;aa&lt;/code&gt; dan &lt;code&gt;aaa&lt;/code&gt;, tapi tidak &lt;code&gt;aaaa&lt;/code&gt; karena melebihi nilai max.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Caret (^)&lt;/strong&gt;&lt;br /&gt;
    Artinya karakter pertama di baris teks. &lt;code&gt;^a&lt;/code&gt; berarti baris teks yang karakter pertamanya &lt;code&gt;a&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tanda dolar ($)&lt;/strong&gt;&lt;br /&gt;
    Ini kebalikan dari &lt;code&gt;^&lt;/code&gt;, yang berarti karakter terakhir. &lt;code&gt;a$&lt;/code&gt; berarti baris teks yang karakter terakhirnya adalah &lt;code&gt;a&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kurung siku ([])&lt;/strong&gt;&lt;br /&gt;
    Artinya sama dengan kurung siku di wildcard. &lt;code&gt;[ab]&lt;/code&gt; berarti &lt;code&gt;a&lt;/code&gt; atau &lt;code&gt;b&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;[^]&lt;/strong&gt;&lt;br /&gt;
    Sama seperti &lt;code&gt;[!]&lt;/code&gt; di wildcard. &lt;code&gt;[^ab]&lt;/code&gt; berarti bukan &lt;code&gt;a&lt;/code&gt; dan bukan &lt;code&gt;b&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;|&lt;/strong&gt;&lt;br /&gt;
    Berarti salah satu dari pattern. &lt;code&gt;(a|b|c)&lt;/code&gt; berarti salah satu saja antara &lt;code&gt;a&lt;/code&gt; atau &lt;code&gt;b&lt;/code&gt; atau &lt;code&gt;c&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Di atas itu karakter-karakter Regular Expression. Regex ini dipakai di program seperti &lt;code&gt;grep&lt;/code&gt;, &lt;code&gt;awk&lt;/code&gt;, dan &lt;code&gt;sed&lt;/code&gt; yang juga ada di tulisan ini.&lt;/p&gt;
&lt;p&gt;Pusing?&lt;br /&gt;
Ingat, Anda membaca ini atas kemauan sendiri dan tanpa paksaan dari pihak manapun.&lt;/p&gt;
&lt;p&gt;Kita lanjut ke program.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="cut"&gt;&lt;a name="cut" &gt;&lt;/a&gt;cut&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;cut&lt;/strong&gt; dipakai buat filter output berdasarkan &lt;code&gt;delimiter&lt;/code&gt; dan &lt;code&gt;field&lt;/code&gt;, input program &lt;code&gt;cut&lt;/code&gt; bisa dari stdin atau file.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;cut&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;OPTION&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Lebih gampang dijelaskan pakai contoh, misal kita punya file dengan nama &lt;code&gt;data.txt&lt;/code&gt; yang isinya seperti di bawah&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;satu    dua     tiga    empat&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Masing-masing kata itu dipisahkan dengan delimiter tab, jadi &lt;code&gt;satu&amp;lt;tab&amp;gt;dua&amp;lt;tab&amp;gt;tiga&amp;lt;tab&amp;gt;empat&lt;/code&gt;. Nah yang disebut field itu kata &lt;code&gt;satu&lt;/code&gt;, &lt;code&gt;dua&lt;/code&gt;, &lt;code&gt;tiga&lt;/code&gt;, dan &lt;code&gt;empat&lt;/code&gt;.&lt;br /&gt;
Field ini dihitung &lt;code&gt;field 1&lt;/code&gt;, &lt;code&gt;field 2&lt;/code&gt;, dan seterusnya, dihitung dari kiri. Jadi &lt;code&gt;field 1&lt;/code&gt; itu kata &lt;code&gt;satu&lt;/code&gt;, &lt;code&gt;field 4&lt;/code&gt; itu kata &lt;code&gt;empat&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sekarang, kita lihat penggunaan &lt;code&gt;cut&lt;/code&gt; yang umum.&lt;br /&gt;
Misalnya kita mau filter output file &lt;code&gt;data.txt&lt;/code&gt; untuk &lt;code&gt;field 3&lt;/code&gt; saja:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cut -f3 data.txt
tiga
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kalau kita mau print &lt;code&gt;field 2&lt;/code&gt; sampai field terakhir, pakai &lt;code&gt;dash (-)&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cut -f2- data.txt
dua    tiga    empat
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Bagaimana kalau &lt;code&gt;field 1&lt;/code&gt; sama &lt;code&gt;field 3&lt;/code&gt;?&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cut -f1,3 data.txt
satu   tiga
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;cut&lt;/code&gt; juga bisa pakai &lt;code&gt;stdin&lt;/code&gt; selain file. Jadi kita bisa pakai &lt;code&gt;pipe&lt;/code&gt;, misalnya:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat data.txt &lt;span class="p"&gt;|&lt;/span&gt; cut -f1,3
satu   tiga
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;cut&lt;/code&gt; secara default pakai &lt;code&gt;delimiter tab&lt;/code&gt;, jadi bagaimana kalau isi file &lt;code&gt;data.txt&lt;/code&gt; seperti ini?&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;satu,dua,tiga,empat&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kata-kata di file itu dipisah pakai koma, bukan tab. Jadi kita harus secara spesifik instruksikan &lt;code&gt;cut&lt;/code&gt; supaya pakai delimiter koma, caranya dengan argumen &lt;code&gt;-d&lt;/code&gt; diikuti karakter delimiter-nya.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat data.txt &lt;span class="p"&gt;|&lt;/span&gt; cut -d, -f3
tiga
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="head-tail"&gt;&lt;a name="head-n-tail" &gt;&lt;/a&gt;head &amp;amp; tail&lt;/h3&gt;
&lt;p&gt;command &lt;code&gt;head&lt;/code&gt; dan &lt;code&gt;tail&lt;/code&gt; dipakai untuk membatasi jumlah baris yang diprint ke stdout.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;tail&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;OPTION&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;head&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;OPTION&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Bedanya &lt;code&gt;head&lt;/code&gt; sama &lt;code&gt;tail&lt;/code&gt;, &lt;code&gt;head&lt;/code&gt; dihitung dari baris pertama, kalau &lt;code&gt;tail&lt;/code&gt; dihitung dari baris terakhir.  &lt;/p&gt;
&lt;p&gt;Misal kita punya file &lt;code&gt;data.txt&lt;/code&gt; yang isinya ada 11 baris teks.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat &amp;gt; data.txt &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; satu&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; dua&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; tiga&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; empat&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; lima&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; enam&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; tujuh&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; delapan&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; sembilan&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; sepuluh&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; sebelas&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Tes command &lt;code&gt;head&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ head data.txt
satu
dua
tiga
empat
lima
enam
tujuh
delapan
sembilan
sepuluh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kalau command &lt;code&gt;tail&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ tail data.txt
dua
tiga
empat
lima
enam
tujuh
delapan
sembilan
sepuluh
sebelas
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kelihatan bedanya?&lt;br /&gt;
Ya, jadi secara default &lt;code&gt;head&lt;/code&gt; menampilkan 10 baris teks dihitung dari baris pertama. &lt;code&gt;tail&lt;/code&gt; menampilkan 10 baris dihitung dari baris terakhir.&lt;/p&gt;
&lt;p&gt;Kalau kita mau kurang atau lebih dari 10, bisa pakai argumen &lt;code&gt;-n&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ head -n2 data.txt
satu
dua
$
$ tail -n2 data.txt
sepuluh
sebelas
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Tentu saja kita juga bisa pakai stdin lewat &lt;code&gt;pipe&lt;/code&gt; selain &lt;code&gt;file&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat data.txt &lt;span class="p"&gt;|&lt;/span&gt; tail -n2
sepuluh
sebelas
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="tr"&gt;&lt;a name="tr" &gt;&lt;/a&gt;tr&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;tr&lt;/strong&gt; dipakai untuk translasi atau hapus set karakter.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;tr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;OPTION&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SET1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;SET2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;tr&lt;/code&gt; ini inputnya dari &lt;code&gt;stdin&lt;/code&gt; dan print output ke &lt;code&gt;stdout&lt;/code&gt;. saya biasanya pakai &lt;code&gt;tr&lt;/code&gt; buat konversi karakter atau hapus karakter.&lt;/p&gt;
&lt;p&gt;Misal kita mau convert huruf kecil ke besar&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;abcd&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="o"&gt;[&lt;/span&gt;:lower:&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;:upper:&lt;span class="o"&gt;]&lt;/span&gt;
ABCD
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kalau mau sebaliknya, tinggal dibalik saja &lt;code&gt;tr [:upper:] [:lower:]&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tr&lt;/code&gt; ini berguna buat misalnya merubah &lt;code&gt;newline&lt;/code&gt; jadi &lt;code&gt;tab&lt;/code&gt;. Contoh kita buat file &lt;code&gt;data.txt&lt;/code&gt; yang isinya seperti ini:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat &amp;gt; data.txt &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; abcd&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; efgh&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;File &lt;code&gt;data.txt&lt;/code&gt; yang isinya dua baris. Kita bisa rubah &lt;code&gt;newline (\n)&lt;/code&gt; ke &lt;code&gt;tab (\t)&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat data.txt &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;\t&amp;#39;&lt;/span&gt;
abcd   efgh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Atau &lt;code&gt;newline&lt;/code&gt; ke &lt;code&gt;spasi&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat data.txt &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39; &amp;#39;&lt;/span&gt;
abcd efgh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Atau jadi &lt;code&gt;dash (-)&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat data.txt &lt;span class="p"&gt;|&lt;/span&gt; tr &lt;span class="s1"&gt;&amp;#39;\n&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;
abcd-efgh-
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kita juga bisa pakai &lt;code&gt;tr&lt;/code&gt; buat hapus karakter tertentu pakai argumen &lt;code&gt;-d&lt;/code&gt;. Contoh, hapus huruf &lt;code&gt;c&lt;/code&gt; dari stream.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat data.txt &lt;span class="p"&gt;|&lt;/span&gt; tr -d &lt;span class="s1"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;
abd
efgh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="sort"&gt;&lt;a name="sort" &gt;&lt;/a&gt;sort&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;sort&lt;/strong&gt;, seperti namanya dipakai buat sorting baris teks dari stdin atau file.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;sort&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;OPTION&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Mari kita coba dengan file &lt;code&gt;data.txt&lt;/code&gt; yang tidak berurutan.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat &amp;gt; data.txt &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; zebra&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; charlie&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; bravo&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; kilo&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; 456&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; 123&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sort file &lt;code&gt;data.txt&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ sort data.txt
&lt;span class="m"&gt;123&lt;/span&gt;
&lt;span class="m"&gt;456&lt;/span&gt;
bravo
charlie
kilo
zebra
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Jadi, sort mengurutkan dari 0-9 kemudian a-z. Kalau mau sebaliknya, pakai argumen &lt;code&gt;-r (reverse)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Sort mode &lt;code&gt;reverse&lt;/code&gt; dari &lt;code&gt;stdin&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat data.txt &lt;span class="p"&gt;|&lt;/span&gt; sort -r
zebra
kilo
charlie
bravo
&lt;span class="m"&gt;456&lt;/span&gt;
&lt;span class="m"&gt;123&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="uniq"&gt;&lt;a name="uniq" &gt;&lt;/a&gt;uniq&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;uniq&lt;/strong&gt; ini dipakai buat print file atau stdin ke &lt;code&gt;stdout&lt;/code&gt; tapi skip baris yang sama dan berdekatan.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;uniq&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;OPTION&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;INPUT [OUTPUT&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="err"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Coba dengan file &lt;code&gt;data.txt&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat &amp;gt; data.txt &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; satu&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; satu&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; dua&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; dua&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; tiga&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; tiga&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kalau kita print file itu pakai &lt;code&gt;uniq&lt;/code&gt;,&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ uniq data.txt
satu
dua
tiga
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Jadi kalau ada line atau baris berdekatan yang sama, &lt;code&gt;uniq&lt;/code&gt; print satu saja. Tapi bagaimana kalau misalnya baris yang sama itu tidak berdekatan?&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat &amp;gt; data.txt &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; satu&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; tiga&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; dua&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; tiga&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; satu&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; dua&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Isi file yang seperti itu, kalau kita pakai &lt;code&gt;uniq&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ uniq data.txt
satu
tiga
dua
tiga
satu
dua
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Tidak ada yang berubah.&lt;/p&gt;
&lt;p&gt;Triknya, kalau kita mau print baris pakai &lt;code&gt;uniq&lt;/code&gt; tapi line-nya tidak berdekatan, kita bisa pakai &lt;code&gt;sort&lt;/code&gt;.&lt;br /&gt;
Misalnya&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat data.txt &lt;span class="p"&gt;|&lt;/span&gt; sort &lt;span class="p"&gt;|&lt;/span&gt; uniq
dua
satu
tiga
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kita print dulu &lt;code&gt;data.txt&lt;/code&gt;, kemudian di sorting pakai command &lt;code&gt;sort&lt;/code&gt;, baru pakai &lt;code&gt;uniq&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Itu program-program Coreutils untuk manipulasi output. Selanjutnya kita ke program-program selain Coreutils.&lt;/p&gt;
&lt;p&gt;&amp;nbsp; &lt;/p&gt;
&lt;h3 id="more-less"&gt;&lt;a name="more-n-less" &gt;&lt;/a&gt;more &amp;amp; less&lt;/h3&gt;
&lt;p&gt;Command &lt;code&gt;more&lt;/code&gt; dan &lt;code&gt;less&lt;/code&gt; fungsinya sama. Kalau kita print file yang isinya banyak baris dan tidak fit di layar, &lt;code&gt;more&lt;/code&gt; dan &lt;code&gt;less&lt;/code&gt; bisa dipakai buat scroll.&lt;br /&gt;
Jadi sama seperti kalau kita baca artikel di web yang panjang, kita bisa scroll halamannya kebawah.&lt;/p&gt;
&lt;p&gt;Program &lt;code&gt;more&lt;/code&gt; sebenarnya termasuk Coreutils, kalau &lt;code&gt;less&lt;/code&gt; bukan. Kelemahan program &lt;code&gt;more&lt;/code&gt;, dia tidak bisa scroll ke atas, cuma scroll ke bawah. Nah para hacker yang kurang suka limitasi ini buat program sendiri seperti &lt;code&gt;more&lt;/code&gt; tapi yang bisa scroll ke atas, lucunya program itu malah dinamakan &lt;code&gt;less&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Contoh penggunaan &lt;code&gt;less&lt;/code&gt; misalnya kalau kita baca file syslog yang panjang itu.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;less&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;syslog&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Tekan &lt;code&gt;&amp;lt;Enter&amp;gt;&lt;/code&gt; atau panah ke bawah untuk scroll ke bawah, panah atas untuk scroll ke atas. Program &lt;code&gt;less&lt;/code&gt; dan &lt;code&gt;more&lt;/code&gt; juga bisa baca dari stdin selain dari file.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;var&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nb"&gt;log&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;syslog&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;less&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sama saja.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Tiga program selanjutnya, &lt;code&gt;awk&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt;, dan &lt;code&gt;sed&lt;/code&gt; perlu &lt;code&gt;Regular Expression&lt;/code&gt; yang sudah ditulis di atas. Di contoh ini saya tidak akan pakai karakter regex yang aneh-aneh, yang simpel saja.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="awk"&gt;&lt;a name="awk" &gt;&lt;/a&gt;awk&lt;/h3&gt;
&lt;p&gt;Sama seperti program-program yang lain, &lt;code&gt;awk&lt;/code&gt; ini juga dipakai buat manipulasi stream. Bedanya, &lt;code&gt;awk&lt;/code&gt; ini lebih programmable atau seperti scripting. Input &lt;code&gt;awk&lt;/code&gt; bisa dari &lt;code&gt;file&lt;/code&gt; atau &lt;code&gt;stdin&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Secara umum penggunaan &lt;code&gt;awk&lt;/code&gt; seperti ini&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;awk &amp;#39;/pattern_regex/ {action1;}&amp;#39; file&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Salah satu dari &lt;code&gt;/pattern_regex/&lt;/code&gt; atau &lt;code&gt;{action;}&lt;/code&gt; boleh tidak dipakai, tapi tidak dua-duanya. Kalau &lt;code&gt;{action;}&lt;/code&gt; tidak ada, maka action dianggap &lt;code&gt;{print}&lt;/code&gt;. &lt;code&gt;{print}&lt;/code&gt; ini action default di &lt;code&gt;awk&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Proses &lt;code&gt;awk&lt;/code&gt; kalau dirinci seperti ini:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;awk&lt;/code&gt; baca input dari file atau stdin baris per baris.&lt;/li&gt;
&lt;li&gt;Kalau ada &lt;code&gt;/pattern_regex/&lt;/code&gt;, di setiap baris teks, periksa pattern regex. Kalau match eksekusi action yang ada di kurung kurawal. Kalau tidak, baris teks dilompati dan action tidak dieksekusi.&lt;/li&gt;
&lt;li&gt;Kalau tidak ada &lt;code&gt;/pattern_regex/&lt;/code&gt;, eksekusi &lt;code&gt;{action;}&lt;/code&gt; di setiap baris teks.&lt;/li&gt;
&lt;li&gt;Kalau tidak ada &lt;code&gt;{action;}&lt;/code&gt; print baris teks yang match dengan &lt;code&gt;/pattern_regex/&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Contoh umum penggunaan awk sama seperti &lt;code&gt;cut&lt;/code&gt;.&lt;br /&gt;
Masih ingat program &lt;code&gt;cut&lt;/code&gt; di atas?&lt;/p&gt;
&lt;p&gt;Sama seperti &lt;code&gt;cut&lt;/code&gt;, &lt;code&gt;awk&lt;/code&gt; juga ada delimiter dan default delimiter di program &lt;code&gt;awk&lt;/code&gt; ini bisa &lt;code&gt;spasi&lt;/code&gt; atau &lt;code&gt;tab&lt;/code&gt;. Sama seperti &lt;code&gt;cut&lt;/code&gt; juga, delimiter bisa disesuaikan.&lt;/p&gt;
&lt;p&gt;Langsung saja dengan contoh file &lt;code&gt;data.txt&lt;/code&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat &amp;gt; data.txt &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; satu dua tiga empat&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sama seperti &lt;code&gt;cut&lt;/code&gt;, kalau kita mau print field 3 pakai &lt;code&gt;awk&lt;/code&gt;, caranya:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ awk &lt;span class="s1"&gt;&amp;#39;{print $3;}&amp;#39;&lt;/span&gt; data.txt
tiga
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Untuk field 1 dan 3&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ awk &lt;span class="s1"&gt;&amp;#39;{print $1,$3;}&amp;#39;&lt;/span&gt; data.txt
satu tiga
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sekarang kita coba dengan &lt;code&gt;data.txt&lt;/code&gt; yang berisi dua baris.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat &amp;gt; data.txt &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; satu dua tiga empat&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; lima enam tujuh delapan&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Coba print field ke 3.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ awk &lt;span class="s1"&gt;&amp;#39;{print $3;}&amp;#39;&lt;/span&gt; data.txt
tiga
tujuh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kalau misalnya kita mau &lt;code&gt;awk&lt;/code&gt; eksekusi action di baris tertentu saja, kita bisa filter baris itu. Misalnya untuk eksekusi action print di baris yang diawali &lt;code&gt;lima&lt;/code&gt; saja.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ awk &lt;span class="s1"&gt;&amp;#39;/^lima.*/ {print $3;}&amp;#39;&lt;/span&gt; data.txt
tujuh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Line yang pertama di-skip karena tidak ada pattern &lt;code&gt;lima&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Seperti yang lain, &lt;code&gt;awk&lt;/code&gt; juga bisa baca dari stdin.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat data.txt &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;/^lima.*/ {print $3;}&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Bagaimana untuk delimiter yang bukan &lt;code&gt;spasi&lt;/code&gt; atau &lt;code&gt;tab&lt;/code&gt;?&lt;br /&gt;
Ambil contoh seperti file &lt;code&gt;/etc/passwd&lt;/code&gt; yang seperti ini:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bash&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kita bisa pakai argumen &lt;code&gt;-F&lt;/code&gt; diikuti karakter delimiternya.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ awk -F: &lt;span class="s1"&gt;&amp;#39;/^root/ {print $7;}&amp;#39;&lt;/span&gt; /etc/passwd
/bin/bash
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="grep"&gt;&lt;a name="grep" &gt;&lt;/a&gt;grep&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;grep&lt;/strong&gt; dipakai buat filter baris teks yang ada berisi pattern Regular Expression yang dicari.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;grep&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;OPTIONS&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;PATTERN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FILE...&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Misalnya file &lt;code&gt;data.txt&lt;/code&gt; isinya dua baris seperti di bawah:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat &amp;gt; data.txt &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; satu dua tiga empat&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; lima enam tujuh delapan&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Nah pakai &lt;code&gt;grep&lt;/code&gt;, kita bisa filter baris teks yang ada pattern &lt;code&gt;"enam"&lt;/code&gt; misalnya.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ grep &lt;span class="s2"&gt;&amp;quot;enam&amp;quot;&lt;/span&gt; data.txt
lima enam tujuh delapan
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;grep&lt;/code&gt; ini case sensitive, jadi &lt;code&gt;ABCD&lt;/code&gt; beda sama &lt;code&gt;abcd&lt;/code&gt;. Kalau mau pakai pattern yang case insensitive atau besar kecil huruf bukan masalah, pakai argumen &lt;code&gt;-i&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ grep -i &lt;span class="s2"&gt;&amp;quot;ENAM&amp;quot;&lt;/span&gt; data.txt
lima enam tujuh delapan
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kadang kita perlu tahu di baris ke berapa pattern &lt;code&gt;regex&lt;/code&gt; itu match. Terutama teks yang isinya ratusan atau ribuan baris seperti source code.&lt;/p&gt;
&lt;p&gt;kita bisa instruksikan &lt;code&gt;grep&lt;/code&gt; supaya print nomor baris itu, caranya pakai argumen &lt;code&gt;-n&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ grep -ni &lt;span class="s2"&gt;&amp;quot;ENAM&amp;quot;&lt;/span&gt; data.txt
&lt;span class="m"&gt;2&lt;/span&gt;:lima enam tujuh delapan
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;2&lt;/code&gt;, itu nomor barisnya.&lt;/p&gt;
&lt;p&gt;Selain &lt;code&gt;file&lt;/code&gt;, &lt;code&gt;grep&lt;/code&gt; juga bisa terima input dari &lt;code&gt;stdin&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat data.txt &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;quot;enam&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Untuk pattern yang lebih kompleks misalnya.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat data.txt &lt;span class="p"&gt;|&lt;/span&gt; grep &lt;span class="s2"&gt;&amp;quot;^s.*t&lt;/span&gt;$&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;
satu dua tiga empat
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Maksudnya &lt;code&gt;"^s.*t$"&lt;/code&gt; baris yang dimulai huruf &lt;code&gt;s (^s)&lt;/code&gt;, diikuti karakter apa saja dengan jumlah berapa saja &lt;code&gt;(.*)&lt;/code&gt; dan diakhiri huruf &lt;code&gt;t (t$)&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="sed"&gt;&lt;a name="sed" &gt;&lt;/a&gt;sed&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;sed&lt;/strong&gt; ini stream editor, program yang powerful dan keren sekali di Linux. Pakai &lt;code&gt;sed&lt;/code&gt; ini kita bisa edit file teks tanpa perlu buka file itu di editor seperti &lt;code&gt;Vim&lt;/code&gt; atau &lt;code&gt;Emacs&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Anda juga bisa bayangkan &lt;code&gt;sed&lt;/code&gt; ini seperti &lt;code&gt;pipe&lt;/code&gt;, terima input dari ujung yang satu dan keluar dari ujung yang lain. Bedanya, &lt;code&gt;sed&lt;/code&gt; ada proses manipulasi stream, jadi outputnya beda sama input karena sudah dimanipulasi.&lt;/p&gt;
&lt;p&gt;Proses &lt;code&gt;sed&lt;/code&gt; kurang lebih seperti di bawah:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Terima input dari &lt;code&gt;file&lt;/code&gt; atau &lt;code&gt;stdin&lt;/code&gt;, baca baris per baris.&lt;/li&gt;
&lt;li&gt;Di setiap baris, tempatkan baris teks itu di &lt;code&gt;buffer&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Edit teks yang ada di &lt;code&gt;buffer&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Print teks yang sudah diedit ke &lt;code&gt;output&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Lanjut ke baris berikutnya, eksekusi nomor 1 sampai 4 sampai tidak ada lagi input atau eof (end of file).&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; ini punya banyak mode untuk manipulasi stream. Di sini kita pelajari tiga saja yang umum dipakai.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;print&lt;/code&gt;. Print baris teks tanpa ada modifikasi teks.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;delete&lt;/code&gt;. Delete baris teks.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;subtitute&lt;/code&gt;. Cari pola karakter berdasarkan regex dan subtitusi karakter itu dengan karakter lain.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Print&lt;/strong&gt;&lt;br /&gt;
Mode print dipakai buat print baris teks tanpa ada manipulasi teks.&lt;/p&gt;
&lt;p&gt;Contoh dengan file &lt;code&gt;data.txt&lt;/code&gt; yang seperti ini.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat data.txt
&lt;span class="m"&gt;1&lt;/span&gt;. satu
&lt;span class="m"&gt;2&lt;/span&gt;. dua
&lt;span class="m"&gt;3&lt;/span&gt;. tiga
&lt;span class="m"&gt;4&lt;/span&gt;. empat
&lt;span class="m"&gt;5&lt;/span&gt;. lima
&lt;span class="m"&gt;6&lt;/span&gt;. enam
&lt;span class="m"&gt;7&lt;/span&gt;. tujuh
&lt;span class="m"&gt;8&lt;/span&gt;. delapan
&lt;span class="m"&gt;9&lt;/span&gt;. sembilan
&lt;span class="m"&gt;10&lt;/span&gt;. sepuluh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Format mode print: &lt;strong&gt;&lt;code&gt;sed -n '&amp;lt;nomor baris&amp;gt;'p file&lt;/code&gt;&lt;/strong&gt;.  &lt;/p&gt;
&lt;p&gt;Contoh print baris ke 7.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ sed -n &lt;span class="s1"&gt;&amp;#39;7&amp;#39;&lt;/span&gt;p data.txt
&lt;span class="m"&gt;7&lt;/span&gt;. tujuh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Print baris terakhir pakai tanda &lt;code&gt;$ (dolar)&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ sed -n &lt;span class="s1"&gt;&amp;#39;$&amp;#39;&lt;/span&gt;p data.txt
&lt;span class="m"&gt;10&lt;/span&gt;. sepuluh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Print baris ke dua sampai 5.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ sed -n &lt;span class="s1"&gt;&amp;#39;2,5&amp;#39;&lt;/span&gt;p data.txt
&lt;span class="m"&gt;2&lt;/span&gt;. dua
&lt;span class="m"&gt;3&lt;/span&gt;. tiga
&lt;span class="m"&gt;4&lt;/span&gt;. empat
&lt;span class="m"&gt;5&lt;/span&gt;. lima
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Print baris ke delapan sampai baris terakhir.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ sed -n &lt;span class="s1"&gt;&amp;#39;8,$&amp;#39;&lt;/span&gt;p data.txt
&lt;span class="m"&gt;8&lt;/span&gt;. delapan
&lt;span class="m"&gt;9&lt;/span&gt;. sembilan
&lt;span class="m"&gt;10&lt;/span&gt;. sepuluh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&amp;nbsp;    &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Delete&lt;/strong&gt;&lt;br /&gt;
Format untuk mode delete: &lt;strong&gt;&lt;code&gt;sed '&amp;lt;nomor baris&amp;gt;'d file&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Mode delete ini bisa dianggap kebalikan dari mode &lt;code&gt;print&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Contoh delete baris ke 7.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ sed &lt;span class="s1"&gt;&amp;#39;7&amp;#39;&lt;/span&gt;d data.txt
&lt;span class="m"&gt;1&lt;/span&gt;. satu
&lt;span class="m"&gt;2&lt;/span&gt;. dua
&lt;span class="m"&gt;3&lt;/span&gt;. tiga
&lt;span class="m"&gt;4&lt;/span&gt;. empat
&lt;span class="m"&gt;5&lt;/span&gt;. lima
&lt;span class="m"&gt;6&lt;/span&gt;. enam
&lt;span class="m"&gt;8&lt;/span&gt;. delapan
&lt;span class="m"&gt;9&lt;/span&gt;. sembilan
&lt;span class="m"&gt;10&lt;/span&gt;. sepuluh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Delete baris terakhir pakai tanda &lt;code&gt;$ (dolar)&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ sed &lt;span class="s1"&gt;&amp;#39;$&amp;#39;&lt;/span&gt;d data.txt
&lt;span class="m"&gt;1&lt;/span&gt;. satu
&lt;span class="m"&gt;2&lt;/span&gt;. dua
&lt;span class="m"&gt;3&lt;/span&gt;. tiga
&lt;span class="m"&gt;4&lt;/span&gt;. empat
&lt;span class="m"&gt;5&lt;/span&gt;. lima
&lt;span class="m"&gt;6&lt;/span&gt;. enam
&lt;span class="m"&gt;7&lt;/span&gt;. tujuh
&lt;span class="m"&gt;8&lt;/span&gt;. delapan
&lt;span class="m"&gt;9&lt;/span&gt;. sembilan
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Delete baris ke dua sampai 5.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ sed &lt;span class="s1"&gt;&amp;#39;2,5&amp;#39;&lt;/span&gt;d data.txt
&lt;span class="m"&gt;1&lt;/span&gt;. satu
&lt;span class="m"&gt;6&lt;/span&gt;. enam
&lt;span class="m"&gt;7&lt;/span&gt;. tujuh
&lt;span class="m"&gt;8&lt;/span&gt;. delapan
&lt;span class="m"&gt;9&lt;/span&gt;. sembilan
&lt;span class="m"&gt;10&lt;/span&gt;. sepuluh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Delete baris ke delapan sampai baris terakhir.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ sed -n &lt;span class="s1"&gt;&amp;#39;8,$&amp;#39;&lt;/span&gt;d data.txt
&lt;span class="m"&gt;1&lt;/span&gt;. satu
&lt;span class="m"&gt;2&lt;/span&gt;. dua
&lt;span class="m"&gt;3&lt;/span&gt;. tiga
&lt;span class="m"&gt;4&lt;/span&gt;. empat
&lt;span class="m"&gt;5&lt;/span&gt;. lima
&lt;span class="m"&gt;6&lt;/span&gt;. enam
&lt;span class="m"&gt;7&lt;/span&gt;. tujuh
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&amp;nbsp;    &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Subtitusi&lt;/strong&gt;&lt;br /&gt;
Mode subtitusi ini bisa dibilang &lt;em&gt;search and replace&lt;/em&gt;, cari karakter pakai regex, kalau ketemu replace.&lt;/p&gt;
&lt;p&gt;Saya suka pakai sed mode ini, lebih cepat daripada harus lewat teks editor.&lt;/p&gt;
&lt;p&gt;Format mode subtitusi: &lt;strong&gt;&lt;code&gt;sed 's/regex/replace/' file&lt;/code&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Dengan contoh file &lt;code&gt;data.txt&lt;/code&gt; seperti di bawah,&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat &amp;gt; data.txt &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; 123 abc&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Coba subtitusi karakter &lt;code&gt;123&lt;/code&gt; dengan &lt;code&gt;456&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ sed &lt;span class="s1"&gt;&amp;#39;s/123/456/&amp;#39;&lt;/span&gt; data.txt
&lt;span class="m"&gt;456&lt;/span&gt; abc
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;sed&lt;/code&gt; ini kalau kita instruksikan buat subtitusi karakter, cuma pattern yang pertama match saja yang dirubah.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat &amp;gt; data.txt &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; 123 abc 123&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; EOF&lt;/span&gt;
$
$ sed &lt;span class="s1"&gt;&amp;#39;s/123/456/&amp;#39;&lt;/span&gt; data.txt
&lt;span class="m"&gt;456&lt;/span&gt; abc &lt;span class="m"&gt;123&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Pattern &lt;code&gt;123&lt;/code&gt; yang kedua tidak berubah. Kalau kita mau rubah semuanya, pakai &lt;code&gt;g (global)&lt;/code&gt; setelah delimiter terakhir.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ sed &lt;span class="s1"&gt;&amp;#39;s/123/456/g&amp;#39;&lt;/span&gt; data.txt
&lt;span class="m"&gt;456&lt;/span&gt; abc &lt;span class="m"&gt;456&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Tentu saja &lt;code&gt;sed&lt;/code&gt; ini juga bisa ambil input dari &lt;code&gt;stdin&lt;/code&gt; selain &lt;code&gt;file&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat data.txt &lt;span class="p"&gt;|&lt;/span&gt; sed &lt;span class="s1"&gt;&amp;#39;s/123/456/g&amp;#39;&lt;/span&gt;
&lt;span class="m"&gt;456&lt;/span&gt; abc &lt;span class="m"&gt;456&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dari semua contoh di atas itu, output semuanya di print ke stdout. Kadang kita perlu juga output bukan stdout tapi langsung ke file.&lt;br /&gt;
&lt;code&gt;sed&lt;/code&gt; punya satu fitur untuk ini namanya in-place. Pakai in-place, input dan output adalah file yang sama. Gampangnya, edit file tanpa perlu buka di editor.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat &amp;gt; data.txt &lt;span class="s"&gt;&amp;lt;&amp;lt; EOF&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; 123 abc 123&lt;/span&gt;
&lt;span class="s"&gt;&amp;gt; EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Merubah file secara in-place pakai argumen &lt;code&gt;-i&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ sed -i &lt;span class="s1"&gt;&amp;#39;s/123/456/&amp;#39;&lt;/span&gt; data.txt
$ cat data.txt
&lt;span class="m"&gt;456&lt;/span&gt; abc &lt;span class="m"&gt;123&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Sampai sini topik kali ini, manipulasi teks dan stream.&lt;br /&gt;
Contoh-contoh yang ditulis di atas itu sedikit, cuma buat pengenalan. Kalau kurang, &amp;ldquo;Man page is your friend&amp;rdquo;, dan tentu saja Google.&lt;/p&gt;
&lt;p&gt;Saya terbuka, jadi silahkan disampaikan kalau di tulisan ini ada yang perlu dikoreksi, perlu ditambah atau dikurangi, asal bukan untuk dihapus.&lt;/p&gt;
&lt;p&gt;Sampai jumpa di tulisan selanjutnya, Insya Allah.&lt;/p&gt;</content><category term="Linux Padawan"></category><category term="Linux"></category></entry><entry><title>Membumikan OpenStack</title><link href="//devnull.web.id/openstack/pengenalan-openstack.html" rel="alternate"></link><published>2016-05-14T00:13:00+08:00</published><updated>2016-05-14T00:13:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-05-14:/openstack/pengenalan-openstack.html</id><summary type="html">&lt;div class="fimg"&gt;
  &lt;img src="//devnull.web.id/images/openstack/openstack-logo.png" alt="OpenStack" title="OpenStack" /&gt;
&lt;/div&gt;

&lt;p&gt;Hari itu tanggal 13 Februari 2016, bunyi notifikasi di hape tanda ada email masuk. Subject email itu bunyinya &lt;em&gt;&amp;ldquo;Debian 6.0 Long Term Support reaching end-of-life&amp;rdquo;&lt;/em&gt;, email announcement dari tim Debian.&lt;/p&gt;
&lt;p&gt;Semua Linux admin paham apa maksudnya ini. Ya, itu berarti upgrade sistem, sebuah task yang njlimet.&lt;/p&gt;
&lt;p&gt;Tapi tetap saja …&lt;/p&gt;</summary><content type="html">&lt;div class="fimg"&gt;
  &lt;img src="//devnull.web.id/images/openstack/openstack-logo.png" alt="OpenStack" title="OpenStack" /&gt;
&lt;/div&gt;

&lt;p&gt;Hari itu tanggal 13 Februari 2016, bunyi notifikasi di hape tanda ada email masuk. Subject email itu bunyinya &lt;em&gt;&amp;ldquo;Debian 6.0 Long Term Support reaching end-of-life&amp;rdquo;&lt;/em&gt;, email announcement dari tim Debian.&lt;/p&gt;
&lt;p&gt;Semua Linux admin paham apa maksudnya ini. Ya, itu berarti upgrade sistem, sebuah task yang njlimet.&lt;/p&gt;
&lt;p&gt;Tapi tetap saja, sistem harus diupgrade. Debian 6 dengan nama Squeeze itu sudah lima tahun dari lahirnya di tahun 2011 lalu.&lt;/p&gt;
&lt;p&gt;Februari 2016, Debian stable yang paling baru namanya Debian Jessie, versi 8.&lt;br /&gt;
Itu artinya, prosesnya pasti semakin rumit karena proses upgrade tidak bisa lompat dari 6 langsung ke 8, harus upgrade ke versi 7 dulu atau Debian Wheezy.&lt;/p&gt;
&lt;p&gt;Dengan pertimbangan proses yang njlimet itu, juga karena lingkungan virtualisasi Xen, ditambah lagi karena banyaknya jumlah server yang harus diupgrade, saya putuskan tidak upgrade.&lt;/p&gt;
&lt;p&gt;Sistem tidak diupgrade, tapi saya lebih milih buat fresh install Debian Jessie.&lt;/p&gt;
&lt;p&gt;Nyatanya pilihan ini juga tidak lebih mudah, saya harus pikirkan juga bagaimana caranya migrasi sistem dengan waktu downtime yang minim.&lt;/p&gt;
&lt;p&gt;Strategi yang muncul di pikiran saya waktu itu, pakai satu mesin untuk host virtualisasi, terus buat guest OS Debian 8 di situ, kemudian migrasi konfigurasi.&lt;/p&gt;
&lt;p&gt;Nah di sinilah perkenalan saya dengan OpenStack dimulai.&lt;/p&gt;
&lt;p&gt;Saya tidak tinggal di goa, jadi kata seperti cloud computing, big data, dan OpenStack sering sekali saya dengar. Kata-kata itu biasanya cuma lewat begitu saja, tapi karena momen upgrade ini Saya jadi punya niat buat memahami apa itu OpenStack.&lt;/p&gt;
&lt;p&gt;Saya buka Google, cari tentang OpenStack berbahasa Indonesia belum ada yang bisa memuaskan keingintahuan Saya. Kebanyakan tulisan terlalu advance, banyak juga yang pengenalan OpenStack tapi tidak terlalu ramah buat yang belum ngerti OpenStack seperti saya waktu itu.&lt;/p&gt;
&lt;p&gt;Dari hasil baca sana-sini saya masih juga kesulitan memahami konsep OpenStack. Tapi akhirnya biarpun berbekal sedikit pengetahuan, Saya tetap install OpenStack. Setup OpenStack Saya waktu itu, satu controller dan dua compute node biar bisa redundant maksudnya.&lt;/p&gt;
&lt;p&gt;Setelah proses deploy dan testing yang sangat singkat itu, hasilnya saya berani putuskan bahwa setup OpenStack ini siap beroperasi.&lt;/p&gt;
&lt;p&gt;Dan sekarang saya pikir, Saya juga perlu menulis pengenalan OpenStack berdasarkan pemahaman Saya.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="tentang-openstack"&gt;Tentang OpenStack&lt;/h2&gt;
&lt;p&gt;Saya yakin banyak pengguna &lt;s&gt;Linux&lt;/s&gt; GNU/Linux, mungkin juga Anda salah satunya yang sering dengar kata OpenStack, atau mau belajar OpenStack tapi masih geleng-geleng belum ngeh apa itu OpenStack.&lt;/p&gt;
&lt;p&gt;Kabar baiknya, di artikel ini saya mau coba kasih gambaran tentang pengertian OpenStack termasuk komponennya. Kabar buruknya, karena Saya juga termasuk baru kenal OpenStack, jadi tidak semua hal tentang OpenStack ada di tulisan ini.&lt;/p&gt;
&lt;p&gt;Kalau kita bahas tentang OpenStack pasti tidak bisa lepas dari yang namanya buzzword &amp;ldquo;Cloud&amp;rdquo;. Ya, jadi kata &lt;em&gt;Cloud&lt;/em&gt; itu cuma buzzword. Artinya, &lt;em&gt;Cloud&lt;/em&gt; itu bukan terminologi teknis, jadi arti kata &lt;em&gt;Cloud&lt;/em&gt; itu bisa beda masing-masing orang.&lt;/p&gt;
&lt;p&gt;Tapi coba kita lihat definisi &lt;em&gt;Cloud Computing&lt;/em&gt; yang lumayan bikin bingung dari &lt;a href="https://en.wikipedia.org/wiki/Cloud_computing"&gt;Wikipedia&lt;/a&gt; ini:  &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&amp;ldquo;&lt;em&gt;&lt;strong&gt;Cloud computing&lt;/strong&gt;, also &lt;strong&gt;on-demand computing&lt;/strong&gt;, is a kind of Internet-based computing that provides shared processing resources and data to computers and other devices on demand. It is a model for enabling ubiquitous, on-demand access to a shared pool of configurable computing resources (e.g., networks, servers, storage, applications and services)&lt;/em&gt;&amp;ldquo;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Jadi, secara umum yang mereka-mereka maksud dengan &lt;em&gt;Cloud Computing&lt;/em&gt; itu, layanan komputasi yang resource komputasinya seperti jaringan, hard disk, dan server, itu tidak perlu dikelola sendiri dan resource itu sifatnya on-demand.&lt;/p&gt;
&lt;p&gt;Seperti Saya, atau Anda juga yang punya email Gmail misalnya. Kita tidak perlu punya server, tidak perlu sewa jaringan sama public ip address kalau mau bisa pakai email. Cukup buka browser, atau pakai smartphone sudah bisa baca sama kirim email.&lt;br /&gt;
Resourcenya seperti server, storage, sama jaringannya kita tidak perlu ikut mikir, biarkan itu Google saja yang mikir.&lt;br /&gt;
Sama seperti kalau kita perlu listrik, kita tidak perlu punya pltd sendiri kan? kita tinggal sewa saja dari PLN, beres.&lt;/p&gt;
&lt;p&gt;Nah, dengan pemahaman &lt;em&gt;Cloud&lt;/em&gt; yang seperti itu, terus di mana tempat dan fungsinya OpenStack?&lt;/p&gt;
&lt;p&gt;Jadi OpenStack adalah software suite, atau kumpulan banyak software yang fungsinya untuk mengatur resource komputasi itu. OpenStack fungsinya mengatur server, hard disk, network, dan sebagainya. Karena itu OpenStack menyebut dirinya sebagai &lt;em&gt;&lt;strong&gt;Cloud Software&lt;/strong&gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Sebenarnya OpenStack itu adalah project Open Source yang lahirnya belakangan. Jadi sebelum OpenStack sudah ada project yang kurang lebih sama, seperti OpenNebula contohnya.&lt;/p&gt;
&lt;p&gt;OpenStack disebut software suite karena memang ada lebih dari satu software cloud di OpenStack itu. Beda sama software cloud yang spesifik, software cloud buat storage misalnya seperti ownCloud atau Seafile.&lt;br /&gt;
Kalau untuk storage-nya, OpenStack punya software yang namanya Swift sama Cinder.&lt;/p&gt;
&lt;p&gt;Masing-masing software atau service di OpenStack ini bisa jalan sendiri-sendiri atau independen. Jadi kalau misalnya kita cuma perlu software cloud buat storage, kita bisa install OpenStack Swift saja, yang lain tidak perlu.&lt;/p&gt;
&lt;p&gt;Sudah paham kalau OpenStack adalah software suite untuk cloud? Sekarang coba kita lihat apa saja software atau service di OpenStack.&lt;/p&gt;
&lt;p&gt;OpenStack punya nama-nama untuk masing-masing software nya.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Keystone:&lt;/strong&gt; Identity service&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nova:&lt;/strong&gt; Compute service&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Glance:&lt;/strong&gt; Image service&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Swift:&lt;/strong&gt; Object storage service&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cinder:&lt;/strong&gt; Block storage service&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Neutron:&lt;/strong&gt; Networking service&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Enam software di atas itu yang termasuk inti atau core service di OpenStack, cuma enam ini juga yang mau saya tuliskan.&lt;/p&gt;
&lt;p&gt;Saya tidak bahas service yang lain karena saya juga tidak pernah pakai service itu kecuali Horizon. Horizon ini buat manajemen Cloud lewat interface web.&lt;/p&gt;
&lt;p&gt;Service selain enam core di atas:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Horizon:&lt;/strong&gt; Dashboard Web management&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Trove:&lt;/strong&gt; Database&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zaqar:&lt;/strong&gt; Messaging&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Barbican:&lt;/strong&gt; Key Management&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Congress:&lt;/strong&gt; Governance&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ceilometer:&lt;/strong&gt; Telemetry&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sahara:&lt;/strong&gt; Elastic Map Reduce&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Manila:&lt;/strong&gt; Shared Filesystems&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magnum:&lt;/strong&gt; Containers&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Heat:&lt;/strong&gt; Orchestration&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ironic:&lt;/strong&gt; Bare-Metal Provisioning&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Designate:&lt;/strong&gt; Domain Name Service&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Murano:&lt;/strong&gt; Application Catalog&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="keystone"&gt;Keystone&lt;/h3&gt;
&lt;p&gt;Keystone adalah identity service. Mungkin service Keystone ini yang wajib ada di tiap-tiap instalasi OpenStack. Jadi semua service sama tenant di OpenStack harus terdaftar di Keystone ini.&lt;/p&gt;
&lt;p&gt;Misalnya kita nambah service baru, seperti Nova contohnya, Nova ini harus di daftarkan di Keystone. User sama tenant begitu juga, harus terdaftar di Keystone.&lt;/p&gt;
&lt;p&gt;Istilah Tenant di OpenStack itu seperti grup resource. Jadi setiap tenant itu punya user sama kapasitas resource-nya masing-masing. Kita bisa batasi resource storage buat tenant A maksimal 100 GB misalnya.&lt;/p&gt;
&lt;p&gt;Itu Keystone. Jadi Keystone itu service OpenStack yang berhubungan dengan Tenant, User, sama service yang lain.&lt;/p&gt;
&lt;h3 id="nova"&gt;Nova&lt;/h3&gt;
&lt;p&gt;Nova adalah compute service, atau virtualisasi, atau service virtual machine. Nova tugasnya membuat guest OS atau virtual machine, restart, shutdown, destroy guest OS, itu semuanya dari Nova.&lt;/p&gt;
&lt;p&gt;Nova ini frontend, artinya Nova bukan teknologi hypervisor seperti KVM, Xen dan teman-temannya. Untuk hypervisor-nya Nova bisa pakai backend Qemu, bisa juga pakai KVM, Xen, bahkan VMware vSphere.&lt;/p&gt;
&lt;p&gt;Itu Nova. Jadi jelas ya, bahwa fungsi Nova ini lebih ke Virtual Machine.&lt;/p&gt;
&lt;h3 id="glance"&gt;Glance&lt;/h3&gt;
&lt;p&gt;Glance fungsinya buat manage disk image. Disk image ini yang nantinya diattach ke vm lewat Nova, terus dipakai buat hard disk virtual.&lt;br /&gt;
Glance ini seperti repositori disk image, user bisa upload disk image, terus instruksikan Nova supaya boot pakai disk image ini.&lt;/p&gt;
&lt;p&gt;Jadi gambarannya kurang lebih seperti itu. Glance itu fungsinya berhubungan dengan image, disk image.&lt;/p&gt;
&lt;h3 id="swift"&gt;Swift&lt;/h3&gt;
&lt;p&gt;Swift adalah service object storage di OpenStack.&lt;/p&gt;
&lt;p&gt;Sudah pernah dengar object storage? ini salah satu dari beberapa jenis storage, yang lain misalnya seperti file-level storage sama block-level storage.&lt;/p&gt;
&lt;p&gt;Di object storage, kalau misalnya kita simpan file di storage dengan tipe ini, data yang disimpan di storage ini disebut object.&lt;/p&gt;
&lt;p&gt;Object ini masing-masing punya metadata, metadata ini berisi informasi tentang object, misalnya tipe filenya, besarnya berapa, dibuat kapan, dan sebagainya. Terus setiap object ini juga punya id masing-masing yang unik.&lt;/p&gt;
&lt;p&gt;Kita ambil contoh, kita sudah tidak asing sama layanan cloud storage semacam Google Drive atau Amazon S3.&lt;br /&gt;
Bisa kita bayangkan dari semua pengguna Google Drive itu, kalau dihitung semua kapasitas storage-nya pasti bukan hitungan terabyte lagi, anggap saja sekian exabyte atau jutaan terabyte.&lt;/p&gt;
&lt;p&gt;Nah, problemnya adalah, bagaimana mengatur data sebesar itu? itu pasti jadi persoalan sendiri.&lt;/p&gt;
&lt;p&gt;Di sinilah keunggulan storage tipe object storage. Kapasitas storage dengan tipe ini bisa scaling atau bisa membesar kapasitasnya sampai skala unlimited. Terus kerennya lagi, letak geografis bukan masalah buat object storage.&lt;/p&gt;
&lt;p&gt;Jadi storage yang terpisah-pisah secara geografis, data center yang beda lokasi bukan masalah karena object storage melihatnya sebagai satu entity.  &lt;/p&gt;
&lt;p&gt;Karena itu, karena kelebihan ini makanya layanan seperti Amazon S3 sama Google Drive pakai object storage buat nyimpan data.&lt;/p&gt;
&lt;h3 id="cinder"&gt;Cinder&lt;/h3&gt;
&lt;p&gt;OpenStack Cinder adalah service block storage. Block storage ini beda sama Swift yang object storage di atas.&lt;br /&gt;
Block storage ini nyimpan data di disk dalam bentuk block, block ini biasanya disebut volume.&lt;/p&gt;
&lt;p&gt;Block storage itu kebanyakan dipakai di &lt;em&gt;Storage Area Network&lt;/em&gt; atau SAN. Data yang bentuknya block itu bisa dipakai buat hard disk virtual, karena itu tipe storage ini banyak dipakai buat filesystem di Guest OS.&lt;/p&gt;
&lt;p&gt;Block yang tersimpan di disk itu bisa didistribusikan sebagai hard disk virtual ke server-server lewat protokol iSCSI atau Fibre Channel (FC), ini bukan typo tapi memang betul fibre bukan fiber.&lt;br /&gt;
Fibre Channel ini protokol, kalau fiber optic itu medianya. &lt;/p&gt;
&lt;p&gt;Terus OS yang pakai FC atau iSCSI ini nantinya bisa memperlakukan block yang dari SAN itu, sama seperti hard disk fisik. Block ini bisa diformat ke filesystem tertentu seperti ext4, ntfs, atau fat dan diisi data.&lt;/p&gt;
&lt;p&gt;Tipe storage yang ini lebih cepat kalau dibanding object storage, itu kelebihannya, karena itu tipe block ini lebih cocok buat database sama filesystem untuk OS.&lt;br /&gt;
Kelemahannya, tipe block ini kurang bisa scaling seperti object storage. Jadi kalau object storage bisa scaling bahkan sampai beda lokasi, block storage tidak.&lt;/p&gt;
&lt;h3 id="neutron"&gt;Neutron&lt;/h3&gt;
&lt;p&gt;OpenStack Neutron ini adalah layanan Networking as a Service atau NaaS. saya sendiri juga belum ngeh konsep NaaS ini sampai Saya pakai OpenStack, padahal Saya punya background jaringan.&lt;/p&gt;
&lt;p&gt;Neutron ini tugasnya me-manage jaringan virtual, alokasikan ip address, termasuk juga security firewall.&lt;br /&gt;
Pakai Neutron ini, user tenant bisa buat jaringan virtual untuk tenant-nya, dia juga bisa buat router virtual termasuk port-nya, atur firewall, ip address, dan lainnya.&lt;/p&gt;
&lt;p&gt;Dari semua service core di OpenStack, menurut saya Neutron ini yang paling susah, paling susah dimengerti. Karena ketika dipelajari lagi ternyata Neutron ini banyak komponen program Linux yang membentuk jadi Neutron. Dari Linux bridge, Open vSwitch, OpenFlow, Linux virtual ethernet, sampai Linux network namespace.&lt;/p&gt;
&lt;p&gt;Kalau Anda mau pelajari OpenStack Neutron lebih dalam lagi, silahkan baca tulisan saya yang lain tentang Neutron, &lt;a href="//devnull.web.id/openstack/memahami-networking-openstack-neutron.html"&gt;Memahami OpenStack Neutron lebih dalam&lt;/a&gt; sama lanjutannya juga, &lt;a href="http://devnull.web.id/openstack/openstack-network-namespace.html"&gt;Cara Kerja OpenStack Networking - Memahami Network Namespace&lt;/a&gt;.  &lt;/p&gt;
&lt;p&gt;Dua artikel ini saya rasa cukup buat memahami gambaran bagaimana OpenStack Neutron itu sebenarnya.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="manajemen-openstack"&gt;Manajemen OpenStack&lt;/h2&gt;
&lt;p&gt;Untuk manajemen service-nya, OpenStack punya tiga fasilitas. Dashboard web GUI lewat service Horizon, bisa juga pakai Command Line Interface atau CLI, atau Application Programming Interface atau API.  &lt;/p&gt;
&lt;p&gt;Dua yang awal tidak perlu banyak penjelasan, tinggal yang terakhir API. API ini interface buat pemrograman, pakai API ini developer atau programmer bisa buat program sendiri buat me-manage service OpenStack.&lt;br /&gt;
Terus program itu berkomunikasi dengan OpenStack lewat API ini. Jadi API ini semacam perantara antara program yang dibuat programmer sama OpenStack.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 id="conclusion"&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Kalau Anda pengguna Linux yang bukan end user atau sekedar pengguna, atau Anda berada di industri IT, terutama Linux, menurut saya OpenStack layak untuk dipelajari. Kita lihat saja tren komputasi sekarang, data yang besar, masif, dan terpusat. &lt;/p&gt;
&lt;p&gt;Kalau dulu developer jualan software, sekarang software ditaruh di cloud terus dibuat layanan atau istilah kerennya sekarang Software as a Service (SaaS), Google Apps contohnya.&lt;/p&gt;
&lt;p&gt;Google Apps ambil contoh saja seperti aplikasi perkantoran Google Docs. Kalau seperti Microsoft Office programnya dijual, tapi kalau Google Docs programnya tidak dijual tapi ditempatkan di cloud terus dijadikan layanan.&lt;br /&gt;
User tinggal buka browser, kapan saja dari mana saja dan dari perangkat apa saja bisa pakai service program Google Docs.&lt;/p&gt;
&lt;p&gt;Kalau misalnya perlu update software, atau ada problem sama programnya, itu juga bukan tanggung jawab user tapi Google.&lt;/p&gt;
&lt;p&gt;Nah OpenStack bisa menjawab tren computing itu, OpenStack ini juga sebuah project Open Source yang besar karena sebagian besar leader di industri IT berkontribusi di OpenStack. Sebut saja seperti Rackspace, Red Hat, Ubuntu, Google, Intel, Cisco, dan masih banyak lagi yang terlibat di project ini.&lt;/p&gt;
&lt;p&gt;Saya sendiri begitu sudah sedikit ngeh dengan OpenStack ini, saya merasa kagum sama sistem ini, dan seharusnya Anda juga.&lt;/p&gt;
&lt;p&gt;Terakhir, saya minta bantuan Anda untuk share tulisan ini kalau menurut Anda tulisan ini bisa membantu buat pemula OpenStack.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Terima kasih.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artikel Berkaitan:&lt;/strong&gt;&lt;br /&gt;
&lt;a href="//devnull.web.id/openstack/convert-database-openstack-cinder-dari-sqlite3-ke-mysql.html"&gt;Convert Database OpenStack Cinder dari Sqlite3 ke MySQL - Debian Jessie&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;Kesalahan konfigurasi default OpenStack Cinder di Debian 8, dan bagaimana cara konversi database dari Sqlite3 ke MySQL&lt;/em&gt;&lt;/p&gt;</content><category term="OpenStack"></category><category term="Linux"></category><category term="OpenStack"></category><category term="Debian"></category></entry><entry><title>Cara Kerja OpenStack Networking - Memahami Network Namespace</title><link href="//devnull.web.id/openstack/openstack-network-namespace.html" rel="alternate"></link><published>2016-05-09T20:02:00+08:00</published><updated>2016-05-09T20:02:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-05-09:/openstack/openstack-network-namespace.html</id><summary type="html">&lt;div class="fimg"&gt;
  &lt;img src="//devnull.web.id/images/openstack/netns.png" alt="OpenStack" title="OpenStack" /&gt;
&lt;/div&gt;

&lt;p&gt;Melanjutkan tentang OpenStack Networking di tulisan yang lalu dengan judul &lt;a href="//devnull.web.id/openstack/memahami-networking-openstack-neutron.html"&gt;Memahami OpenStack Neutron lebih dalam&lt;/a&gt;, ada salah satu fitur Linux yang dipakai OpenStack Networking dan belum dibahas, fitur Linux itu namanya network namespace.&lt;/p&gt;
&lt;p&gt;Mungkin di antara Anda para pembaca ada yang punya background networking. Di dunia networking ada istilah yang …&lt;/p&gt;</summary><content type="html">&lt;div class="fimg"&gt;
  &lt;img src="//devnull.web.id/images/openstack/netns.png" alt="OpenStack" title="OpenStack" /&gt;
&lt;/div&gt;

&lt;p&gt;Melanjutkan tentang OpenStack Networking di tulisan yang lalu dengan judul &lt;a href="//devnull.web.id/openstack/memahami-networking-openstack-neutron.html"&gt;Memahami OpenStack Neutron lebih dalam&lt;/a&gt;, ada salah satu fitur Linux yang dipakai OpenStack Networking dan belum dibahas, fitur Linux itu namanya network namespace.&lt;/p&gt;
&lt;p&gt;Mungkin di antara Anda para pembaca ada yang punya background networking. Di dunia networking ada istilah yang dikenal dengan VRF (&lt;em&gt;Virtual Routing and Forwarding&lt;/em&gt;). VRF ini memungkinkan lebih dari satu routing table coexist dalam satu router fisik, artinya dalam satu router ada banyak router virtual dengan routing table yang independen dan terpisah dari yang lain. Nah di Linux, fitur ini dinamakan network namespace.&lt;/p&gt;
&lt;p&gt;Masing-masing network namespace di Linux punya routing table sendiri-sendiri, interface sendiri-sendiri dan juga firewall yang terpisah. Fitur ini yang dipakai OpenStack untuk membuat virtual network dan virtual router.&lt;/p&gt;
&lt;p&gt;Seperti router dan network pada umumnya, di network namespace juga ada interface, routing table, firewall, dan ip address. Bedanya, di network namespace kita tidak bisa pakai interface fisik, kita cuma bisa pakai interface virtual. Jadi tidak ada eth0 atau eth1 atau wlan0 di network namespace.  &lt;/p&gt;
&lt;p&gt;Karena tidak bisa pakai interface fisik, maka network virtual ini secara default juga tidak bisa berkomunikasi dengan jaringan fisik, seperti Internet misalnya. Dan untuk mengatasi batasan itu, biasanya digunakan bridge untuk menjembatani antara jaringan fisik dan jaringan virtual.&lt;br /&gt;
OpenStack Neutron atau networking juga menggunakan bridge Open vSwitch untuk menjembatani dua jaringan ini.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="command-command-namespace"&gt;Command-command namespace&lt;/h3&gt;
&lt;p&gt;Di contoh ini saya pakai banyak command &lt;em&gt;ip&lt;/em&gt;. Kalau Anda masih sering pakai command &lt;em&gt;ifconfig&lt;/em&gt; dan command &lt;em&gt;route&lt;/em&gt;, saran Saya segera saja tinggalkan karena dua command itu dari zaman batu. Gantinya, pelajari command &lt;em&gt;ip&lt;/em&gt; dari package &lt;em&gt;iproute2&lt;/em&gt; karena yang ini lebih modern.&lt;/p&gt;
&lt;p&gt;Karena network namespace sama seperti network biasa, maka command ip juga bisa dipakai di namespace.&lt;/p&gt;
&lt;p&gt;Menambahkan network namespace:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ip netns add test-netns&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Command ini untuk membuat network namespace baru dengan nama &lt;em&gt;test-netns&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Untuk melihat semua netns&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;root@DEATH-STAR:~# ip netns show&lt;/span&gt;
&lt;span class="err"&gt;test-netns&lt;/span&gt;
&lt;span class="err"&gt;root@DEATH-STAR:~#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Untuk mengeksekusi command dalam netns, pakai &lt;em&gt;ip netns exec &amp;lt;nama netns&amp;gt; &amp;lt;command&amp;gt;&lt;/em&gt;.
Contoh untuk eksekusi command &lt;em&gt;ip link show&lt;/em&gt; di netns &lt;em&gt;test-netns&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;root@DEATH-STAR:~# ip netns exec test-netns ip link show&lt;/span&gt;
&lt;span class="c"&gt;1: lo: &amp;lt;LOOPBACK&amp;gt; mtu 65536 qdisc noop state DOWN mode DEFAULT group default &lt;/span&gt;
&lt;span class="c"&gt;    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;/span&gt;
&lt;span class="err"&gt;root@DEATH-STAR:~#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kalau command di atas dibagi jadi tiga bagian, maka seperti ini:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;ip netns exec&lt;/strong&gt; : Ini dipakai untuk eksekusi command dalam network namespace.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;test-netns&lt;/strong&gt; : &lt;em&gt;test-netns&lt;/em&gt; adalah nama network namespace.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ip link show&lt;/strong&gt; : Ini command yang dieksekusi di dalam netns.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Seperti terlihat di output, waktu kita buat namespace atau netns baru, di netns baru itu langsung ada interface loopback (lo) tapi dengan status down, jadi tidak bisa kita ping.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;root@DEATH-STAR:~# ip netns exec test-netns ping localhost&lt;/span&gt;
&lt;span class="err"&gt;PING localhost (127.0.0.1) 56(84) bytes of data.&lt;/span&gt;
&lt;span class="err"&gt;^C&lt;/span&gt;
&lt;span class="err"&gt;--- localhost ping statistics ---&lt;/span&gt;
&lt;span class="err"&gt;4 packets transmitted, 0 received, 100% packet loss, time 3024ms&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kita harus up-kan dulu interface loopback &lt;em&gt;lo&lt;/em&gt; baru kemudian loopback tersebut bisa berfungsi.&lt;br /&gt;
Supaya interface lo bisa up, pakai command &lt;em&gt;ip link set lo up&lt;/em&gt;. Di dalam netns tentu saja.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;root@DEATH-STAR:~# ip netns exec test-netns ip link set lo up&lt;/span&gt;
&lt;span class="err"&gt;root@DEATH-STAR:~# ip netns exec test-netns ping localhost&lt;/span&gt;
&lt;span class="err"&gt;PING localhost (127.0.0.1) 56(84) bytes of data.&lt;/span&gt;
&lt;span class="err"&gt;64 bytes from localhost (127.0.0.1): icmp_req=1 ttl=64 time=0.126 ms&lt;/span&gt;
&lt;span class="err"&gt;64 bytes from localhost (127.0.0.1): icmp_req=2 ttl=64 time=0.066 ms&lt;/span&gt;
&lt;span class="err"&gt;64 bytes from localhost (127.0.0.1): icmp_req=3 ttl=64 time=0.057 ms&lt;/span&gt;
&lt;span class="err"&gt;^C&lt;/span&gt;
&lt;span class="err"&gt;--- localhost ping statistics ---&lt;/span&gt;
&lt;span class="err"&gt;3 packets transmitted, 3 received, 0% packet loss, time 1998ms&lt;/span&gt;
&lt;span class="err"&gt;rtt min/avg/max/mdev = 0.057/0.083/0.126/0.030 m&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Netns ini belum bisa berkomunikasi dengan dunia luar. Supaya bisa maka harus kita buat bridge untuk menjembatani itu.&lt;/p&gt;
&lt;p&gt;Di Debian yang saya pakai untuk percobaan ini nama interface-nya &lt;em&gt;eth0&lt;/em&gt;. Kemudian Saya akan coba buat sepasang Linux Veth, salah satu veth di assign ke netns &lt;em&gt;test-netns&lt;/em&gt;, satunya lagi dijadikan member bridge &lt;em&gt;br0&lt;/em&gt; bersama &lt;em&gt;eth0&lt;/em&gt;. &lt;em&gt;eth0&lt;/em&gt; ini tersambung dengan kabel ke jaringan fisik external termasuk jaringan Internet.&lt;/p&gt;
&lt;p&gt;Buat bridge &lt;em&gt;br0&lt;/em&gt; dengan member &lt;em&gt;eth0&lt;/em&gt;, request ip address ke server DHCP dan test ping ke Google dns.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;root@DEATH-STAR:~# brctl addbr br0&lt;/span&gt;
&lt;span class="err"&gt;root@DEATH-STAR:~# brctl addif br0 eth0&lt;/span&gt;
&lt;span class="err"&gt;root@DEATH-STAR:~# brctl show br0&lt;/span&gt;
&lt;span class="err"&gt;bridge name bridge id               STP enabled     interfaces&lt;/span&gt;
&lt;span class="err"&gt;br0         8000.80c16e592e43       no              eth0&lt;/span&gt;
&lt;span class="err"&gt;root@DEATH-STAR:~#&lt;/span&gt;
&lt;span class="err"&gt;root@DEATH-STAR:~# dhclient br0&lt;/span&gt;
&lt;span class="err"&gt;Restarting ntp (via systemctl): ntp.service.&lt;/span&gt;
&lt;span class="err"&gt;root@DEATH-STAR:~# ip addr show br0&lt;/span&gt;
&lt;span class="c"&gt;4: br0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UP group default &lt;/span&gt;
&lt;span class="c"&gt;    link/ether 80:c1:6e:59:2e:43 brd ff:ff:ff:ff:ff:ff&lt;/span&gt;
&lt;span class="c"&gt;    inet 10.10.10.10/27 brd 10.10.10.31 scope global br0&lt;/span&gt;
&lt;span class="c"&gt;            valid_lft forever preferred_lft forever&lt;/span&gt;
&lt;span class="err"&gt;root@DEATH-STAR:~#&lt;/span&gt;
&lt;span class="err"&gt;root@DEATH-STAR:~# ping 8.8.8.8&lt;/span&gt;
&lt;span class="err"&gt;PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data.&lt;/span&gt;
&lt;span class="err"&gt;64 bytes from 8.8.8.8: icmp_req=1 ttl=55 time=47.2 ms&lt;/span&gt;
&lt;span class="err"&gt;64 bytes from 8.8.8.8: icmp_req=2 ttl=55 time=48.5 ms&lt;/span&gt;
&lt;span class="err"&gt;64 bytes from 8.8.8.8: icmp_req=3 ttl=55 time=44.0 ms&lt;/span&gt;
&lt;span class="err"&gt;^C&lt;/span&gt;
&lt;span class="err"&gt;--- 8.8.8.8 ping statistics ---&lt;/span&gt;
&lt;span class="err"&gt;3 packets transmitted, 3 received, 0% packet loss, time 2003ms&lt;/span&gt;
&lt;span class="err"&gt;rtt min/avg/max/mdev = 44.051/46.605/48.540/1.900 ms&lt;/span&gt;
&lt;span class="err"&gt;root@DEATH-STAR:~#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Selanjutnya buat sepasang Linux Veth dengan nama veth1 dan veth2&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;root@DEATH-STAR:~# ip link add veth1 type veth peer name veth2&lt;/span&gt;
&lt;span class="err"&gt;root@DEATH-STAR:~#&lt;/span&gt;
&lt;span class="err"&gt;root@DEATH-STAR:~# ip link show | grep veth&lt;/span&gt;
&lt;span class="c"&gt;5: veth2: &amp;lt;BROADCAST,MULTICAST&amp;gt; mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000&lt;/span&gt;
&lt;span class="c"&gt;6: veth1: &amp;lt;BROADCAST,MULTICAST&amp;gt; mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000&lt;/span&gt;
&lt;span class="err"&gt;root@DEATH-STAR:~#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Seperti yang sudah dijelaskan di artikel sebelumnya, Linux Virtual Ethernet (Veth) adalah sepasang interface yang kalau ada paket masuk lewat salah satu interface maka paket itu akan keluar lewat interface lainnya.&lt;/p&gt;
&lt;p&gt;Berikutnya, assign interface veth1 ke namespace &lt;em&gt;test-netns&lt;/em&gt; dan veth2 ke bridge &lt;em&gt;br0&lt;/em&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;root@DEATH-STAR:~# brctl addif br0 veth2&lt;/span&gt;
&lt;span class="err"&gt;root@DEATH-STAR:~# brctl show br0&lt;/span&gt;
&lt;span class="err"&gt;bridge name bridge id               STP enabled     interfaces&lt;/span&gt;
&lt;span class="err"&gt;br0         8000.80c16e592e43       no              eth0&lt;/span&gt;
&lt;span class="err"&gt;                                                    veth2&lt;/span&gt;
&lt;span class="err"&gt;root@DEATH-STAR:~# ip link set veth1 netns test-netns&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kalau kita cek lagi dengan &lt;em&gt;ip link show&lt;/em&gt;, veth1 sudah hilang karena sudah ada di namespace &lt;em&gt;test-netns&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;root@DEATH-STAR:~# ip link show | grep veth&lt;/span&gt;
&lt;span class="c"&gt;5: veth2: &amp;lt;BROADCAST,MULTICAST&amp;gt; mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Cek &lt;em&gt;ip link show&lt;/em&gt; di &lt;em&gt;test-netns&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;root@DEATH-STAR:~# ip netns exec test-netns ip link show&lt;/span&gt;
&lt;span class="c"&gt;1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default &lt;/span&gt;
&lt;span class="c"&gt;    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;/span&gt;
&lt;span class="c"&gt;6: veth1: &amp;lt;BROADCAST,MULTICAST&amp;gt; mtu 1500 qdisc noop state DOWN mode DEFAULT group default qlen 1000&lt;/span&gt;
&lt;span class="c"&gt;    link/ether 26:e1:4d:ee:33:ef brd ff:ff:ff:ff:ff:ff&lt;/span&gt;
&lt;span class="err"&gt;root@DEATH-STAR:~#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Perlu juga diperhatikan bahwa nomor index interface tidak berubah biarpun interface ada di netns. Di namespace &lt;em&gt;test-netns&lt;/em&gt; nomor interface 1 untuk &lt;em&gt;lo&lt;/em&gt; dan 6 untuk &lt;em&gt;veth1&lt;/em&gt; karena nomor index interface &lt;em&gt;veth1&lt;/em&gt; adalah 6.&lt;/p&gt;
&lt;p&gt;Coba dihidupkan interface veth1 dan veth2 kemudian request ip address ke DHCP server di &lt;em&gt;test-netns&lt;/em&gt; dan coba ping ke Google.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@DEATH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;STAR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;veth2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;up&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@DEATH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;STAR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@DEATH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;STAR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;set&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;veth1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;up&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@DEATH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;STAR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dhclient&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;veth1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;/&lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@DEATH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;STAR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@DEATH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;STAR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@DEATH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;STAR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;addr&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;lo&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;LOOPBACK&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;UP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;LOWER_UP&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;65536&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;qdisc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;noqueue&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;state&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;UNKNOWN&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;group&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;loopback&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;brd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;00&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;inet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;127.0.0.1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;lo&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;valid_lft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forever&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;preferred_lft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forever&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;inet6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;host&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;valid_lft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forever&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;preferred_lft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forever&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;veth1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;BROADCAST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;MULTICAST&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;UP&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;LOWER_UP&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;mtu&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1500&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;qdisc&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;pfifo_fast&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;state&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;UP&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;group&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;qlen&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;ether&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;26&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="nl"&gt;e1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="nl"&gt;d&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nl"&gt;ee&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ef&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;brd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nl"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nl"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nl"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nl"&gt;ff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;ff&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;inet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;10.10.10.25&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;brd&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;10.10.10.31&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;global&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;veth1&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;valid_lft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forever&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;preferred_lft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forever&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;inet6&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;fe80&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mf"&gt;24e1&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="nl"&gt;dff&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nl"&gt;feee&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;33&lt;/span&gt;&lt;span class="n"&gt;ef&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;valid_lft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forever&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;preferred_lft&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;forever&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@DEATH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;STAR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@DEATH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;STAR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;###&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;Cek&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;routing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;table&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;di&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;netns&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@DEATH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;STAR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;route&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="k"&gt;default&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;via&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;10.10.10.28&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;veth1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="mf"&gt;10.10.10.0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;27&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;dev&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;veth1&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;proto&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;kernel&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="k"&gt;scope&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;link&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="n"&gt;src&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;10.10.10.25&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@DEATH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;STAR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@DEATH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;STAR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@DEATH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;STAR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ip&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;exec&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;test&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;netns&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ping&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;8.8.8.8&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;PING&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;8.8.8.8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;8.8.8.8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;56&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;84&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;of&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;8.8.8.8&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;icmp_req&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;40.8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;8.8.8.8&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;icmp_req&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;40.8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mi"&gt;64&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;bytes&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;8.8.8.8&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;icmp_req&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ttl&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;55&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;time&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;42.3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="n"&gt;C&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="o"&gt;---&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;8.8.8.8&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ping&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;statistics&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;---&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;packets&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;transmitted&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;received&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;%&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;packet&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;loss&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;time&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2003&lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;rtt&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nf"&gt;min&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nf"&gt;avg&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nf"&gt;max&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;mdev&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mf"&gt;40.817&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;41.328&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;42.347&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mf"&gt;0.720&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ms&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@DEATH&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;STAR&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Network namespace &lt;em&gt;test-netns&lt;/em&gt; sudah berhasil terkoneksi dengan Internet.&lt;/p&gt;
&lt;p&gt;Untuk menghapus namespace, pakai perintah &lt;em&gt;ip netns del &amp;lt;nama netns&amp;gt;&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ip netns del test-netns&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="openstack-jaringan-virtual"&gt;OpenStack &amp;amp; jaringan virtual&lt;/h3&gt;
&lt;p&gt;Setelah memahami sedikit tentang network namespace, kita akan lihat bagaimana OpenStack membangun jaringan virtual dengan network namespace.&lt;/p&gt;
&lt;div class="aimg"&gt;
    &lt;img src="//devnull.web.id/images/openstack/openstack-network-namespace.png" alt="OpenStack Network Namespace" title="OpenStack network Namespace" /&gt;
&lt;/div&gt;

&lt;p&gt;Gambar di atas adalah perbandingan antara netns dan Open vSwitch.&lt;br /&gt;
Bagian gambar di sebelah kanan adalah network namespace, bagaimana masing-masing tenant OpenStack melihat jaringannya sebagai jaringan yang independen dan terpisah dengan jaringan tenant lainnya.  &lt;/p&gt;
&lt;p&gt;Di Open vSwitch, bagian jaringan di gambar yang sebelah kiri itu jaringan sebenarnya, tidak terpisah secara fisik. Jaringan masing-masing tenant jadi satu hanya saja dipisahkan dengan apapun mode yang dipilih oleh administrator, vlan contohnya. Silahkan lihat kembali artikel sebelumnya untuk mode-mode yang lain.&lt;/p&gt;
&lt;p&gt;Kalau di tulisan yang lalu kita tahu OpenStack membuat penamaan interface dengan prefix &lt;strong&gt;qbr&lt;/strong&gt;, &lt;strong&gt;qvo&lt;/strong&gt;, &lt;strong&gt;qvb&lt;/strong&gt; dengan masing-masing penggunaannya, di sini juga ada tiga lagi yaitu &lt;strong&gt;qg&lt;/strong&gt;, &lt;strong&gt;qrouter&lt;/strong&gt;, dan &lt;strong&gt;qr&lt;/strong&gt;.&lt;br /&gt;
Mari kita lihat masing-masing nama prefix ini.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;qrouter&lt;/strong&gt; : Ini adalah prefix untuk network namespace&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;qg&lt;/strong&gt; : Ini nama interface di namespace untuk interface yang terhubung ke jaringan luar, gampangnya kita sebut gateway.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;qr&lt;/strong&gt; : Ini adalah nama interface yang terhubung ke jaringan internal vm.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Di instalasi OpenStack di contoh ini, saya ambil salah satu namespace bernama qrouter-3b71f8b1-4f6f-4647-abd3-bac4b1aebe7d&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ip netns show&lt;/span&gt;
&lt;span class="err"&gt;qrouter-3b71f8b1-4f6f-4647-abd3-bac4b1aebe7d&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sedangkan untuk interface di netns tersebut:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;root@Controller:~# ip netns exec qrouter-3b71f8b1-4f6f-4647-abd3-bac4b1aebe7d ip link show&lt;/span&gt;
&lt;span class="c"&gt;1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt; mtu 65536 qdisc noqueue state UNKNOWN mode DEFAULT group default &lt;/span&gt;
&lt;span class="c"&gt;    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00&lt;/span&gt;
&lt;span class="c"&gt;7: qg-25efe5e5-07: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default &lt;/span&gt;
&lt;span class="c"&gt;    link/ether fa:16:3e:84:ca:5c brd ff:ff:ff:ff:ff:ff&lt;/span&gt;
&lt;span class="c"&gt;9: qr-6d6d8407-22: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default &lt;/span&gt;
&lt;span class="c"&gt;    link/ether fa:16:3e:7f:a5:23 brd ff:ff:ff:ff:ff:ff&lt;/span&gt;
&lt;span class="c"&gt;12: qr-c5ad4b75-f0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc noqueue state UNKNOWN mode DEFAULT group default &lt;/span&gt;
&lt;span class="c"&gt;    link/ether fa:16:3e:69:23:ee brd ff:ff:ff:ff:ff:ff&lt;/span&gt;
&lt;span class="err"&gt;root@Controller:~#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Seperti terlihat, saya punya satu interface gateway qg-25efe5e5-07 dan 2 interface ke jaringan internal dengan prefix qr.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Saya harap tulisan ini bisa memberikan gambaran untuk para administrator bagaimana OpenStack networking itu dibangun.&lt;br /&gt;
Salah satu hal yang kompleks di OpenStack menurut saya adalah networking ini, rumit dan banyak sekali komponennya.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artikel Berkaitan:&lt;/strong&gt;&lt;br /&gt;
&lt;a href="//devnull.web.id/openstack/pengenalan-openstack.html"&gt;Membumikan OpenStack&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;Pengenalan yang &amp;ldquo;ramah&amp;rdquo; tentang OpenStack, ditulis dengan bahasa yang sederhana dan gampang dipahami&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="//devnull.web.id/openstack/memahami-networking-openstack-neutron.html"&gt;Memahami OpenStack Neutron lebih dalam&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;Memahami bagaimana OpenStack menggunakan Open vSwitch, bridge, dan mengatur flow packet&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="//devnull.web.id/openstack/convert-database-openstack-cinder-dari-sqlite3-ke-mysql.html"&gt;Convert Database OpenStack Cinder dari Sqlite3 ke MySQL - Debian Jessie&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;Kesalahan konfigurasi default OpenStack Cinder di Debian 8, dan bagaimana cara konversi database dari Sqlite3 ke MySQL&lt;/em&gt;&lt;/p&gt;</content><category term="OpenStack"></category><category term="Linux"></category><category term="OpenStack"></category><category term="Networking"></category></entry><entry><title>Belajar Linux Dasar - Manajemen file</title><link href="//devnull.web.id/linux-padawan/linux-dasar-2.html" rel="alternate"></link><published>2016-05-02T20:02:00+08:00</published><updated>2016-05-02T20:02:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-05-02:/linux-padawan/linux-dasar-2.html</id><summary type="html">&lt;div class="fimg"&gt;
  &lt;img src="//devnull.web.id/images/linux/linux-cli.png" alt="Linux CLI" title="Linux CLI" /&gt;
&lt;/div&gt;

&lt;p&gt;Tulisan ini menyambung artikel sebelumnya, &lt;a href="/linux-padawan/linux-dasar-1.html"&gt;Belajar Linux Dasar - Pengenalan Input &amp;amp; Ouput&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Penggunaan program-program di artikel ini dibuat sederhana dengan maksud supaya para pengguna Linux yang baru, atau yang belum familiar dengan terminal bisa langsung ketik perintah tanpa harus membaca manual yang panjang dan &lt;s&gt;boring&lt;/s&gt; lengkap itu. Kalau sudah sedikit ngerti …&lt;/p&gt;</summary><content type="html">&lt;div class="fimg"&gt;
  &lt;img src="//devnull.web.id/images/linux/linux-cli.png" alt="Linux CLI" title="Linux CLI" /&gt;
&lt;/div&gt;

&lt;p&gt;Tulisan ini menyambung artikel sebelumnya, &lt;a href="/linux-padawan/linux-dasar-1.html"&gt;Belajar Linux Dasar - Pengenalan Input &amp;amp; Ouput&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Penggunaan program-program di artikel ini dibuat sederhana dengan maksud supaya para pengguna Linux yang baru, atau yang belum familiar dengan terminal bisa langsung ketik perintah tanpa harus membaca manual yang panjang dan &lt;s&gt;boring&lt;/s&gt; lengkap itu. Kalau sudah sedikit ngerti baru baca manual lengkapnya, atau istilahnya RTFM (&lt;em&gt;Read The F[ine] Manual&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;Di artikel ini saya tuliskan tentang manajemen file, bagaimana cara membuat, rename, copy, cut, dan hapus file.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Beberapa program yang dipakai:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="#ls"&gt;&lt;strong&gt;ls&lt;/strong&gt;&lt;/a&gt;, Untuk listing file dan direktori.&lt;/li&gt;
&lt;li&gt;&lt;a href="#mkdir"&gt;&lt;strong&gt;mkdir&lt;/strong&gt;&lt;/a&gt;, Dipakai untuk membuat direktori baru.&lt;/li&gt;
&lt;li&gt;&lt;a href="#touch"&gt;&lt;strong&gt;touch&lt;/strong&gt;&lt;/a&gt;, Update timestamp atau buat file baru.&lt;/li&gt;
&lt;li&gt;&lt;a href="#mv"&gt;&lt;strong&gt;mv&lt;/strong&gt;&lt;/a&gt;, Move (cut + paste) dan rename file.&lt;/li&gt;
&lt;li&gt;&lt;a href="#cp"&gt;&lt;strong&gt;cp&lt;/strong&gt;&lt;/a&gt;, Copy file dan direktori.&lt;/li&gt;
&lt;li&gt;&lt;a href="#rm"&gt;&lt;strong&gt;rm&lt;/strong&gt;&lt;/a&gt;, Hapus file dan direktori.&lt;/li&gt;
&lt;li&gt;&lt;a href="#ln"&gt;&lt;strong&gt;ln&lt;/strong&gt;&lt;/a&gt;, Untuk membuat link.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Di penulisan penggunaan program (synopsis), saya mengikuti Linux manual. Jadi argumen program di antara tanda [ dan ] bersifat opsional.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="ls"&gt;&lt;a name="ls"&gt;&lt;/a&gt;ls&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;ls&lt;/strong&gt; dipakai untuk me-list nama-nama file dan direktori plus atributnya.&lt;br /&gt;
Synopsis&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ls&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;OPTION&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;FILE&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;em&gt;ls&lt;/em&gt; kalau tidak disuplai argumen apa-apa akan me-list nama-nama file di current directory, working atau current directory bisa dilihat dengan perintah &lt;em&gt;pwd&lt;/em&gt;. File atau folder hidden dengan nama berawalan . (dot) juga tidak di-print kecuali ada argumen -a (all).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Contoh&lt;/strong&gt;&lt;br /&gt;
Untuk me-listing file dan direktori di current directory, ketik ls tanpa argumen apa-apa.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ls&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Output dengan perintah ls di atas semua file terlihat sama, kita tidak bisa bedakan mana file mana folder, berapa besar file-nya, dsb.&lt;/p&gt;
&lt;p&gt;Tergantung program terminal dan environmentnya, biasanya output ls ada warna-warna untuk membedakan tipe file, kalau tidak ada warna, coba ini:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ls --color&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Biarpun sudah dibedakan dengan warna, tetap tidak ada informasi kapan file-file itu terahir kali diakses, atau berapa ukurannya, atau siapa pemilik file itu. Supaya ls ada output informasi itu, pakai argumen -l.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ls -l --color&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Untuk list file dan direktori yang bukan di current directory, folder /tmp misalnya&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ls /tmp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sudah dijelaskan di atas kalau file hidden dengan nama berawalan . (dot) tidak diprint, pakai argumen -a (all) kalau mau print termasuk yang hidden.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ls -a ~&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dua atau lebih argumen bisa dijadikan satu, misalnya untuk list atribut file termasuk yang hidden.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ls -la ~/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="mkdir"&gt;&lt;a name="mkdir"&gt;&lt;/a&gt;mkdir&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;mkdir&lt;/strong&gt; dipakai untuk buat file direktori baru. saya sebut file karena memang di Unix dan Linux, direktori itu file, sama seperti file umumnya.&lt;br /&gt;
Cara pakai mkdir:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;OPTIONS&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DIRECTORY&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;OPTIONS di sini opsional, boleh tidak dipakai. DIRECTORY adalah nama direktori yang mau dibuat.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Contoh&lt;/strong&gt;&lt;br /&gt;
Membuat direktori &lt;em&gt;blah&lt;/em&gt; di current directory:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;mkdir blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Membuat direktori &lt;em&gt;blah&lt;/em&gt; dengan absolute path.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;mkdir /tmp/blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kalau kita mau buat direktori baru, sekalian buat juga parent directory-nya kalau belum ada, kita bisa pakai argumen -p (parent).&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;mkdir -p blah/blah1/blah2/blah3&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dengan -p, mkdir tidak akan error kalau direktori yang dimaksud sudah ada.&lt;br /&gt;
Perintah di atas itu untuk buat direktori &lt;em&gt;blah3&lt;/em&gt;, kalau direktori parent-nya &lt;em&gt;blah2&lt;/em&gt; belum ada, maka dibuat juga. Begitu juga kalau folder &lt;em&gt;blah&lt;/em&gt; dan &lt;em&gt;blah1&lt;/em&gt; belum ada, maka akan dibuat juga.&lt;/p&gt;
&lt;p&gt;Kalau kita mau buat banyak direktori baru, tidak perlu ketik perintah satu-satu.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;mkdir {blah, blah1, blah2}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Perintah ini untuk buat direktori &lt;em&gt;blah&lt;/em&gt;, &lt;em&gt;blah1&lt;/em&gt;, dan &lt;em&gt;blah2&lt;/em&gt; di current directory. Sebenarnya tanda { dan } bukan fitur mkdir, tapi Linux shell.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="touch"&gt;&lt;a name="touch"&gt;&lt;/a&gt;touch&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;touch&lt;/strong&gt; dipakai untuk modifikasi timestamp, atau buat file baru kalau file yang dimaksud tidak ada. Timestamp adalah waktu terakhir file diakses dan dimodifikasi.&lt;/p&gt;
&lt;p&gt;Synopsis&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;touch&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;OPTION&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;FILE&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Contoh&lt;/strong&gt;  &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;touch foo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Perintah itu, kalau file &lt;em&gt;foo&lt;/em&gt; tidak ada maka dibuat baru, tapi kalau ada maka waktu akses dan modifikasi file yang dirubah. Waktu bisa dilihat dengan perintah ls.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ls -l foo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Tunggu beberapa menit, ulangi perintah &lt;em&gt;touch foo&lt;/em&gt; kemudian &lt;em&gt;ls -l foo&lt;/em&gt; dan perhatikan perbedaan outputnya.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="mv"&gt;&lt;a name="mv"&gt;&lt;/a&gt;mv&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;mv&lt;/strong&gt; dipakai untuk rename atau move (cut + paste) file.&lt;/p&gt;
&lt;p&gt;Synopsis&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;mv&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;OPTION&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;-T&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SOURCE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DEST&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;SOURCE adalah file atau direktori asal, dan DEST adalah file atau direktori tujuan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Contoh&lt;/strong&gt;&lt;br /&gt;
Rename direktori &lt;em&gt;blah&lt;/em&gt; ke &lt;em&gt;blah1&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;mv blah blah1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Pindahkan direktori &lt;em&gt;blah1&lt;/em&gt; ke /tmp&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;mv blah1 /tmp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Atau misalnya mau pindahkan &lt;em&gt;blah1&lt;/em&gt; ke /tmp/ dengan nama berbeda, &lt;em&gt;blah2&lt;/em&gt; misalnya&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;mv blah1 /tmp/blah2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sangat simpel.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="cp"&gt;&lt;a name="cp"&gt;&lt;/a&gt;cp&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;cp&lt;/strong&gt; dipakai untuk copy file.&lt;/p&gt;
&lt;p&gt;Synopsis &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;cp&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;OPTION&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;-T&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;SOURCE&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;DEST&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Penjelasan SOURCE dan DEST sama dengan mv di atas.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Contoh&lt;/strong&gt;&lt;br /&gt;
Copy file &lt;em&gt;foo&lt;/em&gt; ke folder /tmp&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;cp foo /tmp&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Untuk copy &lt;em&gt;foo&lt;/em&gt; ke /tmp dengan nama berbeda, foo1 misalnya.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;cp foo /tmp/foo1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Copy direktori.&lt;br /&gt;
Untuk copy direktori, gunakan argumen -r (recursive)&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;cp -r blah /tmp/blah1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Program cp tidak ada output apa-apa kalau sukses, kalau mau print file-file yang dicopy pakai argumen -v (verbose), misalnya:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;cp -rv blah /tmp/blah1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="rm"&gt;&lt;a name="rm"&gt;&lt;/a&gt;rm&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;rm&lt;/strong&gt; dipakai untuk menghapus file dan direktori.&lt;/p&gt;
&lt;p&gt;Synopis&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;rm&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;OPTION&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="k"&gt;FILE&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;OPTION bersifat opsional, FILE adalah file yang mau dihapus.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Contoh&lt;/strong&gt;&lt;br /&gt;
Hapus file /tmp/foo&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;rm /tmp/foo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Hapus direktori dengan option -r (recursive)&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;rm -r /tmp/blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Untuk hapus direktori, selain &lt;em&gt;rm -r&lt;/em&gt; juga bisa pakai &lt;em&gt;rmdir&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Kadang beberapa file tidak bisa begitu saja dihapus, kita bisa pakai option -f (force) untuk file-file yang susah dihapus.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;rm -rf /tmp/blah&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="ln"&gt;&lt;a name="ln"&gt;&lt;/a&gt;ln&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;ln&lt;/strong&gt; dipakai untuk membuat file link.  &lt;/p&gt;
&lt;p&gt;Di Linux ada file dengan tipe link. Link itu kurang lebih seperti shortcut kalau di Windows.&lt;/p&gt;
&lt;p&gt;Jenis link di Linux ada dua, soft link dan hard link. Soft link cara kerjanya kurang lebih seperti shortcut, sedangkan hard link seperti alias.  &lt;/p&gt;
&lt;p&gt;Soft link biasanya juga disebut dengan symbolic link atau pendeknya symlink.&lt;/p&gt;
&lt;p&gt;Penjelasan untuk hard link agak low level, tapi saya akan coba jelaskan sedikit.&lt;/p&gt;
&lt;p&gt;Misal saya buat file dengan nama &lt;em&gt;foo&lt;/em&gt;, maka file &lt;em&gt;foo&lt;/em&gt; ini punya struktur data yang disebut inode, inode ini unik untuk setiap file dan untuk sederhananya inode ini anggap saja nomor.  &lt;/p&gt;
&lt;p&gt;Misalnya inode untuk file &lt;em&gt;foo&lt;/em&gt; itu 100, nah kalau kita buat hard link ke &lt;em&gt;foo&lt;/em&gt; dengan nama &lt;em&gt;bar&lt;/em&gt;, maka sama saja kita buat file baru  dengan nama &lt;em&gt;bar&lt;/em&gt; tapi dengan inode 100.&lt;br /&gt;
Kita edit &lt;em&gt;foo&lt;/em&gt; maka &lt;em&gt;bar&lt;/em&gt; juga berubah, begitu juga sebaliknya. Tapi kalau kita hapus salah satu nama &lt;em&gt;foo&lt;/em&gt; misalnya, maka yang terhapus cuma &lt;em&gt;foo&lt;/em&gt;, sedangkan inode 100 masih tetap ada, jadinya &lt;em&gt;bar&lt;/em&gt; juga masih ada.&lt;/p&gt;
&lt;div class="aimg"&gt;
        &lt;img src="//devnull.web.id/images/linux/link.png" alt="Linux link" title="Linux link" /&gt;
&lt;/div&gt;

&lt;p&gt;File di Linux cuma bisa terhapus kalau nama file untuk inode tertentu jumlahnya sama dengan 0, artinya kalau ada 5 hard link ke satu inode maka untuk benar-benar menghapus file, lima link tersebut harus dihapus.&lt;br /&gt;
Terus lagi hard link tidak bisa cross device, artinya target file untuk link tidak bisa beda partisi atau hard disk, harus sama. Sedangkan symlink tidak ada batasan seperti itu.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Contoh&lt;/strong&gt;&lt;br /&gt;
Untuk membuat symlink ke file &lt;em&gt;foo&lt;/em&gt; dengan nama &lt;em&gt;bar&lt;/em&gt;&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ln -s foo bar&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dengan symlink atau soft link, kalau kita hapus file target &lt;em&gt;foo&lt;/em&gt;, maka &lt;em&gt;bar&lt;/em&gt; disebut broken link. &lt;em&gt;bar&lt;/em&gt; mengarah ke &lt;em&gt;foo&lt;/em&gt; tapi &lt;em&gt;foo&lt;/em&gt; tidak ada.&lt;/p&gt;
&lt;p&gt;Sedangkan untuk hard link&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ln foo bar&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dengan hard link, &lt;em&gt;foo&lt;/em&gt; dan &lt;em&gt;bar&lt;/em&gt; mengarah ke satu inode jadi seolah-olah file &lt;em&gt;foo&lt;/em&gt; dan &lt;em&gt;bar&lt;/em&gt; seperti file kembar yang selalu sinkron. Edit &lt;em&gt;foo&lt;/em&gt; maka &lt;em&gt;bar&lt;/em&gt; berubah, begitu juga sebaliknya. Hapus &lt;em&gt;foo&lt;/em&gt;, &lt;em&gt;bar&lt;/em&gt; masih bisa diakses.&lt;/p&gt;
&lt;p&gt;Demonstrasi penggunaan link dengan hard link.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; touch foo&lt;/span&gt;
&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; echo &amp;quot;abcd&amp;quot; &amp;gt; foo&lt;/span&gt;
&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; cat foo&lt;/span&gt;
&lt;span class="err"&gt;abcd&lt;/span&gt;
&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; ln foo bar&lt;/span&gt;
&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; cat bar&lt;/span&gt;
&lt;span class="err"&gt;abcd&lt;/span&gt;
&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; echo &amp;quot;1234&amp;quot; &amp;gt; bar&lt;/span&gt;
&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; cat foo&lt;/span&gt;
&lt;span class="err"&gt;1234&lt;/span&gt;
&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; rm foo&lt;/span&gt;
&lt;span class="c"&gt;rm: remove regular file ‘foo’? y&lt;/span&gt;
&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; cat bar&lt;/span&gt;
&lt;span class="err"&gt;1234&lt;/span&gt;
&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt; rm -f bar&lt;/span&gt;
&lt;span class="err"&gt;[dhani: ~] Endor &amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Saya rasa program-program ini tidak susah dipahami. Dan kalau perlu memahami lebih lagi tentang program-program di atas, langsung saja, ahem&amp;hellip; &lt;s&gt;RTFM&lt;/s&gt;, maksud saya baca manual masing-masing program dengan ketik perintah &lt;em&gt;man &amp;lt;program&amp;gt;&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;misalnya untuk program mkdir:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;man mkdir&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kita lanjut lagi di tulisan berikutnya dengan program-program yang lain, Insya Allah.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[Edit]&lt;br /&gt;
Artikel selanjutnya: &lt;a href="//devnull.web.id/linux-padawan/linux-dasar-3.html"&gt;Belajar Linux Dasar - Manipulasi Teks dan Stream&lt;/a&gt;&lt;/p&gt;</content><category term="Linux Padawan"></category><category term="Linux"></category></entry><entry><title>Memahami OpenStack Neutron lebih dalam</title><link href="//devnull.web.id/openstack/memahami-networking-openstack-neutron.html" rel="alternate"></link><published>2016-04-26T18:58:00+08:00</published><updated>2016-04-26T18:58:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-04-26:/openstack/memahami-networking-openstack-neutron.html</id><summary type="html">&lt;div class="fimg"&gt;
  &lt;img src="//devnull.web.id/images/openstack/openstack-logo.png" alt="OpenStack" title="OpenStack" /&gt;
&lt;/div&gt;

&lt;p&gt;Beberapa waktu lalu, salah satu node server OpenStack kami mengalami system failure karena NIC Gigabit di server itu hang dan reset terus-menerus. Node yang fail ini service-nya networking atau di OpenStack disebut Neutron, dan akibatnya beberapa guest vm unreachable karena sistem failure ini.&lt;/p&gt;
&lt;p&gt;Meskipun pada akhirnya saya berhasil mengembalikan guest …&lt;/p&gt;</summary><content type="html">&lt;div class="fimg"&gt;
  &lt;img src="//devnull.web.id/images/openstack/openstack-logo.png" alt="OpenStack" title="OpenStack" /&gt;
&lt;/div&gt;

&lt;p&gt;Beberapa waktu lalu, salah satu node server OpenStack kami mengalami system failure karena NIC Gigabit di server itu hang dan reset terus-menerus. Node yang fail ini service-nya networking atau di OpenStack disebut Neutron, dan akibatnya beberapa guest vm unreachable karena sistem failure ini.&lt;/p&gt;
&lt;p&gt;Meskipun pada akhirnya saya berhasil mengembalikan guest os beroperasi lagi, tapi Saya perlu waktu yang lama sampai akhirnya sistem up dan running. Kendalanya waktu itu status OpenStack out of sync, status di OpenStack sistem running padahal yang sebenarnya dalam keadaan failed.&lt;/p&gt;
&lt;p&gt;Parahnya lagi waktu problem itu, saya belum benar-benar mengerti cara kerja networking di OpenStack, jadinya Saya sedikit kebingungan dan perlu waktu lama sampai akhirnya kembali normal.&lt;br /&gt;
Saya tahu cara mengadministrasi jaringan OpenStack, tapi saya tidak benar-banar tahu bagaimana sebenarnya OpenStack Neutron itu di belakang layar.&lt;br /&gt;
Karena problem itu kemudian saya coba memahami OpenStack Neutron lebih dalam lagi.&lt;/p&gt;
&lt;p&gt;Di artikel ini saya akan gambarkan apa yang sudah Saya pelajari, bagaimana OpenStack Neutron itu membuat jaringan virtual di Linux. Bagaimana interkoneksi antar vm dibuat, dan seterusnya.&lt;br /&gt;
Saya tidak membahas bagaimana membuat port di OpenStack, cara assign floating ip, dan sebagainya. Yang mau saya jelaskan lebih ke low level bagaimana sebenarnya networking di OpenStack itu beroperasi.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="setup"&gt;Setup&lt;/h3&gt;
&lt;p&gt;Saya jelaskan dulu deployment OpenStack yang saya pakai. Di setup ini Saya gunakan vlan untuk komunikasi antar vm.&lt;br /&gt;
Ada beberapa mode di OpenStack Neutron untuk komunikasi antar vm:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;flat : Ini mode routing biasa, antar tenant OpenStack tidak ada segmentasi jaringan.&lt;/li&gt;
&lt;li&gt;vlan : Antar tenant OpenStack masing-masing tersegmentasi dengan vlan, beda tenant beda vlan id.&lt;/li&gt;
&lt;li&gt;vxlan: Segmentasi jaringan menggunakan vxlan.&lt;/li&gt;
&lt;li&gt;gre : Segmentasi jaringan antar tenant menggunakan tunneling generic routing encapsulation.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dalam setup ini saya gunakan vlan dengan range vlan id untuk tenant dari 1000 - 1100.&lt;/p&gt;
&lt;p&gt;Di setup ini ada tujuh guest os yang berjalan di OpenStack, tapi di contoh ini saya ambil tiga saja. Tiga vm itu anggap saja VM1, VM2, dan VM3. Tiga vm ini berjalan di dua server compute atau di OpenStack disebut Nova.&lt;/p&gt;
&lt;p&gt;Saya gambarkan kurang lebih tiga vm itu seperti di bawah:&lt;/p&gt;
&lt;div class="aimg"&gt;
  &lt;img src="//devnull.web.id/images/openstack/neutron.png" alt="OpenStack Neutron" title="OpenStack Neutron" /&gt;
&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Keterangan:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A, E, W&lt;/strong&gt; : Guest OS.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;B, F, X&lt;/strong&gt; : Linux bridge&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;C, Y&lt;/strong&gt; : Openvswitch bridge dengan nama br-int (default OpenStack).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;D, Z&lt;/strong&gt; : Openvswitch bridge dengan nama br-vm.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Kalau Anda merasa tidak familiar dengan gambar di atas, maka ada beberapa komponen penting yang harus dipelajari dulu sebelumnya, yaitu:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Tap device : Interface virtual yang berjalan di layer 2.&lt;/li&gt;
&lt;li&gt;Linux Bridge: ini bridge yang dibuat dengan brctl.&lt;/li&gt;
&lt;li&gt;Linux virtual ethernet : Linux veth, Linux veth adalah virtual interface yang berpasang-pasangan. Anggap pasangan veth A dan B, seperti pipa, apa yang masuk ke A akan keluar lewat B, yang masuk lewat B keluar lewat A.&lt;/li&gt;
&lt;li&gt;Openvswitch: Software switching, seperti switch fisik tapi di lingkungan virtualisasi.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Di OpenStack Neutron, Openvswitch juga diatur dengan OpenFlow. saya jelaskan singkat saja, di dalam switch ada yang namanya control plane dan data plane. Control plane fungsinya untuk mengatur flow paket, sedangkan data plane mengeksekusi flow tersebut. Biasanya dalam switch umum, control plane dan data plane jadi satu. Dengan OpenFlow, control plane dipisah dari data plane dan control plane diatur lewat OpenFlow.&lt;/p&gt;
&lt;p&gt;Keuntungannya, switch yang berbeda-beda dari vendor apapun kalau pakai OpenFlow maka bisa diatur dari software yang sama. Cisco tidak harus dengan Cisco IOS, Juniper tidak harus dengan JunOS. Istilah untuk ini namanya SDN (Software Defined Networking).&lt;/p&gt;
&lt;p&gt;Empat hal di atas itu yang harus dipelajari dulu kalau memang masih asing, karena OpenStack Neutron menggunakan 4 komponen di atas untuk membentuk jaringan.&lt;/p&gt;
&lt;p&gt;Melihat gambar di atas, mungkin Anda punya pertanyaan mengapa harus ada Linux bridge di situ. Ini juga pertanyaan saya pertama kali karena seperti tidak masuk akal menempatkan Linux bridge di antara vm dan Openvswitch br-int. Lebih logis kalau tap device langsung ke Openvswitch bridge br-int dari pada ke Linux bridge.&lt;/p&gt;
&lt;p&gt;Kemudian saya tahu dari hasil baca sana-sini bahwa bridge itu memang diperlukan. Fitur security di OpenStack memerlukan bridge itu karena firewall tidak akan berfungsi kalau interface tap dijadikan port Openvswitch. Jadi, anggap saja bridge B, F, dan X adalah firewall bridge.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="openstack-networking"&gt;OpenStack Networking&lt;/h3&gt;
&lt;p&gt;Dilihat dari gambaran besarnya, OpenStack Neutron membagi network jadi tiga kategori:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Management Network: Jaringan yang digunakan untuk memanage server OpenStack.&lt;/li&gt;
&lt;li&gt;External: Jaringan yang digunakan guest OS untuk berkomunikasi dengan jaringan luar, Internet misalnya.&lt;/li&gt;
&lt;li&gt;Internal: Jaringan yang digunakan untuk komunikasi antar virtual machine.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Di setup ini, saya jadikan management dan external network jadi satu jaringan. Di gambar itu interface untuk management dan external menggunakan interface eth0, sedangkan interface untuk internal eth1.&lt;/p&gt;
&lt;p&gt;Di tulisan ini saya fokuskan untuk jaringan internal saja, jaringan external dan management tidak karena Saya rasa dua network itu cukup jelas fungsinya.&lt;/p&gt;
&lt;p&gt;Penjelasan masing-masing komponen network internal seperti di bawah:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;br-vm: Bridge Openvswitch untuk jaringan internal vm saya namakan br-vm. Pengaturan vlan untuk tenant ada di bridge ini.&lt;/li&gt;
&lt;li&gt;br-int: Ini bridge Openvswitch internal OpenStack. Bridge ini tidak diatur oleh user atau konfigurasi, tapi OpenStack yang mengatur. Fungsi bridge ini semacam patch panel fisik, jalur-jalur ke vm diatur di bridge ini.&lt;/li&gt;
&lt;li&gt;Linux bridge: Seperti saya terangkan di atas, bridge ini fungsi utamanya untuk security. Setiap vm mempunyai bridge sendiri-sendiri.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Antara br-int dengan br-vm terkoneksi dengan Linux veth. Ujung Linux veth yang satu namanya int-br-vm, ujung satunya phy-br-vm. int-br-vm ditempatkan di bridge br-int, sedangkan phy-br-vm ditempatkan di br-vm.&lt;/p&gt;
&lt;div class="aimg"&gt;
  &lt;img src="//devnull.web.id/images/openstack/br-int.png" alt="OpenStack Openvswitch" title="OpenStack Openvswitch" /&gt;
&lt;/div&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="proses-networking-openstack"&gt;Proses networking OpenStack&lt;/h3&gt;
&lt;p&gt;Untuk setiap vm baru yang dibuat, OpenStack neutron membuat satu tap interface, satu Linux bridge, dan satu pasang Linux veth.&lt;br /&gt;
Tap interface untuk di-attach ke vm dan vm mapping tap itu ke eth0.&lt;br /&gt;
Satu Linux bridge untuk keperluan firewall. Member bridge ini ada dua, tap yang mengarah ke vm dan salah satu interface virtual Linux veth. Sedangkan Linux veth yang satunya lagi jadi member bridge br-int.&lt;/p&gt;
&lt;p&gt;OpenStack membuat prefix nama interface yang konsisten, prefix yang dimaksud seperti di bawah:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;tap : Interface dengan prefix tap adalah tap device.&lt;/li&gt;
&lt;li&gt;qbr : Interface dengan prefix qbr menandakan Linux bridge.&lt;/li&gt;
&lt;li&gt;qvb : qvb adalah salah satu dari pasangan Linux veth yang jadi member bridge qbr.&lt;/li&gt;
&lt;li&gt;qvo : Ini pasangan Linux veth qvb. Jadi qvo dan qvb itu sepasang veth. qvo jadi member bridge Ovs (Openvswitch) br-int.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jadi untuk satu vm, prefix interface beda-beda cuma suffixnya sama. Misal suffix interface abcd-01, maka tap nya &lt;strong&gt;tapabcd-01&lt;/strong&gt;, bridge-nya &lt;strong&gt;qbrabcd-01&lt;/strong&gt;, veth yang di Linux bridge &lt;strong&gt;qvbabcd-01&lt;/strong&gt;, veth yang di Ovs bridge &lt;strong&gt;qvoabcd-01&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Contoh di bawah ini saya ambilkan dari salah satu server compute dengan salah satu guest OS yang Saya beri nama alderaan:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Guest interface&lt;/strong&gt;&lt;br /&gt;
Dari guest, nama interface eth0 dengan mac address fa:16:3e:0c:24:82&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;administrator@alderaan:~$ ip link show eth0&lt;/span&gt;
&lt;span class="c"&gt;2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000&lt;/span&gt;
&lt;span class="err"&gt;link/ether fa:16:3e:0c:24:82 brd ff:ff:ff:ff:ff:ff&lt;/span&gt;
&lt;span class="err"&gt;administrator@alderaan:~$&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Tap device&lt;/strong&gt;&lt;br /&gt;
Dari compute server kita cari tap device dengan mac address yang 40 bit di belakangnya sama dengan yang terbaca di guest OS, yaitu 16:3e:0c:24:82. &lt;em&gt;ip link show&lt;/em&gt; untuk print interface.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;root@nova2:~# ip link show tapdd0ae56d-5f&lt;/span&gt;
&lt;span class="c"&gt;50: tapdd0ae56d-5f: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt; mtu 1500 qdisc pfifo_fast master qbrdd0ae56d-5f state UNKNOWN mode DEFAULT group default qlen 500&lt;/span&gt;
&lt;span class="err"&gt;link/ether fe:16:3e:0c:24:82 brd ff:ff:ff:ff:ff:ff&lt;/span&gt;
&lt;span class="err"&gt;root@nova2:~#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dari sini diketahui nama interface tap &lt;strong&gt;tapdd0ae56d-5f&lt;/strong&gt;, berarti suffix-nya &lt;strong&gt;dd0ae56d-5f&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Linux bridge&lt;/strong&gt;&lt;br /&gt;
Karena sudah tahu suffix interface &lt;strong&gt;dd0ae56d-5f&lt;/strong&gt;, tinggal tambah prefix qbr jadi &lt;strong&gt;qbrdd0ae56d-5f&lt;/strong&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;root@nova2:~# brctl show qbrdd0ae56d-5f&lt;/span&gt;
&lt;span class="err"&gt;bridge name bridge id       STP enabled interfaces&lt;/span&gt;
&lt;span class="err"&gt;qbrdd0ae56d-5f      8000.fad1404dbac4   no      qvbdd0ae56d-5f&lt;/span&gt;
&lt;span class="err"&gt;                        tapdd0ae56d-5f&lt;/span&gt;
&lt;span class="err"&gt;root@nova2:~#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;Linux veth&lt;/strong&gt;&lt;br /&gt;
Dari suffix itu, berarti pasangan veth nya &lt;strong&gt;qvodd0ae56d-5f&lt;/strong&gt; dan &lt;strong&gt;qvbdd0ae56d-5f&lt;/strong&gt;.&lt;br /&gt;
&lt;strong&gt;qvbdd0ae56d-5f&lt;/strong&gt; jadi member Linux bride &lt;strong&gt;qbrdd0ae56d-5f&lt;/strong&gt;, seperti terlihat di command brctl di atas.&lt;br /&gt;
&lt;strong&gt;qvodd0ae56d-5f&lt;/strong&gt; jadi member Ovs bridge br-int.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@nova2&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ovs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;vsctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;da610347&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b798&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4520&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b5a1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f8899b3e1a4&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Bridge&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;int&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nl"&gt;fail_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;secure&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;int&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;int&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;internal&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;qvodd0ae56d-5f&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nl"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;qvodd0ae56d-5f&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;int&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;int&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nl"&gt;ovs_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;2.3.0&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@nova2&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Interface yang tidak berhubungan saya hilangkan dari output.&lt;/p&gt;
&lt;p&gt;Menurut saya yang buat susah itu nama interface yang aneh dan tidak deskriptif itu. Kalau misalnya nama interface dibuat seperti qbralderaan, qvoalderaan, atau qvbalderaan mungkin lebih gampang buat diingat.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 id="packet-flow"&gt;Packet Flow&lt;/h3&gt;
&lt;p&gt;Di bagian ini saya bahas bagaimana aliran paket di Openvswitch dengan setup di atas.&lt;br /&gt;
Di setup ini tenant menggunakan range vlan id dari 1000 - 1100. Karena tenant cuma ada satu, vlan yang terpakai baru vlan id 1000.&lt;/p&gt;
&lt;p&gt;Vlan ini di tag di br-vm untuk vlan tenant, kemudian di Ovs br-int vlan tersebut di rewrite dengan vlan yang diatur sendiri oleh OpenStack dan diarahkan ke port yang jadi member vlan tersebut.&lt;/p&gt;
&lt;p&gt;Dalam setup ini, vlan tenant adalah vlan 1000 sedangkan vlan internal OpenStack Neutron vlan 3. Vlan 3 ini sepenuhnya OpenStack yang mengatur, tidak ada campur tangan user dan sebaiknya tidak dirubah secara langsung.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@nova2&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ovs&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;vsctl&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;show&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;da610347&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b798&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4520&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;b5a1&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="n"&gt;f8899b3e1a4&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="n"&gt;Bridge&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;int&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="nl"&gt;fail_mode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;secure&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;int&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nc"&gt;int&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;                &lt;/span&gt;&lt;span class="nl"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;internal&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;qvodd0ae56d-5f&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="nl"&gt;tag&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;qvodd0ae56d-5f&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="n"&gt;Port&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;int&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="n"&gt;Interface&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nc"&gt;int&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;br&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;vm&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="nl"&gt;ovs_version&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="ss"&gt;&amp;quot;2.3.0&amp;quot;&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="nv"&gt;@nova2&lt;/span&gt;&lt;span class="err"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;#&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Terlihat dari output, vlan internal OpenStack vlan 3 (tag: 3). Mungkin counter-intuitive, yang dimaksud &lt;em&gt;tag: 3&lt;/em&gt; di output itu sebenarnya mode port access, bukan trunk. Jadi port qvodd0ae56d-5f itu port vlan 3 mode access.&lt;/p&gt;
&lt;p&gt;Untuk memperjelas flow paket, gambarannya seperti di gambar.&lt;/p&gt;
&lt;div class="aimg"&gt;
  &lt;img src="//devnull.web.id/images/openstack/flow.png" alt="OpenStack Packet flows" title="OpenStack Packet flows" /&gt;
&lt;/div&gt;

&lt;p&gt;Seperti saya jelaskan sebelumnya, packet flow di Openvswitch itu tidak diatur langsung dari Openvswitch, tapi dari OpenFlow.&lt;br /&gt;
Mari kita lihat flow nya:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;root@nova2:~# ovs-ofctl dump-flows br-int&lt;/span&gt;
&lt;span class="err"&gt;NXST_FLOW reply (xid=0x4):&lt;/span&gt;
&lt;span class="err"&gt; cookie=0x0, duration=417414.623s, table=0, n_packets=11149297, n_bytes=1952040247, idle_age=0, hard_age=65534, priority=1 actions=NORMAL&lt;/span&gt;
&lt;span class="err"&gt; cookie=0x0, duration=410729.710s, table=0, n_packets=13337809, n_bytes=6907864027, idle_age=0, hard_age=65534, priority=3,in_port=7,dl_vlan=1000 actions=mod_vlan_vid:3,NORMAL&lt;/span&gt;
&lt;span class="err"&gt; cookie=0x0, duration=417413.441s, table=0, n_packets=4617, n_bytes=295786, idle_age=65534, hard_age=65534, priority=2,in_port=7 actions=drop&lt;/span&gt;
&lt;span class="err"&gt; cookie=0x0, duration=417411.202s, table=0, n_packets=0, n_bytes=0, idle_age=65534, hard_age=65534, priority=2,in_port=6 actions=drop&lt;/span&gt;
&lt;span class="err"&gt; cookie=0x0, duration=417414.582s, table=22, n_packets=0, n_bytes=0, idle_age=65534, hard_age=65534, priority=0 actions=drop&lt;/span&gt;
&lt;span class="err"&gt;root@nova2:~#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Di output line ke dua &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;in_port=7,dl_vlan=1000 actions=mod_vlan_vid:3,NORMAL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Maksudnya paket yang masuk lewat port 7, port 7 ini int-br-vm, kalau paket tersebut ada vlan header dengan vlan id 1000 maka vlan itu direwrite ke vlan 3. Vlan 3 ini kemudian di untag di port qvodd0ae56d-5f.&lt;/p&gt;
&lt;p&gt;Untuk memahami kenapa ada dua vlan berbeda ini, anggap saja ada dua versi vlan untuk tenant yang sama, vlan 1000 dan vlan 3. Vlan 1000 versi saya (user) vlan 3 versi OpenStack.&lt;br /&gt;
Nah karena saya dan OpenStack tidak sepakat nomor id vlan-nya, maka perlu pemetaan vlan. Vlan 1000 versi user diterjemahkan ke vlan 3 versi OpenStack.&lt;/p&gt;
&lt;p&gt;Kalau saya ditanya kenapa OpenStack tidak pakai vlan yang dipilih user saja, Saya tidak bisa jawab karena memang Saya tidak tahu kenapa desainnya seperti itu. Padahal logis saja kalau pakai vlan 1000 tanpa perlu translasi vlan.&lt;/p&gt;
&lt;p&gt;Kita lanjut lihat flow di bridge br-vm:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;root@nova2:~# ovs-ofctl dump-flows br-vm&lt;/span&gt;
&lt;span class="err"&gt;NXST_FLOW reply (xid=0x4):&lt;/span&gt;
&lt;span class="err"&gt; cookie=0x0, duration=417699.483s, table=0, n_packets=13597383, n_bytes=6938457305, idle_age=0, hard_age=65534, priority=1 actions=NORMAL&lt;/span&gt;
&lt;span class="err"&gt; cookie=0x0, duration=411015.347s, table=0, n_packets=10778277, n_bytes=1641396036, idle_age=0, hard_age=65534, priority=4,in_port=3,dl_vlan=3 actions=mod_vlan_vid:1000,NORMAL&lt;/span&gt;
&lt;span class="err"&gt; cookie=0x0, duration=417698.995s, table=0, n_packets=48, n_bytes=3976, idle_age=65534, hard_age=65534, priority=2,in_port=3 actions=drop&lt;/span&gt;
&lt;span class="err"&gt;root@nova2:~#&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Output line ke dua:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt; in_port=3,dl_vlan=3 actions=mod_vlan_vid:1000,NORMAL&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Paket dengan header vlan 3 dan masuk dari port 3 (phy-br-vm) akan dipetakan ke vlan user vlan 1000. Vlan 1000 ini yang dipakai untuk komunikasi antar vm yang beda server compute.&lt;/p&gt;
&lt;p&gt;Saya harap penjelasan saya tentang internal network OpenStack ini bisa dipahami dan bisa memberikan gambaran bagaimana OpenStack networking itu beroperasi.&lt;/p&gt;
&lt;p&gt;Sebenarnya belum semua tentang internal network dibahas karena masih ada virtual router OpenStack dengan network namespace yang belum dijelaskan. Tapi saya batasi sampai di sini saja karena terlalu panjang kalau virtual router dan network namespace ditulis juga.&lt;/p&gt;
&lt;p&gt;Mungkin lain kali, mungkin.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artikel Berkaitan:&lt;/strong&gt;&lt;br /&gt;
&lt;a href="//devnull.web.id/openstack/pengenalan-openstack.html"&gt;Membumikan OpenStack&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;Pengenalan yang &amp;ldquo;ramah&amp;rdquo; tentang OpenStack, ditulis dengan bahasa yang sederhana dan gampang dipahami&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="//devnull.web.id/openstack/openstack-network-namespace.html"&gt;Cara Kerja OpenStack Networking - Memahami Network Namespace&lt;/a&gt;&lt;br /&gt;
&lt;em&gt;Pembahasan tentang Linux Network Namespace dan bagaimana OpenStack menggunakan Network Namespace untuk membuat jaringan virtual.&lt;/em&gt;&lt;/p&gt;</content><category term="OpenStack"></category><category term="OpenStack"></category><category term="Linux"></category></entry><entry><title>Belajar Linux Dasar - Pengenalan Input &amp; Output</title><link href="//devnull.web.id/linux-padawan/linux-dasar-1.html" rel="alternate"></link><published>2016-04-22T13:02:00+08:00</published><updated>2016-04-22T13:02:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-04-22:/linux-padawan/linux-dasar-1.html</id><summary type="html">&lt;div class="fimg"&gt;
  &lt;img src="/images/term.png" alt="Linux Terminal" title="Linux Terminal" /&gt;
  &lt;p&gt;Photo credit: pixabay.com&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;GNU/Linux atau sebutan gampangnya Linux, hari ini sudah berbeda jauh sekali dibanding Linux dulu. Linux pada zaman dahulu kala identik dengan sistem operasi yang susah dan cuma orang-orang komputer saja yang pakai Linux. Sekarang Linux sudah gampang, tanpa perlu paham command pun pengguna sudah bisa …&lt;/p&gt;</summary><content type="html">&lt;div class="fimg"&gt;
  &lt;img src="/images/term.png" alt="Linux Terminal" title="Linux Terminal" /&gt;
  &lt;p&gt;Photo credit: pixabay.com&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;GNU/Linux atau sebutan gampangnya Linux, hari ini sudah berbeda jauh sekali dibanding Linux dulu. Linux pada zaman dahulu kala identik dengan sistem operasi yang susah dan cuma orang-orang komputer saja yang pakai Linux. Sekarang Linux sudah gampang, tanpa perlu paham command pun pengguna sudah bisa pakai Linux.  &lt;/p&gt;
&lt;p&gt;Dulu waktu pertama belajar Linux, saya bingung waktu masukkan flash disk tapi di layar tidak muncul apa-apa. Putar mp3 tapi tidak ada suara apa-apa yang keluar, mau putar mp3 saja perlu perjuangan.&lt;br /&gt;
Syukurnya sekarang para pengguna baru tidak perlu melalui hal-hal ribet itu, cukup install dan siap pakai.&lt;/p&gt;
&lt;p&gt;Tapi ada hal lain, buat pengguna yang berencana menjadi Linux admin atau berencana membuat server dengan Linux, maka belajar command atau perintah-perintah Linux tetap harus dikuasai. Mau tidak mau tetap harus buka terminal dan ketik perintah.&lt;br /&gt;
Karena itu tulisan ini saya kategorikan di Linux Padawan. Padawan kalau di film Star Wars adalah seorang yang sedang belajar menjadi seorang master Jedi.&lt;/p&gt;
&lt;p&gt;Entah mengapa saya merasa resource pembelajaran Linux berbahasa Indonesia masih minim, mungkin juga Saya salah tapi lihat saja situs seperti &lt;a href="http://linux.or.id"&gt;linux.or.id&lt;/a&gt;. Benar atau salah tapi asumsi itu yang membuat Saya menulis artikel ini.&lt;/p&gt;
&lt;p&gt;Saya berniat menulis artikel tentang perintah-perintah Linux yang sering dipakai, ada kemungkinan juga akan berkelanjutan. Dimulai dari pengenalan Input dan Output sampai ke program.&lt;br /&gt;
Di Linux, ada package software yang namanya GNU Coreutils. Ini berisi set program-program standar yang pasti ada di setiap distribusi Linux. Tulisan ini akan coba menjelaskan penggunaan program-program Coreutils yang sering dipakai, dan kalau dirasa kurang akan ditambah dengan program-program yang lain.&lt;/p&gt;
&lt;p&gt;Sebelum ke program, kita perlu pahami beberapa hal dasar di Linux. Yaitu I/O (Input/Output), pipe, redirection, dan struktur direktori.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input/Output&lt;/strong&gt;&lt;br /&gt;
Apa yang kita ketik di terminal termasuk input, dan yang keluar dari terminal namanya output.&lt;br /&gt;
Input tidak harus ada di terminal, begitu juga output. Input dan output bisa berupa file.&lt;br /&gt;
Misal kita mau print isi file /etc/passwd dengan command cat&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;cat /etc/passwd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;cat adalah programnya, file /etc/passwd inputnya. Outputnya diprint di terminal&lt;/p&gt;
&lt;p&gt;Linux punya special device untuk I/O, yaitu standard input atau &lt;em&gt;&lt;strong&gt;stdin&lt;/strong&gt;&lt;/em&gt;, standard ouput disebut &lt;em&gt;&lt;strong&gt;stdout&lt;/strong&gt;&lt;/em&gt;, dan standard error &lt;em&gt;&lt;strong&gt;stderr&lt;/strong&gt;&lt;/em&gt;.  &lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;stdin: Input yang ditulis atau diprint di terminal.&lt;/li&gt;
&lt;li&gt;stdout: Output normal dari program.&lt;/li&gt;
&lt;li&gt;stderr: Output program untuk pesan error.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Jadi jenis input di Linux ada dua, file dan terminal (stdin). Sedangkan jenis output ada tiga, file, output di terminal (stdout), dan output terminal kalau error (stderr).&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Pipe&lt;/strong&gt;&lt;br /&gt;
Ada fitur menarik di Unix dan Linux, output dari satu program bisa dijadikan input program lain, caranya dengan memakai pipe. Disebut pipe mungkin karena cara kerjanya seperti pipa, menghubungkan output dan input. 
Pipe dilambangkan dengan karakter |.&lt;/p&gt;
&lt;p&gt;Contoh, kita mau lihat uid dari nama user nobody. Kita pakai dua program, cat dan grep. Output dari cat dijadikan input program grep dengan pipe.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;passwd&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;grep&lt;/span&gt; &lt;span class="ss"&gt;&amp;quot;nobody&amp;quot;&lt;/span&gt;

&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="k"&gt;Output&lt;/span&gt; &lt;span class="n"&gt;yang&lt;/span&gt; &lt;span class="n"&gt;terprint&lt;/span&gt; &lt;span class="n"&gt;di&lt;/span&gt; &lt;span class="n"&gt;terminal&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;seperti&lt;/span&gt; &lt;span class="n"&gt;dibawah&lt;/span&gt;
&lt;span class="n"&gt;nobody&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65534&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65534&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;nobody&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nonexistent&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;sbin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;nologin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Maksud dari command di atas, cat /etc/passwd untuk print isi file /etc/passwd ke terminal, sedangkan grep &amp;ldquo;nobody&amp;rdquo; untuk filter baris teks yang ada tulisan nobody.&lt;br /&gt;
Ouput dari &lt;em&gt;cat /etc/passwd&lt;/em&gt; tidak diprint ke terminal tapi diarahkan ke pipe. Pipe ini kemudian mengambil output dari perintah pertama dan menjadikannya input untuk perintah ke dua &lt;em&gt;grep &amp;ldquo;nobody&amp;rdquo;&lt;/em&gt;.&lt;br /&gt;
Ringkasnya, print isi file /etc/passwd tapi cuma baris yang ada kata nobody saja. Dari output kita tahu uid user nobody adalah 65534, lain sistem hasilnya bisa beda.&lt;/p&gt;
&lt;p&gt;Pipe tidak terbatas dua program saja, lebih dari dua juga bisa, misalnya.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;cat /etc/passwd | grep &amp;quot;nobody&amp;quot; | awk -F: &amp;#39;{print $3}&amp;#39;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Redirection&lt;/strong&gt;&lt;br /&gt;
Fitur lain lagi, namanya redirection.&lt;br /&gt;
Kita bisa me-redirect atau memindahkan output atau input program. Misalnya, program yang outputnya ke stdout atau ke terminal bisa diredirect atau dipindahkan ke file, output dari stderr diredirect ke stdout, dan sebagainya.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Karakter &amp;gt; untuk redirect output.&lt;/li&gt;
&lt;li&gt;Karakter &amp;lt; untuk redirect input.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Contohnya, command di atas &lt;em&gt;cat /etc/passwd | grep &amp;ldquo;nobody&amp;rdquo;&lt;/em&gt; outputnya tidak harus terminal, kita bisa redirect atau arahkan output ke file user misalnya.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;cat /etc/passwd | grep &amp;quot;nobody&amp;quot; &amp;gt; user&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Command di atas tidak ada output apa-apa di terminal karena output kita redirect atau pindahkan ke file user. Di file user, isinya sama saja dengan output perintah yang pertama. &lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;nobody&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65534&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65534&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;nobody&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;nonexistent&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="sr"&gt;/sbin/&lt;/span&gt;&lt;span class="n"&gt;nologin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Untuk redirect input, kita gunakan karakter &amp;lt;  &lt;/p&gt;
&lt;p&gt;Contoh untuk menghitung jumlah baris file /etc/passwd.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;wc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;passwd&lt;/span&gt;

&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="k"&gt;Output&lt;/span&gt; &lt;span class="n"&gt;di&lt;/span&gt; &lt;span class="k"&gt;stdout&lt;/span&gt;
&lt;span class="mi"&gt;62&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;passwd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;62 adalah jumlah baris, /etc/passwd adalah nama file.&lt;br /&gt;
Sekarang dengan redirect input.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;wc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;passwd&lt;/span&gt;

&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="k"&gt;Output&lt;/span&gt; &lt;span class="n"&gt;di&lt;/span&gt; &lt;span class="k"&gt;stdout&lt;/span&gt;
&lt;span class="mi"&gt;62&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Maksud dari command wc -l yang ke dua, file /etc/passwd diredirect ke stdin dan kemudian dijadikan input perintah wc -l.&lt;br /&gt;
Perhatikan perbedaan output dari kedua perintah. Yang pertama ada file /etc/passwd, yang ke dua tidak ada karena perintah wc -l mengambil input dari stdin, bukan file /etc/passwd.&lt;/p&gt;
&lt;p&gt;Ada mode lain di redirect, dengan dua karakter redirection &amp;lt;&amp;lt; atau &amp;gt;&amp;gt;.&lt;br /&gt;
Bedanya dengan dua karakter, modenya adalah append.&lt;/p&gt;
&lt;p&gt;Langsung saja dengan contoh.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;cat /etc/passwd | grep &amp;quot;nobody&amp;quot; &amp;gt; user&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Command ini kalau diulang 5 kali, isi file user tetap sama.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;nobody&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65534&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65534&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;nobody&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;nonexistent&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="sr"&gt;/sbin/&lt;/span&gt;&lt;span class="n"&gt;nologin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Tapi dengan mode append, atau dua karakter redirect&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;cat /etc/passwd | grep &amp;quot;nobody&amp;quot; &amp;gt;&amp;gt; user&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Isi file user kalau command diulang lima kali.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;nobody&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65534&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65534&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;nobody&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;nonexistent&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="sr"&gt;/sbin/&lt;/span&gt;&lt;span class="n"&gt;nologin&lt;/span&gt;
&lt;span class="n"&gt;nobody&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65534&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65534&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;nobody&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;nonexistent&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="sr"&gt;/sbin/&lt;/span&gt;&lt;span class="n"&gt;nologin&lt;/span&gt;
&lt;span class="n"&gt;nobody&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65534&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65534&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;nobody&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;nonexistent&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="sr"&gt;/sbin/&lt;/span&gt;&lt;span class="n"&gt;nologin&lt;/span&gt;
&lt;span class="n"&gt;nobody&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65534&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65534&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;nobody&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;nonexistent&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="sr"&gt;/sbin/&lt;/span&gt;&lt;span class="n"&gt;nologin&lt;/span&gt;
&lt;span class="n"&gt;nobody&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65534&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="mi"&gt;65534&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="n"&gt;nobody&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;nonexistent&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="sr"&gt;/sbin/&lt;/span&gt;&lt;span class="n"&gt;nologin&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dengan dua karakter redirect, output atau input ditambahkan di bawahnya.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Struktur Direktori Linux&lt;/strong&gt;&lt;br /&gt;
Di Linux, tidak ada drive C: atau drive D: seperti di Windows.&lt;/p&gt;
&lt;p&gt;Di Linux, gambaran struktur direktori seperti di bawah:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;/&lt;/span&gt;                           &lt;span class="c1"&gt;# root&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;
 &lt;span class="o"&gt;|--&lt;/span&gt; &lt;span class="n"&gt;home&lt;/span&gt;                   &lt;span class="c1"&gt;# Direktori untuk user&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;
 &lt;span class="o"&gt;|--&lt;/span&gt; &lt;span class="n"&gt;etc&lt;/span&gt;                    &lt;span class="c1"&gt;# /etc: direktori yang berisi konfigurasi&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;   
 &lt;span class="o"&gt;|--&lt;/span&gt; &lt;span class="n"&gt;tmp&lt;/span&gt;                    &lt;span class="c1"&gt;# /tmp: temporary&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;   
 &lt;span class="o"&gt;|--&lt;/span&gt; &lt;span class="n"&gt;usr&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;/&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|--&lt;/span&gt;  &lt;span class="n"&gt;bin&lt;/span&gt;           &lt;span class="c1"&gt;# /usr/bin: Berisi executable program&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;    
 &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|--&lt;/span&gt;  &lt;span class="n"&gt;lib&lt;/span&gt;           &lt;span class="c1"&gt;# /usr/lib: Berisi library program&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|--&lt;/span&gt;  &lt;span class="n"&gt;share&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|&lt;/span&gt;    
 &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|--&lt;/span&gt;  &lt;span class="n"&gt;local&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;                 &lt;span class="o"&gt;/&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt; 
 &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|--&lt;/span&gt; &lt;span class="n"&gt;bin&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|--&lt;/span&gt; &lt;span class="n"&gt;lib&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|&lt;/span&gt; 
 &lt;span class="o"&gt;|&lt;/span&gt;                  &lt;span class="o"&gt;|--&lt;/span&gt; &lt;span class="n"&gt;share&lt;/span&gt;
 &lt;span class="o"&gt;|--&lt;/span&gt; &lt;span class="n"&gt;dev&lt;/span&gt;                            &lt;span class="c1"&gt;# /dev: Berisi device node&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;/&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;       &lt;span class="o"&gt;|--&lt;/span&gt;  &lt;span class="n"&gt;disk&lt;/span&gt;
 &lt;span class="o"&gt;|&lt;/span&gt;
 &lt;span class="o"&gt;|--&lt;/span&gt; &lt;span class="k"&gt;var&lt;/span&gt;
        &lt;span class="o"&gt;/&lt;/span&gt;
         &lt;span class="o"&gt;|&lt;/span&gt;
         &lt;span class="o"&gt;|--&lt;/span&gt; &lt;span class="n"&gt;lib&lt;/span&gt;
         &lt;span class="o"&gt;|&lt;/span&gt;   
         &lt;span class="o"&gt;|--&lt;/span&gt; &lt;span class="nb"&gt;log&lt;/span&gt;
         &lt;span class="o"&gt;|&lt;/span&gt;   
         &lt;span class="o"&gt;|--&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Seperti terlihat, struktur direktori seperti percabangan pohon. Paling atas disebut root, karakter / dan diikuti cabangnya, misal /usr/local/share.&lt;/p&gt;
&lt;p&gt;Kalau di Windows, biasanya program yang terinstall ada di direktori C:\Program Files. Di Linux berbeda, program yang terinstall filenya tersebar di beberapa direktori.&lt;br /&gt;
Misalnya program Vlc player, program executablenya di /usr/bin/vlc. Library-nya terinstall di /usr/lib/vlc, dokumentasi di /usr/share/vlc.&lt;br /&gt;
Kelebihannya dari Windows, kalau ada beberapa program membutuhkan library yang sama, atau istilahnya shared library, cukup memakai library yang sudah ada di direktori /lib, /usr/lib, atau /usr/local/lib. Satu libarary dipakai bersama-sama, dan hasilnya ukuran program jadi kecil.&lt;/p&gt;
&lt;p&gt;Struktur direktori Linux mengikuti standar FHS (Filesystem Hierarchy Standard) &lt;a href="https://en.wikipedia.org/wiki/Filesystem_Hierarchy_Standard"&gt;Wikipedia&lt;/a&gt;, silahkan dipelajari.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Absolute dan relative path&lt;/strong&gt;&lt;br /&gt;
Absolute path adalah path yang dimulai dari / (root), misalnya /etc/passwd.&lt;br /&gt;
Relative path, path yang dimulai dari current directory atau working directory. Current directory bisa diketahui dengan command pwd.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;Dengan&lt;/span&gt; &lt;span class="k"&gt;absolute&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;
&lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;passwd&lt;/span&gt;

&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;Dengan&lt;/span&gt; &lt;span class="k"&gt;relative&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;           &lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pindah&lt;/span&gt; &lt;span class="n"&gt;working&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt; &lt;span class="n"&gt;ke&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;
&lt;span class="err"&gt;$&lt;/span&gt; &lt;span class="n"&gt;cat&lt;/span&gt; &lt;span class="n"&gt;passwd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Command cat yang ke dua tidak perlu /etc karena working directory adalah /etc.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Navigasi&lt;/strong&gt;&lt;br /&gt;
Ada beberapa karakter spesial untuk navigasi direktori.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.  (dot): current directory.&lt;/li&gt;
&lt;li&gt;.. (double dot): naik satu direktori.&lt;/li&gt;
&lt;li&gt;~  (tilde): home directory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Contoh:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ &lt;span class="nb"&gt;cd&lt;/span&gt; /usr/local/share       &lt;span class="c1"&gt;# Pindah ke direktori /usr/local/share&lt;/span&gt;
$ &lt;span class="nb"&gt;cd&lt;/span&gt; .                      &lt;span class="c1"&gt;# Tetap di tempat.&lt;/span&gt;
$ &lt;span class="nb"&gt;pwd&lt;/span&gt;                       &lt;span class="c1"&gt;# Print working directory&lt;/span&gt;
/usr/local/share
$ &lt;span class="nb"&gt;cd&lt;/span&gt; ..                     &lt;span class="c1"&gt;# Naik satu direktori&lt;/span&gt;
$ &lt;span class="nb"&gt;pwd&lt;/span&gt;
/usr/local
$ &lt;span class="nb"&gt;cd&lt;/span&gt; ..
$ &lt;span class="nb"&gt;pwd&lt;/span&gt;
/usr
$ &lt;span class="nb"&gt;cd&lt;/span&gt; ~                      &lt;span class="c1"&gt;# Pindah ke home directory&lt;/span&gt;
$ &lt;span class="nb"&gt;pwd&lt;/span&gt;
/home/administrator
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;Setelah paham hal di atas, maka nantinya tidak akan bingung kalau ketemu command yang ada karakter aneh seperti |, &amp;gt;, .., ~, dan seterusnya.&lt;/p&gt;
&lt;p&gt;Di tulisan selanjutnya kita akan mulai bahas program-program dari Coreutils.&lt;/p&gt;
&lt;p&gt;Terima kasih.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;[EDIT]&lt;br /&gt;
Artikel selanjutnya: &lt;a href="//devnull.web.id/linux-padawan/linux-dasar-2.html"&gt;Belajar Linux Dasar - Manajemen file&lt;/a&gt;&lt;/p&gt;</content><category term="Linux Padawan"></category><category term="Linux"></category></entry><entry><title>Belajar Jaringan Komputer Dasar - Layer OSI 1, 2, dan 3</title><link href="//devnull.web.id/networking/jaringan-komputer-dasar.html" rel="alternate"></link><published>2016-04-15T23:45:00+08:00</published><updated>2016-04-15T23:45:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-04-15:/networking/jaringan-komputer-dasar.html</id><summary type="html">&lt;div class="fimg"&gt;
  &lt;img src="/images/jaringan-dasar.png" alt="Jaringan" title="Jaringan" /&gt;
  &lt;p&gt;Photo credit: www.freedigitalphotos.net&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Pernah satu waktu saya ke toko komputer buat beli switch, tapi sama penjualnya disodorkan hub. Saya bilang switch bukan hub, penjualnya bilang sama saja karena bentuknya sama.&lt;br /&gt;
Tentu saja saya maklum karena memang penjaga toko komputer tidak belajar jaringan, jadi tidak paham kalau hub itu …&lt;/p&gt;</summary><content type="html">&lt;div class="fimg"&gt;
  &lt;img src="/images/jaringan-dasar.png" alt="Jaringan" title="Jaringan" /&gt;
  &lt;p&gt;Photo credit: www.freedigitalphotos.net&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;Pernah satu waktu saya ke toko komputer buat beli switch, tapi sama penjualnya disodorkan hub. Saya bilang switch bukan hub, penjualnya bilang sama saja karena bentuknya sama.&lt;br /&gt;
Tentu saja saya maklum karena memang penjaga toko komputer tidak belajar jaringan, jadi tidak paham kalau hub itu perangkat jaringan layer 1 dan switch perangkat layer 2. Tapi, Saya juga pernah menemui beberapa orang yang belajar jaringan komputer tapi kurang memahami dasar jaringan.&lt;/p&gt;
&lt;p&gt;Buat mereka yang mau jadi praktisi jaringan atau bahasa kerennya network engineer tentu saja harus paham dasar jaringan. Bagaimana perangkat-perangkat jaringan itu dihubungkan, bagaimana cara kerjanya, dan seterusnya.&lt;/p&gt;
&lt;p&gt;Kalau belajar jaringan komputer, yang paling pertama harus dipahami adalah OSI Model. OSI (Open Systems Interconnections) model adalah pembagian segmen-segmen jaringan, ada 7 lapis atau layer dalam satu jaringan menurut OSI.&lt;br /&gt;
Jadi kalau diumpamakan jaringan itu seperti institusi, ada departemen-departemen tertentu yang tugasnya beda-beda tapi saling berhubungan. Begitu juga jaringan, layer-layer itu tugasnya juga beda-beda.&lt;/p&gt;
&lt;p&gt;Saya waktu pertama kali mempelajari jaringan, konsep 7 layer ini buat saya waktu itu terasa asing. Saya menghabiskan berhari-hari untuk membaca tentang ini, dan akhirnya tidak bisa paham juga. Akhirnya, ada titik terang waktu Saya langsung berpraktek membuat jaringan dan dari sini konsep layer jaringan mulai Saya pahami.&lt;/p&gt;
&lt;p&gt;Seperti disebutkan, OSI membagi jaringan kedalam 7 lapisan atau 7 layer. Dan karena konteks tulisan ini jaringan komputer, maka kita akan batasi saja dari layer 1 sampai layer 3. Layer 4 sampai 7 tidak akan dibahas karena tidak begitu berkaitan dengan jaringan.&lt;/p&gt;
&lt;h3 id="pengenalan-layer-osi-1-2-dan-3"&gt;Pengenalan layer OSI 1, 2, dan 3&lt;/h3&gt;
&lt;p&gt;Pada tulisan ini, saya akan coba jelaskan masing-masing layer dari layer 1 sampai layer 3 termasuk fungsi serta contoh protokol yang berjalan di masing-masing layer.&lt;br /&gt;
Masing-masing layer OSI mempunyai nama:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Layer 1 : Physical layer atau lapisan fisik jaringan.&lt;/li&gt;
&lt;li&gt;Layer 2 : Data link layer atau lapisan link jaringan.&lt;/li&gt;
&lt;li&gt;Layer 3 : Network layer.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Untuk memberi gambaran apa dan bagaimana layer-layer itu, saya analogikan layer-layer di atas ke proses pengiriman paket barang. 
Misalnya, saya mau kirim paket dari kota Balikpapan ke Papua. Proses bagaimana cara supaya paket tersebut bisa sampai itu sama seperti proses routing di jaringan komputer. Saya bisa pakai jasa kurir, kemudian paket Saya itu dibawa ke bandara pakai mobil, kemudian diterbangkan yang mungkin saja ada transit di kota Makassar, dan seterusnya sampai akhirnya paket tersebut diterima di Papua.&lt;/p&gt;
&lt;p&gt;Dari analogi diatas, saya umpamakan layer 1 adalah jalan. Jalan ini bentuknya bisa darat, laut atau udara.&lt;br /&gt;
Layer 2 adalah kendaraan. Kendaraan bisa mobil, pesawat, sepeda motor, atau kapal.&lt;br /&gt;
Sedangkan layer 3 adalah jasa kurir paket itu. Dan dalam jaringan, paket yang dikirim itu disebut payload.&lt;/p&gt;
&lt;p&gt;Kembali ke OSI, layer 1 itu dinamakan layer fisik, atau bagaimana jaringan bisa terhubung secara fisik. Fisik jaringan bisa berupa kabel tembaga, seperti kabel telepon atau kabel UTP, bisa juga pakai wireless tanpa kabel, atau bisa juga dengan kabel fiber optic yang menggunakan cahaya.&lt;/p&gt;
&lt;p&gt;Layer 2, atau layer data link adalah bagaimana jaringan terhubung melalui data link. Di layer ini ada perangkat-perangkat yang terhubung secara link, perangkat layer 2 contohnya switch dan bridge. Perangkat di layer 2 ini masing-masing punya identitas yang disebut MAC address.&lt;/p&gt;
&lt;p&gt;Layer 3, atau layer network. Perangkat-perangkat jaringan yang termasuk di layer ini seperti router, PC, laptop, server, smartphone dan sebagainya. Perangkat di layer ini masing-masing juga punya identitas yang unik yang namanya IP address atau alamat IP.&lt;/p&gt;
&lt;p&gt;Coba kita lihat gambar di bawah&lt;/p&gt;
&lt;div class="aimg"&gt;
&lt;img src="/images/network1.png" title="Jaringan" alt="jaringan" /&gt;
&lt;/div&gt;

&lt;p&gt;Gambar di atas itu cuma satu jaringan sederhana, bagaimana HOST A bisa berkomunikasi dengan HOST B.&lt;br /&gt;
HOST A, HOST B, dan ROUTER X adalah perangkat layer 3. Sedangkan SWITCH 1 dan SWITCH 2 ada di layer 2. Masing-masing garis berwarna merepresentasikan layer. Layer 1 dengan garis hitam, layer 2 dengan garis merah dan layer 3 dengan garis biru. Seperti terlihat, biarpun jaringan di gambar satu tapi kalau dilihat dari masing-masing layer ternyata ada banyak jaringan. 
Ada empat jaringan layer 1, dua jaringan layer 2 dan satu jaringan layer 3.&lt;/p&gt;
&lt;p&gt;Empat jaringan layer 1 tersebut adalah:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;HOST A ke SWITCH 1&lt;/li&gt;
&lt;li&gt;SWITCH 1 ke ROUTER X&lt;/li&gt;
&lt;li&gt;ROUTER X ke SWITCH 2&lt;/li&gt;
&lt;li&gt;SWITCH 2 ke HOST B&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Dua jaringan layer 2:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;HOST A ke SWITCH 1 ke ROUTER X&lt;/li&gt;
&lt;li&gt;ROUTER X ke SWITCH 2 ke HOST B&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Satu jaringan layer 3:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;HOST A ke ROUTER X ke HOST B&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Penting untuk diingat, setiap perangkat di layer tertentu harus mempunyai jaringan layer dibawahnya tapi tidak sebaliknya. Misalnya, perangkat layer 3 harus punya jaringan layer 2 dan jaringan layer 1, tapi perangkat layer 2 tidak harus punya jaringan layer 3.&lt;br /&gt;
Ingat lagi analogi pengiriman paket di atas, kendaraan yang ada di layer dua harus punya jaringan layer 1 atau ada jalannya tapi tidak sebaliknya. Kurir butuh kendaraan, dan kendaraan perlu jalan. Tapi sebaliknya tidak, jalanan tidak perlu ada mobilnya, dan mobil tidak butuh kurir.&lt;/p&gt;
&lt;p&gt;Kemudian setiap jaringan cuma aware jaringan yang berada satu layer dan tidak peduli jaringan dibawahnya. Dalam contoh gambar, HOST A, HOST B dan ROUTER X yang ada di layer 3 tidak akan melihat jaringan layer 2 dan layer 1. Jadi biarpun SWITCH 1 dan SWITCH 2 di layer 2 diganti dengan perangkat bridge, perangkat layer 3 tidak akan tahu atau mempermasalahkannya.&lt;br /&gt;
Begitu juga layer 2, tidak akan mempermasalahkan media transmisi di layer 1, apakah itu terhubung lewat kabel optik, kabel tembaga atau wireless.&lt;/p&gt;
&lt;p&gt;Di masing-masing layer jaringan, ada beberapa protokol yang bisa berjalan di layer tersebut, dan dalam artikel ini kita akan pakai contoh yang umum dipakai. Kita hanya akan ambil contoh di layer 2 dan 3, sedangkan layer 1 atau layer fisik tidak karena layer 1 tidak ada protokol jaringan, layer 1 itu fisika sekali.&lt;br /&gt;
Di layer 2, protokol yang umum dipakai di jaringan sekarang adalah protokol Ethernet sedangkan di layer 3 yang umum adalah protokol IP. Nanti kita bahas protokol-protokol ini.&lt;/p&gt;
&lt;p&gt;Sedikit tentang IP (Internet Protocol), ketika disebut IP maka kebanyakan dari kita berpikir ip address semisal 192.168.1.1. Ini kesalahan yang membingungkan, yang dimaksud dengan IP adalah protokol Internet, sedangkan 192.168.1.1 disebut alamat IP atau IP address, hanya saja kebanyakan orang menyebutnya dengan IP saja dan menyebabkan kebingungan buat yang tidak paham.&lt;br /&gt;
Kalau misalnya IP adalah perumahan, maka alamat IP adalah alamat rumah, sesuatu yang berbeda. Dan supaya tidak tambah bingung, di artikel ini dibedakan antara IP dan IP address.&lt;/p&gt;
&lt;h3 id="protokol-ethernet-dan-protokol-ip"&gt;Protokol Ethernet dan Protokol IP&lt;/h3&gt;
&lt;p&gt;Kita bahas dari layer 1 dulu. Di layer 1 atau layer fisik, media transmisi jaringan bisa berupa kabel entah itu kabel tembaga atau kabel fiber optic, atau bisa juga wireless.&lt;/p&gt;
&lt;p&gt;Cara kerjanya, kalau kita ingat atau pernah belajar sandi Morse, kurang lebih seperti itu. Jadi data atau dalam Morse berupa huruf dikodekan ke dalam signal-signal. Di kabel tembaga, signal ini dikodekan ke dalam aliran listrik. Di kabel optik, data atau paket atau payload itu akan dikodekan dengan signal menggunakan gelombang cahaya. Sedangkan di wireless, signal dikodekan menggunakan gelombang elektromagnetik yang ada di rentang frekuensi radio, yang umum ada di frekuensi radio 2,4 GHz dan 5,8 GHz.&lt;br /&gt;
Kemudian perangkat layer 1 yang menerima signal-signal kode tersebut akan menerjemahkan kode yang diterima untuk kemudian diteruskan ke layer diatasnya yaitu layer 2.&lt;/p&gt;
&lt;p&gt;Di layer 2, ada protokol Ethernet. Di protokol ini, paket Ethernet mempunyai alamat asal dan alamat tujuan. Alamat tersebut disebut alamat MAC (Media Access Control) atau MAC Address. Format alamat MAC adalah 48 bit bilangan heksadesimal. Contohnya 80:c1:6e:59:2e:43, ini alamat MAC laptop Saya. Seperti dijelaskan sebelumnya, setiap perangkat layer 2 punya MAC Address yang unik.&lt;/p&gt;
&lt;p&gt;Ambil contoh dalam perangkat switch dengan 8 buah port, alamat-alamat MAC yang bertetangga dengan switch tersebut dan yang berada dalam satu jaringan layer 2 disimpan di tabel yang disebut FDB (forwarding database) dan dari database ini bisa diketahui alamat MAC A terhubung di port 1 misalnya. Jadi waktu ada paket datang ke switch itu, dan tujuan alamat MAC A maka paket tersebut akan dikirimkan melalui port 1, bukan port yang lain.&lt;/p&gt;
&lt;p&gt;Di layer 3, ada protokol IP. Ini adalah protokol yang kita gunakan saat ini untuk berkomunikasi dengan jaringan seluruh dunia. Di protokol IP, juga ada alamat asal dan tujuan yang disebut alamat IP, 192.168.1.1 contohnya.&lt;br /&gt;
Misalnya untuk mengakses Youtube yang ada di server Google, paket yang kita kirimkan akan melewati banyak perangkat layer 3 berupa router. Router-router ini tidak melihat alamat asal, hanya alamat IP tujuan yang dilihat. Paket yang kita kirim ke Google terlebih dulu akan dikirim ke router Telkom kalau berlangganan Telkom. Kemudian dari Telkom dikirim lagi ke router Telin, begitu seterusnya sampai diterima di alamat IP tujuan terakhir yaitu server Google.&lt;/p&gt;
&lt;p&gt;Kemudian yang perlu diingat juga, paket Ethernet hanya bisa berada di layer 2. Karena itu paket Ethernet tidak bisa melewati sebuah router karena router itu perangkat layer 3.&lt;/p&gt;
&lt;p&gt;Perhatikan gambar dibawah:&lt;/p&gt;
&lt;div class="aimg"&gt;
&lt;img src="/images/ethernet-network.png" alt="ethernet network" title="ethernet network" /&gt;
&lt;/div&gt;

&lt;p&gt;Gambar di atas itu adalah gambar jaringan Ethernet di layer 2. Dengan jaringan seperti itu, BRIDGE 1 bisa berkomunikasi dengan BRIDGE 2 lewat protokol Ethernet.&lt;/p&gt;
&lt;p&gt;Sekarang, bagaimana kalau di jaringan itu ditempatkan router di tengahnya.&lt;/p&gt;
&lt;div class="aimg"&gt;
&lt;img src="/images/ip-network.png" title="ip network" alt="ip network" /&gt;
&lt;/div&gt;

&lt;p&gt;Dengan adanya router, karena router itu perangkat layer 3, maka jaringan Ethernet terputus dan terbagi jadi dua jaringan Ethernet. Kalau seperti ini, BRIDGE 1 tidak lagi bisa berkomunikasi dengan BRIDGE 2 karena sudah beda jaringan.&lt;/p&gt;
&lt;p&gt;Sampai di sini mungkin timbul pertanyaan, kenapa harus ada jaringan Ethernet dan jaringan IP? bukankah cara kerja dua jaringan itu hampir sama? dan kenapa kita tidak pakai salah satu jaringan saja?&lt;br /&gt;
Baik, kita akan coba bahas itu.&lt;/p&gt;
&lt;p&gt;Perbedaan jaringan Ethernet dan jaringan IP, jaringan Ethernet lebih simple dibanding IP. Karena simple-nya itu dan karena Ethernet ada di layer 2, jaringan Ethernet lebih cepat dibanding jaringan IP di layer 3.&lt;br /&gt;
Tapi, juga karena simple-nya Ethernet itu, jaringan jadi susah diatur dibandingkan IP. Mengatur jalur rute paket Ethernet lebih sulit, mengatur keamanan jaringan Ethernet juga lebih sulit dibanding jaringan IP. Intinya, jaringan Ethernet itu rawan error dan mencari sumber masalah di jaringan Ethernet jauh lebih sulit dari jaringan IP.&lt;/p&gt;
&lt;p&gt;Saya pernah menangani jaringan wireless, hanya sekitar 20 perangkat jaringan yang terkoneksi lewat jaringan Ethernet. Waktu itu salah satu perangkat radio bermasalah dan menyebabkan broadcast storm, satu jaringan itu jadi down karena ini. Mencari sumber masalahnya pun perlu waktu lama.&lt;br /&gt;
Bisa dibayangkan, dari sekitar 20 perangkat yang saling terhubung, satu saja yang bermasalah dan satu jaringan bisa mati karena itu. Bagaimana kalau ada ratusan bahkan ribuan perangkat yang terkoneksi lewat jaringan Ethernet?&lt;/p&gt;
&lt;p&gt;Di sisi lain, jaringan IP memang sedikit lebih lambat dibanding Ethernet tapi menawarkan fitur yang tidak ada di Ethernet. Dari segi manajemen, monitoring, dan troubleshooting, jaringan IP lebih mudah. Karena itu, saat ini protokol Internet yang kita pakai dan dipakai di seluruh dunia pakai protokol IP karena IP lebih cocok untuk jaringan yang besar.&lt;/p&gt;
&lt;p&gt;Lalu apakah jaringan IP bebas masalah? jawabannya tidak. Kalau Anda pernah ingat di bulan November tahun 2012, layanan Google sempat tidak bisa diakses oleh sebagian besar pengguna Internet di dunia selama kurang lebih setengah jam. Dan setelah ditelusuri, penyebabnya karena kesalahan konfigurasi router dari ISP Moratelindo di Indonesia, baca beritanya &lt;a href="http://arstechnica.com/information-technology/2012/11/how-an-indonesian-isp-took-down-the-mighty-google-for-30-minutes/" target="_blank"&gt;di sini&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Sebenarnya, dengan memakai protokol IP maka secara otomatis jaringan juga memakai jaringan Ethernet. Hanya saja, jaringan Ethernet tersebut dipotong-potong menjadi jaringan kecil dan banyak sehingga gampang diatur. Setiap layer tertentu memerlukan layer di bawahnya, ingat?&lt;br /&gt;
Lihat kembali gambar terakhir dimana kita tempatkan router di tengah-tengah jaringan Ethernet, dan jaringan Ethernet itu terbagi jadi dua. Dengan begitu, ketika ada problem di jaringan Ethernet yang satu, maka jaringan Ethernet yang kedua tidak terpengaruh.&lt;/p&gt;
&lt;h3 id="proses-routing-paket-ip"&gt;Proses Routing paket IP&lt;/h3&gt;
&lt;p&gt;Mari sekali lagi lihat gambar jaringan IP yang pertama. Misal HOST A mau kirim data ke HOST B, maka prosesnya seperti di bawah:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HOST A&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;em&gt;Encapsulation&lt;/em&gt;. Pertama, data yang akan dikirim terlebih dulu harus dibungkus ke paket yang disebut paket IP. Proses ini namanya encapsulation.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Routing table lookup&lt;/em&gt;. Setelah jadi paket IP, dicari tahu bagaimana caranya paket IP tersebut bisa sampai ke HOST B, atau mencari jalur rute yang harus dilewati, proses ini disebut routing table lookup. Dari proses ini bisa diketahui bahwa untuk mengirim paket ke HOST B, terlebih dulu paket IP harus dikirim ke ROUTER X.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Address resolution&lt;/em&gt;. Setelah diketahui bahwa paket harus dikirim ke ROUTER X, tugas selanjutnya mencari tahu alamat MAC ROUTER X. Proses ini disebut Address Resolution,  Protokolnya disebut ARP (Address Resolution Protocol). Proses address resolution berjalan di layer 2.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Encapsulation&lt;/em&gt;. Paket IP yang akan dikirim ke alamat MAC ROUTER X itu dibungkus lagi kedalam paket Ethernet. Berbeda dengan encapsulation yang pertama yang membungkus data ke paket IP, encapsulation yang kedua membungkus paket IP ke paket Ethernet dan ditujukan ke alamat MAC ROUTER X.&lt;/li&gt;
&lt;li&gt;Setelah diketahui alamat MAC ROUTER X, selanjutnya dicari tahu bagaimana cara mengirim paket Ethernet ke alamat MAC ROUTER X. Dari sini diketahui kalau mau kirim paket Ethernet ke ROUTER X, paket Ethernet itu harus dikirim melalui kabel.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Data Transmission&lt;/em&gt;. Ini adalah proses pengiriman data dan proses ini ada di layer 1. Paket akan dikodekan ke signal-signal listrik melalui kabel yang terhubung ke SWITCH 1.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;SWITCH 1&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Di layer 1, signal diterima dan diterjemahkan ke paket Ethernet untuk kemudian diteruskan ke layer diatasnya, yaitu layer 2.&lt;/li&gt;
&lt;li&gt;Di layer 2, protokol Ethernet akan melihat kemana alamat tujuan paket Ethernet itu. Karena alamat tujuan adalah MAC address ROUTER X, maka paket dikembalikan ke layer 1 untuk dikirim ke ROUTER X.&lt;/li&gt;
&lt;li&gt;Di layer 1, paket dikirim dengan signal listrik lewat kabel yang terhubung ke ROUTER X.&lt;/li&gt;
&lt;li&gt;Langkah-langkah dari 1 sampai 3 disebut switching.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;ROUTER X&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Di layer 1, signal diterima, diterjemahkan ke paket Ethernet dan diteruskan ke layer 2.&lt;/li&gt;
&lt;li&gt;Di layer 2, paket Ethernet diperiksa tujuannya. Karena alamat MAC tujuan untuk ROUTER X sendiri, maka paket Ethernet tidak diteruskan tapi dibuka. Setelah dibuka, dan karena isinya adalah paket IP, maka paket IP ini kemudian diteruskan ke layer 3.&lt;/li&gt;
&lt;li&gt;Di layer 3, paket IP akan dilihat alamat IP tujuannya dan ternyata tujuan paket IP itu bukan ke ROUTER X, tapi ke HOST B.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Routing table lookup&lt;/em&gt;, mencari rute ke HOST B.&lt;/li&gt;
&lt;li&gt;Di layer 2, &lt;em&gt;address resolution&lt;/em&gt;, mencari alamat MAC HOST B.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Encapsulation&lt;/em&gt;. Paket ip kembali dibungkus ke paket ethernet, ditujukan ke alamat MAC HOST B.&lt;/li&gt;
&lt;li&gt;Di layer 1, &lt;em&gt;Transmit&lt;/em&gt;. Data dikirim dengan signal-signal lewat kabel yang terhubung ke SWITCH 2.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;SWITCH 2&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Layer 1, menerima signal dan menerjemahkan signal ke paket Ethernet, dan meneruskannya ke layer 2.&lt;/li&gt;
&lt;li&gt;Di layer 2, paket Ethernet dilihat kemana tujuannya. Tujuan paket ke HOST B, maka dikembalikan ke layer 1.&lt;/li&gt;
&lt;li&gt;Di layer 1, paket di-transmit atau dikirim ke HOST B dengan signal lewat kabel.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;HOST B&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Layer 1 di HOST B menerima signal, menerjemahkan kode signal tersebut ke paket Ethernet dan meneruskan paket tersebut ke layer 2.&lt;/li&gt;
&lt;li&gt;Di layer 2, protokol Ethernet melihat kemana tujuan paket itu.&lt;/li&gt;
&lt;li&gt;Karena alamat MAC tujuan adalah HOST B sendiri maka paket Ethernet dibuka dan kembali menjadi paket IP. Paket IP ini diteruskan ke layer 3.&lt;/li&gt;
&lt;li&gt;Di layer 3, protokol IP melihat alamat IP tujuan. Karena alamat IP tujuan adalah HOST B sendiri, maka paket dibuka dan diteruskan ke layer di atasnya yaitu layer 4.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Sampai sini paket IP sudah diterima di HOST B, tinggal diproses di layer diatasnya. Tapi karena tulisan ini hanya membatasi sampai layer 3, maka layer diatasnya itu tidak dibahas. Kalau Anda tertarik dengan layer 4, silahkan cari tahu tentang protokol TCP dan protokol UDP.&lt;/p&gt;
&lt;p&gt;Begitulah kira-kira proses routing, bagaimana paket IP yang berasal dari HOST A bisa sampai ke HOST B. Proses yang panjang sebenarnya, tapi ternyata semua proses itu memakan waktu hanya sekian mili detik.&lt;/p&gt;
&lt;p&gt;Saya harap tulisan ini bisa memberikan pengetahuan dasar bagaimana jaringan komputer itu dibangun. Dan setelah memahami konsep dasar ini, maka pembelajaran jaringan berikutnya seperti switching, bridging, atau routing bisa lebih mudah dimengerti.&lt;/p&gt;
&lt;p&gt;Dan terakhir kalau artikel ini dirasa berguna, silahkan di-share ke mereka yang sedang belajar dasar jaringan.  &lt;/p&gt;
&lt;p&gt;Terima kasih dan selamat belajar jaringan.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Artikel Berkaitan:&lt;/strong&gt;&lt;br /&gt;
&lt;a href="//devnull.web.id/networking/jaringan-layer-3.html"&gt;Materi lanjutan. Jaringan Layer 3, IP routing &lt;/a&gt;&lt;br /&gt;
&lt;em&gt;Apa yang terjadi di layer 3? IP routing, routing protocol, dan sedikit dynamic routing protocol&lt;/em&gt;&lt;/p&gt;</content><category term="Networking"></category></entry><entry><title>Reset Mikrobits Aneto tanpa serial console</title><link href="//devnull.web.id/how-to/reset-mikrobits-tanpa-console.html" rel="alternate"></link><published>2016-04-04T22:12:00+08:00</published><updated>2016-04-04T22:12:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-04-04:/how-to/reset-mikrobits-tanpa-console.html</id><summary type="html">&lt;p&gt;System error tidak bisa diakses, tombol reset tidak berfungsi, kabel console pun tidak ada, kombinasi yang pas sekali. Lalu apa yang bisa dilakukan untuk memperbaiki router Mikrobits dengan kondisi seperti ini? Tidak banyak tapi ada, dengan Linux masih ada yang bisa dilakukan.&lt;/p&gt;
&lt;p&gt;Itu yang kami alami beberapa waktu lalu. Router …&lt;/p&gt;</summary><content type="html">&lt;p&gt;System error tidak bisa diakses, tombol reset tidak berfungsi, kabel console pun tidak ada, kombinasi yang pas sekali. Lalu apa yang bisa dilakukan untuk memperbaiki router Mikrobits dengan kondisi seperti ini? Tidak banyak tapi ada, dengan Linux masih ada yang bisa dilakukan.&lt;/p&gt;
&lt;p&gt;Itu yang kami alami beberapa waktu lalu. Router Mikrobits Aneto milik salah satu pelanggan kami yang error. Parahnya, kabel console untuk router tersebut hilang. Lebih parahnya lagi, kabel console router lain seperti kabel serial console Cisco tidak bisa dipakai untuk Mikrobits tersebut.&lt;/p&gt;
&lt;p&gt;Pada kondisi seperti ini, router sama sekali tidak bisa diakses. Telnet, ssh, winbox, mac-telnet, layer 2 ataupun layer 3 tidak ada yang bisa. Karena itu, saya tidak diberi banyak pilihan kecuali melakukan reset dengan cara yang tidak biasa.&lt;/p&gt;
&lt;h3 id="tentang-mikrobits-aneto"&gt;Tentang Mikrobits Aneto&lt;/h3&gt;
&lt;p&gt;Mikrobits, jenis apapun adalah hardware router x86, dan tidak di desain oleh MikroTik, hanya saja menggunakan sistem operasi MikroTik RouterOS. Mikrobits jenis Aneto mempunyai 10 port, 2 port sfp dan 8 port Gigabit Ethernet. Router ini juga memiliki port serial console rj45. Lucunya, pinout untuk serial tidak umum, artinya kabel serial console seperti milik Cisco atau HP tidak bisa dipakai untuk router ini. Disk yang dipakai router ini menggunakan complact flash, dan tidak ada hard disk sata yang terpasang.&lt;/p&gt;
&lt;p&gt;Mikrobits Aneto mempunyai tombol yang kemungkinan tombol reset, tidak ada tulisan atau keterangan reset. Waktu dicoba reset dengan tombol ini, yang jadi bukannya reset tapi reboot. saya juga sudah pindah jumper untuk tombol tersebut, tapi waktu ditekan malah jadinya shutdown. Karena console yang tidak umum dan tombol reset yang tidak berfungsi, router ini adalah router teraneh yang pernah Saya temui. Satu-satunya yang memudahkan adalah cpu architecture hardware ini yang x86.&lt;/p&gt;
&lt;p&gt;Dengan kondisi seperti ini, cara paling mudah dengan memakai cf adapter, adapter untuk compact flash dengan interface SATA atau IDE.&lt;br /&gt;
Dengan adapter ini disk compact flash Mikrobits bisa dijalankan di pc dan kemudian di reset melalui pc tersebut. Tapi kalau tidak ada cf adapter, atau tidak mau beli, maka cara resetnya sedikit lebih panjang.&lt;/p&gt;
&lt;h3 id="metode-reset"&gt;Metode reset&lt;/h3&gt;
&lt;p&gt;Cara untuk reset kalau dibuat ringakasan seperti ini.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Menjalankan sistem operasi Linux di hardware Mikrobits, kemudian login ke router lewat ssh.&lt;/li&gt;
&lt;li&gt;Dari Linux di Mikrobits drive compact flash dibuat disk image. &lt;/li&gt;
&lt;li&gt;Image tersebut kemudian dicopy ke PC / laptop dengan OS Linux.&lt;/li&gt;
&lt;li&gt;Image dijalankan secara virtual dengan Qemu, kemudian di reset.&lt;/li&gt;
&lt;li&gt;Setelah image di reset kemudian image dicopy kembali ke Mikrobits.&lt;/li&gt;
&lt;li&gt;Image di flash kembali ke disk compact flash Mikrobits, dan&lt;/li&gt;
&lt;li&gt;selesai.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="perlengkapan"&gt;Perlengkapan&lt;/h3&gt;
&lt;p&gt;Beberapa perlengkapan perlu disiapkan.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;PC Desktop.&lt;/li&gt;
&lt;li&gt;Hard disk sata.&lt;/li&gt;
&lt;li&gt;Kabel sata.&lt;/li&gt;
&lt;li&gt;Kabel UTP.&lt;/li&gt;
&lt;li&gt;Image Linux live dan&lt;/li&gt;
&lt;li&gt;Laptop atau PC dengan os Linux.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Untuk image live Linux saya menggunakan &lt;a href="http://vyos.net/" target="_blank"&gt;VyOS&lt;/a&gt;, ini os untuk router kelas enterprise, sedangkan laptop Saya pakai OS Debian.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;STOP!&lt;/strong&gt;, sebelum melanjutkan saya minta baca terlebih dahulu paragraf paling akhir.&lt;/p&gt;
&lt;h3 id="langkah-langkah-reset"&gt;Langkah-langkah reset&lt;/h3&gt;
&lt;p&gt;Saya anggap live OS memakai VyOS. Download image VyOS kalau belum ada di &lt;a href="http://vyos.uv.es/iso/release/1.1.7/" target="_blank"&gt;http://vyos.uv.es/iso/release/1.1.7/&lt;/a&gt; gunakan yang 32 bit saja dengan kode arch i586. Setelah download image iso bisa di burn ke cd, atau dibuat live di flash disk.&lt;/p&gt;
&lt;p&gt;Langkah selanjutnya, jalankan VyOS di pc kemudian install ke hard disk. Setelah VyOS up dan running, install VyOS ke hard disk dengan perintah dibawah:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;install image&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Ikuti panduan instalasi VyOS sampai selesai, setelah itu reboot pc dan boot dengan VyOS yang sudah terinstall di hard disk. Setelah VyOS running, hidupkan service ssh dengan command dibawah:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ configure
&lt;span class="c1"&gt;# set service ssh&lt;/span&gt;
&lt;span class="c1"&gt;# commit&lt;/span&gt;
&lt;span class="c1"&gt;# save&lt;/span&gt;
&lt;span class="c1"&gt;# exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;TAnda dollar ($) adalah mode user, sedangkan tanda pagar (#) adalah mode konfigurasi.&lt;/p&gt;
&lt;p&gt;Selanjutnya, kita akan lakukan brute force set ip address untuk 10 port Mikrobits melalui script yang ada di file /config/scripts/vyatta-postconfig-bootup.script. Kita gunakan network 10.11.12.0/28 untuk ip addressnya.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;sudo cat &amp;gt;&amp;gt; /config/scripts/vyatta-postconfig-bootup.script &amp;lt;&amp;lt; EOF&lt;/span&gt;
&lt;span class="err"&gt;/sbin/ip addr add 10.11.12.1/28 dev eth0&lt;/span&gt;
&lt;span class="err"&gt;/sbin/ip addr add 10.11.12.2/28 dev eth1&lt;/span&gt;
&lt;span class="err"&gt;/sbin/ip addr add 10.11.12.3/28 dev eth2&lt;/span&gt;
&lt;span class="err"&gt;/sbin/ip addr add 10.11.12.4/28 dev eth3&lt;/span&gt;
&lt;span class="err"&gt;/sbin/ip addr add 10.11.12.5/28 dev eth4&lt;/span&gt;
&lt;span class="err"&gt;/sbin/ip addr add 10.11.12.6/28 dev eth5&lt;/span&gt;
&lt;span class="err"&gt;/sbin/ip addr add 10.11.12.7/28 dev eth6&lt;/span&gt;
&lt;span class="err"&gt;/sbin/ip addr add 10.11.12.8/28 dev eth7&lt;/span&gt;
&lt;span class="err"&gt;/sbin/ip addr add 10.11.12.9/28 dev eth8&lt;/span&gt;
&lt;span class="err"&gt;/sbin/ip addr add 10.11.12.10/28 dev eth9&lt;/span&gt;
&lt;span class="err"&gt;EOF&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Maksud dari script diatas adalah supaya waktu boot, VyOS secara otomatis men-set ip address di interface Mikrobits. Berhubung representasi internal udev tidak diketahui, maka interface dari nomor 1 sampai 10 diset semua.&lt;/p&gt;
&lt;p&gt;Langkah selanjutnya, shutdown pc VyOS dan setelah shutdown lepas hard disk yang terinstall VyOS dari PC.&lt;br /&gt;
Setelah itu bongkar case router Mikrobits. Di board Mikrobits tersebut ada beberapa port sata, cari sata1 kemudian dengan kabel sata hubungkan port sata1 ke hard disk VyOS. Masalah lagi, di board Mikrobits tidak ada power untuk hard disk sata jadi power untuk hard disk harus diambil dari power supply lain, saya menggunakan power supply yang ada di PC untuk power hard disk.&lt;/p&gt;
&lt;p&gt;Dengan kondisi hard disk sata berisi VyOS terpasang di port sata1, hidupkan Mikrobits. Router Mikrobits akan boot dengan VyOS yang ada di hard disk, tunggu beberapa saat sampai VyOS benar-benar up.&lt;/p&gt;
&lt;p&gt;Siapkan PC atau laptop dengan OS Linux serta kabel UTP. Hubungkan port ethernet laptop / PC ke port 3 dengan kabel UTP. Set ip address laptop / PC ke 10.11.12.14/28.&lt;br /&gt;
Dengan asumsi bahwa interface adalah eth0, set ip address dengan command berikut, user root tentu saja:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ip link set eth0 up&lt;/span&gt;
&lt;span class="err"&gt;ip addr add 10.11.12.14/28 dev eth0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kita tidak bisa tahu berapa ip address yang ada di port 3 Mikrobits, karena itu kita ping dengan broadcast atau coba ping ip address satu per satu. Cara ping broadcast:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ping -b 10.11.12.15&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Hasilnya, ip address yang reply itu yang terset di port 3 Mikrobits. Apabila tidak ada reply, coba ping ip address satu per satu mulai dari 10.11.12.1 sampai 10.11.12.10. Pada kasus Saya, ip address yang reply 10.11.12.7&lt;/p&gt;
&lt;p&gt;Setelah ip address port 3 diketahui, dengan asumsi ip address 10.11.12.7, kita masuk ke bagian yang paling menyenangkan.&lt;br /&gt;
Akses router dengan ssh:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="n"&gt;vyos&lt;/span&gt;&lt;span class="mf"&gt;@10.11.12.7&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Password default untuk user &lt;strong&gt;&lt;em&gt;vyos&lt;/em&gt;&lt;/strong&gt; adalah &lt;strong&gt;&lt;em&gt;vyos&lt;/em&gt;&lt;/strong&gt;. Selanjutnya, cari tahu nama hard disk yang terinstall dengan command:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;sudo fdisk -l&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dari output command fdisk diatas, akan muncul 2 nama hard disk. &lt;em&gt;/dev/sda&lt;/em&gt; dan &lt;em&gt;/dev/sdb&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;WARNING!!!&lt;/strong&gt; dari dua drive tersebut, kita harus benar-benar yakin mana drive sata mana yang compact flash. Cara mencari tahu bisa dengan melihat kapasitas drive. Misal untuk drive sata yang saya pakai berkapasitas 320GB, output fdisk kurang lebih seperti dibawah.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;Disk /dev/sdb: 298.1 GiB, 320072933376 bytes, 625142448 sectors&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dengan begitu, maka &lt;em&gt;/dev/sdb&lt;/em&gt; adalah drive sata sedangkan &lt;em&gt;/dev/sda&lt;/em&gt; adalah compact flash Mikrobits. Cara lainnya, dengan command df&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;sudo df -h&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Command diatas digunakan untuk mengetahui filesystem yang ter-mount. Artinya filesystem yang ter-mount berarti drive sata. Misalkan &lt;em&gt;/dev/sdb1&lt;/em&gt; ter-mount ke /, maka /dev/sdb adalah drive sata.&lt;/p&gt;
&lt;p&gt;Sekali lagi, command setelah ini tidak boleh dieksekusi sebelum drive bisa dipastikan. Risikonya, kehilangan data, kehilangan lisensi RouterOS, dan mungkin juga kacaunya alam semesta.&lt;/p&gt;
&lt;p&gt;Sampai disini, kita asumsikan &lt;em&gt;/dev/sda&lt;/em&gt; adalah compact flash sedangkan &lt;em&gt;/dev/sdb&lt;/em&gt; adalah drive sata.
Kita akan membuat disk image dengan source /dev/sda, image tersebut akan dijalankan secara virtual di dalam os Linux, reset konfigurasi RouterOS dan kemudian diflash kembali ke compact flash.&lt;/p&gt;
&lt;p&gt;Untuk membuat image:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;cd ~&lt;/span&gt;
&lt;span class="err"&gt;sudo dd if=/dev/sda of=routeros.img bs=1M&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Tunggu sampai proses selesai. Setelah selesai, maka di directory /home/vyos akan ada file dengan nama routeros.img dengan besar file sesuai dengan kapasitas drive compact flash. Perintah exit untuk keluar dari console VyOS dan kembali ke terminal Linux di PC / laptop.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Berikutnya, image tersebut dicopy ke PC / laptop dengan os Linux. Silahkan copy dengan cara apa saja, sftp atau scp misalnya.&lt;br /&gt;
Dari terminal Linux di PC / laptop, ketik perintah dibawah untuk copy image.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;scp&lt;/span&gt; &lt;span class="n"&gt;vyos&lt;/span&gt;&lt;span class="mf"&gt;@10.11.12.7&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;vyos&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;routeros&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Setelah image ter-copy, image tersebut dijalankan secara virtual dengan Qemu. Install Qemu kalau belum terinstall:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;apt-get install qemu&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Jalankan image dengan Qemu&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;qemu -nographic routeros.img&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dari sini, setelah system up dan running kita bisa login ke MikroTik dan lakukan reset dengan perintah /system reset-configuration&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;/system reset-configuration&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Tekan &amp;ldquo;y&amp;rdquo;, dan sistem akan ter-reset.&lt;/p&gt;
&lt;p&gt;Kalau saja cara ini gagal, entah karena system yang error atau tidak bisa login ke MikroTik, masih ada cara lain, netinstall.&lt;br /&gt;
Untuk netinstall, cara menjalankan qemu agak sedikit berbeda karena harus ada cdrom untuk cd MikroTik RouterOS-nya. Cara netinstall tidak akan dibahas disini.&lt;/p&gt;
&lt;p&gt;Sampai disini, kita sudah punya file image MikroTik yang sudah ter-reset, selanjutnya file image tersebut akan di copy kembali ke Mikrobits dan di flash ke compact flash Mikrobits. Sebelum itu, matikan Qemu kalau masih running.&lt;/p&gt;
&lt;p&gt;Copy kembali file routeros.img ke Mikrobits, dan login ssh ke Mikrobits.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;scp&lt;/span&gt; &lt;span class="n"&gt;routeros&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;img&lt;/span&gt; &lt;span class="n"&gt;vyos&lt;/span&gt;&lt;span class="mf"&gt;@10.11.12.7&lt;/span&gt;&lt;span class="o"&gt;:/&lt;/span&gt;&lt;span class="n"&gt;home&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;vyos&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;
&lt;span class="n"&gt;ssh&lt;/span&gt; &lt;span class="n"&gt;vyos&lt;/span&gt;&lt;span class="mf"&gt;@10.11.12.7&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Flash image MikroTik yang sudah ter-reset ke compact flash. Sekali lagi, &lt;em&gt;/dev/sda&lt;/em&gt; hanya asumsi dan kalau berbeda silahkan disesuaikan.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;sudo dd if=routeros.img of=/dev/sda bs=1M&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Tunggu sampai selesai, dan setelah selesai shutdhown VyOS Mikrobits dengan command &lt;em&gt;poweroff&lt;/em&gt; atau &lt;em&gt;sudo halt&lt;/em&gt;.&lt;br /&gt;
Cabut kabel sata dari Mikrobits, dan coba hidupkan kembali Mikrobits tanpa drive sata. Jangan lupa berdoa semoga semuanya berjalan lancar.&lt;/p&gt;
&lt;p&gt;Apabila berhasil, maka router Mikrobits sudah bisa diakses via layer 2, mac-telnet atau Winbox dengan mac address.&lt;/p&gt;
&lt;p&gt;Sebagai penutup, artikel ini adalah cara-cara yang saya pakai untuk reset Mikrobits Aneto dan belum tentu berhasil dengan kasus lain. Apabila tulisan ini dijadikan panduan, maka Saya tidak akan bertanggung jawab apabila langkah-langkah diatas tidak berhasil, terjadi kehilangan data, kerusakan hardware, gangguan pada the Force, dan lain sebagainya.&lt;/p&gt;</content><category term="How-to"></category><category term="VyOS"></category><category term="Linux"></category></entry><entry><title>Inovasi teknologi melawan status quo.</title><link href="//devnull.web.id/esai/inovasi-teknologi.html" rel="alternate"></link><published>2016-04-02T22:35:00+08:00</published><updated>2016-04-02T22:35:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-04-02:/esai/inovasi-teknologi.html</id><summary type="html">&lt;p&gt;Pada tanggal 27 Januari lalu, Telkom Indonesia mengumumkan bahwa layanan Netflix diblokir melalui jaringan Telkom. Telkom beralasan bahwa Netflix belum comply dengan regulasi di Indonesia. Selain itu Telkom juga mengatakan bahwa Netflix bisa diakses asalkan mau bekerjasama dengan Telkom.&lt;/p&gt;
&lt;p&gt;Pada tanggal 22 Maret lalu juga terjadi demo anarkis oleh para …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Pada tanggal 27 Januari lalu, Telkom Indonesia mengumumkan bahwa layanan Netflix diblokir melalui jaringan Telkom. Telkom beralasan bahwa Netflix belum comply dengan regulasi di Indonesia. Selain itu Telkom juga mengatakan bahwa Netflix bisa diakses asalkan mau bekerjasama dengan Telkom.&lt;/p&gt;
&lt;p&gt;Pada tanggal 22 Maret lalu juga terjadi demo anarkis oleh para driver taksi konvensional menuntut agar layanan taksi online dibubarkan.&lt;/p&gt;
&lt;p&gt;Dua kejadian berbeda, industri yang berbeda tapi mempunyai pola yang sama. Pertanyaanya, apa yang sebenarnya terjadi? Mungkin saja, untuk menjawab pertanyaan tersebut tidak semudah kelihatannya, mungkin juga diperlukan para ahli dibidangnya, dan saya bukan salah satu dari para ahli tersebut. Dibawah Saya coba menuliskan pendapat subjektif Saya mengenai masalah ini.&lt;/p&gt;
&lt;p&gt;Saya jadi teringat nama Alvin Toffler dan idenya tentang &amp;ldquo;The Third Wave&amp;rdquo;, saya belum pernah membaca buku tersebut dan hanya mengetahuinya dari random blog yang Saya baca [1]. Alvin Toffler berpendapat bahwa peradaban manusia seperti gelombang, dan pada saat ini peradaban manusia memasuki yang disebut gelombang ketiga (The Third Wave). First wave, atau gelombang peradaban yang pertama adalah Agrikultur. Gelombang kedua adalah revolusi industri, ditandai dengan munculnya banyak industri dan korporasi. Third wave, gelombang ketiga adalah post industrial age, atau era informasi yang saat ini kita ada di dalamnya.&lt;/p&gt;
&lt;p&gt;Awal tahun 2000-an, muncul fenomena yang disebut dot-com bubble. Banyak industri berbasis tekonologi IT lahir pada era ini, sebagian dari industri ini bahkan lahir dari garasi. Kemudian sekarang ini juga muncul istilah-istilah yang asing di dunia teknologi informasi seperti Big Data, Internet of Thing, Cloud Computing, dsb.&lt;/p&gt;
&lt;p&gt;Dalam dunia teknologi informasi, ada sebuah hukum yang disebut Moore&amp;rsquo;s Law atau Hukum Moore [2]. Ide ini berasal dari Gordon Moore, mengatakan bahwa komponen semikonduktor seperti kapasitor, transistor, resistor, dan dioda dalam sebuah Integrated Circuit jumlahnya meningkat dua kali lipat dalam dua tahun. Bisa kita bayangkan, satuan terkecil dalam komputasi adalah bit dan dalam sebuah memory, 8 bit membentuk 1 byte. Jumlah transistor per bit berbeda atara teknologi yang satu dengan lainnya, ada yang memerlukan 4 buah transistor per bit nya, ada pula yang satu transistor untuk 2 bit tapi kalau kita anggap satu bit diwakili oleh satu transistor, maka delapan buah transistor untuk 1 byte. Untuk satu buah memory yang kapasitasnya 1 GB, berarti ada 8 milyar transistor, 8 milyar transistor dalam sebuah chip yang ukurannya begitu kecil.&lt;/p&gt;
&lt;p&gt;Pada saat ini, memory 1 GB tentunya tergolong kecil. Tapi beberapa tahun lalu, saya ingat sekitar tahun 2007 waktu itu Saya punya flash drive yang kapasitasnya hanya 256 MB, pada saat itu kapasitas 1 GB terasa mewah sekali, ini membuktikan Hukum Moore diatas.&lt;/p&gt;
&lt;p&gt;Apa yang coba saya sampaikan adalah, bahwa evolusi teknologi ini berjalan begitu cepat, dan karena saking cepatnya sehingga banyak yang kewalahan mengejarnya dan akhirnya tertinggal. Kita paham bahwa dalam proses evolusi, evolusi apa saja pasti memakan korban, yaitu siapa yang gagal beradaptasi akan tereliminasi dengan sendirinya. Kita lihat sendiri bagaimana Yahoo atau sosial media jadul seperti Friendster yang begitu populer di awal 2000-an sekarang hampir tidak terdengar namanya. Atau seperti smartphone Blackberry yang seakan-akan kemarin semua orang membicarakannya, tapi sekarang sudah tergantikan smartphone berbasis Android. Saya sendiri, tahun 2013 lalu pernah beli smartphone Android yang Saya anggap wah sekali pada waktu itu, tapi sekarang sudah obsolete dan harus pakai yang lebih baru lagi kalau tidak mau dianggap manusia zaman batu. Tapi meskipun begitu, paling tidak Saya tidak demo turun ke jalan menuntut produksi smartphone dihentikan.&lt;/p&gt;
&lt;p&gt;Mari kita lihat masalah ini dari kacamata engineering. Proses engineering itu, engineering dalam disiplin ilmu apapun, sebagian besar polanya sama. Proses engineering berawal dari adanya masalah, kemudian dengan cara-cara yang kreatif dan inovatif mencoba menyelesaikan masalah tersebut, dan kemudian seperti sulap jadilah produk yang belum pernah ada sebelumnya.&lt;/p&gt;
&lt;p&gt;Ambil contoh kendaraan, mobil atau sepeda motor. Mobil dan sepeda motor merupakan produk engineering, yang lahir sebagai solusi dari beberapa masalah, salah satunya saja misalnya untuk perjalanan jarak jauh dengan waktu yang cepat. Sebelum ada kendaraan dengan mesin, perjalanan jauh mungkin saja dengan berjalan kaki atau kereta kuda misalnya, mobil dan motor jadi solusi masalah tersebut.&lt;/p&gt;
&lt;p&gt;Karena itu, hasil dari proses engineering untuk bisa diterima sebagai solusi paling tidak harus memenuhi beberapa hal yaitu desirability, feasibility, dan viability. Desirability artinya solusi itu benar-benar dibutuhkan dan diinginkan. Untuk orang-orang yang lebih suka naik sepeda misalnya, sepeda motor tentu bukan solusi. Viability, artinya dapat dijangkau, mobil tentu saja desirable atau lebih diminati tapi ternyata tidak semua orang mampu beli mobil. Feasibility, artinya solusi engineering itu bisa diwujudkan. Kalau saja manusia bisa melakukan teleportasi dari satu tempat ke tempat lain, tentu itu lebih desirable daripada menggunakan kendaraan, tapi sampai saat ini teleportasi belum bisa diwujudkan, mungkin nanti.&lt;/p&gt;
&lt;p&gt;Kembali ke masalah taksi konvensional versus taksi online atau Telkom versus Netflix. Dua-duanya merupakan hasil dari proses engineering, tapi ternyata yang satu lebih diminati daripada yang lain, desirability. Gojek misalnya, kita kesampingkan dulu masalah legalitasnya, adalah solusi yang lahir dari proses engineering, begitu juga Netflix. Faktor kemudahan dan kenyamanan adalah problemnya, dan baik Gojek maupun Netflix mampu melihat itu dan mampu memberikan solusi yang lebih diminati masyarakat. Jadi, menuntut Grab, Uber, atau Gojek  ditutup atau Telkom yang memblokir Netflix adalah cara yang menurut Saya, sekali lagi menurut saya tidak logis.&lt;/p&gt;
&lt;p&gt;Kesimpulannya, kemajuan teknologi tidak dapat dihentikan karena akan terus berevolusi. Karena itu, akan muncul masalah-masalah baru dan akan muncul solusi-solusi engineering yang baru dan inovasi mutlak diperlukan kalau tidak ingin tertinggal dibelakang. Pada akhirnya, masyarakat lah yang memilih mana yang lebih baik, bukan tangan besi atau monopoli.&lt;/p&gt;
&lt;h3 id="refs"&gt;Refs:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;[1] &lt;a href="http://www.criticalthink.info/Phil1301/Wave3lec.htm" target="_blank"&gt;http://www.criticalthink.info/Phil1301/Wave3lec.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2] &lt;a href="https://en.wikipedia.org/wiki/Moore%27s_law" target="_blank"&gt;https://en.wikipedia.org/wiki/Moore%27s_law&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content><category term="Esai"></category></entry><entry><title>Linux cross-compile dengan crosstool-ng</title><link href="//devnull.web.id/misc/cross-compile-crosstool-ng.html" rel="alternate"></link><published>2016-03-27T14:35:00+08:00</published><updated>2016-03-27T14:35:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-03-27:/misc/cross-compile-crosstool-ng.html</id><summary type="html">&lt;p&gt;Pada artikel ini, saya coba menuliskan langkah-langkah membuat toolchain untuk cross compile program Linux. Os yang dipakai Debian Jessie, tentu saja applicable untuk selain Debian, sedangkan toolchain yang dipakai menggunakan crosstool-ng.&lt;/p&gt;
&lt;p&gt;Sebelum ke how-to, ada baiknya dituliskan sedikit penjelasan tentang hal-hal yang berkaitan dengan cross-compile.&lt;/p&gt;
&lt;h2 id="architecture"&gt;Architecture&lt;/h2&gt;
&lt;p&gt;Setiap CPU (Central Processing …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Pada artikel ini, saya coba menuliskan langkah-langkah membuat toolchain untuk cross compile program Linux. Os yang dipakai Debian Jessie, tentu saja applicable untuk selain Debian, sedangkan toolchain yang dipakai menggunakan crosstool-ng.&lt;/p&gt;
&lt;p&gt;Sebelum ke how-to, ada baiknya dituliskan sedikit penjelasan tentang hal-hal yang berkaitan dengan cross-compile.&lt;/p&gt;
&lt;h2 id="architecture"&gt;Architecture&lt;/h2&gt;
&lt;p&gt;Setiap CPU (Central Processing Unit) dibuat menurut architecture tertentu, dan setiap architecture berbeda dalam mengeksekusi program [1]. Beberapa contoh cpu architecture yang banyak dipakai diantaranya ada architecture x86, ini merupakan cpu 32 bit yang banyak dipakai di komputer desktop, laptop, serta server. Kemudian ada x86_64, prosesor architecture x86 versi 64 bit. Produk dari Intel dan AMD banyak dipakai untuk dua architecture tersebut.&lt;/p&gt;
&lt;p&gt;Kemudian ada architecture ARM, dan seperti x86, ARM adalah 32 bit sedangkan ARM64 untuk yang 64 bit. Prosesor ARM banyak dipakai di system embed dan handheld seperti smartphone, sebagian besar smartphone yang ada saat ini menggunakan cpu ARM.&lt;/p&gt;
&lt;p&gt;Selain x86 dan ARM, ada processor architecture yang terkenal di embedded system yaitu MIPS. MIPS banyak dipakai di sistem embed untuk jaringan seperti router dan switch. Beberapa router dan switch seperti Cisco, Ubiquiti dan MikroTik menggunakan MIPS.&lt;/p&gt;
&lt;h2 id="endianness"&gt;Endianness&lt;/h2&gt;
&lt;p&gt;Setiap cpu, cara mengatur susunan byte (byte order) dalam memory berbeda-beda dan dikelompokkan menjadi dua bagian, little endian dan big endian [2]. Little dan big endian tidak ada pengaruhnya untuk data di memory yang besarnya hanya satu byte (8 bit), bedanya adalah ketika data di memory merupakan multiple byte atau lebih dari satu byte. Big endian (big-end) menyusun dan menginterpretasikan bahwa byte pertama atau byte paling awal adalah byte terbesar, sedangkan litte endian (little-end) sebaliknya.&lt;/p&gt;
&lt;p&gt;Contoh untuk tipe data short integer yang besarnya 2 byte. Artinya ada 2 lokasi memory (satu blok memory besarnya 1 byte / 8 bit) yang apabila data dari dua lokasi memory itu dijumlahkan akan membentuk satu data short integer. Byte pertama berisi 0x12 atau 18 dalam desimal, byte kedua berisi 0x34 atau 52 dalam desimal.&lt;/p&gt;
&lt;p&gt;Big endian mengartikan byte pertama adalah yang terbesar sehingga kalkulasinya adalah&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;18 x (2 ^ 8) + 52 = 4660&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sedangkan little endian mengartikan bahwa byte terakhir adalah yang terbesar, pertama yang terkecil, sehingga:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;18 + 52 x (2 ^ 8) = 13798&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dari sini terlihat, kalau salah mengartikan endianness, maka hasil program pun akan salah.&lt;/p&gt;
&lt;h2 id="compiled-language"&gt;Compiled language&lt;/h2&gt;
&lt;p&gt;Ada dua tipe program yang ada di komputer, yaitu tipe interpreted dan compiled. Program yang termasuk dalam tipe interpreted language tidak perlu di-compile dan biasanya disebut bahasa scripting, beberapa contoh ada bahasa Python, Perl, PHP, dsb.&lt;/p&gt;
&lt;p&gt;Berbeda dengan interpreted language, bahasa tipe compiled language harus di-compile sebelum bisa dieksekusi atau dijalankan. Yang termasuk kategori ini diantaranya bahasa C, C++, Pascal, dsb. Program compiled biasanya berjalan lebih cepat daripada tipe interpreted language.&lt;/p&gt;
&lt;p&gt;Proses kompilasi adalah proses menerjemahkan bahasa pemrograman yang dipahami manusia kedalam bahasa yang dipahami oleh cpu, program untuk meng-compile program disebut compiler. Berbeda dengan bahasa interpreted yang cukup sekali ditulis dan bisa berjalan di cpu apapun, bahasa compiled harus menyesuaikan tipe cpu yang dipakai.&lt;/p&gt;
&lt;h3 id="cross-compile"&gt;Cross compile&lt;/h3&gt;
&lt;p&gt;Dalam proses compile program, ada tiga tipe cpu yang dipakai.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Build&lt;/code&gt;, Build host adalah cpu dimana compiler dibuat.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Host&lt;/code&gt;, Host merupakan cpu dimana compiler akan digunakan untuk meng-compile program.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Target&lt;/code&gt;, Target merupakan cpu dimana program yang sudah di-compile akan berjalan.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Biasanya, untuk compile di komputer x86 dan yang semisalnya, build, host, dan target adalah komputer yang sama. Artinya compiler dibuat di komputer tersebut, kemudian compiler dijalankan di komputer tersebut untuk meng-compile program, dan program yang sudah di-compile akan berjalan di komputer itu.&lt;/p&gt;
&lt;p&gt;Sedangkan untuk system embed, prosesnya berbeda. embedded system biasanya dibuat dengan sangat efisien dan resource yang terbatas. Contohnya beberapa jenis router SOHO yang mempunyai prosesor MIPS dengan speed hanya 400 MHz, memory 32 MB, dan storage 64MB. Dengan resource seperti ini tentu saja tidak mungkin kompilasi program dilakukan di router tersebut.&lt;/p&gt;
&lt;p&gt;Proses cross-compile adalah proses meng-compile program dengan target cpu arhitecture yang berbeda. Misalnya, program di-compile di mesin Intel x86 seperti laptop atau komputer desktop, tapi program hasil kompilasi akan digunakan di cpu MIPS seperti router. Tools atau program-program yang digunakan untuk melakukan cross-compile disebut toolchain.&lt;/p&gt;
&lt;p&gt;Toolchain dibentuk dengan beberapa program, diataranya:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;binutils&lt;/code&gt;, Program untuk memanage program binary, contohnya ld sebagai linker.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gcc&lt;/code&gt;, koleksi compiler yang dibuat oleh GNU.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;C library&lt;/code&gt; untuk embedded system biasanya menggunakan uclibc meskipun ada juga yang menggunakan glibc.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Proses membuat toolchain merupakan proses yang sangat kompleks dan memerlukan usaha trial and error yang tidak mudah [3]. Thanks to FOSS community, kita tidak perlu melalui proses yang rumit itu. Salah satunya crosstool-ng, tool ini melakukan proses otomasi membuat toolchain seperti patching, compiling, dan linking. Dengan crosstool-ng kita bisa dengan mudah tinggal menjalankan script, memberikan input dan setelah proses selesai, toolchain sudah jadi dan siap digunakan untuk meng-compile program.&lt;/p&gt;
&lt;h3 id="crosstool-ng"&gt;Crosstool-ng&lt;/h3&gt;
&lt;p&gt;Sebelum proses building, kita perlu mengetahui beberapa parameter untuk crosstool-ng, diantaranya cpu architecture, endianness, c library yang dipakai. Untuk case saya beberapa waktu lalu, cpu architecture MIPS 64 bit, c library menggunakan GNU libc versi 2, dan big endian.&lt;/p&gt;
&lt;p&gt;Untuk mencari endianness, ketik lscpu di terminal:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;Architecture&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;          &lt;span class="n"&gt;mips64&lt;/span&gt;
&lt;span class="n"&gt;Byte&lt;/span&gt; &lt;span class="n"&gt;Order&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;            &lt;span class="n"&gt;Big&lt;/span&gt; &lt;span class="n"&gt;Endian&lt;/span&gt;
&lt;span class="n"&gt;CPU&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;):&lt;/span&gt;                &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;On&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt; &lt;span class="n"&gt;CPU&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;   &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;per&lt;/span&gt; &lt;span class="n"&gt;core&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;    &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;Core&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;per&lt;/span&gt; &lt;span class="n"&gt;socket&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;    &lt;span class="mi"&gt;1&lt;/span&gt;
&lt;span class="n"&gt;Socket&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="o"&gt;):&lt;/span&gt;             &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;span class="n"&gt;L1d&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;             &lt;span class="mi"&gt;32&lt;/span&gt;&lt;span class="n"&gt;K&lt;/span&gt;
&lt;span class="n"&gt;L1i&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;             &lt;span class="mi"&gt;37&lt;/span&gt;&lt;span class="n"&gt;K&lt;/span&gt;
&lt;span class="n"&gt;L2&lt;/span&gt; &lt;span class="n"&gt;cache&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;              &lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="n"&gt;K&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Output dari Byte Order adalah Big Endian.&lt;/p&gt;
&lt;p&gt;Pada beberapa system, command lscpu tidak ada sehingga menggunakan cara lain untuk mengetahui endianness&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ &lt;span class="c1"&gt;## Big endian output 0&lt;/span&gt;
$ &lt;span class="nb"&gt;echo&lt;/span&gt; -n I &lt;span class="p"&gt;|&lt;/span&gt; od -to2 &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;FNR==1{ print substr($2,6,1)}&amp;#39;&lt;/span&gt;
$ &lt;span class="m"&gt;0&lt;/span&gt;
$
$ &lt;span class="c1"&gt;## Output 1 untuk little endian&lt;/span&gt;
$ &lt;span class="nb"&gt;echo&lt;/span&gt; -n I &lt;span class="p"&gt;|&lt;/span&gt; od -to2 &lt;span class="p"&gt;|&lt;/span&gt; awk &lt;span class="s1"&gt;&amp;#39;FNR==1{ print substr($2,6,1)}&amp;#39;&lt;/span&gt;
$ &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Untuk mengetahui cpu architecture dan OS, contoh output untuk notebook saya yang 32 bit&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;uname -a&lt;/span&gt;
&lt;span class="err"&gt;Linux DEATH-STAR 3.16.0-4-686-pae #1 SMP Debian 3.16.7-ckt20-1+deb8u1 (2015-12-14) i686 GNU/Linux&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Setelah parameter diketahui, berikutnya ke proses build.&lt;/p&gt;
&lt;p&gt;Untuk Debian dan sejenisnya, pastikan paket build-essential sudah terinstall&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;dpkg&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;grep&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;essential&lt;/span&gt;

&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;jika&lt;/span&gt; &lt;span class="n"&gt;belum&lt;/span&gt; &lt;span class="n"&gt;terinstall&lt;/span&gt;
&lt;span class="n"&gt;apt&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;get&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt; &lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;essential&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Download crosstool-ng, versi terakhir saat artikel ini ditulis adalah 1.22&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;wget&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;//&lt;/span&gt;&lt;span class="n"&gt;crosstool&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ng&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;org&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;download&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;crosstool&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ng&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;crosstool&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ng&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.22&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="n"&gt;tar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bz2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Extract tarball dan compile crosstool-ng&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;tar&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;xvjf&lt;/span&gt; &lt;span class="n"&gt;crosstool&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ng&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.22&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="mf"&gt;0.&lt;/span&gt;&lt;span class="n"&gt;tar&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;bz2&lt;/span&gt;
&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="n"&gt;crosstool&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ng&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mf"&gt;1.22&lt;/span&gt;
&lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="n"&gt;configure&lt;/span&gt; &lt;span class="o"&gt;--&lt;/span&gt;&lt;span class="n"&gt;prefix&lt;/span&gt;&lt;span class="o"&gt;=/&lt;/span&gt;&lt;span class="n"&gt;usr&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;local&lt;/span&gt;
&lt;span class="n"&gt;make&lt;/span&gt;

&lt;span class="c1"&gt;# dengan user root&lt;/span&gt;
&lt;span class="n"&gt;make&lt;/span&gt; &lt;span class="n"&gt;install&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;crosstool-ng sudah terinstall di /usr/local. Selanjutnya buat direktori untuk toolchain. Direktori untuk toolchain dalam contoh ini dinamai crosstool dengan subdirektori build untuk proses build dan subdirektori target untuk toolchain yang sudah siap digunakan.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;mkdir&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;crosstool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;cd&lt;/span&gt; &lt;span class="o"&gt;~/&lt;/span&gt;&lt;span class="n"&gt;crosstool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;build&lt;/span&gt;
&lt;span class="n"&gt;ct&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ng&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;samples&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dari output sample, yang paling mendekati adalah mipsel-unknown-linux-gnu. mipsel-unknown-linux-gnu adalah contoh konfigurasi untuk target mips little endian dengan c library gnu libc. Karena target dalam kasus ini berbeda, target endianness big endian, maka konfigurasi perlu disesuaikan dengan ct-ng menuconfig&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;ct&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ng&lt;/span&gt; &lt;span class="k"&gt;show&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;mipsel&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;unknown&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gnu&lt;/span&gt;
&lt;span class="n"&gt;ct&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ng&lt;/span&gt; &lt;span class="n"&gt;mipsel&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;unknown&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gnu&lt;/span&gt;

&lt;span class="n"&gt;ct&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;ng&lt;/span&gt; &lt;span class="n"&gt;menuconfig&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Di bagian paths and misc options, sesuaikan target direktori sesuai dengan yang sudah dibuat diatas&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;HOME&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;crosstool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Prefix&lt;/span&gt; &lt;span class="n"&gt;directory&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Di bagian Target Options, ubah endianness ke Big Endian. Pilih exit kemudian save. Setalah itu build toolchain dengan command ct-ng build&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ct-ng build&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Command ct-ng build akan secara otomatis mendownload tool yang diperlukan seperti binutils, gcc, libc, dsb. ct-ng build juga akan melakukan patching source code dan kemudian compile secara otomatis. Proses ini cukup lama, lebih dari 2 jam dengan prosesor Intel Atom, prosesor yang lebih tinggi seharusnya lebih cepat.&lt;/p&gt;
&lt;p&gt;Setelah selesai, toolchain sudah ada di direktori ~/crosstool/target dan sudah bisa digunakan&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="n"&gt;PATH&lt;/span&gt;&lt;span class="o"&gt;=$&lt;/span&gt;&lt;span class="n"&gt;PATH&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;$&lt;/span&gt;&lt;span class="n"&gt;HOME&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;crosstool&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;bin&lt;/span&gt;

&lt;span class="c1"&gt;# Tes compile program&lt;/span&gt;
&lt;span class="n"&gt;mips&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;unknown&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;linux&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gnu&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;gcc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;Wall&lt;/span&gt; &lt;span class="n"&gt;program&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="n"&gt;program&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Program yang sudah di-compile dengan crosstool-ng tinggal di-copy ke mesin target, di-set execution bit nya dan bisa dijalankan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Refs:&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;[1] &lt;a href="https://en.wikipedia.org/wiki/Central_processing_unit" target="_blank"&gt;https://en.wikipedia.org/wiki/Central_processing_unit&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[2] &lt;a href="https://en.wikipedia.org/wiki/Endianness" target="_blank"&gt;https://en.wikipedia.org/wiki/Endianness&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;[3] &lt;a href="http://kegel.com/crosstool/crosstool-0.43/buildlogs/" target="_blank"&gt;http://kegel.com/crosstool/crosstool-0.43/buildlogs/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://crosstool-ng.org/" target="_blank"&gt;http://crosstool-ng.org/&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;</content><category term="Misc"></category><category term="Debian"></category><category term="Linux"></category><category term="Programming"></category></entry><entry><title>Filter massive ip address di Linux</title><link href="//devnull.web.id/networking/iptables-filter-linux-ipset.html" rel="alternate"></link><published>2016-03-21T13:23:00+08:00</published><updated>2016-03-21T13:23:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-03-21:/networking/iptables-filter-linux-ipset.html</id><summary type="html">&lt;p&gt;Traffic policy merupakan hal yang umum di jaringan, salah satu praktiknya untuk menerapkan policy yang berbeda antara yang berasal dari network A dan network B. Pada router berbasis Linux, biasanya menggunakan Iptables untuk filtering.&lt;/p&gt;
&lt;p&gt;Problemnya adalah ketika ip address atau network prefix yang difilter sangat banyak, dalam kasus ini prefix …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Traffic policy merupakan hal yang umum di jaringan, salah satu praktiknya untuk menerapkan policy yang berbeda antara yang berasal dari network A dan network B. Pada router berbasis Linux, biasanya menggunakan Iptables untuk filtering.&lt;/p&gt;
&lt;p&gt;Problemnya adalah ketika ip address atau network prefix yang difilter sangat banyak, dalam kasus ini prefix mendekati 100 ribu network prefix. Dengan Iptables tidak akan bisa karena pertama, performance degradation dan yang kedua akan muncul pesan error memory allocation failed karena terlalu banyak rule. Karena itu, ipset yang digunakan bersamaan dengan iptables.&lt;/p&gt;
&lt;p&gt;Hardware yang kami gunakan sebagai router adalah hardware server dengan 8 core prosesor Intel Xeon. Sistem operasi router menggunakan Vyatta, router ini menjalankan dynamic routing protocol BGP full prefix dari beberapa network provider dan OSPF untuk interior gateway protocol.&lt;/p&gt;
&lt;p&gt;Sedikit tentang Vyatta, Vyatta adalah sistem operasi router yang berbasis Debian dan mempunyai command line interface yang mirip dengan Juniper JunOS. Vyatta awalnya merupakan project Open Source, tapi pada tahun 2012 Vyatta diakuisisi oleh Brocade dan tidak lagi Open. Pada tahun 2013, para developer komunitas Vyatta membuat project sistem operasi Open Source berbasis Vyatta dengan nama &lt;a href="http://vyos.net/wiki/Main_Page" target="_blank"&gt;VyOS&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Karena Vyatta merupakan OS berbasis Debian, maka repository pun menggunakan bisa menggunakan Debian. Instalasi ipset cukup dengan apt-get&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;apt-get install ipset&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Setelah ipset terinstall, langkah selanjutnya adalah membuat nama ipset dan memasukkan ip address ke set tersebut. Disini set menggunakan nama NETLIST. Ada beberapa mode hash yang harus dipilih dalam membuat set, untuk list ip address bisa menggunakan hash ip, untuk network prefix menggunakan hash net. Kemudian, secara default maximum list dalam set adalah 64 ribu, jadi kalau list melebihi 64 ribu harus di set secara eksplisit.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ipset create NETLIST hash:net maxelem 100000&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;NETLIST&lt;/code&gt;&lt;/em&gt; : Nama ip set.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;hash:net&lt;/code&gt;&lt;/em&gt; : Set ipset menggunakan network prefix.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;maxelem 100000&lt;/code&gt;&lt;/em&gt; : Set maksimum list entry sebanyak 100 ribu.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Setelah itu input network prefix ke set&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;ipset -A NETLIST 192.168.1.0/24&lt;/span&gt;
&lt;span class="err"&gt;ipset -A NETLIST 172.16.3.0/24&lt;/span&gt;
&lt;span class="err"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Untuk list yang banyak sekali, lebih gampang menggunakan script.&lt;/p&gt;
&lt;p&gt;Setelah &lt;code&gt;NETLIST&lt;/code&gt; terisi dengan prefix atau ip address, tinggal matching iptables. Misalnya untuk set dscp traffic yang berasal dari ip address yang ada di &lt;code&gt;NETLIST&lt;/code&gt;.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;iptables -t mangle -A PREROUTING -m set --match-set NETLIST src -j DSCP --set-dscp-class AF11&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;-t mangle -A PREROUTING&lt;/code&gt;&lt;/em&gt; : Tambahkan rule di table mangle chain PREROUTING.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;-m set&lt;/code&gt;&lt;/em&gt; : Match ipset&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;--match-set NETLIST src&lt;/code&gt;&lt;/em&gt; : Match source address dari ipset NETLIST.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;-j DSCP&lt;/code&gt;&lt;/em&gt; : Jump ke target DSCP.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;&lt;code&gt;--set-dscp-class AF11&lt;/code&gt;&lt;/em&gt; : Set dscp 0x0a.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Dengan ipset yang berisi hampir 100 ribu prefix, hasil tes dengan hardware spesifikasi diatas tidak ada degradasi performance, hanya penambahan delay sekitar 1 mili detik.&lt;/p&gt;
&lt;p&gt;Terakhir, seperti halnya iptables, ipset hanya tersimpan di volatile memory dan hilang setelah reboot. Cara untuk membuat rule persistent tidak dibahas di artikel ini.&lt;/p&gt;</content><category term="Networking"></category><category term="Vyatta"></category><category term="Linux"></category><category term="Networking"></category></entry><entry><title>Filter website negatif dengan Linux dan Powerdns.</title><link href="//devnull.web.id/how-to/blokir-situs-negatif-linux-powerdns.html" rel="alternate"></link><published>2016-02-28T14:31:00+08:00</published><updated>2016-02-28T14:31:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-02-28:/how-to/blokir-situs-negatif-linux-powerdns.html</id><summary type="html">&lt;p&gt;Ini how-to yang quick and dirty, bagaimana cara blokir dns situs-situs negatif dengan Powerdns dan Lua.&lt;/p&gt;
&lt;p&gt;Di beberapa institusi, misalnya kampus, sekolah atau yang lain, situs-situs negatif seperti pornografi dan yang lain lebih baik untuk difilter. Dari sekian banyak cara blokir content negatif, salah satu cara adalah dengan blokir melalui …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Ini how-to yang quick and dirty, bagaimana cara blokir dns situs-situs negatif dengan Powerdns dan Lua.&lt;/p&gt;
&lt;p&gt;Di beberapa institusi, misalnya kampus, sekolah atau yang lain, situs-situs negatif seperti pornografi dan yang lain lebih baik untuk difilter. Dari sekian banyak cara blokir content negatif, salah satu cara adalah dengan blokir melalui dns. Meskipun dengan blokir dns user masih bisa dengan cara-cara lain mengakses konten negatif, tapi paling tidak blokir dns bisa mengurangi traffic ke situs-situs negatif tersebut.&lt;/p&gt;
&lt;p&gt;Ada beberapa opsi untuk blokir situs negatif dengan dns, free service seperti Nawala atau OpenDNS bisa digunakan. Cara blokir dibawah ini bisa digunakan kalau ada server Linux lokal yang dimanfaatkan sebagai dns server.&lt;/p&gt;
&lt;h3 id="dns"&gt;DNS&lt;/h3&gt;
&lt;p&gt;Ada dua mode dalam dns service, yaitu recursor dan authoritative. Recursor fungsinya melakukan query ke root server untuk memetakan nama domain ke ip address. Sedangkan authoritative berfungsi sebagai nameserver.
Misalnya untuk Google, free service dns recursor Google di server 8.8.8.8 dan 8.8.4.4 sedangkan untuk authoritative nameserver google.com di ns(1|2|3|4).google.com.&lt;/p&gt;
&lt;h3 id="powerdns"&gt;Powerdns&lt;/h3&gt;
&lt;p&gt;Untuk blokir melalui dns, yang diperlukan hanya dns recursor sedangkan authoritative nameserver tidak diperlukan. Ada banyak dns recursor yang bisa dipakai, beberapa yang banyak digunakan yaitu bind9, dnsmasq, dan Powerdns recursor. Di artikel ini menggunakan Powerdns recursor.&lt;/p&gt;
&lt;p&gt;Situs-situs pornografi jumlahnya banyak, banyak sekali bahkan. Kalau kita ambil data dari situs &lt;a href="http://trustpositif.kominfo.go.id/"&gt;Trust Positif Kominfo&lt;/a&gt;, ada lebih dari 700 ribu situs yang seharusnya diblokir. Karena itu, pilihan dns recursornya juga menyesuaikan.&lt;/p&gt;
&lt;p&gt;Saya tidak gunakan Bind9 atau Dnsmasq dengan beberapa pertimbangan. Konfigurasi file teks Bind9 untuk 700 ribu lebih record sepertinya menyusahkan, Dnsmasq meskipun bagus untuk skala kecil, tapi untuk data sebanyak itu start-up nya jadi lebih lama.&lt;/p&gt;
&lt;p&gt;Powerdns sangat cocok karena bisa menggunakan backend database SQL. Jadi record domain yang diblokir bisa disimpan di database. Tapi problem muncul kemudian ketika harus upgrade server atau pindah server, backup dan restore database dengan data ratusan ribu record jadi tidak efisien. Untuk itu, saya putuskan untuk kembali ke konsep KISS, &lt;em&gt;&lt;strong&gt;K&lt;/strong&gt;eep &lt;strong&gt;I&lt;/strong&gt;t &lt;strong&gt;S&lt;/strong&gt;imple &lt;strong&gt;S&lt;/strong&gt;tupid!&lt;/em&gt;, abaikan saja kata stupidnya.&lt;/p&gt;
&lt;p&gt;Satu fitur di Powerdns yang saya manfaatkan adalah scripting dengan bahasa Lua. Jadi dengan script ini kita bisa memanipulasi hasil dns query dengan hasil script Lua, silahkan baca tentang Lua di &lt;a href="http://www.lua.org/"&gt;http://www.lua.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Metode saya sederhana saja, nama-nama domain yang diblokir disimpan di file plaintext. Kemudian dengan script Lua, Saya eksekusi command grep. Kalau return value dari grep True, berarti domain masuk dalam list blokir dan False jika sebaliknya.&lt;/p&gt;
&lt;h3 id="how-to"&gt;How-to&lt;/h3&gt;
&lt;p&gt;Di artikel ini, direktori Powerdns ada di /etc/powerdns dan nama file yang berisi domain-domain yang diblok ada di /etc/powerdns/blacklist, silahkan disesuaikan.&lt;/p&gt;
&lt;p&gt;Pertama, install Powerdns dan Lua kalau belum ada&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;apt-get install pdns-recursor lua5.2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Command diatas untuk Debian 8, untuk distibusi lain silahkan disesuaikan. Paket Lua5.2 sebenarnya tidak diperlukan, hanya diperlukan untuk testing script.&lt;/p&gt;
&lt;p&gt;Setelah pdns-recursor terinstall, edit file /etc/powerdns/recursor.conf.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;vim /etc/powerdns/recursor.conf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Vim bisa diganti dengan editor lain, nano misalnya. Banyak parameter di recursor.conf, tapi untuk keperluan ini cukup allow-from dan lua-dns-script&lt;/p&gt;
&lt;p&gt;Comtoh file recursor.conf&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="n"&gt;untuk&lt;/span&gt; &lt;span class="n"&gt;memfilter&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt; &lt;span class="n"&gt;mana&lt;/span&gt; &lt;span class="n"&gt;saja&lt;/span&gt; &lt;span class="n"&gt;yang&lt;/span&gt; &lt;span class="n"&gt;boleh&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="n"&gt;ke&lt;/span&gt; &lt;span class="n"&gt;server&lt;/span&gt; &lt;span class="n"&gt;ini&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;Misal&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt; &lt;span class="n"&gt;internal&lt;/span&gt; &lt;span class="mi"&gt;192&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;maka&lt;/span&gt; &lt;span class="n"&gt;tambahkan&lt;/span&gt; &lt;span class="n"&gt;network&lt;/span&gt; &lt;span class="n"&gt;tersebut&lt;/span&gt; &lt;span class="n"&gt;ke&lt;/span&gt; &lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;

&lt;span class="n"&gt;allow&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;from&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;127&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;128&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;fe80&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;192&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;168&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="mi"&gt;24&lt;/span&gt;

&lt;span class="o"&gt;#&lt;/span&gt; &lt;span class="n"&gt;lua&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dns&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;diisi&lt;/span&gt; &lt;span class="n"&gt;dengan&lt;/span&gt; &lt;span class="n"&gt;lokasi&lt;/span&gt; &lt;span class="n"&gt;script&lt;/span&gt; &lt;span class="n"&gt;Lua&lt;/span&gt; &lt;span class="n"&gt;untuk&lt;/span&gt; &lt;span class="n"&gt;Powerdns&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="n"&gt;lua&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;dns&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;powerdns&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;script&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lua&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Berikutnya, kita perlu mendownload data dari server Trust Positif dan menulis script Lua.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;curl&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;http://trustpositif.kominfo.go.id/files/index.php?download=blacklist&lt;/span&gt;&lt;span class="si"&gt;%2F&lt;/span&gt;&lt;span class="s2"&gt;porn&lt;/span&gt;&lt;span class="si"&gt;%2F&lt;/span&gt;&lt;span class="s2"&gt;domains&amp;amp;share=11&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;etc&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;powerdns&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="n"&gt;blacklist&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Setelah download dengan command diatas, di direktori /etc/powerdns sudah ada file dengan nama blacklist yang berisi nama-nama domain yang di blokir oleh Kominfo.&lt;/p&gt;
&lt;p&gt;Selanjutnya, script Lua di /etc/powerdns/script.lua&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gd"&gt;--- function preresolve dieksekusi oleh pdns-recursor&lt;/span&gt;
&lt;span class="gd"&gt;--- sebelum query ke root server&lt;/span&gt;
&lt;span class="gd"&gt;--- kita tempatkan blacklist di function ini&lt;/span&gt;

function preresolve (ip, domain, qtype)
&lt;span class="gd"&gt;---     Kita hanya akan memeriksa query dengan tipe record A&lt;/span&gt;
        if qtype == pdns.A
        then
                dom = domain:match(&amp;quot;%w+%.%w+.$&amp;quot;)

                if dom == nil
                then
                        dom = &amp;quot;NXDOMAIN.&amp;quot;
                end

&lt;span class="gd"&gt;---             Hilangkan tanda . (dot) dibelakang query domain&lt;/span&gt;
&lt;span class="gd"&gt;---             google.com. menjadi google.com&lt;/span&gt;
                dom = string.sub(domain, 1, string.len(domain) - 1)

&lt;span class="gd"&gt;---             File berisi nama-nama domain yang diblokir&lt;/span&gt;
                file = &amp;quot;/etc/powerdns/blacklist&amp;quot;

&lt;span class="gd"&gt;---             Eksekusi perintah grep, apabila return value == true, maka&lt;/span&gt;
&lt;span class="gd"&gt;---             situs terblokir dan hasil query akan diarahkan ke web server&lt;/span&gt;
&lt;span class="gd"&gt;---             dengan halaman blokir. IP address web server disini&lt;/span&gt;
&lt;span class="gd"&gt;---             menggunakan 192.168.1.1, apabila berbeda&lt;/span&gt;
&lt;span class="gd"&gt;---             silahkan disesuaikan.&lt;/span&gt;
                if os.execute(string.format(&amp;quot;grep \&amp;quot;^%s$\&amp;quot; %s &amp;gt;/dev/null&amp;quot;, dom, file)) == true     
                then
                        addr = &amp;quot;192.168.1.1&amp;quot;
                        ret={
                                {qtype=1, ttl=60,  content=addr}
                        }
                        return 0, ret
                else
                        return -1, {}
                end

        end
        return -1, {}
end
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sampai disini seharusnya dns server sudah bisa dipakai&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;systemctl restart pdns-recursor&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Jika tidak ada error, tes query dari localhost&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;dig google.com @localhost&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Tes juga query domain yang diblokir&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;dig playboy.com @localhost&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Jika hasilnya seperti dibawah, maka sudah benar&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;;; ANSWER SECTION:&lt;/span&gt;
&lt;span class="err"&gt;playboy.com.        60  IN  A   192.168.1.1&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;h3 id="update-data"&gt;Update data&lt;/h3&gt;
&lt;p&gt;Problem selanjutnya yang muncul adalah bagaimana cara menambah atau menghapus data. saya pikir agak merepotkan kalau setiap kali menambah atau menghapus data harus login ke server kemudian edit file secara manual.&lt;/p&gt;
&lt;p&gt;Untuk itu, saya membuat script sederhana dengan Python dan pop3 module. Dengan script ini, Saya bisa menambah atau mengurangi data domain yang diblokir dengan cara kirim email. Script Python ini fungsinya mengecek email setiap 10 menit sekali, kemudian jika ada email maka data akan di-update tergantung subject email, Saya gunakan subject [dns add] untuk menambah dan [dns del] untuk menghapus. Untuk nama-nama domainnya di list di body teks email, satu domain per baris.&lt;/p&gt;
&lt;p&gt;Script ini diberi nama ckmail dan ditempatkan di /usr/local/bin. Script ini dieksekusi oleh cron setiap 10 menit.&lt;/p&gt;
&lt;table class="codehilitetable"&gt;&lt;tr&gt;&lt;td class="linenos"&gt;&lt;div class="linenodiv"&gt;&lt;pre&gt;  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111&lt;/pre&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="code"&gt;&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="ch"&gt;#!/usr/bin/env python&lt;/span&gt;

&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;poplib&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;re&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os.path&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nn"&gt;op&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;remove&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;shutil&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;move&lt;/span&gt;

&lt;span class="n"&gt;DELETE&lt;/span&gt;      &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x01&lt;/span&gt;
&lt;span class="n"&gt;ADD&lt;/span&gt;         &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x02&lt;/span&gt;
&lt;span class="n"&gt;CMD&lt;/span&gt;         &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mh"&gt;0x00&lt;/span&gt;

&lt;span class="n"&gt;DIR&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;/etc/powerdns/&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;FILE&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;blacklist&amp;quot;&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;checkhdr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;CMD&lt;/span&gt;
        &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;ADD&lt;/span&gt;
        &lt;span class="k"&gt;global&lt;/span&gt; &lt;span class="n"&gt;DELETE&lt;/span&gt;

        &lt;span class="n"&gt;qa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;(S|s)ubject:[ &lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s2"&gt;]+\[dns add\].*&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;qd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;(S|s)ubject:[ &lt;/span&gt;&lt;span class="se"&gt;\t&lt;/span&gt;&lt;span class="s2"&gt;]+\[dns del\].*&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;50&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qa&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                                &lt;span class="n"&gt;CMD&lt;/span&gt; &lt;span class="o"&gt;|=&lt;/span&gt; &lt;span class="n"&gt;ADD&lt;/span&gt;
                                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
                        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;qd&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                                &lt;span class="n"&gt;CMD&lt;/span&gt; &lt;span class="o"&gt;|=&lt;/span&gt; &lt;span class="n"&gt;DELETE&lt;/span&gt;
                                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;
                &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;

&lt;span class="c1"&gt;# end chkhdr()&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;addlist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DIR&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;FILE&lt;/span&gt;

        &lt;span class="n"&gt;fsock&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;fsock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;fsock&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;

&lt;span class="c1"&gt;# end addlist&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;remlist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DIR&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;FILE&lt;/span&gt;
        &lt;span class="n"&gt;f2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;DIR&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;FILE&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;op&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;isfile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;move&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;

        &lt;span class="n"&gt;fsockr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;r&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;fsockw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;a&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;fsockr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readline&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                        &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
                        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                                        &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
                                        &lt;span class="k"&gt;break&lt;/span&gt;

                        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                                &lt;span class="n"&gt;fsockw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                        &lt;span class="k"&gt;break&lt;/span&gt;

        &lt;span class="n"&gt;fsockr&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;fsockw&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;close&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

        &lt;span class="n"&gt;remove&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;True&lt;/span&gt;

&lt;span class="c1"&gt;# Server, username dan password&lt;/span&gt;
&lt;span class="n"&gt;srv&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pop3.example.com&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;user@example.com&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;passwd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;password&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;POP&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;poplib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;POP3_SSL&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;srv&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;POP&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;POP&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pass_&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;passwd&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;mailnum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;POP&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;stat&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mailnum&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
        &lt;span class="n"&gt;mail&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;POP&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;retr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;

        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;checkhdr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;q&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;compile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;^[a-zA-Z0-9]+[a-zA-Z0-9-_.]+\.[a-z]{2,4}$&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;dom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
                &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;mail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;search&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                                &lt;span class="n"&gt;dom&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CMD&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;ADD&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                        &lt;span class="n"&gt;addlist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dom&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;CMD&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;DELETE&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                        &lt;span class="n"&gt;remlist&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;dom&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

                &lt;span class="n"&gt;POP&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dele&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="n"&gt;POP&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;quit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

&lt;p&gt;That&amp;rsquo;s it, cara yang quick and dirty dan tentunya metode ini jauh dari kata elegan. &lt;/p&gt;</content><category term="How-to"></category><category term="Debian"></category><category term="Linux"></category><category term="Powerdns"></category><category term="Lua"></category></entry><entry><title>Pengenalan systemd</title><link href="//devnull.web.id/debian/pengenalan-systemd.html" rel="alternate"></link><published>2016-02-21T10:41:00+08:00</published><updated>2016-02-21T10:41:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-02-21:/debian/pengenalan-systemd.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;&lt;em&gt;systemd&lt;/em&gt;&lt;/strong&gt;, ditulis dengan huruf kecil, adalah init system baru di Debian Jessie dan belum pernah ada di versi Debian sebelumnya. Tulisan ini adalah sedikit apa yang saya ketahui dari systemd di Debian 8.&lt;/p&gt;
&lt;p&gt;Para pengguna Debian mungkin saja sudah tahu bahwa keputusan Debian untuk mengadopsi systemd sebagai init system melalui …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;&lt;em&gt;systemd&lt;/em&gt;&lt;/strong&gt;, ditulis dengan huruf kecil, adalah init system baru di Debian Jessie dan belum pernah ada di versi Debian sebelumnya. Tulisan ini adalah sedikit apa yang saya ketahui dari systemd di Debian 8.&lt;/p&gt;
&lt;p&gt;Para pengguna Debian mungkin saja sudah tahu bahwa keputusan Debian untuk mengadopsi systemd sebagai init system melalui perdebatan yang panjang antara pro systemd dan kontra systemd yang akhirnya menyebabkan para developer Debian terpecah menjadi dua kubu.&lt;/p&gt;
&lt;h2 id="kontroversi-systemd"&gt;Kontroversi systemd&lt;/h2&gt;
&lt;p&gt;systemd memang mejadi kontroversi karena beberapa hal.
Pertama, sebagian orang menganggap systemd tidak menghormati filosofi Unix. saya ingat ketika awal sekali mengenal Linux, bahwa Linux adalah sistem operasi yang Unix-like dan Unix terkenal dengan filosofi-nya, diantaranya:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Tugas sebuah program adalah melakukan satu hal dan melakukannya dengan baik.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Sistem yang besar dan kompleks merupakan gabungan dari program-program kecil yang bekerja bersama.&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Teks adalah interface yang universal&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Segalanya di Unix adalah file.&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;systemd dianggap tidak conform dengan filosofi Unix diatas sehingga banyak yang menolaknya. systemd awalnya di-develop oleh Lennart Poettering, developer yang sekarang bekerja untuk Red Hat. Lennart Poettering sebelumnya juga membuat program yang kontroversial yaitu Avahi dan PulseAudio. Silahkan baca tentang Lennart Poettering di halaman &lt;a href="https://en.wikipedia.org/wiki/Lennart_Poettering"&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Beberapa kritik terhadap systemd, systemd tidak hanya menjadi init system tapi juga mengambil alih banyak fungsi. Misalnya systemd berusaha mengatur network, cron, fstab, syslog/rsyslog, dll. Artinya systemd bukanlah sebuah program yang melakukan satu hal saja, tapi banyak hal. Kemudian, systemd dikritik karena logging filenya tidak berbasis teks seperti Unix dan Linux log pada umumnya, tapi binary log file.&lt;/p&gt;
&lt;p&gt;Diantara kritik terhadap systemd ada beberapa yang tidak valid, misalnya saja systemd dianggap tidak modular. Lennart Poettering menjawab kritik yang seperti ini di halaman blognya dengan judul &lt;a href="http://0pointer.net/blog/projects/the-biggest-myths.html"&gt;The Biggest Myths&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="lahirnya-devuan-gnulinux"&gt;Lahirnya Devuan GNU/Linux&lt;/h2&gt;
&lt;p&gt;Di Debian sendiri, setelah perdebatan panjang, systemd menjadi default init system di rilis Debian mulai Debian 8. Debian termasuk terlambat karena beberapa distribusi Linux sebelumnya sudah menggunakan systemd seperti Red Hat dan Fedora, Ubuntu, Gentoo, dll.&lt;/p&gt;
&lt;p&gt;Akibat dari keputusan ini, beberapa developer Debian yang menolak systemd membuat distribusi baru berbasis Debian, Debian tanpa systemd yang diberi nama Devuan. Devuan adalah Debian yang masih menggunakan sysvinit, tentang Devuan bisa dilihat di &lt;a href="https://devuan.org/"&gt;https://devuan.org/&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Bagi user seperti Saya, systemd atau bukan systemd tidak banyak pengaruhnya kecuali mempelajari command-command baru. Dan ini pendapat saya setelah beberapa waktu menggunakan Debian 8 dan systemd.&lt;/p&gt;
&lt;p&gt;systemd adalah sistem yang modular. Di Debian 8, implementasi systemd hanya init system dan journal log. Debian menjaga backward compatibility dengan sysvinit, dan antara journal dan rsyslog. Artinya, dari sisi user tidak ada bedanya karena user tetap bisa menggunakan sysvinit dan logging menggunakan rsyslog, command &lt;strong&gt;&lt;em&gt;service &amp;lt;service&amp;gt; (start|stop|restart)&lt;/em&gt;&lt;/strong&gt; tetap bisa digunakan. systemd memang menawarkan banyak fitur seperti networking, cron, dsb tapi itu semua optional, satu-satunya fitur yang tidak bisa dipisahkan dari systemd adalah journald untuk system log, itu pun tidak mematikan service rsyslog dan rsyslog tetap bisa digunakan.&lt;/p&gt;
&lt;p&gt;systemd adalah sistem yang modern, berbanding terbalik dengan sysvinit. Sysvinit memang sudah seharusnya hilang dari dunia per-init-an karena mangatur service melalui script itu tidak mudah dan tidak teratur. Ubuntu pernah membuat pengganti Sysvinit dengan Upstart, tapi kemudian ditinggalkan dan beralih ke systemd. systemd menggunakan file konfigurasi yang disebut unit, cara membuat file unit pun gampang karena konfigurasinya yang ini-style.&lt;/p&gt;
&lt;p&gt;Yang menurut saya kurang adalah sistem logging dengan journald karena file log-nya bukan teks. Sebelumnya, dengan teks logging rsyslog bisa menggunakan tool apa saja seperti cat, grep, tail, atau head, tapi dengan journald hanya bisa menggunakan satu tool yaitu journalctl.&lt;/p&gt;
&lt;h2 id="command-command-systemd"&gt;Command-command systemd&lt;/h2&gt;
&lt;p&gt;Beberapa command systemd yang sering digunakan.&lt;/p&gt;
&lt;p&gt;Untuk me-restart service, systemctl restart. Misalnya merestart apache2&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;systemctl restart apache2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;systemctl juga bisa me-restart beberapa service sekaligus, untuk restart apache2 dan mysql&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;systemctl restart apache2 mysql&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Untuk start, stop dan reload, tinggal ganti restart dengan start, stop atau reload.&lt;/p&gt;
&lt;p&gt;Mengaktifkan service saat start-up, misal mengaktifkan service systemd-networkd&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;systemctl enable systemd-networkd&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Menonaktifkan service saat start-up, misal menonaktifkan service networking&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;systemctl disable networking&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Restart&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;systemctl reboot&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Shutdown&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;systemctl poweroff&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Melihat tanggal dan jam&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;timedatectl&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Set waktu&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;timedatectl set-time &amp;quot;2016-02-21 22:33:44&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Melihat log secara live&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;journalctl -f&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Melihat log untuk service, email server postfix misalnya&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;journalctl -u postfix&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Melihat log dari tanggal 20 sampai 21 Februari&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;journalctl --since &amp;quot;2016-02-20&amp;quot; --until &amp;quot;2016-02-21&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Melihat log dua jam terakhir&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;journalctl --since &amp;quot;2 hours ago&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Masih banyak lagi tentang systemd yang tidak tertulis disini dan belum saya ketahui. Manual untuk systemd bisa dibaca di &lt;a href="https://www.freedesktop.org/software/systemd/man/"&gt;https://www.freedesktop.org/software/systemd/man/&lt;/a&gt;&lt;/p&gt;</content><category term="Debian"></category><category term="Debian"></category><category term="Linux"></category><category term="systemd"></category></entry><entry><title>Hacker dalam kultur korporat</title><link href="//devnull.web.id/esai/hacker-dalam-kultur-korporat.html" rel="alternate"></link><published>2016-02-05T05:03:00+08:00</published><updated>2016-02-05T05:03:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-02-05:/esai/hacker-dalam-kultur-korporat.html</id><summary type="html">&lt;p&gt;Kata &lt;em&gt;&amp;ldquo;hacker&amp;rdquo;&lt;/em&gt; yang saya gunakan dalam artikel ini merujuk pada arti
kata hacker versi hacker, bukan hacker versi yang lain. Hacker yang
dimaksud disini bukan mereka dengan topeng anonymous, pengguna Kali
Linux yang hobinya melakukan vandalisme merusak website atau mencuri
kartu kredit.&lt;br /&gt;
Mungkin saja belum paham bedanya, silahkan baca artikel …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Kata &lt;em&gt;&amp;ldquo;hacker&amp;rdquo;&lt;/em&gt; yang saya gunakan dalam artikel ini merujuk pada arti
kata hacker versi hacker, bukan hacker versi yang lain. Hacker yang
dimaksud disini bukan mereka dengan topeng anonymous, pengguna Kali
Linux yang hobinya melakukan vandalisme merusak website atau mencuri
kartu kredit.&lt;br /&gt;
Mungkin saja belum paham bedanya, silahkan baca artikel yang ditulis
oleh pak RSW tentang &lt;a href="http://romisatriawahono.net/2008/02/27/meluruskan-salah-kaprah-tentang-hacker/"&gt;meluruskan salah kaprah tentang
hacker&lt;/a&gt; atau
essay dalam bahasa Inggris oleh Paul Graham &lt;a href="http://www.paulgraham.com/gba.html"&gt;The Word
&amp;ldquo;Hacker&amp;rdquo;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hacker, aktifitasnya disebut hacking yang menurut Wikipedia adalah
orang-orang yang menyukai tantangan intelektual dan melakukan
memanipulasi batasan-batasan sistem secara kreatif. Sederhananya,
misalnya seseorang mempunyai mobil yang biasanya ada di jalan kemudian
dengan cara yang kreatif orang tersebut bisa membuat mobil tersebut
berenang di air atau terbang, itulah hacker. Istilah hacker umumnya
hanya dibatasi pada dunia komputer dan pemrograman.&lt;br /&gt;
Para hacker inilah yang biasanya mengenal sistem dengan sangat baik dan
memahami dari A sampai Z sistem tersebut, kita bisa bilang bahwa mereka
itu pakar di bidangnya. Di dunia Free / Open Source Software, kita
mengenal ada nama Richard Stallman pendiri GNU yang software-nya banyak
kita pakai sekarang, atau Linus Torvalds pembuat awal Kernel Linux yang
sekarang banyak dipakai dari komputer server sampai Android, dan masih
banyak lagi.&lt;/p&gt;
&lt;p&gt;Ada yang menarik dari aktifitas hacking tersebut, yaitu kultur mereka.
Sebagian besar, mungkin juga semuanya, mereka para hacker itu menyukai
aktifitas hacking sebagai hobi, banyak juga diantara mereka yang
menghasilkan uang dari hobinya tersebut, tapi itu bukan tujuan utamanya.
Kita tahu banyak software Open Source yang sangat bagus kualitasnya,
sebut saja Apache dan Nginx yang dipakai sebagian besar web server di
Internet. Postfix dan Qmail yang dipakai sebagian besar email server,
dan tentu saja distro Linux seperti Debian, CentOS dll. Kita paham bahwa
untuk membuat software dengan kualitas seperti itu usahanya tidak
sedikit, termasuk waktu, tenaga dan pikiran. Meskipun demikian, kita
sebagai pengguna bisa dengan mudah menginstall-nya hanya dengan apt-get
install atau yum install, dan harganya? gratis.&lt;/p&gt;
&lt;p&gt;Di sisi dunia yang lain, ada budaya yang sama sekali terbalik dari
budaya hacking, yaitu budaya korporat yang tujuan utamanya tentu saja
menghasilkan uang. Dari segi expertise, masing-masing akan mengatakan
bahwa mereka yang terbaik di bidangnya, meskipun pada kenyataannya belum
tentu demikian. Salah satu ciri budaya ini yang menurut saya menarik
adalah seperti &amp;ldquo;get the job done&amp;rdquo;, sedangkan prosesnya, apa dan
bagaimana tidak terlalu penting, bahkan jika harus mengeluarkan uang.&lt;/p&gt;
&lt;p&gt;Saya bisa memberi analogi, pernahkah kita bertanya misalnya mengapa
orang pergi ke restoran atau rumah makan kalau mereka bisa masak
sendiri? atau pergi ke bengkel padahal mereka bisa memperbaiki sendiri.
Jawabannya tentu saja bermacam-macam tapi dari analogi tadi, kita bisa
memahami bahwa sebenarnya antara kultur hacking dan kultur korporat ada
titik temu dan diantara banyak perusahaan berbasis Open Source, salah
satu yang menurut saya memahami hal ini adalah Red Hat.&lt;/p&gt;
&lt;p&gt;Red Hat adalah salah satu perusahaan berbasis Open Source, dipenuhi para
hacker dan engineer terbaik dan berhasil menempatkan dirinya pada budaya
korporat. Kita berbicara tentang Open Source sebagai sebuah produk,
bukan seperti service provider yang menggunakan teknologi Open Source
sebagai sarana, seperti Amazon misalnya yang menggunakan teknologi Xen
server untuk bisnis cloud nya.&lt;/p&gt;
&lt;p&gt;Setiap perusahaan pasti bergantung pada teknologi dan membutuhkan solusi
IT, paling sederhananya untuk pengelolaan database. Dan jika bisnis
perusahaan tersebut bukan IT, maka akan sangat tidak masuk akal jika
perusahaan tersebut sampai invest dalam jumlah besar untuk IT apalagi
mempekerjakan seorang pakar IT yang bayarannya mahal. Akan lebih baik
dan efisien jika hal-hal yang berhubungan dengan IT di outsource kan ke
pihak ketiga.&lt;/p&gt;
&lt;p&gt;Tidak jauh berbeda dengan individu, sebuah perusahaan juga perlu merasa
aman dan yakin bahwa mereka menyerahkan urusan IT nya di tangan yang
tepat, yaitu mereka para pakar yang mengetahui sistem dari A sampai Z,
sehingga bisa melakukan &amp;ldquo;hacking&amp;rdquo; pada sistem tersebut ketika ada
masalah.&lt;/p&gt;
&lt;p&gt;Kita ambil contoh antara RHEL dan Debian, dua-duanya distro Linux yang
bagus. Bedanya, Debian hanya dikelola oleh komunitas, berbeda dengan
RHEL yang dikelola Red Hat. Debian adalah distro yang stabil dan solid,
mempunyai user base yang besar dan disukai para hacker dan sysadmin.
Saya tidak pernah memakai RHEL tapi pernah menggunakan Fedora yang
merupakan versi komunitasnya Red Hat. Dari segi Teknis, menurut Saya
Debian lebih bagus manajemen-nya. Antara dpkg-nya Debian dan rpm-nya Red
Hat juga lebih bagus dpkg, tapi tentu saja ini dari opini seorang
pengguna Debian. Tapi, ketika dibawa ke dunia korporasi maka Debian
hampir tidak dapat tempat, RHEL yang dominan. Karena meskipun Debian
bagus tapi tidak ada jaminan dari siapapun, dan ketika timbul masalah
dengan Debian maka &amp;ldquo;you&amp;rsquo;re on your own&amp;rdquo;, tempat mencari bantuan hanya
Google, forum, dan milis. Disini terlihat bahwa faktor penentunya
bukanlan apa, tapi siapa. Lihatlah Microsoft windows yang banyak masalah
itu.&lt;/p&gt;
&lt;p&gt;Pertanyaan berikutnya adalah, mengapa Red Hat bisa berhasil menjual
Linux yang gratis itu? jawabannya adalah karena Red Hat ahli Linux dan
banyak para pakar di Red Hat sehingga banyak perusahaan mempercayakan
solusi IT mereka ke Red Hat.&lt;br /&gt;
Kemudian adalah tentang bagaimana public bisa percaya bahwa Red Hat
benar-benar ahli di bidangnya. Diatas ada saya sebut bagaimana setiap
perusahaan mengklaim bahwa mereka yang terbaik dibidangnya, saya pun
bisa. saya tidak bisa desain web tapi Saya bisa saja katakan bahwa Saya
ahli desain website, yang pada kenyataannya saya menggunakan jasa pihak
ketiga, yang seperti ini sudah sangat umum. Tapi berbeda sekali dengan
Red Hat, Red Hat membuktikannya. Contohnya, Red Hat mempunyai kontribusi
yang besar di project OpenStack, Red Hat juga merupakan kontributor
terbesar di Linux kernel development, dan berbagai project Open Source
yang lain. Red Hat juga memproduksi software yang tidak hanya untuk OS
Red Hat tapi juga distro lain, network manager misalnya.&lt;/p&gt;
&lt;p&gt;Sampai disini, seharusnya skeptisme bisnis berbasis Open Source sudah
terjawab. Software Open Source yang kebanyakan gratis juga bisa menjadi
peluang, seperti udara yang gratis tapi isi angin di tukang tambal ban
juga harus bayar. Adopsi penggunaan software Open Source juga semakin
besar yang tentu saja demand kepada tenaga ahli juga bertambah.&lt;/p&gt;</content><category term="Esai"></category><category term="Linux"></category><category term="Red Hat"></category></entry><entry><title>Convert Database OpenStack Cinder dari Sqlite3 ke MySQL - Debian Jessie</title><link href="//devnull.web.id/openstack/convert-database-openstack-cinder-dari-sqlite3-ke-mysql.html" rel="alternate"></link><published>2016-01-28T18:58:00+08:00</published><updated>2016-01-28T18:58:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-01-28:/openstack/convert-database-openstack-cinder-dari-sqlite3-ke-mysql.html</id><summary type="html">&lt;p&gt;Cinder adalah service block storage di OpenStack. Di instalasi OpenStack
Debian 8 juga ada masalah di databasenya.&lt;/p&gt;
&lt;p&gt;Problem ini baru  Saya ketahui kemudian, padahal Cinder instalasi
sebelumnya sudah berjalan. Ketika mau ditambahkan node baru untuk block
storage, baru ketahuan ternyata ada problem konfigurasi Cinder.&lt;/p&gt;
&lt;p&gt;By default, Cinder menggunakan database sqlite3 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Cinder adalah service block storage di OpenStack. Di instalasi OpenStack
Debian 8 juga ada masalah di databasenya.&lt;/p&gt;
&lt;p&gt;Problem ini baru  Saya ketahui kemudian, padahal Cinder instalasi
sebelumnya sudah berjalan. Ketika mau ditambahkan node baru untuk block
storage, baru ketahuan ternyata ada problem konfigurasi Cinder.&lt;/p&gt;
&lt;p&gt;By default, Cinder menggunakan database sqlite3 sedangkan pada instalasi
ini saya menggunakan MySQL. Kesalahan Saya pada waktu itu tidak
melakukan verifikasi database, saya hanya lihat service Cinder berjalan
dan saya anggap tidak ada masalah, setelah timbul masalah baru diketahui
Cinder menggunakan database Sqlite, padahal di konfigurasi cinder
jelas-jelas saya menggunakan MySQL.&lt;/p&gt;
&lt;p&gt;Konfigurasi Cinder ada di /etc/cinder/cinder.conf.&lt;/p&gt;
&lt;p&gt;Kesalahan pertama, di file konfigurasi tertulis &lt;strong&gt;&lt;em&gt;sql_connection =
mysql://.... &lt;/em&gt;&lt;/strong&gt;yang seharusnya &lt;strong&gt;&lt;em&gt;connection = mysql://..&lt;/em&gt;&lt;/strong&gt;. Ini harus
diganti, bisa dengan sed.&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt;# sed -i &amp;#39;s/sql_connection/connection/&amp;#39; /etc/cinder/cinder.conf&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Kesalahan kedua, line koneksi database diatas dibawah section [ssl] yang
harusnya di section [database]. Ini juga harus dibetulkan.&lt;/p&gt;
&lt;p&gt;Berikutnya, data yang sudah terlanjur ada di Sqlite harus dimigrasikan
ke MySQL. Bagi Saya, ini yang susah karena saya tidak paham Sqlite,
MySQL pun hanya seadanya saja.&lt;/p&gt;
&lt;p&gt;Ini langkah-langkah yang dilakukan:&lt;/p&gt;
&lt;p&gt;Matikan semetara foreign key checking:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;SET foreign_key_checks = 0;&amp;quot;&lt;/span&gt; &amp;gt; cinder-schema.sql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dump skema database, defaultnya database sqlite ada di
/var/lib/cinder/cinder.sqlite :&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ sqlite3 /var/lib/cinder/cinder.sqlite .schema &lt;span class="p"&gt;|&lt;/span&gt; tee -a cinder-schema.sql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Dump data:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ sqlite3 /var/lib/cinder/cinder.sqlite .dump &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;
&amp;gt; grep &lt;span class="s2"&gt;&amp;quot;^INSERT INTO&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; tee cinder-data.sql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sampai sini, sudah ada dua file. cinder-schema.sql yang berisi skema
database dan cinder-data.sql yang berisi data. Berikutnya file-file ini
harus diedit supaya conform dengan MySQL.&lt;/p&gt;
&lt;p&gt;Hapus statement yang tidak perlu:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ sed -i &lt;span class="s1"&gt;&amp;#39;/PRAGMA/d; /BEGIN TRANSACTION;/d; /COMMIT;/d&amp;#39;&lt;/span&gt; cinder-schema.sql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Di skema tersebut ada kolom binary tidak diquote dan key dengan double
quote. keduanya harus di quote dengan backtick (`). Kemudian di file
cinder-data.sql, semua table dengan double quote juga harus diganti
dengan backtick&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;$&lt;/span&gt; &lt;span class="n"&gt;sed&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;s/&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;key&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;/`key`/&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;cinder&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;sql&lt;/span&gt;
&lt;span class="n"&gt;$&lt;/span&gt; &lt;span class="n"&gt;sed&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;s/binary/`binary`/&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;cinder&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;schema&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;sql&lt;/span&gt;
&lt;span class="n"&gt;$&lt;/span&gt; &lt;span class="n"&gt;sed&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;s/INSERT INTO &lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt;/INSERT INTO `/&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;cinder&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;sql&lt;/span&gt;
&lt;span class="n"&gt;$&lt;/span&gt; &lt;span class="n"&gt;sed&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;s/&lt;/span&gt;&lt;span class="se"&gt;\&amp;quot;&lt;/span&gt;&lt;span class="s1"&gt; VALUES/` VALUES/&amp;#39;&lt;/span&gt; &lt;span class="n"&gt;cinder&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="k"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;sql&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Setelah itu, gabungkan kedua file diatas:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ cat cinder-data.sql &amp;gt;&amp;gt; cinder-schema.sql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Hidupkan kembali foreign check:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;SET foreign_key_checks = 1;&amp;quot;&lt;/span&gt; &amp;gt;&amp;gt; cinder-schema.sql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;File cinder-schema.sql sudah berisi command yang conform dengan MySQL
dan tinggal diimport. Kalau database belum ada, harus dibuat dulu dan
kalau database sudah ada, table-table nya harus di drop dulu semua.&lt;/p&gt;
&lt;p&gt;Import database, dengan asumsi user database-nya cinder dan nama
databasenya cinderdb:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;$ mysql -u cinder -p cinderdb &amp;lt; cinder-schema.sql
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Restart Cinder:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="err"&gt; # systemctl restart cinder-api.service   &lt;/span&gt;
&lt;span class="err"&gt; &amp;gt; cinder-volume.service   &lt;/span&gt;
&lt;span class="err"&gt; &amp;gt; cinder-scheduler.service&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Sampai disini seharusnya Cinder sudah bisa berjalan dengan Mysql dan
komunikasi antar block storage node sudah bisa.&lt;/p&gt;</content><category term="OpenStack"></category><category term="Debian"></category><category term="OpenStack"></category><category term="Linux"></category></entry><entry><title>Openstack Deployment di Debian 8</title><link href="//devnull.web.id/openstack/openstack-deployment-debian8.html" rel="alternate"></link><published>2016-01-22T07:16:00+08:00</published><updated>2016-01-22T07:16:00+08:00</updated><author><name>Dhani Setiawan</name></author><id>tag:devnull.web.id,2016-01-22:/openstack/openstack-deployment-debian8.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;Openstack Deployment&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Berhubung Debian Squeeze LTS memasuki masa EOL bulan Pebruari nanti dan
server yang kami pakai masih menggunakan OS tersebut, maka OS server
harus diupgrade ke Debian Stable saat ini, versi 8.2 dengan codename
Jessie.&lt;br /&gt;
Sebelumnya server-server ini berjalan di lingkungan virtualisasi Xen.
Tapi karena saat ini sepertinya …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Openstack Deployment&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Berhubung Debian Squeeze LTS memasuki masa EOL bulan Pebruari nanti dan
server yang kami pakai masih menggunakan OS tersebut, maka OS server
harus diupgrade ke Debian Stable saat ini, versi 8.2 dengan codename
Jessie.&lt;br /&gt;
Sebelumnya server-server ini berjalan di lingkungan virtualisasi Xen.
Tapi karena saat ini sepertinya setiap orang membicarakan Openstack,
maka saya putuskan untuk ikut latah Openstack.&lt;/p&gt;
&lt;p&gt;Hypervisor yang dipilih untuk Openstack adalah KVM dengan alasan karena
guest os yang berjalan tidak perlu aware virtualisasi seperti ketika
menggunakan Xen.&lt;/p&gt;
&lt;p&gt;Dan inilah, setelah beberapa hari bersama Openstack dan Debian Jessie.&lt;br /&gt;
Tentang Openstack, Openstack adalah cloud platform yang sifatnya
modular dan ini merupakan nilai plus karena memberikan kebebasan pilihan
kepada sysadmin. Openstack awalnya merupakan project kerjasama antara
Rackspace dan NASA, namun sejak 2012 Openstack menjadi project dibawah
nama Openstack Foundation.&lt;/p&gt;
&lt;p&gt;Ada banyak service Openstack, tapi beberapa saja yang dipakai disini.&lt;br /&gt;
&lt;strong&gt;Keystone&lt;/strong&gt;&lt;br /&gt;
Keystone adalah identity service dari Openstack, disini semuanya
dimanage dari tenant, service, user, dll.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Nova&lt;/strong&gt;&lt;br /&gt;
Nova service untuk computing resource, disini virtualisasi berjalan.
Nova bertanggung jawab untuk mengalokasikan resource seperti cpu dan
memori. Nova bisa menggunakan hypervisor Qemu, Kvm, Xen, atau mungkin
juga VMware vSphere.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Neutron&lt;/strong&gt;&lt;br /&gt;
Neutron service merupakan NaaS (Network as a service). Meskipun hampir
setiap hari berhubungan dengan networking, tapi konsep Neutron ini yang
paling susah untuk dipahami, untuk kapasitas saya maksudnya. Selain
karena baru mengenal Network as a service, Neutron juga menggunakan
istilah-istilah yang asing di dunia jaringan seperti floating ip, fixed
ip.&lt;br /&gt;
Dengan Neutron user bisa bebas memanage jaringan virtualnya sendiri
seperti membuat router virtual, mengatur topologi jaringan, menambahkan
port di router, manage ip address, firewall dsb, dan itu semua virtual.&lt;br /&gt;
Meskipun awalnya susah dipahami, tapi setelah cukup paham, Neutron ini
jadi salah satu hal paling keren di Openstack.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cinder&lt;/strong&gt;&lt;br /&gt;
Cinder adalah block storage service. Cinder bisa menggunakan lvm dan
iscsi sebagai backend. Lvm dan iscsi sudah umum di dunia per-storage-an
dan Cinder hanya sebagai wrapper, jadi tidak ada yang baru.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Glance&lt;/strong&gt;&lt;br /&gt;
Glance adalah image service, tugasnya memanage image. Image bisa
berformat qcow2, img, raw, iso, dll.&lt;/p&gt;
&lt;p&gt;Deployment yang ini menggunakan Openstack Juno. Di Debian 8, Openstack
belum masuk ke repository stable jadi menggunakan repository Debian
Backports. Dan karena belum ada Openstack stable, deployment juga ada
kendala disana-sini.&lt;br /&gt;
Beberapa diantaranya:&lt;br /&gt;
&lt;strong&gt;Konfigurasi&lt;/strong&gt;&lt;br /&gt;
Di section keystone di tiap-tiap konfigurasi service, harus menggunakan
auth_uri dan identity_uri bukan auth yang terpisah-pisah.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Openvswitch&lt;/strong&gt;&lt;br /&gt;
Neutron menggunakan plugin openvswitch. Masalahnya, pertama service
networking di Debian 8 tambah tidak konsisten mengatur link dan network
jadi harus menggunakan systemd-networkd. Systemd-networkd lebih bagus
dari ifup yang tradisional itu, tapi belum ada konfigurasi untuk
openvswitch di systemd-networkd. Jadi waktu boot, network interface yang
dipakai openvswitch tidak bisa up otomatis. Workaround yang saya pakai
dengan menambahkan baris &amp;ldquo;/sbin/ip link set eth0 up&amp;rdquo; di /etc/rc.local.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Dual stack ipv4 dan ipv6&lt;/strong&gt;&lt;br /&gt;
Implementasi dual stack ip di Openstack Juno belum sepenuhnya berjalan
karena memang support dual stack baru direncanakn oleh Openstack di
release Kilo, Kilo adalah Openstack setelah Juno.&lt;br /&gt;
Meskipun ada limitasi tersebut, bukan berarti tidak bisa dual stack.
Dengan sedikit shell script akhirnya ipv6 bisa digunakan.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Kesimpulan&lt;/strong&gt;&lt;br /&gt;
Meskipun ada kendala, tapi secara keseluruhan Openstack di Debian 8.2
bisa berjalan dengan baik.&lt;br /&gt;
Untuk Openstack, saya merasa platform cloud ini bisa mengakomodasi
trend cloud computing yang semakin hari demand-nya semakin besar.
Openstack sangat layak dipelajari meskipun harus belajar bahasa Python,
karena Openstack ditulis menggunakan bahasa Python. Siapapun yang punya
background programming pasti tidak kesulitan mempelajari Python karena
bahasanya yang high level.&lt;br /&gt;
Menariknya, Openstack menyediakan API untuk memanage service-nya. Jadi
kalau berencana membangun bisnis dengan Openstack, hanya tinggal membuat
program openstack client nya, atau bisa juga menggunakan horizon, web ui
Openstack.&lt;/p&gt;
&lt;p&gt;Kalau masih meragukan Openstack, dibawah ini link cloud provider besar
yang menggunakan Openstack sebagai bisnisnya:&lt;br /&gt;
- Rackspace: &lt;a href="https://www.rackspace.com/"&gt;https://www.rackspace.com/&lt;/a&gt;&lt;br /&gt;
- Cloudscaling: &lt;a href="http://www.cloudscaling.com/"&gt;http://www.cloudscaling.com/&lt;/a&gt;&lt;br /&gt;
- Mirantis: &lt;a href="https://www.mirantis.com/"&gt;https://www.mirantis.com/&lt;/a&gt;&lt;br /&gt;
- Canonical: &lt;a href="http://www.ubuntu.com/cloud/openstack"&gt;http://www.ubuntu.com/cloud/openstack&lt;/a&gt;&lt;br /&gt;
- Red Hat:
&lt;a href="https://www.redhat.com/en/technologies/linux-platforms/openstack-platform"&gt;https://www.redhat.com/en/technologies/linux-platforms/openstack-platform&lt;/a&gt;&lt;br /&gt;
- HP: &lt;a href="http://www8.hp.com/us/en/cloud/hphelion-platform.html"&gt;http://www8.hp.com/us/en/cloud/hphelion-platform.html&lt;/a&gt;&lt;br /&gt;
- And many more&amp;hellip;&lt;/p&gt;
&lt;p&gt;Lebih lanjut tentang Openstack &lt;a href="https://www.openstack.org/"&gt;https://www.openstack.org/&lt;/a&gt;&lt;/p&gt;</content><category term="OpenStack"></category><category term="OpenStack"></category><category term="Debian"></category><category term="Linux"></category></entry></feed>