SSH ile VPN – İleri Düzey SSH

06 Ağustos 2008

SSH ile VPN’le İleri Düzey SSH serisi yazılarımın sonuna geldik. Öncelikle SSH ile VPN mükemmel bir VPN çözümü değildir. Reliable bir bağlantı olan TCP içinden TCP geçirmek ilave bir overhead’e neden olmaktadır. Düzgün ve sağlıklı olmayan bir bağlantı üstünde sık sık kopmalara neden olabilir. SSH ile VPN’in diğer bir dezavantajı da sadece Linux’ten Linux’e (ve benzeri) yapılabiliyor olmasıdır.

Tüm bu olumsuzluklara rağmen SSH ile VPN bağlantısı kurmak mümkündür ve sağlam bir bağlantı üstünde yeterince sağlıklı çalışmaktadır (SSH ile VPN bağlantısı üstünden SIP ile VOIP görüşmesi yapmışlığım var, herhangi bir sorununu görmedim). Diğer olumlu yanları da sunucu’nun sabit IP’si olacak diye bir şart yoktur. DynDNS.org’dan alacağınız bir isimle VPN kurmak istediğiniz SSH sunucunuza DynDNS.org adıyla rahatlıkla ulaşabilirsiniz. Kurulumu diğer VPN çözümlerine göre nispeten daha kolaydır.

SSH VPN bağlantısını pppd yardımı ile gerçekleştirmektedir. VPN’nin kurulabilmesi için SSH istemci ve sunucu taraflarının her ikisinde de pppd’nin kurulu olması bir zorunluluktur. SSH istemcisi ile sunucu arasındaki şifreli bağlantının her iki ucunda yer alan pppd’ler noktadan noktaya iletişik protokolü ile şifreli tünel üzerinden yeni bir ağ kurmaktadırlar. Bu da SSH ile VPN’i meydana getirmektedir.

Tüm bu ön bilgilerden sonra gelelim SSH ile VPN kurulumuna. Hazırlık aşaması biraz uzun ve zahmetli (hangi vpn kolay ki ;-)), ancak hazırlığı bir kere yaptıktan sonra bağlantının kurulması oldukça kolay.

SSH ile VPN bağlantısı kuracak olan istemci ve sunucu Linux’lerin her iki tarafta da firewall/gateway olarak kullanılıyor olması avantajınıza olacaktır. Her iki taraftaki tüm istemciler ön tanımlı ağ geçidi (ing. default gateway) olarak bu Linux’leri kullandıklarından dolayı ilave yönlendirme ayarına gerek kalmayacak ve VPN kurulduğunda birbirlerinin ağlarını görebilir duruma gelecekler. Ancak VPN erişimi yapmak istediğiniz ağdaki Linux sunucusu ilgili ağın yönlendiricisi değilse bir miktar daha çalışma yapmak gerekecek. Bunlara yazının sonlarında değineceğim.

OpenSSH Sunucusu Üzerindeki Hazırlıklar

1. VPN kullanıcısının oluşturulması
Sunucu Linux’te vpn bağlantısının kurulması için ssh ile erişmek üzere kullanacağımız bir kullanıcı hesabı tanımlamalıyız.

root@sunucu# useradd -m -d /home/vpnuser vpnuser
root@sunucu#

2. VPN kullanıcısı için “sudo /usr/sbin/pppd” ayarının yapılması
Tanımlamış olduğumuz vpnuser kullanıcısının pppd’yi çalıştırabilmesi için geçici yetki yükseltmesine ihtiyacımız var. Bunun için sudo altyapısı kullanılacağız. “visudo” komutu ile /etc/sudoers dosyasını düzenlemeliyiz ve aşağıdaki satırı eklemeliyiz.

root@sunucu# visudo
vpnuser ALL=NOPASSWD: /usr/sbin/pppd

Bu düzenlemeyi test edelim:

