Product SiteDocumentation Site

10.2. Virtual Private Network

Sebuah Virtual Private Network (disingkat VPN) adalah suatu cara untuk menyambung dua jaringan lokal yang berbeda melalui Internet melalui suatu tunnel; tunnel biasanya dienkripsi untuk kerahasiaan data. VPN sering dipakai untuk mengintegrasikan suatu mesin di lokasi jauh ke dalam suatu jaringan lokal perusahaan.
Beberapa perkakas menyediakan ini. OpenVPN adalah suatu solusi yang efisien, mudah digelar dan dipelihara, berbasis SSL/TLS. Kemungkinan lain adalah memakai IPsec untuk mengenkripsi lalu lintas IP antara dua mesin; enkripsi ini transparan, yang berarti bahwa aplikasi yang berjalan pada host-host ini tidak perlu dimodifikasi untuk melibatkan VPN. SSH juga bisa menyediakan suatu VPN, selain fitur-fitur konvensionalnya. Terakhir, suatu VPN dapat dijalin memakai protokol PPTP Microsoft. Solusi-solusi lain ada, tapi di luar fokus buku ini.

10.2.1. OpenVPN

OpenVPN adalah perangkat lunak yang didedikasikan untuk menciptakan virtual private network. Penyiapannya melibatkan menciptakan antarmuka jaringan virtual VPN server dan klien; tun (untuk tunnel level IP) dan antarmuka tap (tunnel level terowongan) yang didukung. Dalam prakteknya, antarmuka tun akan paling sering digunakan kecuali ketika klien VPN yang dimaksudkan untuk diintegrasikan ke dalam jaringan lokal server melalui bridge Ethernet.
OpenVPN mengandalkan OpenSSL untuk semua kriptografi SSL/TLS dan fitur terkait (kerahasiaan, otentikasi, integritas, non-repudiation). Hal ini dapat dikonfigurasi dengan kunci pribadi bersama atau menggunakan sertifikat X.509 berdasarkan infrastuktur kunci publik. Konfigurasi terakhir ini sangat disukai karena memungkinkan fleksibilitas yang lebih besar ketika dihadapkan dengan meningkatnya jumlah pengguna roaming yang mengakses VPN.

10.2.1.1. Infrastruktur Kunci Publik: easy-rsa

