Praktiske tips, eksempler og SSH-tunneler

Praktiske tips, eksempler og SSH-tunneler
Praktiske eksempler SSHsom vil tage dine færdigheder som fjernsystemadministrator til et nyt niveau. Kommandoer og tips hjælper ikke kun at bruge SSH, men også navigere på netværket mere intelligent.

At kende et par tricks ssh nyttig for enhver systemadministrator, netværksingeniør eller sikkerhedsprofessionel.

Praktiske SSH-eksempler

  1. SSH sokker proxy
  2. SSH-tunnel (port forwarding)
  3. SSH-tunnel til tredje vært
  4. Omvendt SSH-tunnel
  5. SSH omvendt proxy
  6. Installation af en VPN over SSH
  7. Kopiér SSH-nøgle (ssh-copy-id)
  8. Ekstern kommandoudførelse (ikke-interaktiv)
  9. Fjernpakkeoptagelse og visning med Wireshark
  10. Kopiering af en lokal mappe til en ekstern server via SSH
  11. Remote GUI-applikationer med SSH X11 Forwarding
  12. Fjernkopiering af filer med rsync og SSH
  13. SSH over Tor-netværket
  14. SSH til EC2 forekomst
  15. Redigering af tekstfiler med VIM via ssh/scp
  16. Montering af en ekstern SSH som en lokal mappe med SSHFS
  17. Multiplexing af SSH med ControlPath
  18. Stream video over SSH med VLC og SFTP
  19. To-faktor autentificering
  20. Værtshop med SSH og -J
  21. Blokerer SSH brute force-forsøg med iptables
  22. SSH Escape for at ændre portvideresendelse

Grundlæggende først

SSH kommandolinjeparsing

Følgende eksempel bruger almindelige indstillinger, der ofte stødes på, når der oprettes forbindelse til en ekstern server SSH.

localhost:~$ ssh -v -p 22 -C neo@remoteserver

  • -v: Debug-outputtet er især nyttigt, når man analyserer godkendelsesproblemer. Kan bruges flere gange til at vise yderligere information.
  • - p 22: forbindelsesport til en ekstern SSH-server. 22 skal ikke angives, fordi dette er standardværdien, men hvis protokollen er på en anden port, så angiver vi den ved hjælp af parameteren -p. Lytteporten er angivet i filen sshd_config i formatet Port 2222.
  • -C: komprimering for tilslutning. Hvis du har en langsom kanal eller ser meget tekst, kan dette fremskynde forbindelsen.
  • neo@: Linjen før @-tegnet angiver det brugernavn, der skal godkendes til fjernserveren. Hvis du ikke angiver det, vil det som standard bruge brugernavnet på den konto, du i øjeblikket er logget på (~$ whoami). Brugeren kan også angives med parameteren -l.
  • remoteserver: navn på værten, der skal oprettes forbindelse til ssh, kan det være et fuldt kvalificeret domænenavn, en IP-adresse eller en hvilken som helst vært i den lokale værtsfil. For at oprette forbindelse til en vært, der understøtter både IPv4 og IPv6, kan du tilføje kommandolinjeparameteren -4 eller -6 for korrekt opløsning.

Alle ovenstående parametre er valgfrie undtagen remoteserver.

Brug af en konfigurationsfil

Selvom mange er bekendt med filen sshd_config, er der også en klientkonfigurationsfil til kommandoen ssh. Standard værdi ~/.ssh/config, men det kan defineres som en parameter til en option -F.

Host *
     Port 2222

Host remoteserver
     HostName remoteserver.thematrix.io
     User neo
     Port 2112
     IdentityFile /home/test/.ssh/remoteserver.private_key

Eksemplet på ssh-konfigurationsfilen ovenfor har to værtsindgange. Den første angiver alle værter, for alle er port 2222-konfigurationsparameteren anvendt. Den anden siger, at for værten fjernserver du skal bruge et andet brugernavn, port, FQDN og IdentityFile.

En konfigurationsfil kan spare meget tid til at skrive tegn ved at tillade, at avanceret konfiguration anvendes automatisk, når der oprettes forbindelse til bestemte værter.

Kopiering af filer over SSH ved hjælp af SCP