root@sunucu# su - vpnuser
vpnuser@sunucu$ sudo /usr/sbin/pppd noauth
~�}#�!}!}!} }4}"}&} } } } }%}&�U�}2}'}"}

Yukarıdakine benzer şekilde pppd’nin garip karakterlerini görüyorsak pppd’nin vpnuser tarafından root yetkileri ile çalıştırılması altyapısı hazırdır.

3. SSH açık anahtarının vpn kullanıcısı hesabına yerleştirilmesi
OpenSSH istemci sistemde ilerleyen bölümde hazırlanmış olan ssh açık anahtarını sunucu sistemdeki vpnuser hesabının .ssh/authorized_users dosyasına yazmalıyız. Böylece istemci sistem SSH bağlantısını anahtar altyapısı ile kurabilecektir.

vpnuser@sunucu$ mkdir .ssh
vpnuser@sunucu$ cat id_rsa_vpn.pub >> /home/vpnuser/.ssh/authorized_keys

Genel olarak sunucu sistemdeki hazırlıklar bu kadar. Sıra istemci sistemdeki hazırlıklarda.

OpenSSH İstemcisindeki Hazırlıklar

1. root kullanıcısında VPN için gizli ve açık anahtar oluşturulması

OpenSSH gizli ve açık anahtar oluşturulması için ilave bilgi ihtiyacınız olursa SSH Anahtar Kullanımı başlıklı yazıma başvurabilirsiniz. VPN bağlantısının sistem açılışında otomatik olarak başlatılabilmesi için gizli anahtar şifresinin sadece Enter’a basılarak boş geçilmesi gerekmektedir.

root@istemci# ssh-keygen -t rsa -f /root/.ssh/id_rsa_vpn
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa_vpn.
Your public key has been saved in /root/.ssh/id_rsa_vpn.pub.
The key fingerprint is:
74:9a:43:3a:9a:14:03:20:ce:8d:aa:ba:43:18:09:b8 root@istemci
root@istemci#

Burada oluşturmuş olduğumuz gizli ve açık anahtar ikilisinden açık olanı SSH sunucusundaki vpnuser kullanıcısının .ssh/authorized_users dosyasına eklenmesi gerekmektedir. OpenSSH Sunucusu Üzerindeki hazırlıklar başlığına geri dönerek nasıl yapılacağına tekrar göz atabilirsiniz. Açık anahtarın adı üstünde açık anahtar olduğu için şifreli veya şifresiz bir bağlantı ile istemci sistemden sunucu sisteme aktarabilirsiniz. Ya da offline bir şekilde bir medya aracılığı ile de taşıyabilirsiniz. Ancak hedefe yerleştirmeden önce gözle son bir kontrol faydalı olur, başkasının yerimize VPN yapmasını istemeyiz. 😉

2. VPN bağlantı betiğinin hazırlanması.

VPN bağlantısının kurulması için uzun bir komut yazılması gerekmektedir. Daha pratik olması ve sistem açılışında da kullanılabilmesi için aşağıdaki gibi bir betik hazırlamak daha uygun olacaktır.

===================================

#!/bin/bash

SUNUCU_ADI=sunucu.dyndns.org
SUNUCU_VPNKULLANICI=vpnuser
SUNUCU_VPNIP=172.16.1.2
ISTEMCI_VPNIP=172.16.1.1
GIZLI_ANAHTAR=/root/.ssh/id_rsa_vpn

PATH=/sbin:/bin:/usr/sbin:/usr/bin

case "$1" in
  start)
    pppd updetach noauth passive pty "ssh -P -o StrictHostKeyChecking=no \
         ${SUNUCU_ADI} -i${GIZLI_ANAHTAR} -l${SUNUCU_VPNKULLANICI} \
         -o Batchmode=yes sudo /usr/sbin/pppd nodetach notty noauth" \
         ipparam vpn ${ISTEMCI_VPNIP}:${SUNUCU_VPNIP}
    echo "VPN BASLATILDI!"
    ;;

  stop)
    pkill -f "pppd +updetach +noauth +passive +pty.+ssh.+pppd.+vpn.+\
${ISTEMCI_VPNIP}:${SUNUCU_VPNIP}"
    echo "VPN DURDURULDU!"
    ;;

  *)
    echo "Kullanim: sshvpn {start|stop}"
    exit 1
    ;;