Algoritme RSA banyak dipakai dalam kriptografi kunci publik. Ini melibatkan suatu "pasangan kunci", yang terdiri dari sebuah kunci privat dan publik. Kedua kunci terkait dekat satu sama lain, dan properti matematisnya sedemikian sehingga sebuah pesan yang dienkripsi dengan kunci kunci publik hanya dapat didekripsi oleh seseorang yang mengetahui kunci privatnya, yang memastikan kerahasiaan. Pada arah yang berlawanan, sebuah pesan yang dienkripsi dengan kunci privatnya dapat didekripsi oleh siapapun yang mengetahui kunci publiknya, yang mengizinkan otentikasi asal-usul dari suatu pesan karena hanya seseorang yang punya akses ke kunci privat yang dapat membuatnya. Ketika dihubungkan dengan dengan sebuah fungsi hash digital (MD5, SHA1, atau varian yang lebih terkini), ini mengarah ke suatu mekanisme tanda tangan yang dapat diterapkan ke sebarang pesan.
Namun, siapapun dapat mencipta suatu pasangan kunci, menyimpan sebarang identitas padanya, dan menyaru menjadi identitas pilihan mereka. Satu solusi melibatkan konsep Certification Authority (CA), diformalkan oleh standar X.509. Istilah ini mencakup suatu entitas yang menyimpan suatu pasangan kunci terpercaya yang dikenal sebagai sertifikat root. Sertifikat ini hanya dipakai untuk menandatangani sertifikat lain (pasangan kunci), setelah langkah-langkah yang tepat dilaksanakan untuk memeriksa identitas yang disimpan dalam pasangan kunci. Aplikasi-aplikasi yang memakai X.509 kemudian dapat memeriksa sertifikat yang disajikan ke mereka, bila mereka tahu tentang sertifikat root yang terpercaya.
OpenVPN mengikuti aturan ini. Karena CA publik hanya mengeluarkan sertifikat dengan biaya (yang mahal), dimungkinkan untuk membuat otoritas sertifikasi pribadi dalam perusahaan. Paket easy-rsa menyediakan alat untuk melayani sebagai infrastruktur sertifikasi X.509, diimplementasikan sebagai satu set skrip menggunakan perintah openssl .
Para admin Falcot Corp memakai perkakas ini untuk membuat sertifikat-sertifikat yang diperlukan, untuk server dan klien. Ini memungkinkan konfigurasi semua klien serupa karena mereka hanya perlu menyiapkan agar mempercayai sertifkat yang datang dari CA lokal Falcot. CA ini adalah sertifikat pertama yang dibuat; sampai titik ini, para administrator menyiapkan sebuah direktori dengan berkas-berkas yang diperlukan bagi CA dalam suatu lokasi yang sesuai, lebih disukai pada sebuah mesin yang tidak tersambung ke jaringan untuk memitigasi risiko kunci privat CA dicuri.
$ make-cadir pki-falcot
$ cd pki-falcot
Mereka kemudian menyimpan parameter-parameter yang diperlukan ke dalam berkas vars, terutama mereka dengan nama berawalan KEY_; variabel-variabel ini kemudian diintegrasikan ke dalam lingkungan:
$ vim vars
$ grep KEY_ vars
export KEY_CONFIG=`$EASY_RSA/whichopensslcnf $EASY_RSA`
export KEY_DIR="$EASY_RSA/keys"
echo NOTE: If you run ./clean-all, I will be doing a rm -rf on $KEY_DIR
export KEY_SIZE=2048
export KEY_EXPIRE=3650
export KEY_COUNTRY="FR"
export KEY_PROVINCE="Loire"
export KEY_CITY="Saint-Étienne"
export KEY_ORG="Falcot Corp"
export KEY_EMAIL="admin@falcot.com"
export KEY_OU="Certificate authority"
export KEY_NAME="Certificate authority for Falcot Corp"
# If you'd like to sign all keys with the same Common Name, uncomment the KEY_CN export below
# export KEY_CN="CommonName"
$ . ./vars
NOTE: If you run ./clean-all, I will be doing a rm -rf on /home/roland/pki-falcot/keys
$ ./clean-all
Langkah berikutnya adalah penciptaan pasangan kunci CA (dua bagian dari pasangan kunci akan disimpan di bawah keys/ca.crt dan keys/ca.key selama langkah ini):
$ ./build-ca
Generating a 2048 bit RSA private key
...................................................................+++
...+++
writing new private key to 'ca.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [FR]:
State or Province Name (full name) [Loire]:
Locality Name (eg, city) [Saint-Étienne]:
Organization Name (eg, company) [Falcot Corp]:
Organizational Unit Name (eg, section) [Certificate authority]:
Common Name (eg, your name or your server's hostname) [Falcot Corp CA]:
Name [Certificate authority for Falcot Corp]:
Email Address [admin@falcot.com]:
Sertifikat untuk server VPN dapat sekarang dibuat, maupun parameter Diffie-Hellman yang diperlukan untuk koneksi SSL/TLS sisi server. Server VPN diidentifikasi oleh nama DNS vpn.falcot.com; nama ini digunakan kembali untuk berkas-berkas kunci yang dihasilkan (keys/vpn.falcot.com.crt bagi sertifikat publik, keys/vpn.falcot.com.key untuk kunci privat):
$ ./build-key-server vpn.falcot.com
Generating a 2048 bit RSA private key
.....................................................................................................................+++
...........+++
writing new private key to 'vpn.falcot.com.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [FR]:
State or Province Name (full name) [Loire]:
Locality Name (eg, city) [Saint-Étienne]:
Organization Name (eg, company) [Falcot Corp]:
Organizational Unit Name (eg, section) [Certificate authority]:
Common Name (eg, your name or your server's hostname) [vpn.falcot.com]:
Name [Certificate authority for Falcot Corp]:
Email Address [admin@falcot.com]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
Using configuration from /home/roland/pki-falcot/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'FR'
stateOrProvinceName   :PRINTABLE:'Loire'
localityName          :T61STRING:'Saint-\0xFFFFFFC3\0xFFFFFF89tienne'
organizationName      :PRINTABLE:'Falcot Corp'
organizationalUnitName:PRINTABLE:'Certificate authority'
commonName            :PRINTABLE:'vpn.falcot.com'
name                  :PRINTABLE:'Certificate authority for Falcot Corp'
emailAddress          :IA5STRING:'admin@falcot.com'
Certificate is to be certified until Mar  6 14:54:56 2025 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated
$ ./build-dh
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
[…]
Langkah berikut menciptakan sertifikat untuk klien VPN; satu sertifikat diperlukan untuk setiap komputer atau orang yang diizinkan untuk menggunakan VPN:
$ ./build-key JoeSmith
Generating a 2048 bit RSA private key
................................+++
..............................................+++
writing new private key to 'JoeSmith.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [FR]:
State or Province Name (full name) [Loire]:
Locality Name (eg, city) [Saint-Étienne]:
Organization Name (eg, company) [Falcot Corp]:
Organizational Unit Name (eg, section) [Certificate authority]:Development unit
Common Name (eg, your name or your server's hostname) [JoeSmith]:Joe Smith
[…]
Kini semua sertifikat sudah dibuat, mereka perlu disalin bila diperlukan: kunci publik sertifikat root (keys/ca.crt) akan disimpan pada semua mesin (server dan klien) sebagai /etc/ssl/certs/Falcot_CA.crt. Sertifikat server hanya dipasang pada server (keys/vpn.falcot.com.crt diletakkan di /etc/ssl/vpn.falcot.com.crt, dan keys/vpn.falcot.com.key ke /etc/ssl/private/vpn.falcot.com.key dengan hak terbatas sehingga hanya administrator yang dapat membacanya), dengan parameter Diffie-Hellman terkait keys/dh2048.pem) dipasang ke /etc/openvpn/dh2048.pem. Sertifikat klien dipasang pada klien VPN terkait dengan cara serupa.

10.2.1.2. Mengkonfigurasi Server OpenVPN

Secara baku, skrip inisialisasi OpenVPN mencoba memulai semua virtual private network yang didefinisikan di dalam /etc/openvpn/*.conf. Maka menyiapkan suatu server VPN cukup dengan menyimpan suatu berkas konfigurasi yang terkait dalam direktori ini. Satu titik awal yang baik adalah /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz, yang mengarahkan ke sebuah server agak standar. Tentu saja, beberapa parameter perlu diadaptasi: ca, cert, key, dan dh perlu menjelaskan lokasi yang dipilih (masing-masing, /etc/ssl/certs/Falcot_CA.crt, /etc/ssl/vpn.falcot.com.crt, /etc/ssl/private/vpn.falcot.com.key, dan /etc/openvpn/dh2048.pem). Direktif server 10.8.0.0 255.255.255.0 mendefinisikan subnet yang akan dipakai oleh VPN; server memakai alamat IP pertama dalam rentang tersebut (10.8.0.1) dan sisa alamat dialokasikan ke klien.
Dengan konfigurasi ini, memulai OpenVPN membuat antarmuka jaringan virtual, biasanya dengan nama tun0. Namun, firewall seringkali dikonfigurasi pada waktu yang sama dengan antarmuka jaringan nyata, yang terjadi sebelum OpenVPN dimulai. Praktik yang baik menyarankan membuat suatu antarmuka jaringan virtual yang persisten, dan menata OpenVPN untuk memakai antarmuka yang telah dibuat ini. Lebih jauh ini mengizinkan pemilihan nama antarmuka. Perintah openvpn —mktun —dev vpn —dev-type tun membuat suatu antarmuka jaringan virtual bernama vpn dengan tipe tun; perintah ini dapat dengan mudah diintegrasikan dalam skrip konfigurasi firewall, atau dalam suatu direktif up dari berkas /etc/network/interfaces. Berkas konfigurasi OpenVPN juga mesti diperbarui, dengan direktif dev vpn dan dev-type tun.
Kecuali ada tindakan lebih lanjut, klien VPN hanya dapat mengakses server VPN itu sendiri melalui alamat 10.8.0.1. Memberi akses untuk klien ke jaringan lokal (192.168.0.0/24), memerlukan penambahan direktif push route 192.168.0.0 255.255.255.0 ke konfigurasi OpenVPN sehingga klien VPN secara otomatis mendapatkan route yang memberi tahu mereka bahwa jaringan ini dapat dicapai melalui VPN. Lebih jauh, mesin-mesin pada jaringan lokal juga perlu diberitahu bahwa route ke VPN adalah melalui server VPN (ini secara otomatis berjalan ketika server VPN dipasang pada gateway). Alternatifnya, server VPN dapat dikonfigurasi untuk melaksanakan masquerading IP sehingga koneksi yang datang dari klien-klien VPN tampak seperti datang dari server VPN (lihat Bagian 10.1, “Gateway”).

10.2.1.3. Mengkonfigurasi Klien OpenVPN

Menyiapkan suatu klien OpenVPN juga memerlukan pembuatan suatu berkas konfigurasi dalam /etc/openvpn/. Sebuah konfigurasi standar dapat diperoleh dengan memakai /usr/share/doc/openvpn/examples/sample-config-files/client.conf sebagai titik awal. Direktif remote vpn.falcot.com 1194 menjelaskan alamat dan port server OpenVPN; ca, cert, dan key juga perlu diadaptasi untuk menjelaskan lokasi berkas-berkas kunc.
Bila VPN tidak akan dijalankan secara otomatis saat boot, atur direktif AUTOSTART ke none dalam berkas /etc/default/openvpn. Memulai atau menghentikan suatu koneksi VPN tertentu selalu mungkin dengan perintah service openvpn@nama start dan service openvpn@nama stop (dimana nama koneksi cocok dengan yang didefinisikan dalam /etc/openvpn/nama.conf).
Paket network-manager-openvpn-gnome berisi sebuah ekstensi untuk Network Manager (Lihat Bagian 8.2.5, “Konfigurasi Jaringan Otomatis untuk Pengguna Luar”) yang memungkinkan mengelola virtual private network OpenVPN. Hal ini memungkinkan setiap pengguna untuk mengkonfigurasi koneksi OpenVPN secara grafis dan untuk mengendalikan mereka dari ikon manajemen jaringan.

10.2.2. Virtual Private Network dengan SSH

Sebenarnya ada dua cara membuat sebuah virtual private network dengan SSH. Yang bersejarah melibatkan menjalin lapisan PPP atas link SSH. Metode ini dijelaskan dalam dokumen HOWTO:
Metode kedua lebih baru, dan diperkenalkan dengan OpenSSH 4.3; sekarang mungkin bagi OpenSSH untuk membuat antarmuka jaringan virtual (tun*) pada kedua sisi dari koneksi SSH, dan antarmuka virtual ini dapat dikonfigurasi secara persis seolah mereka antarmuka fisik. Sistem tunnel pertama mesti difungsikan dengan menata PermitTunnel ke ”yes” dalam berkas konfigurasi server SSH (/etc/ssh/sshd_config). Ketika menjalin suatu koneksi SSH, pembuatan tunnel mesti diminta secara eksplisit dengan opsi -w any:any (any dapat digantikan dengan nomor peranti tun yang dikehendaki). Ini memerlukan pengguna memiliki hak administrator pada kedua sisi, sehingga dapat membuat peranti jaringan (dengan kata lain, koneksi mesti dijalin sebagai root).
Kedua metode untuk membuat sebuah virtual private network melalui SSH cukup sederhana. Namun, VPN yang mereka sediakan bukan yang paling efisien; khususnya, ia tidak menangani lalu lintas tingkat tinggi dengan sangat baik.
Penjelasannya adalah bahwa ketika suatu stack TCP/IP dienkapsulasi di dalam suatu koneksi TCP/IP (untuk SSH), protokol TCP dipakai dua kalai, sekali untuk koneksi SSH dan sekali di dalam tunnel. Ini mengarah ke masalah, khususnya karena cara TCP menyesuaikan ke kondisi jaringan dengan mengubah tundaan waktu tunggu. Situs berikut menguraikan masalah tersebut secara lebih terrinci: Maka VPN di atas SSH mesti dibatasi ke tunnel one-off tanpa kendala kinerja.

10.2.3. IPsec

IPsec, walaupun menjadi standar dalam VPN IP, agak rumit dalam implementasinya. Mesin IPsec itu sendiri terintegrasi dalam kernel Linux; bagian-bagian ruang-pengguna yang diperlukan, perkakas konfirugasi dan kendali, disediakan oleh paket ipsec-tools. Dalam istilah konkrit, setiap /etc/ipsec-tools.conf milik host memuat parameter untuk tunnel IPsec (atau Security Associations, dalam terminologi IPsec) terkait host; skrip /etc/init.d/setkey menyediakan suatu cara untuk memulai dan menghentikan sebuah tunnel (setiap tunnel adalah suatu link aman ke host lain yang tersambung ke virtual private network). Berkas ini dapat dibangun secara manual dari dokumentasi yang disediakan oleh halaman manual setkey(8). Namun, menulis parameter secara eksplisit untuk semua host dalam sekumpulan mesin yang tidak trivial segera menjadi pekerjaan yang melelahkan karena banyaknya tunnel tumbuh dengan cepat. Memasang suatu daemon IKE (singkatan dari IPsec Key Exchange) seperti misalnya racoon atau strongswan membuat proses jauh lebih sederhana dengan mengumpulkan administrasi ke suatu titik pusat, dan lebih aman dengan merotasi kunci secara periodik.
Meskipun statusnya sebagai referensi, kompleksitas menyiapkan IPsec membatasi penggunaannya dalam praktek. Solusi berbasis OpenVPN umumnya akan lebih disukai bila diperlukan tunnel yang tidak terlalu banyak atau dinamis.

10.2.4. PPTP

PPTP (untuk Point-to-Point Tunneling Protocol) menggunakan dua saluran komunikasi, satu untuk data kontrol dan satu untuk data muatan; yang terakhir menggunakan protokol GRE (Generik Routing enkapsulasi). Link PPP standar kemudian disiapkan di atas kanal pertukaran data.

10.2.4.1. Mengkonfigurasi Klien

Paket pptp-linux berisi klien PPTP yang mudah dikonfigurasi untuk Linux. Instruksi berikut mengambil inspirasi dari dokumentasi resmi:
Administrator Falcot membuat beberapa berkas: /etc/ppp/options.pptp, /etc/ppp/peers/falcot, /etc/ppp/ip-up.d/falcot, dan /etc/ppp/ip-down.d/falcot.

Contoh 10.2. Berkas /etc/ppp/options.pptp

# PPP options used for a PPTP connection
lock
noauth
nobsdcomp
nodeflate

Contoh 10.3. Berkas /etc/ppp/peers/falcot

# vpn.falcot.com is the PPTP server
pty "pptp vpn.falcot.com --nolaunchpppd"
# the connection will identify as the "vpn" user
user vpn
remotename pptp
# encryption is needed
require-mppe-128
file /etc/ppp/options.pptp
ipparam falcot

Contoh 10.4. Berkas /etc/ppp/ip-up.d/falcot

# Create the route to the Falcot network
if [ "$6" = "falcot" ]; then
  # 192.168.0.0/24 is the (remote) Falcot network
  route add -net 192.168.0.0 netmask 255.255.255.0 dev $1
fi

Contoh 10.5. Berkas /etc/ppp/ip-down.d/falcot

# Delete the route to the Falcot network
if [ "$6" = "falcot" ]; then
  # 192.168.0.0/24 is the (remote) Falcot network
  route del -net 192.168.0.0 netmask 255.255.255.0 dev $1
fi

10.2.4.2. Menata Server

pptpd adalah server PPTP untuk Linux. Berkas konfigurasi utamanya, /etc/pptpd.conf, memerlukan sangat sedikit perubahan: localip (alamat IP lokal) dan remoteip (alamat IP remote). Dalam contoh di bawah, server PPTP selalu memakai alamat 192.168.0.199dan klien PPTP menerima alamat IP dari 192.168.0.200 sampai 192.168.0.250.

Contoh 10.6. Berkas /etc/pptpd.conf

# TAG: speed
#
#       Specifies the speed for the PPP daemon to talk at.
#
speed 115200

# TAG: option
#
#       Specifies the location of the PPP options file.
#       By default PPP looks in '/etc/ppp/options'
#
option /etc/ppp/pptpd-options

# TAG: debug
#
#       Turns on (more) debugging to syslog
#
# debug

# TAG: localip
# TAG: remoteip
#
#       Specifies the local and remote IP address ranges.
#
#       You can specify single IP addresses separated by commas or you can
#       specify ranges, or both. For example:
#
#               192.168.0.234,192.168.0.245-249,192.168.0.254
#
#       IMPORTANT RESTRICTIONS:
#
#       1. No spaces are permitted between commas or within addresses.
#
#       2. If you give more IP addresses than MAX_CONNECTIONS, it will
#          start at the beginning of the list and go until it gets
#          MAX_CONNECTIONS IPs. Others will be ignored.
#
#       3. No shortcuts in ranges! ie. 234-8 does not mean 234 to 238,
#          you must type 234-238 if you mean this.
#
#       4. If you give a single localIP, that's ok - all local IPs will
#          be set to the given one. You MUST still give at least one remote
#          IP for each simultaneous client.
#
#localip 192.168.0.234-238,192.168.0.245
#remoteip 192.168.1.234-238,192.168.1.245
#localip 10.0.1.1
#remoteip 10.0.1.2-100
localip 192.168.0.199
remoteip 192.168.0.200-250
Konfigurasi PPP yang digunakan oleh server PPTP juga memerlukan beberapa perubahan kecil di /etc/ppp/pptpd-options. Parameter penting adalah nama server (pptp), nama domain (falcot.com), dan alamat IP untuk server DNS dan WINS.

Contoh 10.7. Berkas /etc/ppp/pptpd-options

## turn pppd syslog debugging on
#debug

## change 'servername' to whatever you specify as your server name in chap-secrets
name pptp
## change the domainname to your local domain
domain falcot.com

## these are reasonable defaults for WinXXXX clients
## for the security related settings
# The Debian pppd package now supports both MSCHAP and MPPE, so enable them
# here. Please note that the kernel support for MPPE must also be present!
auth
require-chap
require-mschap
require-mschap-v2
require-mppe-128

## Fill in your addresses
ms-dns 192.168.0.1
ms-wins 192.168.0.1

## Fill in your netmask
netmask 255.255.255.0

## some defaults
nodefaultroute
proxyarp
lock
Langkah terakhir melibatkan mendaftarkan pengguna vpn (dan kata sandi terkait) dalam berkas /etc/ppp/chap-secrets. Berbeda dengan instansi lain dimana bintang (*) akan bekerja, nama server harus diisi secara eksplisit di sini. Lebih jauh, klien-klien PPTP Windows mengidentifikasi diri mereka sendiri dalam bentuk DOMAIN\\USER, bukan sekedar menyediakan nama pengguna. Ini menjelaskan mengapa berkas juga menyinggung pengguna FALCOT\\vpn. Juga dimungkinkan untuk menyatakan alamat IP individu untuk para pengguna; bintang dalam ruas ini menyatakan bahwa pengalamat dinamis mesti dipakai.

Contoh 10.8. Berkas /etc/ppp/chap-secrets

# Secrets for authentication using CHAP
# client        server  secret      IP addresses
vpn             pptp    f@Lc3au     *
FALCOT\\vpn     pptp    f@Lc3au     *