Artikel:Berbicara langsung dengan server
[draft artikel untuk infolinux]
Berbicara langsung dengan server
Kadang-kadang dalam melakukan penyelesaian masalah (troubleshooting)
sebuah service, kita perlu mengetes langsung dengan berkomunikasi
dengan server, tanpa bantuan program klien, untuk mengetahui pesan
kesalahan persis dari server. Contohnya, jika gagal mengambil email
via POP atau mengirim email via SMTP, banyak program klien email
termasuk Mozilla Thunderbird tidak melaporkan pesan kesalahan yang
cukup detil. Malah kadang-kadang program klien tertentu, atas nama
"user friendliness", hanya melaporkan pesan kesalahan standar seperti
ini: "Telah terjadi sebuah kesalahan. Silakan coba beberapa saat lagi,
atau hubungi admin Anda." Kesalahan seperti apa? Di mana? Penyebabnya
apa? Bagaimana cara saya bisa memperbaikinya selain mencoba lagi atau
menghubungi admin? Sebab, sayalah adminnya!
Untunglah, protokol-protokol internet sebagian besar sifatnya teks dan
terdokumentasi dengan baik lewat dokumen-dokumen bernama RFC. Untuk
berkomunikasi langsung dengan sebuah service internet, seringkali kita
hanya membutuhkan program telnet saja dan langsung mengetikkan
dengan tangan perintah-perintah dalam bahasa protokol yang sesuai.
Artikel ini menjelaskan beberapa protokol popular disertai cara
pemakaian umumnya.
Menggunakan program telnet
Program telnet digunakan untuk konek ke sebuah mesin/server
tertentu dan ke port tertentu lalu kita dapat mengirimkan perintah
dengan mengetikkan langsung, dan kita juga akan mendapatkan respon
output dari si server. Dengan kata lain, kita berinteraksi langsung
dengan sebuah server. Setelah konek, kita lalu perlu "berbahasa"
protokol yang sesuai dengan aplikasi server yang kita
hubungi. Misalnya jika kita menghubungi port 80, maka kemungkinan
besar kita harus berbicara protokol HTTP. Jika ke port 25, maka
protokol SMTP, dst.
Catatan: Jangan dibingungkan antara protokol internet yang disebutkan
di artikel ini dengan "protokol telnet" (port 23) yaitu yang digunakan
untuk login ke shell sebuah mesin. Protokol ini telah amat tua dan
ditinggalkan karena tidak aman, dan kini biasanya diganti dengan
protokol SSH (port 22).
Program telnet sendiri adalah program generik untuk konek port
mana saja dan host mana saja.
Di Unix/Linux, untuk menjalankan telnet:
$ telnet HOSTNAME_ATAU_IP PORT
Contoh:
$ telnet tokoku.com 80
Untuk keluar dari sesi telnet, tekan tombol Ctrl-] (tahan Control
setelah itu tekan tombol berlabel kurung siku tutup), lalu tekan
Enter. Anda akan kembali ke prompt telnet. Tekan Ctrl-D atau ketik
quit diikuti Enter.
Di Windows juga tersedia program telnet. Anda dapat menjalankannya
dari Start Menu > Run... lalu ketik telnet diikuti Enter. Atau bukalah
terlebih dahulu Command Prompt, lalu ketik telnet diikuti Enter.
Defaultnya localecho di program telnet Windows dimatikan, jadi jika
kita mengetik perintah ke sebuah server maka kita sendiri tidak
melihat apa yang kita ketikkan. Maka kita harus menyalakannya dulu
agar bisa lebih mudah bekerja.
Setelah mengetik telnet, ketikkan:
set localecho
Barulah konek ke server yang diinginkan dengan perintah o,
misalnya (perhatikan urutan: huruf "o" kecil, spasi, hostname, spasi,
port):
o tokoku.com 80
Sama seperti di Unix/Linux, untuk keluar dari sesi telnet, tekan
tombol Ctrl-] (tahan Control setelah itu tekan tombol berlabel kurung
siku tutup), lalu tekan Enter. Anda akan kembali ke prompt
telnet. Tekan Ctrl-Z atau ketik quit diikuti Enter.
Troubleshooting program telnet
Jika Anda menerima pesan kesalahan "Connection refused", artinya di
server tidak ada daemon/program/service yang listen di port
tersebut. Atau bisa juga karena firewall di sisi Anda atau di sisi
server.
Jika saat ingin konek, hasilnya diam saja atau timeout, bisa jadi
karena koneksi Anda lambat atau ada firewall di sisi Anda/server.
Berbicara dengan web server
Oke, setelah mulai familiar dengan program telnet, mari kita mencoba
berbicara dengan service paling popular di seantero jagad internet,
yaitu web, yang menggunakan protokol HTTP (Hyper Text Transfer
Protocol). Untuk berbicara langsung dengan server HTTP, kita dapat
menggunakan program telnet dan konek ke port HTTP (defaultnya 80, tapi
dapat berbeda).
Sekilas protokol HTTP. Klien mengirimkan HTTP request berupa: 1
baris request, diikusi dengan nol atau lebih baris header, diakhiri
dengan baris kosong (dan dapat diikuti informasi tambahan). Server
akan mengirimkan HTTP response berupa 1 baris respon, diikuti nol atau
lebih baris header, diikuti bodi respon.
Sintaks baris request:
METODE URI PROTOKOL
METODE misalnya GET, HEAD, POST, dll. URI misalnya "/" (untuk
meminta halaman utama), "/path/file.html?id=123", dll. PROTOKOL dapat
berupa HTTP/1.0 atau HTTP/1.1.
Contoh baris request:
GET / HTTP/1.0
Contoh lain:
HEAD / HTTP/1.0
Sintaks header:
NAMA_HEADER: NILAI_HEADER
Contoh:
User-Agent: Mozilla/1.0
Contoh lain:
Pragma: no-cache
Sintaks baris respon:
PROTOKOL KODE_RESPON KETERANGAN
PROTOKOL adalah HTTP/1.0 atau HTTP/1.1. KODE_RESPON adalah angka 3
digit, 2xx artinya berhasil, 3xx artinya redirection, 4xx artinya ada
kesalahan di sisi klien, 5xx artinya ada kesalahan di sisi
server. Kode-kode umum adalah 200 (OK), 302, 303, 401, 403
(Forbidden), 404 (Not Found), 500 (Internal server error). Kode
lengkap dapat dilihat di RFC.
Contoh:
HTTP/1.0 200 OK
Contoh lain:
HTTP/1.1 404 Not Found
Berikut ini contoh lengkap sebuah sesi HTTP. Yang dicetak tebal adalah
yang kita ketikkan.
Meminta halaman http://www.yahoo.com/:
$ telnet www.yahoo.com 80
Trying www.yahoo.com...
Connected to www.yahoo.com.
Escape character is '^]'.
GET / HTTP/1.0
HTTP/1.0 200 OK
Date: Fri, 16 Mar 2007 04:24:16 GMT
P3P: policyref="http://p3p.yahoo.com/w3c/p3p.xml", CP="CAO DSP COR
CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi
NRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE
GOV"
Content-Type: text/html
X-Cache: MISS from server.localdomain
Connection: close
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML...
Tip: Untuk mengintip trafik HTTP, Anda bisa pula menggunakan fitur di
browser seperti misalnya menggunakan plugin HTTPWatch di Internet
Explorer, atau add-on seperti Firebug di Firefox. Di wget ada opsi -S
("server response") untuk melihat header yang dikembalikan server. Di
curl ada opsi -D ("dump headers").
Spesifikasi protokol HTTP ada di RFC 2616.
Berbicara dengan mail server POP
Protokol POP3 (Post Office Protocol version 3) adalah protokol untuk
mengambil email dari server. Untuk berbicara langsung dengan server
POP3, kita dapat menggunakan program telnet dan konek ke port POP3
(defaultnya 110, tapi dapat berbeda).
Sekilas protokol POP3. Pertama Anda login dengan memasukkan
username dan password:
USER username
PASS pass
Lalu Anda dapat mendaftar jumlah mail yang ada di mailbox dengan
perintah LIST:
LIST
Outputnya adalah daftar nomor urut dan ID message.
Untuk mengambil sebuah email digunakan perintah RETR ("retrieve"):
RETR nomor_urut_message
Untuk menghapus dapat digunakan perintah DELE ("delete"):
DELE nomor_urut_message
Daftar perintah selengkapnya dapat dilihat di RFC.
Berikut ini sebuah contoh sesi POP3. Yang dicetak tebal adalah yang
kita ketikkan.
Login yang berhasil:
$ telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Hello there.
USER steven@steven.builder.localdomain
+OK Password required.
PASS xxx
+OK logged in.
Login yang gagal:
USER steven@steven.builder.localdomain
+OK Password required.
PASS xxxxx
-ERR Login failed.
Melihat email yang ada di mailbox:
LIST
+OK POP3 clients that break here, they violate STD53.
1 3273
2 14047
.
Mengambil sebuah email:
RETR 1
+OK 3273 octets follow.
Delivered-To: xxxxxxxxxxxxxxxxxxxxxx
Received: (qmail 20932 invoked from network); 16 Mar 2007 02:27:18 -0000
Received: from unknown (HELO xxxxxxxxxxx ...
...(dst)...
.
Menghapus sebuah message:
DELE 1
+OK Deleted.
Keluar:
QUIT
+OK Bye-bye.
Connection closed by foreign host.
Spesifikasi protokol POP3 ada di RFC 1989.
Berbicara dengan mail server SMTP
Protokol SMTP (Simple Mail Transfer Protocol) digunakan untuk mengirim
email. Untuk berbicara langsung dengan server SMTP, kita dapat
menggunakan program telnet dan konek ke port SMTP (defaultnya 25, tapi
dapat berbeda). Ada juga port 587 (submission) yang juga digunakan
untuk mengirim email.
Catatan: jika ingin mengirim email untuk domain katakanlah yahoo.com,
terlebih dahulu kita harus mencari tahu MX record untuk yahoo.com
tersebut, misalnya:
$ host -t mx yahoo.com
yahoo.com mail is handled by 1 d.mx.mail.yahoo.com.
yahoo.com mail is handled by 1 e.mx.mail.yahoo.com.
yahoo.com mail is handled by 1 f.mx.mail.yahoo.com.
yahoo.com mail is handled by 1 g.mx.mail.yahoo.com.
yahoo.com mail is handled by 1 a.mx.mail.yahoo.com.
yahoo.com mail is handled by 1 b.mx.mail.yahoo.com.
yahoo.com mail is handled by 1 c.mx.mail.yahoo.com.
Maka kita dapat mencoba menghubungi salah satu MX mis:
$ telnet d.mx.mail.yahoo.com 25
Kita tidak menghubungi langsung yahoo.com di port 25 karena belum
tentu MX untuk domain yahoo.com itu ada di mesin yang sama dengan
yahoo.com.
Sekilas protokol SMTP. Setelah konek, server akan memberikan
baris banner (welcome message). Klien mengirimkan baris
perintah. Server mengirimkan baris respon berupa kode hasil 3 digit
diikuti keterangan. Kode 2xx artinya berhasil, kode 4xx artinya
terjadi kesalahan temporer dan klien dipersilakan mencoba lagi
beberapa saat mendatang, kode 5xx artinya terjadi kesalahan permanen.
Contoh, kita ingin mengirim email ke steven@serverku.com. Pertama
kita mencari tahu MX untuk domain ini:
$ host -t mx serverku.com
serverku.com mail is handled by 10 mail.serverku.com.
$ telnet mail.serverku.com 25
Trying 203.130.198.32...
Connected to mail.serverku.com.
Escape character is '^]'.
220 serverku.com ESMTP ready (Spanel-SMTPD 0.4.5-sp1.3)
Lalu kita sebutkan siapa pengirimnya:
MAIL FROM:<pengirim@domain.com>
250 OK(250)
Jika tidak ingin menyebutkan pengirimnya (Return-Path kosong), kita
bisa menuliskan:
MAIL FROM:<>
Lalu kita sebutkan penerimanya:
RCPT TO:<steven@serverku.com>
250 OK(250)
Baris RCPT ini dapat diulang untuk penerima-penerima yang lainnya jika
ada, mis kita ingin mengirim email ini ke 3 orang lainnya di domain
yang sama:
RCPT TO:<user2@serverku.com>
RCPT TO:<user2@serverku.com>
...
Catatan: jika domainnya berbeda, misalnya budi@yahoo.com, maka tentu
kita harus menghubungi MX yahoo.com dan bukan di serverku.com.
Lalu kirimkanlah bodi emailnya. Akhiri dengan sebuah baris berisi titik:
DATA
354 GO_AHEAD(354)
Subject: test
Ini hanya sebuah tes, harap abaikan
.
250 QUEUED(250) - e5326248c623f66e8105345a3e3135dd
Untuk keluar:
QUIT
221 BYE(221)
Connection closed by foreign host.
Contoh lengkap sebuah sesi SMTP, mengirim email dan sukses:
$ telnet serverku.com 25
Trying 203.130.198.32...
Connected to serverku.com.
Escape character is '^]'.
220 serverku.com ESMTP ready (Spanel-SMTPD 0.4.5-sp1.3)
MAIL FROM:<pengirim@domain.com>
250 OK(250)
RCPT TO:<steven@serverku.com>
250 OK(250)
DATA
354 GO_AHEAD(354)
Subject: test
Ini hanya sebuah tes, harap abaikan
.
250 QUEUED(250) - fd641de480641ec3c3fb0eae5d2deedd
QUIT
221 BYE(221)
Connection closed by foreign host.
Contoh mengirim email yang ditolak karena user tidak dikenali:
RCPT TO:<xxx@serverku.com>
550 ERR_UNKNOWN_USER(550) - I couldn't find that mail user here
Otentikasi. Kadang untuk mengirim secara relay (mengirim ke
domain lain), sebuah server membutuhkan otentikasi. Protokol
otentikasi adalah sbb:
AUTH LOGIN
server akan merespon minta username
ketikkan-username-yang-diencode-menggunakan-base64
server akan merespon minta password
ketikkan-password-yang-diencode-menggunakan-base64
server akan memberitahu auth kita benar atau salah
Untuk mengencode base64, dapat digunakan skrip berikut:
$ perl -MMIME::Base64 -e'print encode_base64("1234")'
MTIzNA==
Artinya '1234' jika diencode akan menjadi 'MTIzNA=='.
Contoh SMTP authentication: (misalnya usernamenya adalah
'steven@serverku.com' dan passwordnya adalah '1234', yang jika
diencode akan menjadi 'c3RldmVuQHNlcnZlcmt1LmNvbQ==' dan 'MTIzNA=='.
$ telnet serverku.com 25
Trying 203.130.198.32...
Connected to serverku.com.
Escape character is '^]'.
220 serverku.com ESMTP ready (Spanel-SMTPD 0.4.5-sp1.3)
AUTH LOGIN
334 VXNlcm5hbWU6
c3RldmVuQHNlcnZlcmt1LmNvbQ==
334 UGFzc3dvcmQ6
MTIzNA==
Spesifikasi SMTP ada di RFC 2821.
Berbicara dengan server mail IMAP
Protokol IMAP (Internet Message Access Protocol) digunakan untuk
mengakses dan memanipulasi pesan dan mailbox mail di server. Untuk
berbicara langsung dengan server IMAP, kita dapat menggunakan program
telnet dan konek ke port IMAP (defaultnya 143, tapi dapat berbeda).
Sekilas protokol IMAP. Setiap baris request dari klien perlu
diprefiks (diawali) dengan sebuah string penanda. Pada contoh-contoh
di artikel ini digunakan a001.
Login:
$ telnet mail.host.com 143
Trying 1.2.3.4...
Connected to mail.host.com
Escape character is '^]'.
* OK [CAPABILITY IMAP4REV1 LITERAL+ SASL-IR LOGIN-REFERRALS AUTH=LOGIN] mail.host.com IMAP4rev1 2004.350 at Fri, 16 Mar 2007 13:51:21 -0500 (CDT)
a01 LOGIN someuser somepass
RESPONSE: a001 OK User logged in
Mengetahui capability IMAP service:
a001 CAPABILITY
* CAPABILITY IMAP4REV1 LITERAL+ IDLE NAMESPACE MAILBOX-REFERRALS BINARY UNSELECT SCAN SORT THREAD=REFERENCES THREAD=ORDEREDSUBJECT MULTIAPPEND SASL-IR LOGIN-REFERRALS AUTH=LOGIN
a001 OK CAPABILITY completed
Logout:
a001 LOGOUT
* BYE mail.host.com IMAP4rev1 server terminating connection
a002 OK LOGOUT completed
Connection closed by foreign host.
Melihat daftar mailbox yang ada (pada contoh, semua anak Inbox):
a001 LIST "Inbox" "*"
* LIST (\HasNoChildren) "." "INBOX.omail.log.old"
* LIST (\HasChildren) "." "INBOX.omail.log"
* LIST (\HasNoChildren) "." "INBOX.Trash"
* LIST (\HasNoChildren) "." "INBOX.Spam"
* LIST (\HasNoChildren) "." "INBOX.Sent"
* LIST (\HasNoChildren) "." "INBOX.Drafts"
* LIST (\Noselect \HasChildren) "." "INBOX.omail"
a001 OK LIST completed
Men-select sebuah mailbox (pada contoh, bernama INBOX):
a001 SELECT INBOX
* FLAGS (\Answered \Flagged \Draft \Deleted \Seen)
* OK [PERMANENTFLAGS (\Answered \Flagged \Draft \Deleted \Seen \*)]
* 1242 EXISTS
* 0 RECENT
* OK [UIDVALIDITY 1062186210]
* OK [UIDNEXT 1246]
a03 OK [READ-WRITE] Completed
Mendaftar semua message yang ada pada sebuah mailbox yang sedang
di-select:
a001 FETCH 1:* FLAGS
* 1 FETCH (FLAGS (\Seen))
* 2 FETCH (FLAGS (\Seen))
* 3 FETCH (FLAGS (\Seen))
* 4 FETCH (FLAGS (\Seen))
* 5 FETCH (FLAGS (\Seen))
* 6 FETCH (FLAGS (\Seen \Answered))
...
a001 OK FETCH completed
Mengambil header-header sebuah message (pada contoh, urutan pertama
dan mengambil full headers).
a001 FETCH 1 full
* 1 FETCH (FLAGS (\Seen) INTERNALDATE "15-Mar-2000 13:10:14 -0500" RFC822.SIZE 1
553 ENVELOPE ("Wed, 15 Mar 2007 13:10:11 -0600" "Perl Stuff" (("Rusty Nejdl" NIL
"rnejdl" "verio.net")) (("Rusty Nejdl" NIL "rnejdl" "verio.net")) (("Rusty Nejd
l" NIL "rnejdl" "verio.net")) ((NIL NIL "rnejdl" "verio.net")) ((NIL NIL "ttodd"
"verio.net")) NIL NIL "<20000315131011.A5381@tethys.ringofsaturn.com>") BODY ("
TEXT" "PLAIN" ("CHARSET" "us-ascii") NIL NIL "7BIT" 359 9))
a001 OK FETCH completed
Mengambil bodi message:
a001 FETCH 1 body[text]
Set quota:
a001 SETQUOTA "" (STORAGE 512)
Get quota:
a001 GETQUOTA ""
* QUOTA "" (STORAGE 10 512)
a001 OK Getquota completed
Get quota root:
a001 GETQUOTAROOT "Inbox"
Spesifikasi IMAP ada di RFC 3501.
|