esac

exit 0

===================================

Sıra geldi VPN bağlantımızın test edilmesine.

root@istemci# ./sshvpn.sh
Using interface ppp0
Connect: ppp0 <--> /dev/pts/4
Deflate (15) compression enabled
Cannot determine ethernet address for proxy ARP
local  IP address 172.16.1.1
remote IP address 172.16.1.2
VPN BASLATILDI
root@istemci# ifconfig ppp
ppp0      Link encap:Point-to-Point Protocol 
          inet addr:172.16.1.1  P-t-P:172.16.1.2  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:7 errors:0 dropped:0 overruns:0 frame:0
          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:3
          RX bytes:246 (246.0 B)  TX bytes:240 (240.0 B)

root@istemci# ping 172.16.1.1
PING 172.16.1.1 (172.16.1.1) 56(84) bytes of data.
64 bytes from 172.16.1.1: icmp_seq=1 ttl=64 time=0.075 ms
64 bytes from 172.16.1.1: icmp_seq=2 ttl=64 time=0.072 ms

--- 172.16.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.072/0.073/0.075/0.008 ms
root@istemci# ping 172.16.1.2
PING 172.16.1.2 (172.16.1.2) 56(84) bytes of data.
64 bytes from 172.16.1.2: icmp_seq=1 ttl=64 time=28.9 ms
64 bytes from 172.16.1.2: icmp_seq=2 ttl=64 time=17.8 ms

--- 172.16.1.2 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 17.888/23.433/28.979/5.547 ms
root@istemci#

Görüldüğü üzere istemci Linux’ten sunucu Linux’ü kurmuş olduğumuz VPN’den pingleyebildik. İstemci Linux ve sunucu Linux her birisi kendi ağında ağ geçidi (ing. router) / güvenlik duvarı (ing. firewall) görevi görüyorsa bir taraftaki istemci diğer taraftaki istemciyi ssh vpn tuneli üzerinden geçerek görebilecektir. Aynı şekilde tersi de mümkün olacaktır. Diğer bir deyişle iki ağ geçidi linux arasında kurulan SSH VPN site-to-site VPN’dir.

İstemci Linux ağ geçidi değilse, sunucu Linux ağ geçidiyse; olsa olsa client-to-site VPN kurmuş oluruz. Yani istemci Linux’ün üzerinden karşıdaki istemcilere / sistemlere ulaşabiliriz. Ancak bizim ağımızdaki diğer istemcilerin ulaşabilmesi için yönlendirme tablolarına istemci linux’ümüzün IP adresini karşı ağa gidiş noktası olarak tanımlamalıdırlar.

Ayarlama aşaması biraz zahmetli. Ancak bugüne kadar zahmetsiz bir VPN kurulumu görmedim ben. Tüm VPN teknolojilerinin kurulma aşaması zor ve uğraştırıcı oluyor. Bir kere kurulduktan sonra da rahat bir şekilde kullanılabilir.

İleri Düzey SSH serisi yazılarımı bu son yazı ile burada noktalıyorum ve OpenSSH’ın diğer özelliklerini keşfetmeyi de sizlere bırakıyorum.

Etiketler: , , , , , , , , , , , , , , , , , , , , , , ,

  1. “SSH ile VPN – İleri Düzey SSH” için 1 Yorum

  2. ejg diyor ki:
    17 Mayıs 2010 tarihinde.

    valla hocam bu vpn hakında ne kadar bilgi aradımsada pek işe yarar bişi bullamdım ya ne kadar test yaptıgımı bilmek istemesin hepsi de bosa bana detaylı bi anlatım yer varmı

Yorum Yapın