SSH-klienten kommer med to andre meget praktiske værktøjer til at kopiere filer over krypteret ssh-forbindelse. Nedenfor er et eksempel på en typisk brug af kommandoerne scp og sftp. Bemærk, at mange af mulighederne for ssh også gælder for disse kommandoer.

localhost:~$ scp mypic.png neo@remoteserver:/media/data/mypic_2.png

I dette eksempel filen mypic.png kopieret til fjernserver til en mappe /media/data og omdøbt til mypic_2.png.

Glem ikke forskellen i portparameteren. På dette støder på mange, der lancerer scp fra kommandolinjen. Her er portparameteren -POg ikke -pgerne i ssh klient! Du vil glemme, men bare rolig, alle glemmer det.

For dem der er bekendt med konsollen ftp, mange af kommandoerne ligner hinanden i sftp. Du kan gøre skub, sætte и lssom dit hjerte begærer.

sftp neo@remoteserver

Praktiske eksempler

I mange af disse eksempler kan resultatet opnås ved forskellige metoder. Som i alle vores lærebøger og eksempler, præference gives til praktiske eksempler, der bare gør tricket.

1. SSH sokker proxy

SSH Proxy-funktionen er nummer 1 af en god grund. Det er mere kraftfuldt, end de fleste tror, ​​og det giver dig adgang til ethvert system, som en ekstern server har adgang til, ved hjælp af stort set alle programmer. En ssh-klient kan tunnelere trafik gennem en SOCKS-proxy med en simpel kommando. Det er vigtigt at forstå, at trafik til fjernsystemer vil komme fra en fjernserver, som det vil blive angivet i webserverloggene.

localhost:~$ ssh -D 8888 user@remoteserver

localhost:~$ netstat -pan | grep 8888
tcp        0      0 127.0.0.1:8888       0.0.0.0:*               LISTEN      23880/ssh

Her starter vi en socks proxy på TCP port 8888, den anden kommando kontrollerer at porten er aktiv i lyttetilstand. 127.0.0.1 angiver, at tjenesten kun kører på localhost. Vi kan bruge en lidt anderledes kommando til at lytte på alle grænseflader, inklusive ethernet eller wifi, dette vil tillade andre applikationer (browsere osv.) på vores netværk at oprette forbindelse til proxy-tjenesten via ssh socks proxy.

localhost:~$ ssh -D 0.0.0.0:8888 user@remoteserver

Nu kan vi konfigurere browseren til at oprette forbindelse til socks proxy. Vælg i Firefox Indstillinger | Hoved | Netværks indstillinger. Angiv IP-adressen og porten, der skal oprettes forbindelse til.

Praktiske tips, eksempler og SSH-tunneler

Vær opmærksom på muligheden i bunden af ​​formularen, så browserens DNS-forespørgsler også går gennem SOCKS-proxyen. Hvis du bruger en proxyserver til at kryptere webtrafik på dit lokale netværk, vil du sandsynligvis vælge denne mulighed, så DNS-forespørgsler tunneleres over SSH-forbindelsen.

Aktiverer socks proxy i Chrome

At starte Chrome med visse kommandolinjeindstillinger vil aktivere socks-proxyen samt tunnelering af DNS-anmodninger fra browseren. Tro, men tjek. Brug tcpdump for at kontrollere, at DNS-anmodninger ikke længere er synlige.

localhost:~$ google-chrome --proxy-server="socks5://192.168.1.10:8888"

Brug af andre applikationer med en proxy

Husk på, at mange andre applikationer også kan bruge strømper. Webbrowseren er simpelthen den mest populære af dem alle. Nogle applikationer har konfigurationsmuligheder til aktivering af en proxyserver. Andre har brug for lidt hjælp til et hjælpeprogram. For eksempel, proxykæder giver dig mulighed for at køre gennem socks-proxy Microsoft RDP osv.

localhost:~$ proxychains rdesktop $RemoteWindowsServer

Socks proxy-konfigurationsparametre er indstillet i proxychains-konfigurationsfilen.

Tip: hvis du bruger fjernskrivebord fra Linux til Windows? Prøv klient FreeRDP. Dette er en mere moderne implementering end rdesktop, med meget jævnere interaktion.

Mulighed for at bruge SSH gennem socks proxy

