# ----------------------------------------------------------------------------- # SSH NOTLARI # ----------------------------------------------------------------------------- # Anahtar çiftinin üretilmesi cd ~/.ssh ssh-keygen -t rsa -b 2048 -f dosya_adi -t anahtarın tipini belirler. rsa veya dsa kullan -b kaç bitlik şifreleme yapılacağı -f üretilecek özel anahtarın kaydedileceği dosyanın adı genel anahtar, dosya_adi.pub adlı dosyaya kaydedilir. Dosya adı olarak "sunucu_tip" formatını kullan. Örnek: fantastics_rsa Anahtar çifti üretilmeden önce kullanılacak geçiş kelimesi (passphrase) sorulur. # Genel anahtarın sunucuya yüklenmesi ssh-copy-id -i dosya_adi.pub kullanici@12.12.12.12 ssh-copy-id -i dosya_adi.pub "kullanici@12.12.12.12 -p2222" veya scp dosya_adi.pub kulanici@12.12.12.12:~/.ssh/ ssh kullanici@12.12.12.12 'cat ~/.ssh/dosya_adi.pub >> ~/.ssh/authorized_keys' ssh kullanici@12.12.12.12 'rm ~/.ssh/dosya_adi.pub' dosya_adi.pub dosyası bağlanılacak sunucunun ~/.ssh/ klasöründeki authorized_keys adlı dosyanın sonuna eklenir. Debian harici makinelerde farklı bir dosya adı kullanmak gerekebilir. # ssh-agent'ın çalıştırılması ssh-agent, masaüstü içinden konsola geçildiğinde otomatik olarak çalışır. Ayrıca bir işlem yapmaya gerek yok. ssh-agent startx ( masaüstü için ) ssh-agent /bin/bash ( shell için ) ssh-agent -k ( öldürmek için ) # ssh-agent'a özel anahtarların eklenmesi ssh-add ~/.ssh/dosya_adi Özel anahtar eklenirken geçiş kelimesi (passphrase) sorulur. Aynı anda birçok özel anahtar kullanılabilir. ssh-agent duruma göre hangisi ile işlem yapacağına doğru bir şekilde karar verebilir. Hafızadaki bütün anahtarları silmek için: ssh-add -D Hafızadaki bütün anahtarları listelemek için: ssh-add -L # ssh ile çalışma Bundan sonra parola yazılmadan normal ssh işlemleri yapılabilir. Örnek: scp dosya 12.12.12.12:~/ ssh 12.12.12.12 ssh 12.12.12.12 ls -al # Cevap vermeyen ssh oturumunu sonlandırma ~. # Parola ile bağlantıyı yasaklama ssh sunucuya sadece key kullanılarak bağlanılması isteniyorsa ve parola ile girişe izin verilmeyecekse /etc/sshd_config PasswordAuthentication no # Uzaktaki makinedeki logu takip etme ssh -t 12.12.12.12 "tail -f /var/log/xxx" # Bağlantıda parola sormasın, key ile bağlanmayı denesin ssh -o PasswordAuthentication=no domain.com # SSH anahtara göre izinler SSH anahtara göre bağlanan kullanıcının, shell yerine başka bir programı başlatıyor olması için sunucuda ~/.ssh/authorized_keys dosyasında: command='/usr/bin/python' ssh-rsa .... restrict,pty,command='/usr/bin/python' ssh-rsa .... # Host key kontrolunun bir bağlantıda geçici olarak kaldırılması ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no domain.com # ssh ile X uygulamalarının uzaktan çalıştırılması - Sunucuda X yüklü olmayacaksa xauth paketini yüklemek gerekiyor. aptitude install xauth - ssh sunucu için X11Forwarding izni verilir /etc/ssh/sshd_config X11Forwarding yes X11UseLocalhost no #localnet disindan da baglantiya izin verme - uzaktaki X uygulaması çalıştırılır ssh -X kullanici@12.12.12.12 xchat # Transfer edilen verinin sıkıştırılması ssh, scp gibi komutlara -C parametresi eklenir. Bağlantı yavaş ise kullanılmalı. Hızlı bağlantılarda tersine yavaşlamaya sebep olabilir. veya ~/.ssh/config dosyasında Host * Cipher=blowfish CompressionLevel=9 # ----------------------------------------------------------------------------- # SSHFS # ----------------------------------------------------------------------------- sshfs paketi bir ara incelensin. Debian deposundan yüklenen pakette bir sorun var. - sshfs paketini yükle apt-get install sshfs - sshfs mount yapacak kullanıcıları, 'fuse' grubuna ekle adduser kullanici fuse - mount modprobe fuse mkdir ~/mnt1 sshfs kullanici@12.12.12.12:~/klasor ~/mnt1 fusermount -u ~/mnt1 - mount esnasında parametreler sshfs 12.12.12.12:/remote/klasor /mnt/mountpoint \ -o allow_other,default_permissions \ -o ssh_command="ssh -p22 -l kullanici -i ~/.ssh/key" # ----------------------------------------------------------------------------- # SSHUTTLE İLE VPN # ----------------------------------------------------------------------------- # Client kurulum aptitude install sshuttle # Sunucu kurulum SSH Server ve Python kurulu olması gerekiyor. # VPN bağlantısı (root olarak) sshuttle -r kullanici@ip_adresi:port 10.10.0.0/16 192.168.5.0/24 sshuttle -r kullanici@ip_adresi:port 0/0 --dns # SSH key kullanılmak isteniyorsa /root/.ssh/config dosyasına host tanımı gerekiyor. Host host1 Hostname 11.22.33.44 User emrah Port 22 IdentityFile /home/emrah/.ssh/privatekey sshuttle -r host1 0/0 --dns # ----------------------------------------------------------------------------- # SSH tunel # ----------------------------------------------------------------------------- Düz tünel. Bize bağlanabilen makineler, üzerimizden geçip bağlantığımız makine üzerinden bağlantı kurar. ssh -f -L 0.0.0.0:20001:host2:80 -p22 kullanici@host1 sleep 100 curl localhost:20001 curl host3:20001 ssh -f -L 20002:www.yahoo.com:80 -p22 emrah.com sleep 100 curl localhost:20002 ssh -f -L 20003:host2:5901 -p22 kullanici@host1 sleep 100 vncviewer localhost:20003:1 -L 0.0.0.0:20001:host2:80 Komutun verildiği makinenin 20001. portuna gelen bağlantılar, host1 üzerinden geçip host2 makinesinin 80. portuna bağlanır. Host1 ve Host2 için IP adresi veya host adı verilir. 0.0.0.0 verilmezse sadece 127.0.0.1 IP adresi dinlenilir. host2 olarak 127.0.0.1 verilirse bu, host1'den kendi lokaline atlanacağı anlamına gelir. Yani host1'in dışarıya kapalı ama lokale açık portuna bağlanmak için kullanılabilir. Tünelin oluşabilmesi için (bu örnekte) host1 makinesinin, host2 makinesinin 80. portuna erişebiliyor olması gerekmektedir. -f ssh üzerinden çalıştırılan komut başlamadan, ssh'ı arkaplana atar böylece bir sonraki komut (örnekte vncviewer ve curl) çalışmaya başlar. -p22 host1'in SSH sunucu portu. Default SSH portu (yani 22) kullanılıyorsa, yazılmasa da olur. kullanici@host1 Tüneli kuracak olan aradaki makinenin IP adresi veya host adı. SSH sunucuya bağlanırken kullanılacak kullanıcı adı 'kullanici@' şeklinde verilecek. sleep 100 ssh tunel oluşturulunca sunucuda çalışacak komut. sleep komutu, ikinci komut bağlantıyı alıncaya kadar bağlantı kapanmasın diye. sleep bittikten sonra, bağlantı vncviewer'a ait olacağı için bu program işini bitirene kadar tunel kalır, vncviewer kapatılınca tunel de kapanır curl localhost:20001 localhost'un 20001. portuna curl ile bağlanıldığında, host1 üzerinden geçilip host2'nin 80. portundan yayınlanan web sunucuya erişilir. curl host3:20001 Host3, komutun verildiği makinenin IP adresi veya host adı. Bu komut, host3'e erişebilen başka bir makineden veriliyor. vncviewer localhost:20003:1 Kullanılacak uygulama ile komutun verildiği makinenin 20003. portuna bağlanılacak. Bu bağlantının diğer ucu, host2'nin belirtilen portuna çıkacak. :1 vnc için display numarası. # ----------------------------------------------------------------------------- # Reverse SSH # ----------------------------------------------------------------------------- Ters tünel. Bağlandığımız makineye bağlanabilen makineler, üzerimizden geçip bağlantı kurarlar. Host2, host3'e bağlanmak istemektedir ama aradaki firewall blokladığından veya gerekli yönlendirme kuralları tanımlanmadığından dolayı host3'e erişememektedir. Host1 hem SSH ile host2'ye bağlanabilmekte hem de host3'ün bağlantı kurulmak istenen portuna bağlanabilmektedir. Bu durumda host1'den host2'ye ters tünel açıp host2'nin veya host2'ye bağlanabilen makinelerin, host1 üzerinden geçerek host3'e bağlanmasını sağlayabiliriz. Önce host1, host2'ye bağlanır ve ters tünel oluşturur. Artık host2'nin tünelin bir ucunda kalan portuna bağlanan uygulamalar, host1 üzerinde geçip host3'ün bağlanılmak istenen portuna ulaşabilir. Bunun gerçekleşebilmesi için host1 ve host3 firewall'un bloklanmış kısmında (genelde yerel ağda) host2'nin ise erişime açık kısımda (genellikle Internette) olması gerekir. # host1: ssh -R 10001:host3:80 -p22 host2 -p22 host2'deki SSH sunucuya 22. porttan bağlan. Default port kullanıldığında yazılmasa da olur çünkü default 22 -R 10001:host3:80 host2'de 10001. porta bağlantı yapıldığında, bunu host1'in üzerinden geçirip host3'ün 80. portuna eriştirir. host3 olarak 127.0.0.1 verilirse, host1 üzerinden atlanıp 127.0.0.1'e (yani host1'in kendisine) bağlanılır. # host2: curl -p10001 localhost Host2'in 10001. portuna bağlanıldığında host1 üzerindeki tünelden geçilip host3'ün 80. portuna erişilir. # host2'ye erişebilen herhangi bir host4: curl host2:10001 # ----------------------------------------------------------------------------- # SSH İLE SOCK5 SERVER # ----------------------------------------------------------------------------- # SOCK5 sunucuyu başlatma ssh -ND 8080 -p22 host2 -p22 host2'deki SSH sunucuya 22. porttan bağlan. Default port kullanıldığında yazılmasa da olur çünkü default 22 -N host2'de komut çalıştırılamayacak. -D 8080 Bind portu. Komutun verildiği makinede (host1) bu port üzerinden SOCKS sunucuya erişilir. # SOCKS sunucu üzerinden bağlantı kuracak host1 üzerindeki uygulamada (örneğin Iceweasel): SOCKS Host 127.0.0.1 SOCKS Port 8080 SOCKS Type SOCKS v5 # Iceweasel'de DNS sorgularının da SOCKS üzerinden yapılması için: about:config -> network.proxy.socks_remote_dns -> True # ----------------------------------------------------------------------------- # REMOTE AUDIO OVER SSH # ----------------------------------------------------------------------------- Uzak makinedeki mikrofon sesini SSH üzerinden dinleme... Dinleyecek makinede `ffplay` veya `mpv` gibi bir player'ın yüklü olması gerekir. Mikrofonuna erişilecek makinede `alsa-utils` yüklü olması gerekir. # remote ``` apt-get install alsa-utils flac vorbis-tools ``` # local ``` apt-get install ffplay ``` # remote audio Komutlar düşük bant genişliğinden yükseğe doğru sıralanmıştır. `oggenc` CPU kullanımı biraz daha yüksek olabilir. ``` ssh "arecord -f cd -D plughw:0 | oggenc -" | ffplay -nodisp - ssh "arecord -f cd -D plughw:0 | flac - -o -" | ffplay -nodisp - ssh "arecord -f cd -D plughw:0" | ffplay -nodisp - ssh "arecord -f cd -D plughw:0" | aplay - ``` # device Device bulmak için uzak makinede ``` arecord -l arecord -L ``` # ----------------------------------------------------------------------------- # SSLH # ----------------------------------------------------------------------------- HTTPS, OpenVPN ve SSH servislerini aynı port üzerinden kullanılmasını sağlar. Çoğunlukla tercih edilen port 443... HTTPS loglarında remote IP alınamıyor. # Kurulum aptitude install sslh # Ayarlar /etc/default/sslh RUN=yes # Tek satırda yazılacak. DAEMON_OPTS="--user sslh --listen 0.0.0.0:443 --ssh 127.0.0.1:10022 --ssl 127.0.0.1:10443 --pidfile /var/run/sslh/sslh.pid" - SSH servisinin 10022 portundan çalıştığı varsayıldı. - HTTPS servisinin 10443 portundan çalıştığı varsayıldı. # Yeni ayarlarla başlatma /etc/init.d/sslh restart # ----------------------------------------------------------------------------- # REMOTE MAKİNELER İÇİN TERS TÜNEL # ----------------------------------------------------------------------------- Bu kısımda router arkasından Internet'e bağlanan ama her an uzaktan erişebilmek istediğimiz mobil cihazlar için yapılacak ayarlar yer almaktadır. Öncelikle ters tünelin kurulabilmesi için Internet'te yer alan SSH sunucu bir makine (container) kurulur. Daha sonra remote makinede ters tüneli sürekli ayakta tutacak ayarlar yapılır. ## host #### Container * Host makineyi eb-base ile kur. Debian Buster container... * Ters tünel portları, container makineye yönlendirilecek. /etc/nftables.conf -> eb-nat -> prerouting ``` iif "eth0" tcp dport 60000-60100 dnat to 172.22.22.251 ``` #### SSH server * Açık parola ile bağlantıya izin verilmeyecek. * GatewayPorts aktif hale getirilecek. /etc/ssh/sshd_config ``` PasswordAuthentication no GatewayPorts yes ClientAliveInterval 10 ClientAliveCountMax 3 ``` #### vpn kullanıcısı ve anahtarı vpn için bir kullanıcı hesabı ve passphrase'i olmayan bir SSH anahtar oluşturulur. ``` cd /root/.ssh/ ssh-keygen -f em-vpn ``` ``` adduser vpn --disabled-password --shell /bin/zsh --gecos '' chmod 700 /home/vpn mkdir /home/vpn/.ssh chmod 700 /home/vpn/.ssh cp /root/.ssh/authorized_keys /home/vpn/.ssh/ chmod 644 /home/vpn/.ssh/authorized_keys chown vpn:vpn /home/vpn/.ssh -R echo -n 'command="/bin/sleep 86400" ' >> /home/vpn/.ssh/authorized_keys cat /root/.ssh/em-vpn.pub >> /home/vpn/.ssh/authorized_keys ``` ## remote Router arkasında kalan ve ters tünel kuracak olan makinede yapılacak ayarlar. Bu makinedeki hesaplara bağlanabilmek için bağlanacak kişilerin public anahtarlarının önceden yüklenmiş olması gerekmektedir. Güvenlik için açık parola ile bağlantıya izin verilmemesi iyi olur. #### sshd_config /etc/ssh/sshd_config ``` Port 10251 PasswordAuthentication no ClientAliveInterval 10 ClientAliveCountMax 3 ``` #### vpn kullanıcısı ``` adduser vpn --disabled-password --shell /bin/zsh --gecos '' chmod 700 /home/vpn mkdir /home/vpn/.ssh chmod 700 /home/vpn/.ssh cp /root/.ssh/authorized_keys /home/vpn/.ssh/ chmod 644 /home/vpn/.ssh/authorized_keys cp em-vpn em-vpn.pub /home/vpn/.ssh/ chown vpn:vpn /home/vpn/.ssh -R ``` #### kullanıcı ssh config Her makine için sıraki port tahsis edilsin. /home/vpn/.ssh/config ``` Host em-vpn Hostname mydomain.com User vpn Port 10251 RemoteForward 60090 localhost:22 IdentityFile ~/.ssh/em-vpn IdentitiesOnly yes ConnectTimeout 10 ServerAliveInterval 10 ServerAliveCountMax 3 StrictHostKeyChecking no UserKnownHostsFile /dev/null BatchMode yes LogLevel ERROR Host em-sock Hostname mydomain.com User vpn Port 10251 DynamicForward 65022 IdentityFile ~/.ssh/em-vpn IdentitiesOnly yes ConnectTimeout 10 ServerAliveInterval 10 ServerAliveCountMax 3 StrictHostKeyChecking no UserKnownHostsFile /dev/null BatchMode yes LogLevel ERROR ``` #### systemd ###### /etc/systemd/system/em-vpn.service Ters tüneli sürekli ayakta tutacak olan systemd servisi... ``` [Unit] Description=My VPN After=network.target [Service] User=vpn Group=vpn WorkingDirectory=/home/vpn ExecStart=/usr/bin/ssh em-vpn Restart=always RestartSec=2s [Install] WantedBy=multi-user.target ``` ###### /etc/systemd/system/em-sock.service Socks proxy'i sürekli ayakta tutacak olan systemd servisi... ``` [Unit] Description=My Socks Proxy After=network.target [Service] User=vpn Group=vpn WorkingDirectory=/home/vpn ExecStart=/usr/bin/ssh em-sock Restart=always RestartSec=2s [Install] WantedBy=multi-user.target ``` ``` systemctl daemon-reload systemctl enable em-vpn.service systemctl enable em-sock.service systemctl restart em-vpn.service systemctl restart em-sock.service ``` #### Komut systemd servisi olmadan geçici olarak tünel açılacaksa... ``` ssh -q -p 10251 -ND 65022 -R 60090:localhost:22 -l vpn -i ~/.ssh/em-vpn \ mydomain.com ``` ## client remote makinede anahtarı yüklü bir client ile ters tünelden remote makineye bağlanılabilir. ``` ssh -p 60090 remote_user@mydomain.com ```