NetSec Lab 2020-2021 DDoS / SSH Brute Force Attack / SSH Port Fowarding / VPN
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

1768 lines
102 KiB

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge"><![endif]-->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="generator" content="Asciidoctor 1.5.5">
<meta name="author" content="Ρούσου Αντρέι - 711171075 - cs171075@uniwa.gr">
<title>Ασφάλεια Δικτύων και Επικοινωνιών</title>
<link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700">
<style>
/* Asciidoctor default stylesheet | MIT License | http://asciidoctor.org */
/* Remove comment around @import statement below when using as a custom stylesheet */
/*@import "https://fonts.googleapis.com/css?family=Open+Sans:300,300italic,400,400italic,600,600italic%7CNoto+Serif:400,400italic,700,700italic%7CDroid+Sans+Mono:400,700";*/
article,aside,details,figcaption,figure,footer,header,hgroup,main,nav,section,summary{display:block}
audio,canvas,video{display:inline-block}
audio:not([controls]){display:none;height:0}
[hidden],template{display:none}
script{display:none!important}
html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}
a{background:transparent}
a:focus{outline:thin dotted}
a:active,a:hover{outline:0}
h1{font-size:2em;margin:.67em 0}
abbr[title]{border-bottom:1px dotted}
b,strong{font-weight:bold}
dfn{font-style:italic}
hr{-moz-box-sizing:content-box;box-sizing:content-box;height:0}
mark{background:#ff0;color:#000}
code,kbd,pre,samp{font-family:monospace;font-size:1em}
pre{white-space:pre-wrap}
q{quotes:"\201C" "\201D" "\2018" "\2019"}
small{font-size:80%}
sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}
sup{top:-.5em}
sub{bottom:-.25em}
img{border:0}
svg:not(:root){overflow:hidden}
figure{margin:0}
fieldset{border:1px solid silver;margin:0 2px;padding:.35em .625em .75em}
legend{border:0;padding:0}
button,input,select,textarea{font-family:inherit;font-size:100%;margin:0}
button,input{line-height:normal}
button,select{text-transform:none}
button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}
button[disabled],html input[disabled]{cursor:default}
input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}
input[type="search"]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}
input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}
button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}
textarea{overflow:auto;vertical-align:top}
table{border-collapse:collapse;border-spacing:0}
*,*:before,*:after{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}
html,body{font-size:100%}
body{background:#fff;color:rgba(0,0,0,.8);padding:0;margin:0;font-family:"Noto Serif","DejaVu Serif",serif;font-weight:400;font-style:normal;line-height:1;position:relative;cursor:auto;tab-size:4;-moz-osx-font-smoothing:grayscale;-webkit-font-smoothing:antialiased}
a:hover{cursor:pointer}
img,object,embed{max-width:100%;height:auto}
object,embed{height:100%}
img{-ms-interpolation-mode:bicubic}
.left{float:left!important}
.right{float:right!important}
.text-left{text-align:left!important}
.text-right{text-align:right!important}
.text-center{text-align:center!important}
.text-justify{text-align:justify!important}
.hide{display:none}
img,object,svg{display:inline-block;vertical-align:middle}
textarea{height:auto;min-height:50px}
select{width:100%}
.center{margin-left:auto;margin-right:auto}
.spread{width:100%}
p.lead,.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{font-size:1.21875em;line-height:1.6}
.subheader,.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{line-height:1.45;color:#7a2518;font-weight:400;margin-top:0;margin-bottom:.25em}
div,dl,dt,dd,ul,ol,li,h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6,pre,form,p,blockquote,th,td{margin:0;padding:0;direction:ltr}
a{color:#2156a5;text-decoration:underline;line-height:inherit}
a:hover,a:focus{color:#1d4b8f}
a img{border:none}
p{font-family:inherit;font-weight:400;font-size:1em;line-height:1.6;margin-bottom:1.25em;text-rendering:optimizeLegibility}
p aside{font-size:.875em;line-height:1.35;font-style:italic}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{font-family:"Open Sans","DejaVu Sans",sans-serif;font-weight:300;font-style:normal;color:#ba3925;text-rendering:optimizeLegibility;margin-top:1em;margin-bottom:.5em;line-height:1.0125em}
h1 small,h2 small,h3 small,#toctitle small,.sidebarblock>.content>.title small,h4 small,h5 small,h6 small{font-size:60%;color:#e99b8f;line-height:0}
h1{font-size:2.125em}
h2{font-size:1.6875em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.375em}
h4,h5{font-size:1.125em}
h6{font-size:1em}
hr{border:solid #ddddd8;border-width:1px 0 0;clear:both;margin:1.25em 0 1.1875em;height:0}
em,i{font-style:italic;line-height:inherit}
strong,b{font-weight:bold;line-height:inherit}
small{font-size:60%;line-height:inherit}
code{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;color:rgba(0,0,0,.9)}
ul,ol,dl{font-size:1em;line-height:1.6;margin-bottom:1.25em;list-style-position:outside;font-family:inherit}
ul,ol,ul.no-bullet,ol.no-bullet{margin-left:1.5em}
ul li ul,ul li ol{margin-left:1.25em;margin-bottom:0;font-size:1em}
ul.square li ul,ul.circle li ul,ul.disc li ul{list-style:inherit}
ul.square{list-style-type:square}
ul.circle{list-style-type:circle}
ul.disc{list-style-type:disc}
ul.no-bullet{list-style:none}
ol li ul,ol li ol{margin-left:1.25em;margin-bottom:0}
dl dt{margin-bottom:.3125em;font-weight:bold}
dl dd{margin-bottom:1.25em}
abbr,acronym{text-transform:uppercase;font-size:90%;color:rgba(0,0,0,.8);border-bottom:1px dotted #ddd;cursor:help}
abbr{text-transform:none}
blockquote{margin:0 0 1.25em;padding:.5625em 1.25em 0 1.1875em;border-left:1px solid #ddd}
blockquote cite{display:block;font-size:.9375em;color:rgba(0,0,0,.6)}
blockquote cite:before{content:"\2014 \0020"}
blockquote cite a,blockquote cite a:visited{color:rgba(0,0,0,.6)}
blockquote,blockquote p{line-height:1.6;color:rgba(0,0,0,.85)}
@media only screen and (min-width:768px){h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2}
h1{font-size:2.75em}
h2{font-size:2.3125em}
h3,#toctitle,.sidebarblock>.content>.title{font-size:1.6875em}
h4{font-size:1.4375em}}
table{background:#fff;margin-bottom:1.25em;border:solid 1px #dedede}
table thead,table tfoot{background:#f7f8f7;font-weight:bold}
table thead tr th,table thead tr td,table tfoot tr th,table tfoot tr td{padding:.5em .625em .625em;font-size:inherit;color:rgba(0,0,0,.8);text-align:left}
table tr th,table tr td{padding:.5625em .625em;font-size:inherit;color:rgba(0,0,0,.8)}
table tr.even,table tr.alt,table tr:nth-of-type(even){background:#f8f8f7}
table thead tr th,table tfoot tr th,table tbody tr td,table tr td,table tfoot tr td{display:table-cell;line-height:1.6}
h1,h2,h3,#toctitle,.sidebarblock>.content>.title,h4,h5,h6{line-height:1.2;word-spacing:-.05em}
h1 strong,h2 strong,h3 strong,#toctitle strong,.sidebarblock>.content>.title strong,h4 strong,h5 strong,h6 strong{font-weight:400}
.clearfix:before,.clearfix:after,.float-group:before,.float-group:after{content:" ";display:table}
.clearfix:after,.float-group:after{clear:both}
*:not(pre)>code{font-size:.9375em;font-style:normal!important;letter-spacing:0;padding:.1em .5ex;word-spacing:-.15em;background-color:#f7f7f8;-webkit-border-radius:4px;border-radius:4px;line-height:1.45;text-rendering:optimizeSpeed;word-wrap:break-word}
*:not(pre)>code.nobreak{word-wrap:normal}
*:not(pre)>code.nowrap{white-space:nowrap}
pre,pre>code{line-height:1.45;color:rgba(0,0,0,.9);font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;font-weight:400;text-rendering:optimizeSpeed}
em em{font-style:normal}
strong strong{font-weight:400}
.keyseq{color:rgba(51,51,51,.8)}
kbd{font-family:"Droid Sans Mono","DejaVu Sans Mono",monospace;display:inline-block;color:rgba(0,0,0,.8);font-size:.65em;line-height:1.45;background-color:#f7f7f7;border:1px solid #ccc;-webkit-border-radius:3px;border-radius:3px;-webkit-box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em white inset;box-shadow:0 1px 0 rgba(0,0,0,.2),0 0 0 .1em #fff inset;margin:0 .15em;padding:.2em .5em;vertical-align:middle;position:relative;top:-.1em;white-space:nowrap}
.keyseq kbd:first-child{margin-left:0}
.keyseq kbd:last-child{margin-right:0}
.menuseq,.menu{color:rgba(0,0,0,.8)}
b.button:before,b.button:after{position:relative;top:-1px;font-weight:400}
b.button:before{content:"[";padding:0 3px 0 2px}
b.button:after{content:"]";padding:0 2px 0 3px}
p a>code:hover{color:rgba(0,0,0,.9)}
#header,#content,#footnotes,#footer{width:100%;margin-left:auto;margin-right:auto;margin-top:0;margin-bottom:0;max-width:62.5em;*zoom:1;position:relative;padding-left:.9375em;padding-right:.9375em}
#header:before,#header:after,#content:before,#content:after,#footnotes:before,#footnotes:after,#footer:before,#footer:after{content:" ";display:table}
#header:after,#content:after,#footnotes:after,#footer:after{clear:both}
#content{margin-top:1.25em}
#content:before{content:none}
#header>h1:first-child{color:rgba(0,0,0,.85);margin-top:2.25rem;margin-bottom:0}
#header>h1:first-child+#toc{margin-top:8px;border-top:1px solid #ddddd8}
#header>h1:only-child,body.toc2 #header>h1:nth-last-child(2){border-bottom:1px solid #ddddd8;padding-bottom:8px}
#header .details{border-bottom:1px solid #ddddd8;line-height:1.45;padding-top:.25em;padding-bottom:.25em;padding-left:.25em;color:rgba(0,0,0,.6);display:-ms-flexbox;display:-webkit-flex;display:flex;-ms-flex-flow:row wrap;-webkit-flex-flow:row wrap;flex-flow:row wrap}
#header .details span:first-child{margin-left:-.125em}
#header .details span.email a{color:rgba(0,0,0,.85)}
#header .details br{display:none}
#header .details br+span:before{content:"\00a0\2013\00a0"}
#header .details br+span.author:before{content:"\00a0\22c5\00a0";color:rgba(0,0,0,.85)}
#header .details br+span#revremark:before{content:"\00a0|\00a0"}
#header #revnumber{text-transform:capitalize}
#header #revnumber:after{content:"\00a0"}
#content>h1:first-child:not([class]){color:rgba(0,0,0,.85);border-bottom:1px solid #ddddd8;padding-bottom:8px;margin-top:0;padding-top:1rem;margin-bottom:1.25rem}
#toc{border-bottom:1px solid #efefed;padding-bottom:.5em}
#toc>ul{margin-left:.125em}
#toc ul.sectlevel0>li>a{font-style:italic}
#toc ul.sectlevel0 ul.sectlevel1{margin:.5em 0}
#toc ul{font-family:"Open Sans","DejaVu Sans",sans-serif;list-style-type:none}
#toc li{line-height:1.3334;margin-top:.3334em}
#toc a{text-decoration:none}
#toc a:active{text-decoration:underline}
#toctitle{color:#7a2518;font-size:1.2em}
@media only screen and (min-width:768px){#toctitle{font-size:1.375em}
body.toc2{padding-left:15em;padding-right:0}
#toc.toc2{margin-top:0!important;background-color:#f8f8f7;position:fixed;width:15em;left:0;top:0;border-right:1px solid #efefed;border-top-width:0!important;border-bottom-width:0!important;z-index:1000;padding:1.25em 1em;height:100%;overflow:auto}
#toc.toc2 #toctitle{margin-top:0;margin-bottom:.8rem;font-size:1.2em}
#toc.toc2>ul{font-size:.9em;margin-bottom:0}
#toc.toc2 ul ul{margin-left:0;padding-left:1em}
#toc.toc2 ul.sectlevel0 ul.sectlevel1{padding-left:0;margin-top:.5em;margin-bottom:.5em}
body.toc2.toc-right{padding-left:0;padding-right:15em}
body.toc2.toc-right #toc.toc2{border-right-width:0;border-left:1px solid #efefed;left:auto;right:0}}
@media only screen and (min-width:1280px){body.toc2{padding-left:20em;padding-right:0}
#toc.toc2{width:20em}
#toc.toc2 #toctitle{font-size:1.375em}
#toc.toc2>ul{font-size:.95em}
#toc.toc2 ul ul{padding-left:1.25em}
body.toc2.toc-right{padding-left:0;padding-right:20em}}
#content #toc{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
#content #toc>:first-child{margin-top:0}
#content #toc>:last-child{margin-bottom:0}
#footer{max-width:100%;background-color:rgba(0,0,0,.8);padding:1.25em}
#footer-text{color:rgba(255,255,255,.8);line-height:1.44}
.sect1{padding-bottom:.625em}
@media only screen and (min-width:768px){.sect1{padding-bottom:1.25em}}
.sect1+.sect1{border-top:1px solid #efefed}
#content h1>a.anchor,h2>a.anchor,h3>a.anchor,#toctitle>a.anchor,.sidebarblock>.content>.title>a.anchor,h4>a.anchor,h5>a.anchor,h6>a.anchor{position:absolute;z-index:1001;width:1.5ex;margin-left:-1.5ex;display:block;text-decoration:none!important;visibility:hidden;text-align:center;font-weight:400}
#content h1>a.anchor:before,h2>a.anchor:before,h3>a.anchor:before,#toctitle>a.anchor:before,.sidebarblock>.content>.title>a.anchor:before,h4>a.anchor:before,h5>a.anchor:before,h6>a.anchor:before{content:"\00A7";font-size:.85em;display:block;padding-top:.1em}
#content h1:hover>a.anchor,#content h1>a.anchor:hover,h2:hover>a.anchor,h2>a.anchor:hover,h3:hover>a.anchor,#toctitle:hover>a.anchor,.sidebarblock>.content>.title:hover>a.anchor,h3>a.anchor:hover,#toctitle>a.anchor:hover,.sidebarblock>.content>.title>a.anchor:hover,h4:hover>a.anchor,h4>a.anchor:hover,h5:hover>a.anchor,h5>a.anchor:hover,h6:hover>a.anchor,h6>a.anchor:hover{visibility:visible}
#content h1>a.link,h2>a.link,h3>a.link,#toctitle>a.link,.sidebarblock>.content>.title>a.link,h4>a.link,h5>a.link,h6>a.link{color:#ba3925;text-decoration:none}
#content h1>a.link:hover,h2>a.link:hover,h3>a.link:hover,#toctitle>a.link:hover,.sidebarblock>.content>.title>a.link:hover,h4>a.link:hover,h5>a.link:hover,h6>a.link:hover{color:#a53221}
.audioblock,.imageblock,.literalblock,.listingblock,.stemblock,.videoblock{margin-bottom:1.25em}
.admonitionblock td.content>.title,.audioblock>.title,.exampleblock>.title,.imageblock>.title,.listingblock>.title,.literalblock>.title,.stemblock>.title,.openblock>.title,.paragraph>.title,.quoteblock>.title,table.tableblock>.title,.verseblock>.title,.videoblock>.title,.dlist>.title,.olist>.title,.ulist>.title,.qlist>.title,.hdlist>.title{text-rendering:optimizeLegibility;text-align:left;font-family:"Noto Serif","DejaVu Serif",serif;font-size:1rem;font-style:italic}
table.tableblock>caption.title{white-space:nowrap;overflow:visible;max-width:0}
.paragraph.lead>p,#preamble>.sectionbody>.paragraph:first-of-type p{color:rgba(0,0,0,.85)}
table.tableblock #preamble>.sectionbody>.paragraph:first-of-type p{font-size:inherit}
.admonitionblock>table{border-collapse:separate;border:0;background:none;width:100%}
.admonitionblock>table td.icon{text-align:center;width:80px}
.admonitionblock>table td.icon img{max-width:none}
.admonitionblock>table td.icon .title{font-weight:bold;font-family:"Open Sans","DejaVu Sans",sans-serif;text-transform:uppercase}
.admonitionblock>table td.content{padding-left:1.125em;padding-right:1.25em;border-left:1px solid #ddddd8;color:rgba(0,0,0,.6)}
.admonitionblock>table td.content>:last-child>:last-child{margin-bottom:0}
.exampleblock>.content{border-style:solid;border-width:1px;border-color:#e6e6e6;margin-bottom:1.25em;padding:1.25em;background:#fff;-webkit-border-radius:4px;border-radius:4px}
.exampleblock>.content>:first-child{margin-top:0}
.exampleblock>.content>:last-child{margin-bottom:0}
.sidebarblock{border-style:solid;border-width:1px;border-color:#e0e0dc;margin-bottom:1.25em;padding:1.25em;background:#f8f8f7;-webkit-border-radius:4px;border-radius:4px}
.sidebarblock>:first-child{margin-top:0}
.sidebarblock>:last-child{margin-bottom:0}
.sidebarblock>.content>.title{color:#7a2518;margin-top:0;text-align:center}
.exampleblock>.content>:last-child>:last-child,.exampleblock>.content .olist>ol>li:last-child>:last-child,.exampleblock>.content .ulist>ul>li:last-child>:last-child,.exampleblock>.content .qlist>ol>li:last-child>:last-child,.sidebarblock>.content>:last-child>:last-child,.sidebarblock>.content .olist>ol>li:last-child>:last-child,.sidebarblock>.content .ulist>ul>li:last-child>:last-child,.sidebarblock>.content .qlist>ol>li:last-child>:last-child{margin-bottom:0}
.literalblock pre,.listingblock pre:not(.highlight),.listingblock pre[class="highlight"],.listingblock pre[class^="highlight "],.listingblock pre.CodeRay,.listingblock pre.prettyprint{background:#f7f7f8}
.sidebarblock .literalblock pre,.sidebarblock .listingblock pre:not(.highlight),.sidebarblock .listingblock pre[class="highlight"],.sidebarblock .listingblock pre[class^="highlight "],.sidebarblock .listingblock pre.CodeRay,.sidebarblock .listingblock pre.prettyprint{background:#f2f1f1}
.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{-webkit-border-radius:4px;border-radius:4px;word-wrap:break-word;padding:1em;font-size:.8125em}
.literalblock pre.nowrap,.literalblock pre[class].nowrap,.listingblock pre.nowrap,.listingblock pre[class].nowrap{overflow-x:auto;white-space:pre;word-wrap:normal}
@media only screen and (min-width:768px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:.90625em}}
@media only screen and (min-width:1280px){.literalblock pre,.literalblock pre[class],.listingblock pre,.listingblock pre[class]{font-size:1em}}
.literalblock.output pre{color:#f7f7f8;background-color:rgba(0,0,0,.9)}
.listingblock pre.highlightjs{padding:0}
.listingblock pre.highlightjs>code{padding:1em;-webkit-border-radius:4px;border-radius:4px}
.listingblock pre.prettyprint{border-width:0}
.listingblock>.content{position:relative}
.listingblock code[data-lang]:before{display:none;content:attr(data-lang);position:absolute;font-size:.75em;top:.425rem;right:.5rem;line-height:1;text-transform:uppercase;color:#999}
.listingblock:hover code[data-lang]:before{display:block}
.listingblock.terminal pre .command:before{content:attr(data-prompt);padding-right:.5em;color:#999}
.listingblock.terminal pre .command:not([data-prompt]):before{content:"$"}
table.pyhltable{border-collapse:separate;border:0;margin-bottom:0;background:none}
table.pyhltable td{vertical-align:top;padding-top:0;padding-bottom:0;line-height:1.45}
table.pyhltable td.code{padding-left:.75em;padding-right:0}
pre.pygments .lineno,table.pyhltable td:not(.code){color:#999;padding-left:0;padding-right:.5em;border-right:1px solid #ddddd8}
pre.pygments .lineno{display:inline-block;margin-right:.25em}
table.pyhltable .linenodiv{background:none!important;padding-right:0!important}
.quoteblock{margin:0 1em 1.25em 1.5em;display:table}
.quoteblock>.title{margin-left:-1.5em;margin-bottom:.75em}
.quoteblock blockquote,.quoteblock blockquote p{color:rgba(0,0,0,.85);font-size:1.15rem;line-height:1.75;word-spacing:.1em;letter-spacing:0;font-style:italic;text-align:justify}
.quoteblock blockquote{margin:0;padding:0;border:0}
.quoteblock blockquote:before{content:"\201c";float:left;font-size:2.75em;font-weight:bold;line-height:.6em;margin-left:-.6em;color:#7a2518;text-shadow:0 1px 2px rgba(0,0,0,.1)}
.quoteblock blockquote>.paragraph:last-child p{margin-bottom:0}
.quoteblock .attribution{margin-top:.5em;margin-right:.5ex;text-align:right}
.quoteblock .quoteblock{margin-left:0;margin-right:0;padding:.5em 0;border-left:3px solid rgba(0,0,0,.6)}
.quoteblock .quoteblock blockquote{padding:0 0 0 .75em}
.quoteblock .quoteblock blockquote:before{display:none}
.verseblock{margin:0 1em 1.25em 1em}
.verseblock pre{font-family:"Open Sans","DejaVu Sans",sans;font-size:1.15rem;color:rgba(0,0,0,.85);font-weight:300;text-rendering:optimizeLegibility}
.verseblock pre strong{font-weight:400}
.verseblock .attribution{margin-top:1.25rem;margin-left:.5ex}
.quoteblock .attribution,.verseblock .attribution{font-size:.9375em;line-height:1.45;font-style:italic}
.quoteblock .attribution br,.verseblock .attribution br{display:none}
.quoteblock .attribution cite,.verseblock .attribution cite{display:block;letter-spacing:-.025em;color:rgba(0,0,0,.6)}
.quoteblock.abstract{margin:0 0 1.25em 0;display:block}
.quoteblock.abstract blockquote,.quoteblock.abstract blockquote p{text-align:left;word-spacing:0}
.quoteblock.abstract blockquote:before,.quoteblock.abstract blockquote p:first-of-type:before{display:none}
table.tableblock{max-width:100%;border-collapse:separate}
table.tableblock td>.paragraph:last-child p>p:last-child,table.tableblock th>p:last-child,table.tableblock td>p:last-child{margin-bottom:0}
table.tableblock,th.tableblock,td.tableblock{border:0 solid #dedede}
table.grid-all th.tableblock,table.grid-all td.tableblock{border-width:0 1px 1px 0}
table.grid-all tfoot>tr>th.tableblock,table.grid-all tfoot>tr>td.tableblock{border-width:1px 1px 0 0}
table.grid-cols th.tableblock,table.grid-cols td.tableblock{border-width:0 1px 0 0}
table.grid-all *>tr>.tableblock:last-child,table.grid-cols *>tr>.tableblock:last-child{border-right-width:0}
table.grid-rows th.tableblock,table.grid-rows td.tableblock{border-width:0 0 1px 0}
table.grid-all tbody>tr:last-child>th.tableblock,table.grid-all tbody>tr:last-child>td.tableblock,table.grid-all thead:last-child>tr>th.tableblock,table.grid-rows tbody>tr:last-child>th.tableblock,table.grid-rows tbody>tr:last-child>td.tableblock,table.grid-rows thead:last-child>tr>th.tableblock{border-bottom-width:0}
table.grid-rows tfoot>tr>th.tableblock,table.grid-rows tfoot>tr>td.tableblock{border-width:1px 0 0 0}
table.frame-all{border-width:1px}
table.frame-sides{border-width:0 1px}
table.frame-topbot{border-width:1px 0}
th.halign-left,td.halign-left{text-align:left}
th.halign-right,td.halign-right{text-align:right}
th.halign-center,td.halign-center{text-align:center}
th.valign-top,td.valign-top{vertical-align:top}
th.valign-bottom,td.valign-bottom{vertical-align:bottom}
th.valign-middle,td.valign-middle{vertical-align:middle}
table thead th,table tfoot th{font-weight:bold}
tbody tr th{display:table-cell;line-height:1.6;background:#f7f8f7}
tbody tr th,tbody tr th p,tfoot tr th,tfoot tr th p{color:rgba(0,0,0,.8);font-weight:bold}
p.tableblock>code:only-child{background:none;padding:0}
p.tableblock{font-size:1em}
td>div.verse{white-space:pre}
ol{margin-left:1.75em}
ul li ol{margin-left:1.5em}
dl dd{margin-left:1.125em}
dl dd:last-child,dl dd:last-child>:last-child{margin-bottom:0}
ol>li p,ul>li p,ul dd,ol dd,.olist .olist,.ulist .ulist,.ulist .olist,.olist .ulist{margin-bottom:.625em}
ul.unstyled,ol.unnumbered,ul.checklist,ul.none{list-style-type:none}
ul.unstyled,ol.unnumbered,ul.checklist{margin-left:.625em}
ul.checklist li>p:first-child>.fa-square-o:first-child,ul.checklist li>p:first-child>.fa-check-square-o:first-child{width:1em;font-size:.85em}
ul.checklist li>p:first-child>input[type="checkbox"]:first-child{width:1em;position:relative;top:1px}
ul.inline{margin:0 auto .625em auto;margin-left:-1.375em;margin-right:0;padding:0;list-style:none;overflow:hidden}
ul.inline>li{list-style:none;float:left;margin-left:1.375em;display:block}
ul.inline>li>*{display:block}
.unstyled dl dt{font-weight:400;font-style:normal}
ol.arabic{list-style-type:decimal}
ol.decimal{list-style-type:decimal-leading-zero}
ol.loweralpha{list-style-type:lower-alpha}
ol.upperalpha{list-style-type:upper-alpha}
ol.lowerroman{list-style-type:lower-roman}
ol.upperroman{list-style-type:upper-roman}
ol.lowergreek{list-style-type:lower-greek}
.hdlist>table,.colist>table{border:0;background:none}
.hdlist>table>tbody>tr,.colist>table>tbody>tr{background:none}
td.hdlist1,td.hdlist2{vertical-align:top;padding:0 .625em}
td.hdlist1{font-weight:bold;padding-bottom:1.25em}
.literalblock+.colist,.listingblock+.colist{margin-top:-.5em}
.colist>table tr>td:first-of-type{padding:0 .75em;line-height:1}
.colist>table tr>td:last-of-type{padding:.25em 0}
.thumb,.th{line-height:0;display:inline-block;border:solid 4px #fff;-webkit-box-shadow:0 0 0 1px #ddd;box-shadow:0 0 0 1px #ddd}
.imageblock.left,.imageblock[style*="float: left"]{margin:.25em .625em 1.25em 0}
.imageblock.right,.imageblock[style*="float: right"]{margin:.25em 0 1.25em .625em}
.imageblock>.title{margin-bottom:0}
.imageblock.thumb,.imageblock.th{border-width:6px}
.imageblock.thumb>.title,.imageblock.th>.title{padding:0 .125em}
.image.left,.image.right{margin-top:.25em;margin-bottom:.25em;display:inline-block;line-height:0}
.image.left{margin-right:.625em}
.image.right{margin-left:.625em}
a.image{text-decoration:none;display:inline-block}
a.image object{pointer-events:none}
sup.footnote,sup.footnoteref{font-size:.875em;position:static;vertical-align:super}
sup.footnote a,sup.footnoteref a{text-decoration:none}
sup.footnote a:active,sup.footnoteref a:active{text-decoration:underline}
#footnotes{padding-top:.75em;padding-bottom:.75em;margin-bottom:.625em}
#footnotes hr{width:20%;min-width:6.25em;margin:-.25em 0 .75em 0;border-width:1px 0 0 0}
#footnotes .footnote{padding:0 .375em 0 .225em;line-height:1.3334;font-size:.875em;margin-left:1.2em;text-indent:-1.05em;margin-bottom:.2em}
#footnotes .footnote a:first-of-type{font-weight:bold;text-decoration:none}
#footnotes .footnote:last-of-type{margin-bottom:0}
#content #footnotes{margin-top:-.625em;margin-bottom:0;padding:.75em 0}
.gist .file-data>table{border:0;background:#fff;width:100%;margin-bottom:0}
.gist .file-data>table td.line-data{width:99%}
div.unbreakable{page-break-inside:avoid}
.big{font-size:larger}
.small{font-size:smaller}
.underline{text-decoration:underline}
.overline{text-decoration:overline}
.line-through{text-decoration:line-through}
.aqua{color:#00bfbf}
.aqua-background{background-color:#00fafa}
.black{color:#000}
.black-background{background-color:#000}
.blue{color:#0000bf}
.blue-background{background-color:#0000fa}
.fuchsia{color:#bf00bf}
.fuchsia-background{background-color:#fa00fa}
.gray{color:#606060}
.gray-background{background-color:#7d7d7d}
.green{color:#006000}
.green-background{background-color:#007d00}
.lime{color:#00bf00}
.lime-background{background-color:#00fa00}
.maroon{color:#600000}
.maroon-background{background-color:#7d0000}
.navy{color:#000060}
.navy-background{background-color:#00007d}
.olive{color:#606000}
.olive-background{background-color:#7d7d00}
.purple{color:#600060}
.purple-background{background-color:#7d007d}
.red{color:#bf0000}
.red-background{background-color:#fa0000}
.silver{color:#909090}
.silver-background{background-color:#bcbcbc}
.teal{color:#006060}
.teal-background{background-color:#007d7d}
.white{color:#bfbfbf}
.white-background{background-color:#fafafa}
.yellow{color:#bfbf00}
.yellow-background{background-color:#fafa00}
span.icon>.fa{cursor:default}
.admonitionblock td.icon [class^="fa icon-"]{font-size:2.5em;text-shadow:1px 1px 2px rgba(0,0,0,.5);cursor:default}
.admonitionblock td.icon .icon-note:before{content:"\f05a";color:#19407c}
.admonitionblock td.icon .icon-tip:before{content:"\f0eb";text-shadow:1px 1px 2px rgba(155,155,0,.8);color:#111}
.admonitionblock td.icon .icon-warning:before{content:"\f071";color:#bf6900}
.admonitionblock td.icon .icon-caution:before{content:"\f06d";color:#bf3400}
.admonitionblock td.icon .icon-important:before{content:"\f06a";color:#bf0000}
.conum[data-value]{display:inline-block;color:#fff!important;background-color:rgba(0,0,0,.8);-webkit-border-radius:100px;border-radius:100px;text-align:center;font-size:.75em;width:1.67em;height:1.67em;line-height:1.67em;font-family:"Open Sans","DejaVu Sans",sans-serif;font-style:normal;font-weight:bold}
.conum[data-value] *{color:#fff!important}
.conum[data-value]+b{display:none}
.conum[data-value]:after{content:attr(data-value)}
pre .conum[data-value]{position:relative;top:-.125em}
b.conum *{color:inherit!important}
.conum:not([data-value]):empty{display:none}
dt,th.tableblock,td.content,div.footnote{text-rendering:optimizeLegibility}
h1,h2,p,td.content,span.alt{letter-spacing:-.01em}
p strong,td.content strong,div.footnote strong{letter-spacing:-.005em}
p,blockquote,dt,td.content,span.alt{font-size:1.0625rem}
p{margin-bottom:1.25rem}
.sidebarblock p,.sidebarblock dt,.sidebarblock td.content,p.tableblock{font-size:1em}
.exampleblock>.content{background-color:#fffef7;border-color:#e0e0dc;-webkit-box-shadow:0 1px 4px #e0e0dc;box-shadow:0 1px 4px #e0e0dc}
.print-only{display:none!important}
@media print{@page{margin:1.25cm .75cm}
*{-webkit-box-shadow:none!important;box-shadow:none!important;text-shadow:none!important}
a{color:inherit!important;text-decoration:underline!important}
a.bare,a[href^="#"],a[href^="mailto:"]{text-decoration:none!important}
a[href^="http:"]:not(.bare):after,a[href^="https:"]:not(.bare):after{content:"(" attr(href) ")";display:inline-block;font-size:.875em;padding-left:.25em}
abbr[title]:after{content:" (" attr(title) ")"}
pre,blockquote,tr,img,object,svg{page-break-inside:avoid}
thead{display:table-header-group}
svg{max-width:100%}
p,blockquote,dt,td.content{font-size:1em;orphans:3;widows:3}
h2,h3,#toctitle,.sidebarblock>.content>.title{page-break-after:avoid}
#toc,.sidebarblock,.exampleblock>.content{background:none!important}
#toc{border-bottom:1px solid #ddddd8!important;padding-bottom:0!important}
.sect1{padding-bottom:0!important}
.sect1+.sect1{border:0!important}
#header>h1:first-child{margin-top:1.25rem}
body.book #header{text-align:center}
body.book #header>h1:first-child{border:0!important;margin:2.5em 0 1em 0}
body.book #header .details{border:0!important;display:block;padding:0!important}
body.book #header .details span:first-child{margin-left:0!important}
body.book #header .details br{display:block}
body.book #header .details br+span:before{content:none!important}
body.book #toc{border:0!important;text-align:left!important;padding:0!important;margin:0!important}
body.book #toc,body.book #preamble,body.book h1.sect0,body.book .sect1>h2{page-break-before:always}
.listingblock code[data-lang]:before{display:block}
#footer{background:none!important;padding:0 .9375em}
#footer-text{color:rgba(0,0,0,.6)!important;font-size:.9em}
.hide-on-print{display:none!important}
.print-only{display:block!important}
.hide-for-print{display:none!important}
.show-for-print{display:inherit!important}}
</style>
</head>
<body class="article toc2 toc-left">
<div id="header">
<h1>Ασφάλεια Δικτύων και Επικοινωνιών</h1>
<div class="details">
<span id="author" class="author">Ρούσου Αντρέι - 711171075 - cs171075@uniwa.gr</span><br>
</div>
<div id="toc" class="toc2">
<div id="toctitle">Table of Contents</div>
<ul class="sectlevel1">
<li><a href="#_εισαγωγή_και_περιγραφή">Εισαγωγή και Περιγραφή</a>
<ul class="sectlevel2">
<li><a href="#_docker">Docker</a></li>
<li><a href="#_swarm_mode">Swarm mode</a></li>
<li><a href="#_swarmlab_sec">Swarmlab-sec</a></li>
</ul>
</li>
<li><a href="#_προσομοίωση_dos_ddos_attack">Προσομοίωση DoS/DDoS Attack</a>
<ul class="sectlevel2">
<li><a href="#_χρήση_του_hping3_για_πραγματοποίηση_της_επίθεσης">Χρήση του hping3 για πραγματοποίηση της επίθεσης</a></li>
<li><a href="#_εντωπισμός_και_παρουσίαση_επίθεσης_με_tcpdump_netstat">Εντωπισμός και παρουσίαση επίθεσης με tcpdump, netstat</a></li>
<li><a href="#_χρήση_iptables_rules_για_αντιμετώπιση_μιας_επίθεσης">Χρήση iptables rules για αντιμετώπιση μιας επίθεσης</a></li>
<li><a href="#_στιγμιότυπα_οθόνης_από_προσομοίωση_της_επίθεσης">Στιγμιότυπα οθόνης από προσομοίωση της επίθεσης</a></li>
</ul>
</li>
<li><a href="#_ssh_brute_force">SSH Brute Force</a>
<ul class="sectlevel2">
<li><a href="#_χρήση_του_hydra_για_την_επίθεση">Χρήση του Hydra για την επίθεση</a></li>
<li><a href="#_εύρεση_και_αντιμετώπιση_της_επίθεσης_με_fail2ban">Εύρεση και αντιμετώπιση της επίθεσης με Fail2Ban</a></li>
<li><a href="#_eίσοδος_αποκλειστικά_με_key">Eίσοδος αποκλειστικά με key</a></li>
<li><a href="#_στιγμιότυπα_οθόνης_από_προσομοίωση_επίθεσης_ssh_brute_force">Στιγμιότυπα οθόνης από προσομοίωση επίθεσης SSH Brute Force</a></li>
</ul>
</li>
<li><a href="#_local_remote_ssh_fowarding">Local/Remote SSH Fowarding</a>
<ul class="sectlevel2">
<li><a href="#_local_ssh_port_fowarding">Local SSH Port Fowarding</a></li>
<li><a href="#_remote_ssh_port_forwarding">Remote SSH Port Forwarding</a></li>
<li><a href="#_στιγμιότυπα_οθόνης_από_local_remote_ssh_port_forwarding">Στιγμιότυπα οθόνης από Local/Remote SSH Port Forwarding</a></li>
</ul>
</li>
<li><a href="#_δημιουργία_vpn">Δημιουργία VPN</a>
<ul class="sectlevel2">
<li><a href="#_δημιουργία_openvpn_server_σε_docker_container">Δημιουργία OpenVPN Server σε Docker container</a></li>
<li><a href="#_στιγμιότυπα_οθόνης_από_δημιουργία_vpn_στο_swarm">Στιγμιότυπα οθόνης από δημιουργία VPN στο swarm</a></li>
</ul>
</li>
</ul>
</div>
</div>
<div id="content">
<div class="sect1">
<h2 id="_εισαγωγή_και_περιγραφή">Εισαγωγή και Περιγραφή</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Τα παρακάτω ζητούμενα υλοποιούνται σε Ubuntu 20.04.1 LTS Virtual Machine. Τα λογισμικά που απαιτήθηκαν για το περιβάλλον εργασίας είναι Docker και το swarmlab-sec για την δημιουργία ενός swarm cluster.</p>
</div>
<div class="sect2">
<h3 id="_docker">Docker</h3>
<div class="paragraph">
<p>Το Docker είναι λογισμικό ανοιχτό κώδικα που επιτρέπει εικονικοποίηση σε επίπεδο λειτουργικού συστήματος, ώστε να μπορεί να γίνει ανάπτυξη και δοκιμή εφαρμογών σε απομονωμένες περιοχές χρήστη που ονομάζονται docker containers. Μέσω χρήσης τεχνολογιών του πυρήνα των Linux αποφεύγεται η χρήση επιπλέον υπολογιστικών πόρων που θα απαιτούσε μια κανονική εικονική μηχανή (Virtual Machine).</p>
</div>
</div>
<div class="sect2">
<h3 id="_swarm_mode">Swarm mode</h3>
<div class="paragraph">
<p>Η χρήση του Docker σε swarm mode επιτρέπει την δημιουργία ενός cluster από μηχανές Docker που ονομάζονται κόμβοι (nodes) οι οποίοι μπορούν να είναι είτε masters είτε workers. Ένας κόμβος μπορεί να έχει και τους δυο ρόλους. Οι workers λαμβάνουν και εκτελούν εργασίες που τους αναθέτουν οι masters. Αυτό δεν εμποδίζει και τους masters από το να εκτελούν οι ίδιοι εργασίες. Πέρα από αυτό, η σημαντικότερη εργασία των master είναι η διαχείριση και ο συντονισμός ολόκληρου του cluster έτσι ώστε να εμφανίζεται ομαλή λειτουργία.</p>
</div>
</div>
<div class="sect2">
<h3 id="_swarmlab_sec">Swarmlab-sec</h3>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
Με την χρήση του swarmlab-sec μπορούμε να δημιουργήσουμε με μεγαλύτερη ευκολία Docker swarm clusters και προσφέρει επιπλέον δυνατότητες διαχείρισης του cluster. <a href="http://docs.swarmlab.io/SwarmLab-HowTos/labs/sec/sec.adoc.html">Εδώ</a> υπάρχουν οδηγίες σχετικά με την εγκατάσταση.
</td>
</tr>
</table>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_προσομοίωση_dos_ddos_attack">Προσομοίωση DoS/DDoS Attack</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Σε αυτό το ζητούμενο θα γίνει μια προσομοίωση μιας επίθεσης DoS/DDoS σε έναν από τους κόμβους του cluster που θα δημιουργήσουμε. Πραγματοποιείτε συνήθως σε servers οι οποίοι υπερφορτώνονται με συνδέσεις από ένα δίκτυο υπολογιστών το οποίο μπορεί να είναι από ένας έως και εκατομμύριοι υπολογιστές και ονομάζεται botnet.</p>
</div>
<div class="paragraph">
<p>Ο επιτιθέμενος μπορεί να χρησιμοποιήσει περισσότερες τεχνικές για να αποκτήσει πρόσβαση σε πολλούς υπολογιστές και να έχει τον έλεγχο τελικά ενός botnet που στην συνέχεια θα χρησιμοποιήσει για την επίθεση του βάζοντας όλους τους υπολογιστές που έχει υπό τον έλεγχο του να κάνουν ταυτόχρονες συνδέσεις σε έναν server με αποτέλεσμα να μην αντέξει ο server το σύνολο των συνδέσεων και να βγει εκτός λειτουργίας και να μην μπορέσει να παρέχει υπηρεσίες. Μια επίθεση χαρακτηρίζεται ως DoS όταν χρησιμοποιείται ένας υπολογιστής ενώ DDoS όταν χρησιμοποιείται ένα δίκτυο υπολογιστών.</p>
</div>
<div class="sect2">
<h3 id="_χρήση_του_hping3_για_πραγματοποίηση_της_επίθεσης">Χρήση του hping3 για πραγματοποίηση της επίθεσης</h3>
<div class="paragraph">
<p>Το εργαλείο hping3 μπορεί να χρησιμοποιηθεί για την διεξαγωγή της επίθεσης.</p>
</div>
<div class="paragraph">
<p>Εγκατάσταση του hping3.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo apt update
sudo apt install hping3</code></pre>
</div>
</div>
<div class="paragraph">
<p>Εφόσον είμαστε μέσα στον master μέσα στο swarm, μπορούμε βρίσκοντας την IP του, με την χρήση του nmap να δούμε και τις IP διευθύνσεις των υπόλοιπων κόμβων του cluster με τις παρακάτω εντολές:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>ifconfig # Διέυθυνση IP του master node
nmap -sP 172.19.0.* # Εμφάνιση των IP διευθύσεων των υπόλοιπων κόμβων</code></pre>
</div>
</div>
<div class="paragraph">
<p>Για να επιτεθούμε χρειαζόμαστε μια ανοιχτή πόρτα (port). Ανοιχνέυουμε τις ανοιχτές πόρτες με την εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>nmap -p 1-100 &lt;ip-addr&gt;</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
H εντολή ελέγχει ποιές πόρτες από την πόρτα 1 εώς την πόρτα 100 είναι ανοιχτές για την διεύθυνση που θέλουμε να χτυπήσουμε. Περισσότερες πληροφορίες για την χρήση του nmap για ανίχνευση ανοιχτών ports υπάρχουν <a href="http://docs.swarmlab.io/SwarmLab-HowTos/labs/sec/ex-1_iptables.adoc.html#_scan_ports">εδώ</a>.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Αφού βρούμε ποιά πόρτα είναι ανοιχτή, μπορούμε να μπούμε σε όσους workers θέλουμε να χρησιμοποιήσουμε για την επίθεση με την εντολη:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>ssh docker@&lt;worker-IP&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Σε κάθε worker πρέπει να γίνει εγκατάσταση του hping3. Αφού γίνει η εγκατάσταση, ο worker είναι έτοιμος να αρχίσει την επίθεση. Έαν η επίθεση γίνει από έναν worker τότε έχουμε DoS επίθεση, αν γίνει από περισσότερους, έχουμε DDoS επίθεση. Παρακάτω θα γίνει σύντομη περιγραφή για το πώς μπορεί να γίνει μια <a href="https://en.wikipedia.org/wiki/SYN_flood"><strong>SYN flood</strong></a> επίθεση.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
H <strong>SYN flood DDoS</strong> επίθεση εκμεταλλεύεται το <a href="https://en.wikipedia.org/wiki/Transmission_Control_Protocol#Connection_establishment">3-way handshake</a> του πρωτοκόλλου TCP για την έναρξη μιας σύνδεσης μεταξύ client-server. Στην περίπτωση μιας SYN flood DDoS επίθεση, ο επιτιθέμενος στέλνει επαναλμβανόμενα πάρα πολλά SYN πακέτα, χωρίς να περιμένει για SYN-ACK από την μεριά του θύματος ώστε να γίνει η σύνδεση και τα SYN-ACK πακέτα που στέλνει το θύμα δεν φτάνουν ποτέ στον επιτιθέμενο.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Αφού έχουμε έτοιμο το hping3 στους workers που θα χρησιμοποιήσουμε, μπορεί να αρχίσει η επίθεση, με την παρακάτω εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo hping3 &lt;target-IP&gt; -p &lt;target-port&gt; -S --flood</code></pre>
</div>
</div>
<div class="paragraph">
<p>Όπου αναλυτικά:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">&lt;target-IP&gt;</dt>
<dd>
<p>Η IP διεύθυνση του θύματος.</p>
</dd>
<dt class="hdlist1">-p &lt;target-port&gt;</dt>
<dd>
<p>Η ανοιχτή πόρτα που θα χρησιμοποιηθεί.</p>
</dd>
<dt class="hdlist1">-S</dt>
<dd>
<p>Ορισμός τύπου πακέτου SYN.</p>
</dd>
<dt class="hdlist1">--flood</dt>
<dd>
<p>Flood mode, στέλνουμε επαναλαμβανόμενα χωρίς να περιμένουμε απάντηση.</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>Με την εκτέλεση της παραπάνω εντολής σε πολλούς κόμβους κατά ενός κόμβου μπορεί να αρχίσει η DDoS επίθεση και το θύμα λαμβάνει μεγάλο όγκο SYN πακέτων.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
Μπορούν να χρησιμοποιηθούν περισσότεροι παράμετροι στην εντολή για να κάνουν την ανίχνευση και την αντιμετώπιση από το θύμα πιο δύσκολη, όπως για παράδειγμα της παραμέτρου <strong>--rand-source</strong> που θα άλλαζε την source-IP διεύθυνση των πακέτων για κάθε πακέτο. Περισσότερα στο <a href="https://linux.die.net/man/8/hping3">hping3-man</a>.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_εντωπισμός_και_παρουσίαση_επίθεσης_με_tcpdump_netstat">Εντωπισμός και παρουσίαση επίθεσης με tcpdump, netstat</h3>
<div class="paragraph">
<p>Για να εντωπίσουμε μια επίθεση DDoS υπάρχουν πολλά χρήσιμα εργαλεία με τα βασικά να είναι το <strong>tcpdump</strong> και το <strong>netstat.</strong></p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
Το <a href="https://en.wikipedia.org/wiki/Tcpdump">tcpdump</a> είναι command-line packet analyser, το οποίο εμφανίζει όλα τα πακέτα που στέλνονται και λαμβάνονται σε ένα δίκτυο ή σε μια διεπαφή. Το <a href="https://en.wikipedia.org/wiki/Netstat">netstat</a> είναι ένα command-line εργαλείο το οποίο εμφανίζει συνδέσεις δικτύου, πίνακες δρομολόγησεις, στατιστικά κ.α. Μπορούν να χρησιμοποιήθουν μαζί για ανάλυση και εντωπισμό DDoS επιθέσεων.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Για την παρουσίαση όλων των πακέτων που λαμβάνουμε μπορούμε να χρησιμοποιήσουμε την εντολη:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo tcpdump -i eth0 -n</code></pre>
</div>
</div>
<div class="paragraph">
<p>Η οποία εμφανίζει όλα τα πακέτα που στέλνονται και λαμβάνονται στην διεπαφή eth0 με τις IP διευθύνσεις αυτών που στέλνουν και λαμβάνουν. Μπορεί να παρατηρηθεί να παρατηρηθεί για παράδειγμα ότι από ορισμένες διευθύνσεις ο host δέχεται υπερβολικά πολλά πακέτα SYN σε λίγο χρόνο από τις διευθύνσεις των worker nodes που χρησιμοποιούμε για την επίθεση. Μπορεί να αναλυθεί η κίνηση μάλιστα που υπάρχει σε συγκεκριμένες θύρες μέσω της εντολής:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo tcpdump port &lt;port-no&gt; -n</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
Εάν τρέξουμε την εντολή <strong>netstat</strong> δεν παρατήρουμε κάτι το ιδιαίτερο αν δεν έχει γίνει σύνδεση μεταξύ του επιτιθέμενου και του θύματος και στην περίπτωση ενός SYN flood δεν γίνεται ποτέ σύνδεση παρά μόνο προσπάθεια σύνδεσης!
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Εάν καταλαβαίνουμε ότι πρόκειται για SYN flood επίθεση, τότε μπορούμε να εμφανίσουμε μόνο τα SYN πακέτα μέσω τις εντολής:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo tcpdump 'tcp[tcpflags] == tcp-syn' -n</code></pre>
</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
Με μια τέτοια απλή ανάλυση μπορούμε να καταλάβουμε τον τύπο της επίθεσης και την πήγη από την οποία προέρχεται. Φυσικά η διαδικασία μπορεί να γίνει πιο δύσκολη όταν έχουμε χιλιάδες άλλα πακέτα να στέλνονται και να λαμβάνονται, όπως επίσης και αν ο επιτιθέμενος κάνει την επίθεση με τύχαιες source IP διευθύνσεις καθε φορα.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_χρήση_iptables_rules_για_αντιμετώπιση_μιας_επίθεσης">Χρήση iptables rules για αντιμετώπιση μιας επίθεσης</h3>
<div class="paragraph">
<p>Η αντιμετώπιση μιας DDoS επίθεσης μπορεί να γίνει μέσω iptables rules.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
To <a href="https://en.wikipedia.org/wiki/Iptables">ip tables</a> είναι ένα command-line πρόγραμμα το οποίο επιτρέπει την διαχείρηση του firewall του πυρίνα των linux, με το οποίο μπορούμε να φιλτράρουμε και να εμποδίσουμε ή να στείλουμε σε άλλον δρομολογητή πακέτα απο συγκεκριμένες διευθύνσεις ή συγκεκριμένου τύπου, το οποίο το κάνει το τέλειο εργαλείο για την αντιμετώπιση μιας DDoS επίθεσης!
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Στην περίπτωση της επίθεσης SYN flood που περιγράφουμε, μπορούμε να πάρουμε κάποια βασικά αντίμετρα. Εφόσον η επίθεση γίνεται με την πραγματική διεύθυνση του επιτιθέμενου, η επίθεση μπορεί να σταματήσει πολύ εύκολα, με έναν απλό κανόνα, τον οποίο μπορούμε να ορίσουμε με την εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo iptables -A INPUT -s &lt;source-IP&gt; -j DROP</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
Η παραπάνω εντολή κάνει alter, αλλάζει δηλαδή τον πίνακα για τα πακέτα που δεχόμαστε (-Α INPUT) και τα πακέτα που δεχόμαστε από την διεύθυνση IP (-s &lt;source-IP&gt;) τα πετάει και δεν τα δέχεται (-j DROP). Αν γίνει αυτό για όλες τις διευθύνσεις IP που στέλνουν επαναλαμβανόμενα πολλά πακέτα SYN, τότε η επίθεση σταματάει!
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Οι πίνακες INPUT, FOWARD και OUTPUT μπορούν να εμφανιστούν με την χρήση της εντολής:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo iptables -L</code></pre>
</div>
</div>
<div class="paragraph">
<p>Όπου θα πρέπει να φαίνονται οι κανόνες που ορίζουμε για τις διευθύνσεις από τις οποίες δεχόμαστε επίθεση. Επιπλέον πληροφορίες όπως τα πακέτα που εμπόδισε ο κανόνας μας και το μέγεθως τους μπορούν να παρουσιαστούν με την εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo iptables -nvL</code></pre>
</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
Στην περίπτωση που αναλύουμε, οι κάνονες που ορίσαμε δούλεψαν και η επίθεση σταματάει διότι ηταν πολύ απλή προσωμοίωση. Φυσικά σε περίπτωση που ο επιτιθέμενος χρησιμοποιεί πάρα πολλούς κόμβους για την επίθεση, με κάθε πακέτο να έχει ψεύτικη διαφορετική διεύθυνση, τα πράγματα είνα διαφορετικά, καθώς θα ήταν δύσκολο να φτίαξουμε έναν κανόνα για κάθε μια από τις εκατοντάδες ή και χιλιάδες διευθύνσεις του επιτιθέμενου. Θα μπορούσαμε όμως να φιλτράρουμε τον αριθμό των SYN πακέτων που μπορούν να σταλούν για παράδειγμα που θα ήταν πολύ πιο αποτελεσματικό.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_στιγμιότυπα_οθόνης_από_προσομοίωση_της_επίθεσης">Στιγμιότυπα οθόνης από προσομοίωση της επίθεσης</h3>
<div class="paragraph">
<p>Παρακάτω εμφανίζονται στιγμιότυπα οθόνης από προσομοίωση μιας SYN flood DDoS επίθεσης με τον τρόπου που περιγράψαμε. Η επίθεση γίνεται από δυο workers, τον worker 2 (172.19.0.4) και τον worker 3 (172.19.0.5) κατά του worker 1 (172.19.0.3).</p>
</div>
<div class="imageblock">
<div class="content">
<img src="images/DDoS/ifconfig.png" alt="ifconfig">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/DDoS/nmap.png" alt="nmap">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/DDoS/nmap_showopenport.png" alt="nmap showopenport">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/DDoS/gettinginworker1.png" alt="gettinginworker1">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/DDoS/worker1_hping.png" alt="worker1 hping">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/DDoS/worker2_hping.png" alt="worker2 hping">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/DDoS/tcpdump.png" alt="tcpdump">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/DDoS/tcpdump_p22.png" alt="tcpdump p22">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/DDoS/tcpdumpSYN.png" alt="tcpdumpSYN">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/DDoS/iptablesblocked.png" alt="iptablesblocked">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/DDoS/iptablesblocked_packets.png" alt="iptablesblocked packets">
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_ssh_brute_force">SSH Brute Force</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Σε αυτό το ζητούμενο θα γίνει προσομοίωση και ανάλυση μιας επίθεσης SSH Brute Force. To SSH είναι δικτυακό πρωτόκολλο που προσφέρει μεταφορά δεδομένων μεταξύ υπολογιστών. Προσφέρει ασφαλής μεταφορά δεδομένων καθώς και κρυπτογράφήση τους. Δουλεύει σε μοντέλο client-server, με τον client να ζητάει την σύνδεση και να την επαληθεύει με κωδικό η ιδιωτικό κλειδί Μια επίθεση SSH brute force έχει ως σκοπό την απόκτηση πρόσβασης σε τέτοιους SSH servers. Ο επιτιθέμενος κάνει συνεχόμενες απόπειρες σύνδεσης με χρήση πολλών συνδυασμών πιθανών κωδικών μέχρι να μπορέσει να αποκτήσει πρόσβαση.</p>
</div>
<div class="sect2">
<h3 id="_χρήση_του_hydra_για_την_επίθεση">Χρήση του Hydra για την επίθεση</h3>
<div class="paragraph">
<p>Για την προσομοίωση της επίθεσης, θα γίνει χρήση του εργαλείου Hydra. Ένας worker θα είναι ο SSH client που προσπαθεί να αποκτήσει πρόσβαση και ένας άλλος θα είναι ο SSH server. Για την επίθεση μπορούν να χρησιμοποιήθουν παράλληλα περισσότεροι clients (workers).</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
Το <strong>Hydra</strong> είναι εργαλείο με δυνατότητες παράλληλου υπολογισμού το οποίο προσεγγίζει πολλούς τρόπους για την πραγματοποίηση brute force επιθέσεων. Περισσότερα για το Hydra <a href="https://tools.kali.org/password-attacks/hydra">εδώ</a>.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Η εγκατάσταση του Hydra 7.5 γίνεται με την παρακάτω εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo apt-get install hydra hydra-gtk</code></pre>
</div>
</div>
<div class="paragraph">
<p>Το Hydra μπορεί να λειτουργήσει παράλληλα με άλλα προγράμματα τα οποία κάνουν generate συνδυασμούς ονομάτων χρήστη και κωδικών εισόδου. Στις οδηγίες της προσομοίωσης που θα κάνουμε για λόγους απλότητας θα χρησιμοποιήσουμε δύο αρχεία, users.txt και pass.txt τα οποία περιέχουν τυχαία συχνά ονόματα και τυχαίους συχνούς κωδικούς πρόσβασης. Έτσι η επίθεση θα γίνει πολύ γρήγορα καθώς δεν θα χρειαστεί να γίνουν υπερβολικά πολλές δοκιμές. Σε μια πραγματική επίθεση, το πρόγραμμα μπορει να δοκιμάζει κωδικούς για πολύ μεγαλύτερο χρονικό διάστημα μέχρι να μπορεί να τους πετύχει και να αποκτήσουμε πρόσβαση.</p>
</div>
<div class="paragraph">
<p>Πριν αρχίσει η επίθεση, αρκεί να γνωρίζουμε την IP του server που θέλουμε να χτυπήσουμε. Ελέγχουμε αρχικά αν τρέχει SSH service και αν έχει την default SSH πόρτα ανοιχτή με την εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>nmap -p 22 &lt;target-IP&gt;</code></pre>
</div>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
Η πόρτα (port) μπορεί να είναι διαφορετική, σε αυτή την περίπτωση, θα κάναμε έλεγχο να δούμε ποιές πόρτες είναι ανοιχτές. Η default port του SSH όμως, την οποία και θα χρησιμοποιήσουμε για την επίθεση είναι η 22.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Αφου βεβαιωθούμε ότι η πόρτα είναι ανοιχτή, το μόνο που απομένει είναι να αρχίσει η επίθεση. Η εντολή του εργαλείου Hydra που θα χρησιμοποιήθει σε αυτή την περίπτωση είναι η παρακάτω:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>hydra -L &lt;user-file-path&gt; -P &lt;password-file-path&gt; ssh://&lt;target-ip&gt; -t 6</code></pre>
</div>
</div>
<div class="paragraph">
<p>Όπου αναλυτικά:</p>
</div>
<div class="dlist">
<dl>
<dt class="hdlist1">-L &lt;user-file-path&gt;</dt>
<dd>
<p>Παράμετρος για path αρχείου με όνοματα χρήστη που θα δοκιμαστούν.</p>
</dd>
<dt class="hdlist1">-P &lt;password-file-path&gt;</dt>
<dd>
<p>Παράμετρος για path αρχείου με κωδικούς χρήστη που θα δοκιμαστούν.</p>
</dd>
<dt class="hdlist1">ssh://&lt;target-ip&gt;</dt>
<dd>
<p>Πρωτόκολλο (SSH) και IP διεύθυνση του server που προσπαθούμε να αποκτήσουμε πρόσβαση.</p>
</dd>
<dt class="hdlist1">-t 6</dt>
<dd>
<p>Ο αριθμός διεργασιών που θα χρησιμοποιήθουν (όσο πιο πολλές, τόσο πιο γρήγορο το αποτέλεσμα).</p>
</dd>
</dl>
</div>
<div class="paragraph">
<p>Με την εκτέλεση της παραπάνω εντολής μπορεί να αρχίσει η επίθεση. Για σχετικά μικρό αριθμό ονομάτων και κωδικών που θα δοκιμαστούν, όπως στα στιγμιότυπα οθόνης στο παράδειγμα που υπάρχει παρακάτων η διαδικασία δεν παίρνει πάνω από λίγα λεπτά και άν έχουμε το σωστό όνομα και το σωστό κωδικό στα αρχεία μας, η επίθεση θα είναι επιτυχής!</p>
</div>
</div>
<div class="sect2">
<h3 id="_εύρεση_και_αντιμετώπιση_της_επίθεσης_με_fail2ban">Εύρεση και αντιμετώπιση της επίθεσης με Fail2Ban</h3>
<div class="paragraph">
<p>Οι brute force επιθέσεις μπορούν να είναι καταστροφικές αν γίνουν με επιτυχία, για αυτό έχει μεγάλη σημασία η πρόληψη και η γρήγορη ανίχνευση και αντιμετώπιση των επιθέσεψω ώστε να είναι ασφαλής ο server μας. Ένα εργαλείο που μπορούμε να χρησιμοποιήσουμε για να το καταφέρουμε αυτό είναι το <strong>Fail2Ban</strong>.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
Το <a href="https://www.fail2ban.org/wiki/index.php/Main_Page">Fail2Ban</a> είναι framework που βοηθάει στην πρόληψη και την αντιμετώπιση brute force επιθέσεψων βάζοντας, για παράδειγμα σε SSH επιθέσεις, κανόνες σε iptables κάνοντας ban δίευθύνσεις που κάνουν πολλές απόπειρες σύνδεσης.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Η εγκατάσταση του Fail2Ban γίνεται με την παρακάτω εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo apt-get install fail2ban</code></pre>
</div>
</div>
<div class="paragraph">
<p>Δοκιμάζουμε σε έναν από τους workers, στον οποίο θα το εγκαταστήσουμε και θα χρησιμοποιήσουμε ως server που θα δέχεται την επίθεση να εκκινήσουμε το Fail2Ban service ως εξής:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo service fail2ban start</code></pre>
</div>
</div>
<div class="paragraph">
<p>Θα δεχτούμε ένα error τύπου:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>* Starting authentication failure monitor fail2ban No file(s) found for glob /var/log/auth.log
Failed during configuration: Have not found any log file for sshd jail</code></pre>
</div>
</div>
<div class="paragraph">
<p>Αυτό διότι δεν υπάρχει auth.log αρχείο που να καταγράφει όλες τις απόπειρες σύνδεσης στον server μας μέσω SSH. Θα χρειαστούμε πρόγραμμα που κάνει ακριβώς αυτή τη δουλειά, στην περίπτωση μας θα εγκαταστήσουμε το <a href="https://www.rsyslog.com/"><strong>rsyslog</strong></a> και θα το εκτελέσουμε με τις παρακάτω εντολές:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo apt-get install rsyslog
sudo rsyslogd</code></pre>
</div>
</div>
<div class="paragraph">
<p>Πλέον μπορούμε να εκκινήσουμε κανονικά το Fail2Ban service κανονικά!</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
'Εαν θέλουμε να δούμε ότι το logging των μη επιτυχημένων εισόδων γίνεται κανονικά μπορούμε να το δούμε με την εντολή: <strong>sudo grep "Failed password" /var/log/auth.log</strong>.
</td>
</tr>
</table>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
Οι ρυθμίσεις για το πως δουλεύει το Fail2Ban βρίσκονται στο αρχείο <strong>/etc/fail2ban/jail.conf</strong>, είναι προτεινόμενο όμως να βάζουμε τις ρυθμίσεις σε άλλο αρχείο <strong>/etc/fail2ban/jail.local</strong>.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Δημιουργούμε το jail.local.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo vim /etc/fail2ban/jail.local</code></pre>
</div>
</div>
<div class="paragraph">
<p>Ανοίγουμε το jail.local και προσθέτουμε τις παρακάτω γραμμές:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>[sshd]
# Ενεργοποίηση του jail
enabled = true
# SSH πόρτα
port = 22
# SSHD Fail2Ban φίλτρο
filter = sshd
# Path του αρχείου auth.log
logpath = /var/log/auth.log
# Αριθμός επιτρέπόμενων απόπειρων σύνδεσης
maxretry = 4
# Χρόνος του ban (seconds)
bantime = 7200</code></pre>
</div>
</div>
<div class="paragraph">
<p>Αφού αποθηκεύσουμε το αρχείο, κάνουμε επανεκκίνηση το fail2ban service ώστε να δουλέψει με το configuration μας ως εξής:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo service fail2ban restart</code></pre>
</div>
</div>
<div class="paragraph">
<p>Πλέον θα πρέπει να λειτουργεί σωστά με το configuration μας. Δοκιμάζουμε επίθεση με Hydra από οποιονδήποτε worker θέλουμε να χρησιμοποήσουμε. Μπορούμε να δούμε αν το fail2ban έχει ενεργό το sshd jail και αν ανίχνευσε και σταμάτησε την brute force επίθεση με ban στην IP με την εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo fail2ban-client status
sudo fail2ban-client status sshd</code></pre>
</div>
</div>
<div class="paragraph">
<p>Στις πληροφορίες που θα εμφανιστούν θα πρέπει να φαίνεται η IP του worker που έκανε την επιθέση στις banned IPs. Μπορούμε να δούμε και των κανόνα για REJECT που δημιούργησε το fail2ban με την χρήση των iptables με την εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo iptables -L -n</code></pre>
</div>
</div>
<div class="paragraph">
<p>Εάν η IP του επιτιθέμενου είναι banned και υπάρχει και ο κανόνας σε iptables τότε σε απόπειρα σύνδεσεις ο επιτιθέμενος θα πρέπει να λαμβάνει μήνυμα <strong>Connection Refused</strong> και για το χρονικό διάστημα που είναι banned, δεν θα μπορεί να συνδεθεί. Για να μπορεί να έχει πρόσβαση πάλι κάποιος από την συγκεκριμένη IP πρέπει να γίνει unban με την εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo fail2ban-client unban &lt;IP-address&gt;</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_eίσοδος_αποκλειστικά_με_key">Eίσοδος αποκλειστικά με key</h3>
<div class="paragraph">
<p>Ένας δυνατός κωδικός θα μπορούσε να προστατέψει τον server μας αρκετά από brute force επιθέσεις, όμως μπορεί να γίνει χρήση και της εισόδου με κλειδί (public key authentication), που προσφέρει και πολλά άλλα πλεονεκτήματα</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
Τα <a href="https://el.wikipedia.org/wiki/RSA">RSA</a> κλειδία έρχονται σε ζευγάρια, ένα δημόσιο κλειδί και ένα ιδιωτικό κλειδί. Το δημόσιο κλειδί είναι γνωστό σε όλους ενώ το ιδιωτικό είναι γνωστό μόνο στον κάτοχο του. Για την σύνδεση αρκεί να αποδείξει ο client ότι κατέχει το ιδιωτικό κλειδί που αντιστοιχεί στο δημόσιο κλειδί, το οποίο γίνεται χωρίς να χρειαστεί να εμφανίσει το ιδιωτικό του κλειδί. Μάλιστα στο <strong>SFTP</strong> (SSH FILE TRANSFER PROTOCOL) δημόσια κλειδία χρησιμοποιούνται για την κρύπτογράφηση αρχείων τα οποία μπορούν να αποκρυπτογραφηθούν μόνο με το ιδιωτικό κλειδί.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Για αρχή θα πρέπει να γίνει το key generation στον client, το οποίο γίνεται με την εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>ssh-keygen</code></pre>
</div>
</div>
<div class="paragraph">
<p>Θα ακολουθήσει η επιλογή του path όπου θα αποθηκεύονται τα κλειδιά και επιλογή κωδικού για την χρήση του ιδιωτικού κλειδιού, το οποίο αυξάνει ακόμα περισσότερο την ασφάλεια. Αφού γίνουν οι επιλογές, θα δημιουργηθούν δύο κλειδία σε 2 αρχεία, το <strong>id_rsa</strong> που είναι το ιδιωτικό κλειδί και το <strong>id_rsa.pub</strong> που είναι το δημόσιο κλειδί. Τώρα έχει δημιουργηθεί το ζεύγος των κλειδιών μας.</p>
</div>
<div class="paragraph">
<p>Για να λειτουργήσει το public key authentication πρέπει ο server να έχει το δημόσιο κλειδί. Η αντιγραφή του δημόσιου κλειδιού στον server (ένας worker του swarm μας) γίνετε με την παρακάτω εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>ssh-copy-id docker@&lt;worker-IP&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Τώρα ο worker που έχει το δημόσιο κλειδί, μπορεί να γίνει η σύνδεση μέσω public key authentication. Μένει να τροποποιήσουμε τον server ώστε να δέχεται μόνο εισόδους μέσω κλειδιού και όχι μέσω κωδικού πρόσβασης. Θα πρέπει να γίνουν οι παρακάτω τροποποιήσεις στο αρχείο του server <strong>/etc/ssh/sshd_config</strong>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code># Authentication:
#LoginGraceTime 2m
PermitRootLogin without-password
#StrictModes yes
#MaxAuthTries 6
#MaxSessions 10
#PubkeyAuthentication yes</code></pre>
</div>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code># To disable tunneled clear text passwords, change to no here!
PasswordAuthentication no
#PermitEmptyPasswords no</code></pre>
</div>
</div>
<div class="paragraph">
<p>Κάνουμε επανεκκίνηση του ssh με την εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo service ssh restart</code></pre>
</div>
</div>
<div class="paragraph">
<p>Πλέον η είσοδος γίνεται μόνο με <strong>public key authentication</strong>. Σε περίπτωση που δοκιμάσουμε σύνδεση από worker για οποίο ο server δεν έχει public key θα εμφανιστεί μήνυμα της παρακάτω μορφής:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>docker@&lt;IP-address&gt;: Permission denied (publickey).</code></pre>
</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
Όλα τα δημόσια κλειδιά είναι αποθηκευμένα στον SSH server στο αρχείο <strong>~/.ssh/authorized_keys</strong> όπου μπορούν να προστεθούν manually κλειδιά.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_στιγμιότυπα_οθόνης_από_προσομοίωση_επίθεσης_ssh_brute_force">Στιγμιότυπα οθόνης από προσομοίωση επίθεσης SSH Brute Force</h3>
<div class="paragraph">
<p>Παρακάτω εμφανίζονται στιγμιότυπα οθόνης απο μια προσομοίωση επίθεσης με βάση την παραπάνω ανάλυση. Ο worker 1 (172.19.0.3) λειτουργεί ως server, ενώ άλλοι workers χρήσιμοποιούνται ως clients.</p>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/check_ssh_port.png" alt="check ssh port">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/user.png" alt="user">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/pass.png" alt="pass">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/hydra_brute_force.png" alt="hydra brute force">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/auth.logERROR.png" alt="auth.logERROR">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/Fail2Ban_works.png" alt="Fail2Ban works">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/failed_pass_auth.png" alt="failed pass auth">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/jailLocalFile.png" alt="jailLocalFile">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/fail2ban_client_status_before.png" alt="fail2ban client status before">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/fail2ban_client_status.png" alt="fail2ban client status">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/fail2ban_client_status_after.png" alt="fail2ban client status after">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/iptables_rule_fail2ban.png" alt="iptables rule fail2ban">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/ssh_attacker_connection_refused.png" alt="ssh attacker connection refused">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/unban_worker.png" alt="unban worker">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/ssh-keygen.png" alt="ssh keygen">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/ssh-copy-id.png" alt="ssh copy id">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/new-config-file.png" alt="new config file">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/keyauthworking.png" alt="keyauthworking">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/permission-denied-pk.png" alt="permission denied pk">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHBruteForce/authorized_keys.png" alt="authorized keys">
</div>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_local_remote_ssh_fowarding">Local/Remote SSH Fowarding</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Σε αυτό το ερώτημα θα γίνει Local και Remote SSH Fowarding για την επίτευξη SSH Tunneling. Το Tunneling δημιουργεί μια σύνδεση που προσφέρει ασφαλή και κρυπτογραφημένη επικοινωνία μεταξύ του client και server. Μπορεί να χρησιμοποιήθει για πολλούς σκοπούς, μιας και με το tunneling γίνεται ασφαλής ανταλλαγή δεδομένων μεταξύ δύο αποκρυνσμένων υπολογιστών/δικτύων.</p>
</div>
<div class="paragraph">
<p>Στην παρακάτω ανάλυση θα μετατρέψουμε το μηχάνημα μας σε SSH Server που θα προσφέρει υπηρεσίες στο swarm. Θα πρέπει να γίνει εγκατάσταση του <strong>openssh-server</strong> με την παρακάτω εντολή, ώστε να μπορούν οι workers του swarm να συνδέονται μέσω του SSH.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo apt-get install openssh-server</code></pre>
</div>
</div>
<div class="paragraph">
<p>'Επειτα θα εγκαταστήσουμε τον Apache Web Server. Το μηχάνημα μας θα δουλεύει ως Web Server. Η εγκατάστση γίνεται με την εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo apt install apache2</code></pre>
</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
Το <a href="https://httpd.apache.org/">Apache HTTP Server Project</a> είναι ένα από τα πιο γνωστά εργαλεία που χρησιμοποιούνται για το στήσιμο, την ανάπτυξη και την διατήρηση ενός <strong>HTTP Server</strong>. Με την χρήση του μπορούμε να φιλοξενήσουμε στο μηχάνημα μας μια ιστοσελίδα που θα είναι και η υπηρεσία που θα προσφέρουμε στο swarm μας.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Πλέον εάν χρησιμοποιήσουμε τον browser μας, και πάμε στο localhost:80 θα δούμε την default ιστοσελίδα του Apache. Θα κάνουμε μερικές αλλαγές ώστε να εμφανίζει δικό μας περιεχόμενο, εκτελούμε την εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo vim /var/www/html/index.html</code></pre>
</div>
</div>
<div class="paragraph">
<p>Και μέσα στο αρχείο <strong>index.html</strong> βάζουμε δικό μας περιεχόμενο η μπορούμε να βάλουμε αρχεία δικιά μας ιστοσελίδας. Για το παράδειγμα θα χρησιμοποιήσουμε μια πολύ απλή ιστοσελίδα με το παρακάτω περιεχόμενο.</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>&lt;!DOCTYPE html&gt;
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Super Webpage&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;center&gt;
&lt;h&gt;WELCOME&lt;/h&gt;
&lt;p&gt;If you see this, it works&lt;/p&gt;
&lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Για την προβολή του περιεχομένου μπορεί να χρησιμοποιήθει η εντολή <strong>curl</strong> ενώ για την προβολή μπορούμε να χρησιμοποιήσουμε και έναν command-line browser όπως τον <strong>lynx</strong>. Η εγκατάσταση του <strong>lynx</strong> γίνεται με την παρακάτω εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo apt-get install lynx</code></pre>
</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
O <a href="https://lynx.browser.org/">lynx</a> είναι command-line text based browser με πολλές δυνατότες που επιτρέπει την πλοήγηση στο διαδίκτυο από terminal.
</td>
</tr>
</table>
</div>
<div class="sect2">
<h3 id="_local_ssh_port_fowarding">Local SSH Port Fowarding</h3>
<div class="paragraph">
<p>Local SSH Port Fowarding κάνουμε όταν θέλουμε να έχουμε πρόσβαση σε δεδομένα/υπηρεσίες που βρίσκονται σε έναν server και υπό κανονικές συνθήκες δεν θα είχα πρόσβαση. Σε αυτό το παράδειγμα θα κάνουμε Local SSH Port Fowarding, που θα επιτρέπει οποιοδήποτε μήχανημα του swarm που έχουμε στην διάθεση μας να επισκευτεί την ιστοσελίδα μας, σαν να τρέχει στο ίδιο το μηχάνημα του. Η εντολή που θα χρησιμοποιήσουμε, αφού συνδεθούμε στον worker που επιθυμούμε, είναι η παρακάτω:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>ssh -nNT -L 8081:&lt;IP-address&gt;:80 user@&lt;IP-address&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Με την παραπάνω εντολή ανοίγει ένα tunnel, ο worker μας ακούει στην πύλη 8081 για την υπηρεσία που τρέχει στον WebServer μας (&lt;IP-address&gt;:80) και θα αποκτήσω πρόσβαση μέσω του user@&lt;IP-address&gt; που έχει πρόσβαση. Αυτό έχει ως αποτέλεσμα να μπορέσουμε να πάρουμε η να προβάλουμε τα δεδομένα του index.html του WebServer μας για παράδειγμα με τις εντολές:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>curl localhost:8081</code></pre>
</div>
</div>
<div class="paragraph">
<p>ή αντίστοιχα:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>lynx localhost:8081</code></pre>
</div>
</div>
<div class="paragraph">
<p>Άρα πλέον είναι σαν η υπηρεσία του Apache να τρέχει στον worker της επιλογής μας στην πύλη της επιλογής μας, 8081 στο παράδειγμα μας.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
Έαν έχουμε IPv6 διεύθυνση στον server μας, μπορούμε να χρησιμοποιήσουμε την παράμετρο <strong>-4</strong> στην <strong>ssh</strong> εντολή που δώσαμε ώστε να δουλέψει με την IPv4 διεύθυνση, αλλίως μπορεί να εμφανιστεί error <strong>bind: Cannot assign requested address</strong>.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_remote_ssh_port_forwarding">Remote SSH Port Forwarding</h3>
<div class="paragraph">
<p>Πρόκειται για την αντίστροφη ακριβώς διαδικασία. Κάνουμε Remote SSH Port Forwarding όταν έχουμε πρόσβαση σε δεδομένα/υπηρεσία και θέλουμε να την μοιράσουμε με άλλους. Στην περίπτωση μας θα πάμε στον Web Server μας και θα εκτελέσουμε την παρακάτω εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>ssh -nNT -R 8081:localhost:80 user@&lt;IP-address&gt;</code></pre>
</div>
</div>
<div class="paragraph">
<p>Με την παραπάνω εντολή λέμε ότι έχουμε πρόσβαση στην υπηρεσία (localhost:80) και όποιος επιθυμεί να έχει πρόσβαση να έρθει σε εμένα (user@&lt;IP-address&gt;) μέσω της πόρτας 8081. Αυτό επιτρέπει σε οποιονδήποτε να έχει πρόσβαση στην υπηρεσία μέσω της 8081 του Web Server μας, που σε αυτή την περίπτωση φιλοξενεί και την ιστοσελίδα.</p>
</div>
<div class="paragraph">
<p>Πρέπει όμως και να έχουμε ανοιχτή την πύλη 8081 για να μπορέσουμε να λάβουμε τα requests. Το SSH προσφέρει την δυνατότητα να ακούμε από έξω στις πύλες που ορίζουμε με το Remote SSH Port Forwarding. Για να μπορεί να λειτουργήσει σωστά το remote forwarding, πρέπει να ανοίξουμε το αρχείο <strong>sshd_config</strong>:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo vim /etc/ssh/sshd_config</code></pre>
</div>
</div>
<div class="paragraph">
<p>Και να κάνουμε την παρακάτω αλλαγή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>GatewayPorts yes</code></pre>
</div>
</div>
<div class="paragraph">
<p>Τώρα θα μπορούμε να λάβουμε συνδέσεις στην πύλη 8081. Σε κάθε worker του swarm μπορουμε να εκτελέσουμε τις εντολές:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>curl &lt;IP-address&gt;:8081</code></pre>
</div>
</div>
<div class="paragraph">
<p>ή</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>lynx &lt;IP-address&gt;:8081</code></pre>
</div>
</div>
<div class="paragraph">
<p>Και τελικά με τις παραπάνω εντολές παίρνουμε το περιεχόμενο του index.html από τον Web Server μας.</p>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
Για μεγαλύτερη ασφάλεια μπορούμε να ορίσουμε GatewayPorts <strong>clientspecified</strong> ώστε να μπορούμε να δεχόμαστε συνδέσεις σε μια θύρα μόνο από συγκεκριμένες διευθύνσεις και βάζοντας την IP του client που θέλουμε πρίν το port στο οποίο ακούμε, για παράδειγμα <strong>ssh -nNT -R &lt;safe-IP&gt;:8081:localhost:80 user@&lt;IP-address&gt;</strong>.
</td>
</tr>
</table>
</div>
</div>
<div class="sect2">
<h3 id="_στιγμιότυπα_οθόνης_από_local_remote_ssh_port_forwarding">Στιγμιότυπα οθόνης από Local/Remote SSH Port Forwarding</h3>
<div class="paragraph">
<p>Παρακάτω εμφανίζονται στιγμιότυπα οθόνης από Local/Remote SSH Port Forwarding όπως περιγράφονται παραπάνω:</p>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHPortForwarding/usurifconfig.png" alt="usurifconfig">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHPortForwarding/openportsusur.png" alt="openportsusur">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHPortForwarding/htmlcontent.png" alt="htmlcontent">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHPortForwarding/worker2_L_SSH_PF.png" alt="worker2 L SSH PF">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHPortForwarding/worker2_curl.png" alt="worker2 curl">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHPortForwarding/worker2_lynx.png" alt="worker2 lynx">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHPortForwarding/usur_R_SSH_PF.png" alt="usur R SSH PF">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHPortForwarding/GatewayPorts.png" alt="GatewayPorts">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/SSHPortForwarding/curl_remote_pf.png" alt="curl remote pf">
</div>
</div>
<div class="paragraph">
<p><span class="image"><img src="images/SSHPortForwarding/lynx_remote_pf.png" alt="lynx remote pf"></span></p>
</div>
</div>
</div>
</div>
<div class="sect1">
<h2 id="_δημιουργία_vpn">Δημιουργία VPN</h2>
<div class="sectionbody">
<div class="paragraph">
<p>Η δημιουργία VPN (Virtual Private Network) επιτρέπει την σύνδεση απομακρυσμένων δικτύων σε ένα εικονικό δίκτυο. Αυτό προσφέρει ασφάλεια στην επικοινωνία ανάμεσα των δυο δικτύων. Χρησιμοποιείται πολύ εκτός από την ασφάλεια από πολλούς βασικούς χρήστες για ανωνυμία και προστασία των προσωπικών τους δεδομένων. Η σύνδεση γίνεται πάνω στον VPN Server. Στο παρακάτω ζητούμενο θα αναλυθεί η δημιουργία του VPN Server πάνω στον υπολογιστή μας καθώς και πως μπορούν χρήστες που βρίσκονται σε άλλα δίκτυα, στην περίπτωση μας οι κόμβοι του swarm να συνδεθούν και να εμφανίζονται σαν μέλη του δικτύου μας.</p>
</div>
<div class="admonitionblock note">
<table>
<tr>
<td class="icon">
<div class="title">Note</div>
</td>
<td class="content">
Τα VPN δουλεύουν με μοντέλο client-server, ο server είναι που ενώνει τα δίκτυα και από τον οποίο περνάει όλη η κίνηση από τα δίκτυα πρός τα έξω. Στο παρακάτω παράδειγμα, ο υπολογιστής μας θα είναι VPN Server και θα συνδέσουμε τον master του Swarm ως client.
</td>
</tr>
</table>
</div>
<div class="sect2">
<h3 id="_δημιουργία_openvpn_server_σε_docker_container">Δημιουργία OpenVPN Server σε Docker container</h3>
<div class="paragraph">
<p>Αρχικά θα δημιουργήσουμε στον υπολογιστή μας ένα αρχείο <strong>create-vpn.sh</strong> στο οποίο βάζουμε το παρακάτω περιεχόμενο:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>#!/bin/bash
IP=127.0.0.1 # Server IP
P=1194 # Server Port
OVPN_SERVER='10.80.0.0/16' # VPN Network
#vpn_data=/var/lib/swarmlab/openvpn/openvpn-services/ # Dir to save data ** this must exist **
vpn_data=$PWD/openvpn-services/
if [ ! -d $vpn_data ]; then
mkdir -p $vpn_data
fi
NAME=swarmlab-vpn-services # Name of docker service
DOCKERnetwork=swarmlab-vpn-services-network # Docker network
docker=registry.vlabs.uniwa.gr:5080/myownvpn # Docker image
docker stop $NAME #Stop container
sleep 1
docker container rm $NAME #rm container
# rm config files
rm -f $vpn_data/openvpn.conf.*.bak
rm -f $vpn_data/openvpn.conf
rm -f $vpn_data/ovpn_env.sh.*.bak
rm -f $vpn_data/ovpn_env.sh
# create network
sleep 1
docker network create --attachable=true --driver=bridge --subnet=172.50.0.0/16 --gateway=172.50.0.1 $DOCKERnetwork
#run container see ovpn_genconfig
docker run --net=none -it -v $vpn_data:/etc/openvpn -p 1194:1194 --rm $docker ovpn_genconfig -u udp://$IP:1194 \
-N -d -c -p "route 172.50.20.0 255.255.255.0" -e "topology subnet" -s $OVPN_SERVER
# create pki see ovpn_initpki
docker run --net=none -v $vpn_data:/etc/openvpn --rm -it $docker ovpn_initpki
# see ovpn_copy_server_files
#docker run --net=none -v $vpn_data:/etc/openvpn --rm $docker ovpn_copy_server_files
#create vpn see --cap-add=NET_ADMIN
sleep 1
docker run --detach --name $NAME -v $vpn_data:/etc/openvpn --net=$DOCKERnetwork --ip=172.50.0.2 -p $P:1194/udp --cap-add=NET_ADMIN $docker
sudo sysctl -w net.ipv4.ip_forward=1
#show created
docker ps</code></pre>
</div>
</div>
<div class="paragraph">
<p>Στο παραπάνω αρχείο δηλώνουμε, την τοπική IP του server, την port στην οποία θα ακούει, το δίκτυο VPN που δημιουργούμε. Στην συνέχεια θα δημιουργηθεί ένας φάκελος, δηλώνεται το όνομα του docker service, network και το image που θα κάνουμε pull. Στην συνέχεια θα δημιουργηθεί το δίκτυο και θα τρέξει το docker container στο οποίο μέσα σηκώνουμε τον OpenVPN server μας. Τρέχουμε το παραπάνω script με την εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo ./create-vpn.sh</code></pre>
</div>
</div>
<div class="paragraph">
<p>Θα χρειαστεί να ακολουθήσουμε τις οδηγίες που θα εμφανιστούν και να εισάγουμε τους κωδικούς που θα ζητηθούν. Εάν όλα πήγαν καλά με το <strong>docker ps</strong> που θα τρέξει θα πρέπει να βλέπουμε το swarmlab-vpn-services container να τρέχει. Αφού δημιουργηθεί το VPN μας, χρειάζεται να δημιουργήσουμε ένα αρχείο χρήστη για να μπορεί να συνδεθεί. Δημιουργούμε το αρχείο <strong>create-user.sh</strong> και βάζουμε μέσα τα παρακάτω:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>#!/bin/bash
USERNAME=testusermaster
vpn_data=$PWD/openvpn-services/
docker=registry.vlabs.uniwa.gr:5080/myownvpn
docker run -v $vpn_data:/etc/openvpn --rm -it $docker easyrsa build-client-full $USERNAME nopass
docker run -v $vpn_data:/etc/openvpn --log-driver=none --rm $docker ovpn_getclient $USERNAME &gt; $USERNAME.ovpn</code></pre>
</div>
</div>
<div class="paragraph">
<p>Τρέχουμε το παραπάνω script με την παρακάτω εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo ./create-user.sh</code></pre>
</div>
</div>
<div class="paragraph">
<p>Το αρχείο που θα δημιουργηθεί περιέχει τα απαραίτητα κλειδιά για να μπει ο χρήστης μας στο VPN και κάποιες επιπλέον ρυθμίσεις. Προθέτουμε τις παρακάτω γραμμές στην κορυφή του αρχείου βάζοντας την IP του VPN Server μας πάνω στον οποίο θα γίνει η σύνδεση δίπλα στην πόρτα που χρησιμοποιούμε (1194).</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>client
nobind
dev tun
comp-lzo
resolv-retry infinite
keepalive 15 60
remote-cert-tls server
remote &lt;host-IP&gt; 1194 udp
float</code></pre>
</div>
</div>
<div class="paragraph">
<p>Το αρχείο με τα παραπάνω και με τα κλειδιά που έχει μέσα θα τα χρησιμοποιήσει ο χρήστης (ο master του swarm μας) για να συνδεθεί. Αρκεί να μπούμε στον master και να εγκαταστήσουμε το openvpn με την παρακάτω εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo apt-get install openvpn</code></pre>
</div>
</div>
<div class="paragraph">
<p>Αφου εγκαταστήσουμε το OpenVPN, θα εκτελέσουμε την παρακάτω εντολή με το αρχείο που δημιουργήσαμε πριν, στην περίπτωση μας το <strong>testusermaster.ovpn</strong> για παράμετρο ως εξής:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>openvpn --config testusermaster.ovpn</code></pre>
</div>
</div>
<div class="paragraph">
<p>Θα εμφανιστεί μήνυμα επιτυχίας εάν ο χρήστης συνδεθεί με επιτύχια και μπορούμε να ελέγξουμε αν έχει αποκτήσει IP του VPN μας μέσω <strong>ifconfig</strong> όπου θα πρέπει να εμφανιστεί σε μια διεπαφή διεύθυνση του δικτύου VPN μας (στην περίπτωση μας 10.80.0.0/16).</p>
</div>
<div class="paragraph">
<p>Στον VPN Server μπορούμε να δούμε τους users καθώς και τους connected clients με τις παρακάτω εντολές αντίστοιχα:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>docker exec -it swarmlab-vpn-services ovpn_listclients</code></pre>
</div>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>docker exec -it swarmlab-vpn-services cat /tmp/openvpn-status.log</code></pre>
</div>
</div>
<div class="paragraph">
<p>Τέλος εάν θέλουμε να αφαιρέσουμε τον χρήστη από το VPN μας, δημιουργούμε αρχείο <strong>rm-user.sh</strong> με το παρακάτω περιεχόμενο:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>#!/bin/bash
CLIENTNAME=testusermaster
U=$CLIENTNAME
vpn_data=$PWD/openvpn-services/
docker=registry.vlabs.uniwa.gr:5080/myownvpn
rm -f $vpn_data/pki/reqs/$CLIENTNAME.req
rm -f $vpn_data/pki/private/$CLIENTNAME.keyVP
rm -f $vpn_data/pki/issued/$CLIENTNAME.crt
rm -f $vpn_data/server/ccd/$CLIENTNAME
rm -f $vpn_data/ccd/$CLIENTNAME
pem=$(sudo grep "CN=$U$" $vpn_data/pki/index.txt | cut -f4)
rm -f $vpn_data/pki/certs_by_serial/$pem.pem
sed -i "/CN=$U$/d" $vpn_data/pki/index.txt
echo $pem
docker run -v $vpn_data:/etc/openvpn --log-driver=none --rm -it $docker ovpn_revokeclient $CLIENTNAME remove
rm -f $vpn_data_user_config/$CLIENTNAME.ovpn
rm -f $vpn_data_user_config1/$CLIENTNAME.ovpn</code></pre>
</div>
</div>
<div class="admonitionblock tip">
<table>
<tr>
<td class="icon">
<div class="title">Tip</div>
</td>
<td class="content">
Βάζουμε για CLIENTNAME το όνομα του χρήστη που θέλουμε να αφαιρέσουμε.
</td>
</tr>
</table>
</div>
<div class="paragraph">
<p>Και τέλος ο χρήστης θα αφαιρεθεί με την εκτέλεση του παραπάνω script με την παρακάτω εντολή:</p>
</div>
<div class="listingblock">
<div class="content">
<pre class="highlight"><code>sudo ./rm-user.sh</code></pre>
</div>
</div>
</div>
<div class="sect2">
<h3 id="_στιγμιότυπα_οθόνης_από_δημιουργία_vpn_στο_swarm">Στιγμιότυπα οθόνης από δημιουργία VPN στο swarm</h3>
<div class="imageblock">
<div class="content">
<img src="images/VPN/create-vpn.sh.png" alt="create vpn.sh">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/VPN/create-vpn2.sh.png" alt="create vpn2.sh">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/VPN/ca_creation.png" alt="ca creation">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/VPN/swarmlab-vpn-services-up.png" alt="swarmlab vpn services up">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/VPN/create-user.sh.png" alt="create user.sh">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/VPN/create-user.sh2.png" alt="create user.sh2">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/VPN/serverIP.png" alt="serverIP">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/VPN/testusermaster.ovpn.png" alt="testusermaster.ovpn">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/VPN/ovpn_config.png" alt="ovpn config">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/VPN/ifconfig_vpn.png" alt="ifconfig vpn">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/VPN/viewclients.png" alt="viewclients">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/VPN/rm-user.sh.png" alt="rm user.sh">
</div>
</div>
<div class="imageblock">
<div class="content">
<img src="images/VPN/rm-user.sh2.png" alt="rm user.sh2">
</div>
</div>
</div>
</div>
</div>
</div>
<div id="footer">
<div id="footer-text">
Last updated 2021-01-22 00:37:30 EET
</div>
</div>
</body>
</html>