Du sidder på en cafe eller hotel - og er tvunget til at bruge ret upålidelig WiFi. Fra den bærbare computer starter vi en ssh-proxy lokalt og opsætter en ssh-tunnel til hjemmenetværket på den lokale Rasberry Pi. Ved at bruge en browser eller andre programmer, der er konfigureret til en socks-proxy, kan vi få adgang til alle netværkstjenester på vores hjemmenetværk eller gå online via vores hjemmeforbindelse. Alt mellem din bærbare computer og din hjemmeserver (via Wi-Fi og internet til dit hjem) er krypteret i en SSH-tunnel.

2. SSH-tunnel (port forwarding)

I sin enkleste form åbner en SSH-tunnel simpelthen en port på dit lokale system, der forbinder til en anden port i den anden ende af tunnelen.

localhost:~$ ssh  -L 9999:127.0.0.1:80 user@remoteserver

Lad os analysere parameteren -L. Det kan opfattes som den lokale lytteside. I eksemplet ovenfor lytter port 9999 således på den lokale værtsside og videresendes på port 80 til fjernserveren. Bemærk at 127.0.0.1 refererer til localhost på fjernserveren!

Lad os gå op ad trappen. Følgende eksempel binder lytteporte til andre værter på det lokale netværk.

localhost:~$ ssh  -L 0.0.0.0:9999:127.0.0.1:80 user@remoteserver

I disse eksempler opretter vi forbindelse til en port på webserveren, men dette kan være en proxyserver eller en hvilken som helst anden TCP-tjeneste.

3. SSH-tunnel til tredjepartsvært

Vi kan bruge de samme muligheder til at tunnelere fra en fjernserver til en anden tjeneste, der kører på et tredje system.

localhost:~$ ssh  -L 0.0.0.0:9999:10.10.10.10:80 user@remoteserver

I dette eksempel videresender vi en tunnel fra fjernserver til en webserver, der kører den 10.10.10.10. Trafik fra fjernserver til 10.10.10.10 ikke længere i SSH-tunnelen. Webserveren den 10.10.10.10 vil betragte fjernserveren som kilden til webanmodninger.

4. Vend SSH-tunnel

Her vil vi opsætte en lytteport på den eksterne server, der vil forbinde tilbage til en lokal port på vores localhost (eller andet system).

localhost:~$ ssh -v -R 0.0.0.0:1999:127.0.0.1:902 192.168.1.100 user@remoteserver

Denne SSH-session etablerer en forbindelse fra port 1999 på fjernserveren til port 902 på vores lokale klient.

5. SSH Reverse Proxy

I dette tilfælde opsætter vi en socks-proxy på vores ssh-forbindelse, men proxyen lytter på den eksterne ende af serveren. Forbindelser til denne eksterne proxy kommer nu ud af tunnelen som trafik fra vores lokale vært.

localhost:~$ ssh -v -R 0.0.0.0:1999 192.168.1.100 user@remoteserver

Fejlfinding af eksterne SSH-tunneler

Hvis du har problemer med at få SSH-fjernbetjeningsmulighederne til at virke, så tjek med netstat, hvilke andre grænseflader lytteporten er tilsluttet. Selvom vi har angivet 0.0.0.0 i eksemplerne, men hvis værdien GatewayPorts в sshd_config indstillet til ingen, så vil lytteren kun være bundet til localhost (127.0.0.1).

Sikkerhedsadvarsel

Bemærk venligst, at når du åbner tunneler og strømproxyer, kan interne netværksressourcer være tilgængelige for upålidelige netværk (f.eks. internettet!). Dette kan være en alvorlig sikkerhedsrisiko, så sørg for at forstå, hvad en lytter er, og hvad den har adgang til.

6. Installer VPN over SSH

Et almindeligt udtryk blandt angribere (pentestere osv.) er "netværks omdrejningspunkt". Når en forbindelse er etableret på et system, bliver dette system gatewayen for yderligere adgang til netværket. Et omdrejningspunkt, der giver dig mulighed for at bevæge dig i bredden.

Til et sådant fodfæste kan vi bruge en SSH proxy og proxykæder, dog er der nogle begrænsninger. Det vil for eksempel ikke være muligt at arbejde direkte med sockets, så vi vil ikke kunne scanne porte inden for netværket gennem Nmap SYN.

Ved at bruge denne mere avancerede VPN-mulighed falder forbindelsen til niveau 3. Vi kan så blot dirigere trafik gennem tunnelen ved hjælp af standard netværksrouting.

Metoden bruger ssh, iptables, tun interfaces og routing.

Først skal du indstille disse parametre sshd_config. Da vi foretager ændringer i grænseflader på både fjern- og klientsystemer, har vi har brug for root-tilladelser på begge sider.

PermitRootLogin yes
PermitTunnel yes

Derefter etablerer vi en ssh-forbindelse ved hjælp af parameteren, der anmoder om initialisering af tun-enheder.

localhost:~# ssh -v -w any root@remoteserver

Vi skulle nu have en tunenhed, når vi viser grænseflader (# ip a). Det næste trin vil tilføje IP-adresser til tunnelgrænsefladerne.

SSH klient side:

localhost:~# ip addr add 10.10.10.2/32 peer 10.10.10.10 dev tun0
localhost:~# ip tun0 up

SSH server side:

remoteserver:~# ip addr add 10.10.10.10/32 peer 10.10.10.2 dev tun0
remoteserver:~# ip tun0 up

Nu har vi en direkte rute til en anden vært (route -n и ping 10.10.10.10).

Det er muligt at dirigere et hvilket som helst undernet gennem værten på den anden side.

localhost:~# route add -net 10.10.10.0 netmask 255.255.255.0 dev tun0

Aktiver på fjernsiden ip_forward и iptables.

remoteserver:~# echo 1 > /proc/sys/net/ipv4/ip_forward
remoteserver:~# iptables -t nat -A POSTROUTING -s 10.10.10.2 -o enp7s0 -j MASQUERADE

Bom! VPN over SSH-tunnel på netværkslag 3. Dette er allerede en sejr.

Hvis der er problemer, så brug tcpdump и pingat fastslå årsagen. Da vi spiller på lag 3, vil vores icmp-pakker gå gennem denne tunnel.

7. Kopiér SSH-nøgle (ssh-copy-id)

Der er flere måder at gøre dette på, men denne kommando sparer tid ved ikke at kopiere filerne manuelt. Den kopierer ganske enkelt ~/.ssh/id_rsa.pub (eller standardnøglen) fra dit system til ~/.ssh/authorized_keys på en ekstern server.

localhost:~$ ssh-copy-id user@remoteserver

8. Ekstern kommandoudførelse (ikke-interaktiv)

hold ssh kan kobles til andre kommandoer for den sædvanlige brugervenlige grænseflade. Du skal blot tilføje den kommando, du vil køre på fjernværten, som den sidste parameter i anførselstegn.

localhost:~$ ssh remoteserver "cat /var/log/nginx/access.log" | grep badstuff.php

I dette eksempel grep udføres på det lokale system, efter at loggen er blevet downloadet over ssh-kanalen. Hvis filen er stor, er den mere praktisk at køre grep på fjernsiden ved blot at sætte begge kommandoer i dobbelte anførselstegn.

Et andet eksempel udfører samme funktion som ssh-copy-id fra eksempel 7.

localhost:~$ cat ~/.ssh/id_rsa.pub | ssh remoteserver 'cat >> .ssh/authorized_keys'

9. Fjernpakkeoptagelse og Wireshark-visning

Jeg tog en af ​​vores tcpdump eksempler. Brug den til at fange pakker eksternt og returnere resultatet direkte til din lokale Wiresharks GUI.

:~$ ssh root@remoteserver 'tcpdump -c 1000 -nn -w - not port 22' | wireshark -k -i -

10. Kopiering af en lokal mappe til en ekstern server via SSH

Et fint trick, der komprimerer en mappe med bzip2 (dette er -j-indstillingen i kommandoen tar) og henter derefter strømmen bzip2 på den anden side, oprettelse af en dubletmappe på fjernserveren.

localhost:~$ tar -cvj /datafolder | ssh remoteserver "tar -xj -C /datafolder"

11. Remote GUI-applikationer med SSH X11-videresendelse

Hvis både klienten og fjernserveren har "x" installeret, så kan du eksternt udføre en GUI-kommando med et vindue på dit lokale skrivebord. Denne funktion har eksisteret i lang tid, men er stadig meget nyttig. Start en ekstern webbrowser eller endda en VMWawre Workstation-konsol som jeg gør i dette eksempel.

localhost:~$ ssh -X remoteserver vmware

String påkrævet X11Forwarding yes i fil sshd_config.

12. Fjernkopier filer ved hjælp af rsync og SSH

rsync meget mere bekvemt scphvis du har brug for periodisk backup af en mappe, et stort antal filer eller meget store filer. Der er en funktion til at genoprette fra en overførselsfejl og kun kopiere ændrede filer, hvilket sparer trafik og tid.

Dette eksempel bruger komprimering gzip (-z) og arkivtilstand (-a), som muliggør rekursiv kopiering.

:~$ rsync -az /home/testuser/data remoteserver:backup/

13. SSH over Tor-netværket

Det anonyme Tor-netværk kan tunnelere SSH-trafik med kommandoen torsocks. Følgende kommando vil sende en ssh proxy gennem Tor.

localhost:~$ torsocks ssh myuntracableuser@remoteserver

Torsokker vil bruge port 9050 på localhost til proxyen. Som altid, når du bruger Tor, skal du seriøst kontrollere, hvilken trafik der bliver tunneleret og andre driftssikkerhedsproblemer (opsec). Hvor går dine DNS-anmodninger hen?

14. SSH til EC2 instans

Der kræves en privat nøgle for at oprette forbindelse til en EC2-instans. Download den (.pem-udvidelse) fra Amazon EC2-kontrolpanelet og skift tilladelserne (chmod 400 my-ec2-ssh-key.pem). Opbevar nøglen et sikkert sted eller læg den i din mappe ~/.ssh/.

localhost:~$ ssh -i ~/.ssh/my-ec2-key.pem ubuntu@my-ec2-public

Parameter -i fortæller blot ssh-klienten at bruge den nøgle. Fil ~/.ssh/config ideel til automatisk konfiguration af nøglebrug, når der oprettes forbindelse til en ec2-vært.

Host my-ec2-public
   Hostname ec2???.compute-1.amazonaws.com
   User ubuntu
   IdentityFile ~/.ssh/my-ec2-key.pem

15. Rediger tekstfiler med VIM via ssh/scp

For alle elskere vim dette tip vil spare dig for noget tid. Ved hjælp af vim filer redigeres via scp med én kommando. Denne metode opretter blot filen lokalt i /tmp, og kopierer det så tilbage, når vi har gemt det fra vim.

localhost:~$ vim scp://user@remoteserver//etc/hosts

Bemærk: formatet er lidt anderledes end det sædvanlige scp. Efter værten har vi en dobbelt //. Dette er en absolut vejreference. En enkelt skråstreg vil betyde, at stien er i forhold til hjemmemappen users.

**warning** (netrw) cannot determine method (format: protocol://[user@]hostname[:port]/[path])

Hvis du ser denne fejl, skal du dobbelttjekke kommandoformatet. Dette betyder normalt en syntaksfejl.

16. Monter fjern-SSH som en lokal mappe med SSHFS

Ved hjælp af sshfs - filsystemklient ssh - vi kan montere en lokal mappe til en fjernplacering med alle filinteraktioner i en krypteret session ssh.

localhost:~$ apt install sshfs

Installer pakken på Ubuntu og Debian sshfs, og derefter bare montere fjernplaceringen til vores system.

localhost:~$ sshfs user@remoteserver:/media/data ~/data/

17. Multiplexing af SSH med ControlPath

Som standard, hvis der er en eksisterende forbindelse til en ekstern server ved hjælp af ssh anden forbindelse med ssh eller scp etablerer en ny session med yderligere godkendelse. Mulighed ControlPath giver dig mulighed for at bruge en eksisterende session til alle efterfølgende forbindelser. Dette vil fremskynde processen betydeligt: ​​Effekten er mærkbar selv i det lokale netværk, og endnu mere, når det er forbundet til eksterne ressourcer.

Host remoteserver
        HostName remoteserver.example.org
        ControlMaster auto
        ControlPath ~/.ssh/control/%r@%h:%p
        ControlPersist 10m

ControlPath specificerer stikket for nye forbindelser for at tjekke for en aktiv session ssh. Den sidste mulighed betyder, at selv efter at have logget ud af konsollen, vil den eksisterende session forblive åben i 10 minutter, så i løbet af den tid kan du genoprette forbindelsen til det eksisterende stik. Se hjælpen for at få flere oplysninger. ssh_config man.

18. Stream video over SSH med VLC og SFTP

Selv mangeårige brugere ssh и vlc (Video Lan Client) kender ikke altid til denne praktiske mulighed, når du virkelig har brug for at se video over netværket. I indstillinger fil | Åbn Network Stream programmer vlc du kan indtaste placeringen som sftp://. Hvis der kræves en adgangskode, bliver du bedt om det.

sftp://remoteserver//media/uploads/myvideo.mkv

19. To-faktor autentificering

Den samme to-faktor-godkendelse som din bankkonto eller Google-konto gælder for SSH-tjenesten.

Naturligvis ssh har i første omgang en to-faktor autentificeringsfunktion, hvilket betyder en adgangskode og en SSH-nøgle. Fordelen ved et hardwaretoken eller Google Authenticator-app er, at det normalt er en anden fysisk enhed.

Se vores 8-minutters guide til ved hjælp af Google Authenticator og SSH.

20. Hoppeværter med ssh og -J

Hvis netværkssegmentering kræver, at du hopper gennem flere ssh-værter for at komme til dit endelige destinationsnetværk, vil -J-genvejen spare dig tid.

localhost:~$ ssh -J host1,host2,host3 [email protected]

Det vigtigste her er at forstå, at dette ikke ligner kommandoen ssh host1, så user@host1:~$ ssh host2 osv. Indstillingen -J bruger smart videresendelse til at få localhost til at etablere en session med den næste vært i kæden. Så i eksemplet ovenfor autentificerer vores localhost til host4. Det vil sige, at vores localhost-nøgler bruges, og sessionen fra localhost til host4 er fuldt krypteret.

For sådan en mulighed ssh_config angiv konfigurationsmulighed ProxyJump. Hvis du regelmæssigt skal igennem flere værter, vil automatisering gennem konfigurationen spare en masse tid.

21. Blokering af SSH brute force-forsøg med iptables

Enhver, der har styret en SSH-tjeneste og kigget på loggene, er klar over antallet af brute force-forsøg, der forekommer hver time hver dag. En hurtig måde at reducere logstøj på er at flytte SSH til en ikke-standard port. Foretag ændringer i filen sshd_config ved hjælp af en indstillingsmulighed Havn##.

Med iptables du kan også nemt blokere forbindelsesforsøg til en port, når en vis tærskel er nået. En nem måde at gøre dette på er at bruge OSSEC, da den ikke kun blokerer SSH, men udfører en masse andre værtsnavn-baserede indtrængen detektion (HIDS) tiltag.

22. SSH Escape for at ændre portvideresendelse

Og vores sidste eksempel ssh designet til at ændre portvideresendelse i farten inden for en eksisterende session ssh. Forestil dig sådan et scenarie. Du er dybt i netværket; sikkert sprang gennem et halvt dusin værter og har brug for en lokal port på arbejdsstationen, der videresendes til Microsoft SMB i et gammelt Windows 2003-system (er der nogen der kan huske ms08-67?).

Klikker enter, prøv at skrive i konsollen ~C. Dette er en session-escape-sekvens, der giver dig mulighed for at foretage ændringer i en eksisterende forbindelse.

localhost:~$ ~C
ssh> -h
Commands:
      -L[bind_address:]port:host:hostport    Request local forward
      -R[bind_address:]port:host:hostport    Request remote forward
      -D[bind_address:]port                  Request dynamic forward
      -KL[bind_address:]port                 Cancel local forward
      -KR[bind_address:]port                 Cancel remote forward
      -KD[bind_address:]port                 Cancel dynamic forward
ssh> -L 1445:remote-win2k3:445
Forwarding port.

Her kan du se, at vi har videresendt vores lokale port 1445 til en Windows 2003-vært, vi fandt på det interne netværk. Nu er det bare at løbe msfconsole, og du er klar (forudsat at du planlægger at bruge denne vært).

Afslutning

Disse eksempler, tips og kommandoer ssh bør give et udgangspunkt; Yderligere oplysninger om hver af kommandoerne og funktionerne er tilgængelig på man-siderne (man ssh, man ssh_config, man sshd_config).

Jeg har altid været fascineret af evnen til at få adgang til systemer og udføre kommandoer overalt i verden. Udvikle dine færdigheder med værktøjer som ssh du bliver mere effektiv i hvilket spil du spiller.

Kilde: www.habr.com

Tilføj en kommentar