<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de-DE"><generator uri="https://jekyllrb.com/" version="4.2.2">Jekyll</generator><link href="http://localhost:4000/feed.xml" rel="self" type="application/atom+xml" /><link href="http://localhost:4000/" rel="alternate" type="text/html" hreflang="de-DE" /><updated>2025-02-02T00:04:57+01:00</updated><id>http://localhost:4000/feed.xml</id><title type="html">blg.decon230.org</title><subtitle>grumpy goes digital...</subtitle><entry><title type="html">Automatisierung - Ansible &amp;amp; Gitlab - saubere Syntax im Playbook</title><link href="http://localhost:4000/posts/ansible-runner/" rel="alternate" type="text/html" title="Automatisierung - Ansible &amp;amp; Gitlab - saubere Syntax im Playbook" /><published>2023-03-31T07:20:00+02:00</published><updated>2023-03-31T07:20:00+02:00</updated><id>http://localhost:4000/posts/ansible-runner</id><content type="html" xml:base="http://localhost:4000/posts/ansible-runner/"><![CDATA[<p>Für fehlerfreie Syntaxen in Playbooks oder gar das automatische Ausführen von Playbooks bieten sich Tools wie gitlab und gitlab-runner an.</p>

<p>Im folgenden Beispiel sollen nur Playbooks auf die Ansible Control Node (ACN) kopiert werden, welche erfolgreich durch den Syntax-Check von ansible-lint gelaufen sind.</p>

<p>Es werden ein gitlab Server und ein gitlab-runner benötigt. Die ACN sollte bereits vorhanden sein.</p>

<h2 id="gitlab-repo-einrichten">gitlab Repo einrichten</h2>
<p>Es wird ein Projekt im gitlab eingerichtet, hier nennt es sich “pfsense”.</p>

<p><img src="/assets/img/ans-runner01.png" alt="git-repo" w="500" h="250" /></p>

<p>Das Repo wird per <code class="language-plaintext highlighter-rouge">git clone git@10.10.10.97:root/pfsense.git</code> geklont.</p>

<p>Die <code class="language-plaintext highlighter-rouge">README.md</code> wird geleert und eingecheckt.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre><span class="nb">echo</span> <span class="s2">""</span> <span class="o">&gt;</span> README.md
git add <span class="k">*</span>
git commit <span class="nt">-m</span> <span class="s2">"init"</span>
<span class="o">[</span>main 836cf99] init
 1 file changed, 1 insertion<span class="o">(</span>+<span class="o">)</span>, 92 deletions<span class="o">(</span>-<span class="o">)</span>
 rewrite README.md <span class="o">(</span>99%<span class="o">)</span>
git push
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="gitlab-runner-einrichten">gitlab Runner einrichten</h2>
<p>Um automatisch bei einem commit die Playbooks auf ihre richtige Syntax zu prüfen, wird ein runner benötigt. Auf diesen muss sämtliche Software für ansible-lint installiert werden. Der Einfachheit halber wird die Software global installiert und nicht im User Kontext.</p>

<h3 id="runner-installieren">Runner installieren</h3>
<p>Der Runner wird per Shellskript installiert.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>curl <span class="nt">-L</span> <span class="s2">"https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.rpm.sh"</span> | <span class="nb">sudo </span>bash
dnf <span class="nb">install </span>gitlab-runner <span class="nt">-y</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Der Runner muss registriert werden. Dazu wird im gitlab unter <em><code class="language-plaintext highlighter-rouge">Settings-CI/CD</code></em> der Token ausglesen:</p>

<p><img src="/assets/img/ans-runner02.png" alt="git-repo" w="500" h="250" /></p>

<h3 id="runner-registrieren">Runner registrieren</h3>

<p>Der Runner kann jetzt registriert werden.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="rouge-code"><pre>gitlab-runner register <span class="nt">--url</span> http://10.10.10.97/ <span class="nt">--registration-token</span> GR1348941ozPELDfBh6ciKzCNajud

Runtime platform                                    <span class="nb">arch</span><span class="o">=</span>amd64 <span class="nv">os</span><span class="o">=</span>linux <span class="nv">pid</span><span class="o">=</span>2675 <span class="nv">revision</span><span class="o">=</span>dcfb4b66 <span class="nv">version</span><span class="o">=</span>15.10.1
Running <span class="k">in </span>system-mode.                            

Enter the GitLab instance URL <span class="o">(</span><span class="k">for </span>example, https://gitlab.com/<span class="o">)</span>:
<span class="o">[</span>http://10.10.10.97/]:
Enter the registration token:
<span class="o">[</span>GR1348941ozPELDfBh6ciKzCNajud]:
Enter a description <span class="k">for </span>the runner:
<span class="o">[</span>runner3.decon230.org]:
Enter tags <span class="k">for </span>the runner <span class="o">(</span>comma-separated<span class="o">)</span>:

Enter optional maintenance note <span class="k">for </span>the runner:

Registering runner... succeeded                     <span class="nv">runner</span><span class="o">=</span>GR1348941ozPELDfB
Enter an executor: virtualbox, docker+machine, instance, custom, docker-ssh, shell, docker-ssh+machine, kubernetes, docker, parallels, ssh:
shell
Runner registered successfully.
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Der Runner wird jetzt gestartet.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>gitlab-runner start
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Nach einiger Zeit sollte der Runner im gitlab Repo auftauchen.</p>

<p><img src="/assets/img/ans-runner03.png" alt="git-repo" w="500" h="250" /></p>

<h2 id="software-auf-dem-runner-installieren">Software auf dem Runner installieren</h2>
<p>Damit Playbooks (oder was auch immer an Software, Skripten getestet werden soll) geprüft werden können, wird jetzt ansible-lint auf dem Runner installiert.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="rouge-code"><pre>dnf module <span class="nb">enable </span>python39
alternatives <span class="nt">--config</span> python

There are 3 programs which provide <span class="s1">'python'</span><span class="nb">.</span>

  Selection    Command
<span class="nt">-----------------------------------------------</span>
<span class="k">*</span>  1           /usr/libexec/no-python
   2           /usr/bin/python3
 + 3           /usr/bin/python3.9

3

pip3 <span class="nb">install </span>ansible-core ansible ansible-lint
dnf <span class="nt">-y</span> <span class="nb">install </span>yamllint
ansible-galaxy collection <span class="nb">install </span>pfsensible.core
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="pipe-einrichten">Pipe einrichten</h2>
<p>Jetzt muss eine Pipe im gitlab Repo eingerichtet werden.</p>

<p>Unter <code class="language-plaintext highlighter-rouge">*CI/CD-&gt;Editor*</code> wird die <code class="language-plaintext highlighter-rouge">.gitlab-ci.yml</code> eingerichtet.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre><span class="na">stages</span><span class="pi">:</span>  
  <span class="pi">-</span> <span class="s">test</span>

<span class="na">unit-test-job</span><span class="pi">:</span>   
  <span class="na">stage</span><span class="pi">:</span> <span class="s">test</span>
  <span class="na">script</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="s">echo "Testing Ansible Syntax"</span>
    <span class="pi">-</span> <span class="s">ansible-lint pb_pfsense_add_aliases.yml</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Anschließend muss das Repo per <code class="language-plaintext highlighter-rouge">git pull</code> aktualisiert werden.</p>

<p>Jetzt wird das erste Playbook eingecheckt.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="rouge-code"><pre>git add <span class="k">*</span>
git commit <span class="nt">-m</span> <span class="s2">"1st checkin"</span>
<span class="o">[</span>main 696846a] 1st checkin
 1 file changed, 24 insertions<span class="o">(</span>+<span class="o">)</span>
 create mode 100644 pb_pfsense_add_aliases.yml
heiko@jellyfish:~/virtenv/repo/pfsense<span class="nv">$ </span>git push
Enumerating objects: 4, <span class="k">done</span><span class="nb">.</span>
Counting objects: 100% <span class="o">(</span>4/4<span class="o">)</span>, <span class="k">done</span><span class="nb">.</span>
Delta compression using up to 8 threads
Compressing objects: 100% <span class="o">(</span>3/3<span class="o">)</span>, <span class="k">done</span><span class="nb">.</span>
Writing objects: 100% <span class="o">(</span>3/3<span class="o">)</span>, 629 bytes | 629.00 KiB/s, <span class="k">done</span><span class="nb">.</span>
Total 3 <span class="o">(</span>delta 0<span class="o">)</span>, reused 0 <span class="o">(</span>delta 0<span class="o">)</span>, pack-reused 0
To 10.10.10.97:root/pfsense.git
   deda056..696846a  main -&gt; main
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Die ersten Jobs werden fehlschlagen.</p>

<p><img src="/assets/img/ans-runner05.png" alt="git-repo" w="500" h="250" /></p>

<p>Folgende Dinge werden von ansible-lint moniert:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre>Rule Violation Summary                 
count tag               profile  rule associated tags
1 yaml[empty-lines] basic    formatting, yaml     
1 yaml[indentation] basic    formatting, yaml     
1 yaml[truthy]      basic    formatting, yaml     
2 name[casing]      moderate idiom                
Failed after min profile: 5 failure(s), 0 warning(s) on 1 files.
</pre></td></tr></tbody></table></code></pre></div></div>
<p>Es handelt sich primär um Formatierungsfehler.</p>

<p>Diese müssen behoben werden, die Datei wird neu eingecheckt.</p>

<p>Anschließend wird der Test-Job erfolgreich durchlaufen.</p>

<p><img src="/assets/img/ans-runner06.png" alt="git-repo" w="500" h="250" /></p>

<h2 id="runner-für-deployment-vorbereiten">Runner für Deployment vorbereiten</h2>
<p>Damit der Runner die Playbooks auf die ACN kopieren kann, werden SSH-Keys benötigt.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre>ssh-keygen <span class="nt">-t</span> ed25519
Generating public/private ed25519 key pair.
Enter file <span class="k">in </span>which to save the key <span class="o">(</span>/home/gitlab-runner/.ssh/id_ed25519<span class="o">)</span>:
Created directory <span class="s1">'/home/gitlab-runner/.ssh'</span><span class="nb">.</span>
Enter passphrase <span class="o">(</span>empty <span class="k">for </span>no passphrase<span class="o">)</span>:
Enter same passphrase again:
Your identification has been saved <span class="k">in</span> /home/gitlab-runner/.ssh/id_ed25519.
Your public key has been saved <span class="k">in</span> /home/gitlab-runner/.ssh/id_ed25519.pub.
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Der SSH Key wird auf die ACN kopiert.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>ssh-copy-id ansible@10.10.10.95
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Jetzt muss die <code class="language-plaintext highlighter-rouge">.gitlab-ci.yml</code> erweitert werden.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="rouge-code"><pre><span class="na">stages</span><span class="pi">:</span>  
  <span class="pi">-</span> <span class="s">test</span>
  <span class="pi">-</span> <span class="s">deploy</span>

<span class="na">unit-test-job</span><span class="pi">:</span>       
  <span class="na">stage</span><span class="pi">:</span> <span class="s">test</span>
  <span class="na">script</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="s">echo "Testing Ansible Syntax"</span>
    <span class="pi">-</span> <span class="s">ansible-lint *.yml</span>


<span class="na">deploy-job</span><span class="pi">:</span>
  <span class="na">stage</span><span class="pi">:</span> <span class="s">deploy</span>  
  <span class="na">environment</span><span class="pi">:</span> <span class="s">production</span>
  <span class="na">script</span><span class="pi">:</span>
    <span class="pi">-</span> <span class="s">echo "Deploying Playbooks"</span>
    <span class="pi">-</span> <span class="s">scp -r * ansible@10.10.10.95:/home/ansible</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Der Job sollte erfolgreich durchlaufen und die Playbooks auf die ACN kopieren.</p>

<p><img src="/assets/img/ans-runner07.png" alt="git-repo" w="500" h="250" /></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="o">[</span>root@ctlnode ~]# tree ~ansible/
/home/ansible/
|-- README.md
<span class="sb">`</span><span class="nt">--</span> pb_pfsense_add_aliases.yml

</pre></td></tr></tbody></table></code></pre></div></div>

<p>Damit funktioniert die Verteilung der Playbooks. Jetzt können noch weitere
Jobs eingebaut werden, wie bspw. das automatische Ausführen der Playbooks.</p>]]></content><author><name>grumpy</name></author><category term="Netzwerk" /><category term="Gitlab" /><category term="Redhat" /><category term="gitlab" /><category term="ansible" /><category term="redhat" /><summary type="html"><![CDATA[Für fehlerfreie Syntaxen in Playbooks oder gar das automatische Ausführen von Playbooks bieten sich Tools wie gitlab und gitlab-runner an.]]></summary></entry><entry><title type="html">Automatisierung - Ansible - pfSense</title><link href="http://localhost:4000/posts/ansible-pfsense/" rel="alternate" type="text/html" title="Automatisierung - Ansible - pfSense" /><published>2023-03-17T12:44:00+01:00</published><updated>2023-03-17T12:44:00+01:00</updated><id>http://localhost:4000/posts/ansible-pfsense</id><content type="html" xml:base="http://localhost:4000/posts/ansible-pfsense/"><![CDATA[<p>Ansbile ist aktuell <em>das</em> Tool um Netzwerkequipment automatisch konfigurieren
zu lassen. Im aktuellen Beispiel wird eine pfSense mittels Playbooks konfiguriert.</p>

<blockquote class="prompt-warning">

  <p>Derzeit ist es nicht möglich, virtuelle IPs über Ansible einrichten zu lassen.
Clusterkonfigurationen müssen derzeit weiter per Hand eingerichtet werden.</p>
</blockquote>

<h2 id="vorbereitung">Vorbereitung</h2>
<p>Es muss das Modul “pfsensible.core” installiert werden.
Ansible muss ebenfalls installiert sein, <a href="../ansible/">siehe hier</a>.</p>

<p>Auf der pfSense <em>muss</em> <code class="language-plaintext highlighter-rouge">sudo</code> installiert sein.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>ansible-galaxy collection <span class="nb">install </span>pfsensible.core
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Es wird folgende Ordnerstruktur angelegt:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="rouge-code"><pre>
pfsense/
├── ansible.cfg
├── group_vars
│   └── all.yml
├── hosts
├── pb_pfsense_add_aliases.yml
├── pb_pfsense_add_if_pwf01.yml
├── pb_pfsense_add_if_pwf02.yml
├── pb_pfsense_add_if.yml
├── pb_pfsense_add_lab_net.yml
├── pb_pfsense_add_nat.yml
├── pb_pfsense_add_rules.yml
├── pb_pfsense_add_vlans.yml
├── pb_pfsense_del_aliases.yml
├── pb_pfsense_del_if_pwf01.yml
├── pb_pfsense_del_if_pwf02.yml
├── pb_pfsense_del_if.yml
├── pb_pfsense_del_lab_net.yml
├── pb_pfsense_del_nat.yml
├── pb_pfsense_del_rules.yml
└── pb_pfsense_del_vlans.yml
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="ziel">Ziel</h2>
<p>Das Ziel ist es, zwei Netze einzurichten, die per VLAN-Tagging an das interne “LAN-Interface” der Firewall angebunden ist. Diese sollen per NAT auf die WAN-IP übersetzt werden, es soll als Start nur Surfen erlaubt sein.</p>

<h2 id="konfiguration-und-inventory">Konfiguration und Inventory</h2>
<p>Die Konfiguration von Ansbile sieht wie folgt aus:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre>[defaults]
inventory=hosts
retry_files_enabled=False
gathering=explicit
host_key_checking=False
action_warnings=False
deprecation_warnings=False
ansible_command_timeout=600
command_timeout=600
ask_pass=True
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Das Inventory sieht folgendermaßen aus:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>[dmzfirewall]
pf01    ansible_host=10.10.10.50

[dmzfirewall:vars]
ansible_python_interpreter=auto
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Der Interpreter muss auf “auto” gesetzt werden, andernfalls bricht Ansible mit Fehlern ab, sobald mehr als ein Objekt eingerichtet wird.</p>

<h2 id="playbooks">Playbooks</h2>
<p>Folgende Playbooks werden erstellt, um Netze anzulegen.</p>

<h3 id="pb_pfsense_add_vlansyml">pb_pfsense_add_vlans.yml</h3>
<p>Im ersten Schritt werden VLANs angelegt.</p>

<blockquote class="prompt-danger">
  <p>Wichtig: die Items müssen im Modul mit <strong>doppelten</strong>, geschweiften Klammern ({}) geschrieben werden. Dies gilt für <strong>alle</strong> Playbooks dieses Artikels.</p>

  <p>Leider zeigt Jekyll die Notation nicht richtig an.</p>
</blockquote>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="rouge-code"><pre><span class="nn">---</span>
<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">create vlans</span>
  <span class="na">hosts</span><span class="pi">:</span> <span class="s">dmzfirewall</span>
  <span class="na">remote_user</span><span class="pi">:</span> <span class="s">admin</span>
  <span class="na">become</span><span class="pi">:</span> <span class="s">yes</span>
  <span class="na">become_method</span><span class="pi">:</span> <span class="s">sudo</span>
  <span class="na">become_user</span><span class="pi">:</span> <span class="s">root</span>

  <span class="na">tasks</span><span class="pi">:</span>

  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">create vlans</span>
    <span class="na">pfsensible.core.pfsense_vlan</span><span class="pi">:</span>
      <span class="na">interface</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.if</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">vlan_id</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.vid</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">descr</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.descr</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">state</span><span class="pi">:</span> <span class="s">present</span>

    <span class="na">loop</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">em2'</span><span class="pi">,</span> <span class="nv">vid</span><span class="pi">:</span> <span class="s1">'</span><span class="s">555'</span><span class="pi">,</span> <span class="nv">descr</span><span class="pi">:</span> <span class="s1">'</span><span class="s">LAB_Test55'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">em2'</span><span class="pi">,</span> <span class="nv">vid</span><span class="pi">:</span> <span class="s1">'</span><span class="s">556'</span><span class="pi">,</span> <span class="nv">descr</span><span class="pi">:</span> <span class="s1">'</span><span class="s">LAB_Test56'</span> <span class="pi">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="pb_pfsense_add_ifyml">pb_pfsense_add_if.yml</h3>
<p>Jetzt werden Interfaces konfiguriert.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="rouge-code"><pre><span class="nn">---</span>
<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">create interface pwf01</span>
  <span class="na">hosts</span><span class="pi">:</span> <span class="s">pf01</span>
  <span class="na">remote_user</span><span class="pi">:</span> <span class="s">admin</span>
  <span class="na">become</span><span class="pi">:</span> <span class="s">yes</span>
  <span class="na">become_method</span><span class="pi">:</span> <span class="s">sudo</span>
  <span class="na">become_user</span><span class="pi">:</span> <span class="s">root</span>

  <span class="na">tasks</span><span class="pi">:</span>

  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">create interface on pwf01</span>
    <span class="na">pfsensible.core.pfsense_interface</span><span class="pi">:</span>
      <span class="na">interface</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.if</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">ipv4_address</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.ipv4</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">ipv4_prefixlen</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.prefixv4</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">ipv4_type</span><span class="pi">:</span> <span class="s">static</span>
      <span class="na">descr</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.descr</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">state</span><span class="pi">:</span> <span class="s">present</span>
      <span class="na">enable</span><span class="pi">:</span> <span class="no">true</span>

    <span class="na">loop</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">em2.555'</span><span class="pi">,</span> <span class="nv">ipv4</span><span class="pi">:</span> <span class="s1">'</span><span class="s">172.17.55.1'</span><span class="pi">,</span> <span class="nv">prefixv4</span><span class="pi">:</span> <span class="s1">'</span><span class="s">24'</span><span class="pi">,</span> <span class="nv">descr</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_Test55'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">em2.556'</span><span class="pi">,</span> <span class="nv">ipv4</span><span class="pi">:</span> <span class="s1">'</span><span class="s">172.17.56.1'</span><span class="pi">,</span> <span class="nv">prefixv4</span><span class="pi">:</span> <span class="s1">'</span><span class="s">24'</span><span class="pi">,</span> <span class="nv">descr</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_Test56'</span> <span class="pi">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="pb_pfsense_add_aliasesyml">pb_pfsense_add_aliases.yml</h3>
<p>Es werden Aliases angelegt, was das Regelwerk leichter lesbar macht.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="rouge-code"><pre><span class="nn">---</span>
<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">create aliases</span>
  <span class="na">hosts</span><span class="pi">:</span> <span class="s">dmzfirewall</span>
  <span class="na">remote_user</span><span class="pi">:</span> <span class="s">admin</span>
  <span class="na">become</span><span class="pi">:</span> <span class="s">yes</span>
  <span class="na">become_method</span><span class="pi">:</span> <span class="s">sudo</span>
  <span class="na">become_user</span><span class="pi">:</span> <span class="s">root</span>


  <span class="na">tasks</span><span class="pi">:</span>

  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">create host alias(es)</span>
    <span class="na">pfsensible.core.pfsense_alias</span><span class="pi">:</span>
      <span class="na">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.name</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">address</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.address</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">descr</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.descr</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">type</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.type</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">state</span><span class="pi">:</span> <span class="s">present</span>

    <span class="na">loop</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">name</span><span class="pi">:</span> <span class="s1">'</span><span class="s">VIP_lab_Test55'</span><span class="pi">,</span> <span class="nv">address</span><span class="pi">:</span> <span class="s1">'</span><span class="s">172.17.55.1'</span><span class="pi">,</span> <span class="nv">descr</span><span class="pi">:</span> <span class="s1">'</span><span class="s">GW</span><span class="nv"> </span><span class="s">IP</span><span class="nv"> </span><span class="s">LAB</span><span class="nv"> </span><span class="s">Test55'</span><span class="pi">,</span> <span class="nv">type</span><span class="pi">:</span> <span class="s1">'</span><span class="s">host'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">name</span><span class="pi">:</span> <span class="s1">'</span><span class="s">VIP_lab_Test56'</span><span class="pi">,</span> <span class="nv">address</span><span class="pi">:</span> <span class="s1">'</span><span class="s">172.17.56.1'</span><span class="pi">,</span> <span class="nv">descr</span><span class="pi">:</span> <span class="s1">'</span><span class="s">GW</span><span class="nv"> </span><span class="s">IP</span><span class="nv"> </span><span class="s">LAB</span><span class="nv"> </span><span class="s">Test56'</span><span class="pi">,</span> <span class="nv">type</span><span class="pi">:</span> <span class="s1">'</span><span class="s">host'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">name</span><span class="pi">:</span> <span class="s1">'</span><span class="s">NET_lab_test55'</span><span class="pi">,</span> <span class="nv">address</span><span class="pi">:</span> <span class="s1">'</span><span class="s">172.17.55.0/24'</span><span class="pi">,</span> <span class="nv">descr</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Netz</span><span class="nv"> </span><span class="s">LAB</span><span class="nv"> </span><span class="s">Test55'</span><span class="pi">,</span> <span class="nv">type</span><span class="pi">:</span> <span class="s1">'</span><span class="s">network'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">name</span><span class="pi">:</span> <span class="s1">'</span><span class="s">NET_lab_test56'</span><span class="pi">,</span> <span class="nv">address</span><span class="pi">:</span> <span class="s1">'</span><span class="s">172.17.56.0/24'</span><span class="pi">,</span> <span class="nv">descr</span><span class="pi">:</span> <span class="s1">'</span><span class="s">Netz</span><span class="nv"> </span><span class="s">LAB</span><span class="nv"> </span><span class="s">Test56'</span><span class="pi">,</span> <span class="nv">type</span><span class="pi">:</span> <span class="s1">'</span><span class="s">network'</span> <span class="pi">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="pb_pfsense_add_natyml">pb_pfsense_add_nat.yml</h3>
<p>Die Netze werden auf die WAN IP genat’ed. Wichtig: die Outbound NAT muss auf manuell gesetzt sein.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="rouge-code"><pre><span class="nn">---</span>
<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">create nat</span>
  <span class="na">hosts</span><span class="pi">:</span> <span class="s">dmzfirewall</span>
  <span class="na">remote_user</span><span class="pi">:</span> <span class="s">admin</span>
  <span class="na">become</span><span class="pi">:</span> <span class="s">yes</span>
  <span class="na">become_method</span><span class="pi">:</span> <span class="s">sudo</span>
  <span class="na">become_user</span><span class="pi">:</span> <span class="s">root</span>

  <span class="na">tasks</span><span class="pi">:</span>

  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">create outbound nat</span>
    <span class="na">pfsensible.core.pfsense_nat_outbound</span><span class="pi">:</span>
      <span class="na">descr</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.descr</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">interface</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.if</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">address</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.addr</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">source</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.source</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">destination</span><span class="pi">:</span> <span class="s">any</span>
      <span class="na">protocol</span><span class="pi">:</span> <span class="s">any</span>
      <span class="na">before</span><span class="pi">:</span> <span class="s">bottom</span>
      <span class="na">state</span><span class="pi">:</span> <span class="s">present</span>

    <span class="na">loop</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">descr</span><span class="pi">:</span> <span class="s1">'</span><span class="s">NAT_LAB_Test55'</span><span class="pi">,</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">wan'</span><span class="pi">,</span> <span class="nv">addr</span><span class="pi">:</span> <span class="s1">'</span><span class="s">10.10.10.10'</span><span class="pi">,</span> <span class="nv">source</span><span class="pi">:</span> <span class="s1">'</span><span class="s">172.17.55.0/24'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">descr</span><span class="pi">:</span> <span class="s1">'</span><span class="s">NAT_LAB_Test56'</span><span class="pi">,</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">wan'</span><span class="pi">,</span> <span class="nv">addr</span><span class="pi">:</span> <span class="s1">'</span><span class="s">10.10.10.10'</span><span class="pi">,</span> <span class="nv">source</span><span class="pi">:</span> <span class="s1">'</span><span class="s">172.17.56.0/24'</span> <span class="pi">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="pb_pfsense_add_rulesyml">pb_pfsense_add_rules.yml</h3>
<p>Jetzt wird das Regelwerk erstellt.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
</pre></td><td class="rouge-code"><pre><span class="nn">---</span>
<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">create std rule and separators</span>
  <span class="na">hosts</span><span class="pi">:</span> <span class="s">dmzfirewall</span>
  <span class="na">remote_user</span><span class="pi">:</span> <span class="s">admin</span>
  <span class="na">become</span><span class="pi">:</span> <span class="s">yes</span>
  <span class="na">become_method</span><span class="pi">:</span> <span class="s">sudo</span>
  <span class="na">become_user</span><span class="pi">:</span> <span class="s">root</span>

  <span class="na">tasks</span><span class="pi">:</span>

  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">create icmp rule</span>
    <span class="na">pfsensible.core.pfsense_rule</span><span class="pi">:</span>
      <span class="na">action</span><span class="pi">:</span> <span class="s">pass</span>
      <span class="na">interface</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.if</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">ipprotocol</span><span class="pi">:</span> <span class="s">inet</span>
      <span class="na">protocol</span><span class="pi">:</span> <span class="s">icmp</span>
      <span class="na">icmptype</span><span class="pi">:</span> <span class="s">echorep, echoreq</span>
      <span class="na">source</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.source</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">destination</span><span class="pi">:</span> <span class="s">any</span>
      <span class="na">name</span><span class="pi">:</span> <span class="s">permit_ping</span>
      <span class="na">state</span><span class="pi">:</span> <span class="s">present</span>

    <span class="na">with_items</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_TEST55'</span><span class="pi">,</span> <span class="nv">source</span><span class="pi">:</span> <span class="s1">'</span><span class="s">NET_lab_test55'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_TEST56'</span><span class="pi">,</span> <span class="nv">source</span><span class="pi">:</span> <span class="s1">'</span><span class="s">NET_lab_test56'</span> <span class="pi">}</span>

  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">create standard rules</span>
    <span class="na">pfsensible.core.pfsense_rule</span><span class="pi">:</span>
      <span class="na">action</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.action</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">interface</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.if</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">ipprotocol</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.ipproto</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">protocol</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.protocol</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">source</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.source</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">destination</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.destination</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">destination_port</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.dport</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">name</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.name</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">state</span><span class="pi">:</span> <span class="s">present</span>

    <span class="na">loop</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">action</span><span class="pi">:</span> <span class="s1">'</span><span class="s">pass'</span><span class="pi">,</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_TEST55'</span><span class="pi">,</span> <span class="nv">ipproto</span><span class="pi">:</span> <span class="s1">'</span><span class="s">inet'</span><span class="pi">,</span> <span class="nv">protocol</span><span class="pi">:</span> <span class="s1">'</span><span class="s">tcp/udp'</span><span class="pi">,</span> <span class="nv">source</span><span class="pi">:</span> <span class="s1">'</span><span class="s">NET_lab_test55'</span><span class="pi">,</span> <span class="nv">destination</span><span class="pi">:</span> <span class="s1">'</span><span class="s">VIP_lab_Test55'</span><span class="pi">,</span> <span class="nv">dport</span><span class="pi">:</span> <span class="s1">'</span><span class="s">53'</span><span class="pi">,</span> <span class="nv">name</span><span class="pi">:</span> <span class="s1">'</span><span class="s">permit_dns'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">action</span><span class="pi">:</span> <span class="s1">'</span><span class="s">pass'</span><span class="pi">,</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_TEST55'</span><span class="pi">,</span> <span class="nv">ipproto</span><span class="pi">:</span> <span class="s1">'</span><span class="s">inet'</span><span class="pi">,</span> <span class="nv">protocol</span><span class="pi">:</span> <span class="s1">'</span><span class="s">tcp/udp'</span><span class="pi">,</span> <span class="nv">source</span><span class="pi">:</span> <span class="s1">'</span><span class="s">NET_lab_test55'</span><span class="pi">,</span> <span class="nv">destination</span><span class="pi">:</span> <span class="s1">'</span><span class="s">grp_DNS_Server'</span><span class="pi">,</span> <span class="nv">dport</span><span class="pi">:</span> <span class="s1">'</span><span class="s">53'</span><span class="pi">,</span> <span class="nv">name</span><span class="pi">:</span> <span class="s1">'</span><span class="s">permit_dns_grp'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">action</span><span class="pi">:</span> <span class="s1">'</span><span class="s">pass'</span><span class="pi">,</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_TEST55'</span><span class="pi">,</span> <span class="nv">ipproto</span><span class="pi">:</span> <span class="s1">'</span><span class="s">inet'</span><span class="pi">,</span> <span class="nv">protocol</span><span class="pi">:</span> <span class="s1">'</span><span class="s">udp'</span><span class="pi">,</span> <span class="nv">source</span><span class="pi">:</span> <span class="s1">'</span><span class="s">NET_lab_test55'</span><span class="pi">,</span> <span class="nv">destination</span><span class="pi">:</span> <span class="s1">'</span><span class="s">VIP_lab_Test55'</span><span class="pi">,</span> <span class="nv">dport</span><span class="pi">:</span> <span class="s1">'</span><span class="s">123'</span><span class="pi">,</span> <span class="nv">name</span><span class="pi">:</span> <span class="s1">'</span><span class="s">permit_ntp'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">action</span><span class="pi">:</span> <span class="s1">'</span><span class="s">pass'</span><span class="pi">,</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_TEST55'</span><span class="pi">,</span> <span class="nv">ipproto</span><span class="pi">:</span> <span class="s1">'</span><span class="s">inet'</span><span class="pi">,</span> <span class="nv">protocol</span><span class="pi">:</span> <span class="s1">'</span><span class="s">udp'</span><span class="pi">,</span> <span class="nv">source</span><span class="pi">:</span> <span class="s1">'</span><span class="s">NET_lab_test55'</span><span class="pi">,</span> <span class="nv">destination</span><span class="pi">:</span> <span class="s1">'</span><span class="s">grp_NTP_Server'</span><span class="pi">,</span> <span class="nv">dport</span><span class="pi">:</span> <span class="s1">'</span><span class="s">123'</span><span class="pi">,</span> <span class="nv">name</span><span class="pi">:</span> <span class="s1">'</span><span class="s">permit_ntp_grp'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">action</span><span class="pi">:</span> <span class="s1">'</span><span class="s">pass'</span><span class="pi">,</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_TEST55'</span><span class="pi">,</span> <span class="nv">ipproto</span><span class="pi">:</span> <span class="s1">'</span><span class="s">inet'</span><span class="pi">,</span> <span class="nv">protocol</span><span class="pi">:</span> <span class="s1">'</span><span class="s">tcp'</span><span class="pi">,</span> <span class="nv">source</span><span class="pi">:</span> <span class="s1">'</span><span class="s">NET_lab_test55'</span><span class="pi">,</span> <span class="nv">destination</span><span class="pi">:</span> <span class="s1">'</span><span class="s">any'</span><span class="pi">,</span> <span class="nv">dport</span><span class="pi">:</span> <span class="s1">'</span><span class="s">srv_web_tcp'</span><span class="pi">,</span> <span class="nv">name</span><span class="pi">:</span> <span class="s1">'</span><span class="s">permit_http_s'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">action</span><span class="pi">:</span> <span class="s1">'</span><span class="s">pass'</span><span class="pi">,</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_TEST56'</span><span class="pi">,</span> <span class="nv">ipproto</span><span class="pi">:</span> <span class="s1">'</span><span class="s">inet'</span><span class="pi">,</span> <span class="nv">protocol</span><span class="pi">:</span> <span class="s1">'</span><span class="s">tcp/udp'</span><span class="pi">,</span> <span class="nv">source</span><span class="pi">:</span> <span class="s1">'</span><span class="s">NET_lab_test56'</span><span class="pi">,</span> <span class="nv">destination</span><span class="pi">:</span> <span class="s1">'</span><span class="s">VIP_lab_Test56'</span><span class="pi">,</span> <span class="nv">dport</span><span class="pi">:</span> <span class="s1">'</span><span class="s">53'</span><span class="pi">,</span> <span class="nv">name</span><span class="pi">:</span> <span class="s1">'</span><span class="s">permit_dns'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">action</span><span class="pi">:</span> <span class="s1">'</span><span class="s">pass'</span><span class="pi">,</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_TEST56'</span><span class="pi">,</span> <span class="nv">ipproto</span><span class="pi">:</span> <span class="s1">'</span><span class="s">inet'</span><span class="pi">,</span> <span class="nv">protocol</span><span class="pi">:</span> <span class="s1">'</span><span class="s">tcp/udp'</span><span class="pi">,</span> <span class="nv">source</span><span class="pi">:</span> <span class="s1">'</span><span class="s">NET_lab_test56'</span><span class="pi">,</span> <span class="nv">destination</span><span class="pi">:</span> <span class="s1">'</span><span class="s">grp_DNS_Server'</span><span class="pi">,</span> <span class="nv">dport</span><span class="pi">:</span> <span class="s1">'</span><span class="s">53'</span><span class="pi">,</span> <span class="nv">name</span><span class="pi">:</span> <span class="s1">'</span><span class="s">permit_dns_grp'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">action</span><span class="pi">:</span> <span class="s1">'</span><span class="s">pass'</span><span class="pi">,</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_TEST56'</span><span class="pi">,</span> <span class="nv">ipproto</span><span class="pi">:</span> <span class="s1">'</span><span class="s">inet'</span><span class="pi">,</span> <span class="nv">protocol</span><span class="pi">:</span> <span class="s1">'</span><span class="s">udp'</span><span class="pi">,</span> <span class="nv">source</span><span class="pi">:</span> <span class="s1">'</span><span class="s">NET_lab_test56'</span><span class="pi">,</span> <span class="nv">destination</span><span class="pi">:</span> <span class="s1">'</span><span class="s">VIP_lab_Test56'</span><span class="pi">,</span> <span class="nv">dport</span><span class="pi">:</span> <span class="s1">'</span><span class="s">123'</span><span class="pi">,</span> <span class="nv">name</span><span class="pi">:</span> <span class="s1">'</span><span class="s">permit_ntp'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">action</span><span class="pi">:</span> <span class="s1">'</span><span class="s">pass'</span><span class="pi">,</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_TEST56'</span><span class="pi">,</span> <span class="nv">ipproto</span><span class="pi">:</span> <span class="s1">'</span><span class="s">inet'</span><span class="pi">,</span> <span class="nv">protocol</span><span class="pi">:</span> <span class="s1">'</span><span class="s">udp'</span><span class="pi">,</span> <span class="nv">source</span><span class="pi">:</span> <span class="s1">'</span><span class="s">NET_lab_test56'</span><span class="pi">,</span> <span class="nv">destination</span><span class="pi">:</span> <span class="s1">'</span><span class="s">grp_NTP_Server'</span><span class="pi">,</span> <span class="nv">dport</span><span class="pi">:</span> <span class="s1">'</span><span class="s">123'</span><span class="pi">,</span> <span class="nv">name</span><span class="pi">:</span> <span class="s1">'</span><span class="s">permit_ntp_grp'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">action</span><span class="pi">:</span> <span class="s1">'</span><span class="s">pass'</span><span class="pi">,</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_TEST56'</span><span class="pi">,</span> <span class="nv">ipproto</span><span class="pi">:</span> <span class="s1">'</span><span class="s">inet'</span><span class="pi">,</span> <span class="nv">protocol</span><span class="pi">:</span> <span class="s1">'</span><span class="s">tcp'</span><span class="pi">,</span> <span class="nv">source</span><span class="pi">:</span> <span class="s1">'</span><span class="s">NET_lab_test56'</span><span class="pi">,</span> <span class="nv">destination</span><span class="pi">:</span> <span class="s1">'</span><span class="s">any'</span><span class="pi">,</span> <span class="nv">dport</span><span class="pi">:</span> <span class="s1">'</span><span class="s">srv_web_tcp'</span><span class="pi">,</span> <span class="nv">name</span><span class="pi">:</span> <span class="s1">'</span><span class="s">permit_http_s'</span> <span class="pi">}</span>


  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">create separator general</span>
    <span class="na">pfsensible.core.pfsense_rule_separator</span><span class="pi">:</span>
      <span class="na">name</span><span class="pi">:</span> <span class="s">General Rules</span>
      <span class="na">color</span><span class="pi">:</span> <span class="s">warning</span>
      <span class="na">interface</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.if</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">after</span><span class="pi">:</span> <span class="s">top</span>
      <span class="na">state</span><span class="pi">:</span> <span class="s">present</span>

    <span class="na">with_items</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_TEST55'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_TEST56'</span> <span class="pi">}</span>

  <span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">create separator network</span>
    <span class="na">pfsensible.core.pfsense_rule_separator</span><span class="pi">:</span>
      <span class="na">name</span><span class="pi">:</span> <span class="s">Network Rules</span>
      <span class="na">color</span><span class="pi">:</span> <span class="s">info</span>
      <span class="na">interface</span><span class="pi">:</span> <span class="s2">"</span><span class="s">{</span><span class="nv"> </span><span class="s">item.if</span><span class="nv"> </span><span class="s">}"</span>
      <span class="na">after</span><span class="pi">:</span> <span class="s">permit_ping</span>
      <span class="na">state</span><span class="pi">:</span> <span class="s">present</span>

    <span class="na">with_items</span><span class="pi">:</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_TEST55'</span> <span class="pi">}</span>
      <span class="pi">-</span> <span class="pi">{</span> <span class="nv">if</span><span class="pi">:</span> <span class="s1">'</span><span class="s">17_LAB_TEST56'</span> <span class="pi">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="pb_pfsense_add_lab_netyml">pb_pfsense_add_lab_net.yml</h3>
<p>Alle Playbooks werden zusammengefasst.</p>

<div class="language-yaml highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="rouge-code"><pre><span class="nn">---</span>
<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">setting vlans</span>
  <span class="na">import_playbook</span><span class="pi">:</span> <span class="s">pb_pfsense_add_vlans.yml</span>

<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">setting ips</span>
  <span class="na">import_playbook</span><span class="pi">:</span> <span class="s">pb_pfsense_add_if.yml</span>

<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">setting alias</span>
  <span class="na">import_playbook</span><span class="pi">:</span> <span class="s">pb_pfsense_add_aliases.yml</span>

<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">setting nat</span>
  <span class="na">import_playbook</span><span class="pi">:</span> <span class="s">pb_pfsense_add_nat.yml</span>

<span class="pi">-</span> <span class="na">name</span><span class="pi">:</span> <span class="s">setting rules</span>
  <span class="na">import_playbook</span><span class="pi">:</span> <span class="s">pb_pfsense_add_rules.yml</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Damit wurde pfSense mittels Ansible konfiguriert.</p>

<blockquote class="prompt-info">
  <p>Leider gibt es derzeit kein Modul um den DHCP-Server zu aktivieren.</p>

  <p>Lediglich statische DHCP-Mappings können per Ansbile eingerichtet werden.</p>
</blockquote>]]></content><author><name>grumpy</name></author><category term="Netzwerk" /><category term="pfSense" /><category term="Redhat" /><category term="netgate" /><category term="ansible" /><category term="pfsense" /><category term="redhat" /><summary type="html"><![CDATA[Ansbile ist aktuell das Tool um Netzwerkequipment automatisch konfigurieren zu lassen. Im aktuellen Beispiel wird eine pfSense mittels Playbooks konfiguriert.]]></summary></entry><entry><title type="html">Automatisierung - Ansible - Installation</title><link href="http://localhost:4000/posts/ansible/" rel="alternate" type="text/html" title="Automatisierung - Ansible - Installation" /><published>2023-03-17T12:23:00+01:00</published><updated>2023-03-17T12:23:00+01:00</updated><id>http://localhost:4000/posts/ansible</id><content type="html" xml:base="http://localhost:4000/posts/ansible/"><![CDATA[<p>Ansbile ist derzeit <em>das</em> Tool im Bereich Netzwerk, um Abläufe zu automatisieren.
Bei den Netzwerkgeräten kommt es auf den jeweiligen Hersteller an, ob dieser
unterstützt wird. Sollte der Drang bestehen, das Netzwerk komplett mit Ansible zu autmatisieren, sollte auf jeden Fall darauf geachtet werden, dass der Hersteller offiziell unter Ansible Galaxy vertreten ist.</p>

<h2 id="ansible-installation">Ansible Installation</h2>
<p>Ansible kann über den Paketmanager des Systems installiert werden, die Version
kann jedoch veraltet sein. Ich installiere Ansbile direkt über Python.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre>heiko@jellyfish:~/virtenv<span class="nv">$ </span>python <span class="nt">-m</span> venv ansi
heiko@jellyfish:~/virtenv<span class="nv">$ </span><span class="nb">cd </span>ansi
heiko@jellyfish:~/virtenv/ansi<span class="nv">$ </span><span class="nb">source </span>bin/activate
<span class="o">(</span>ansi<span class="o">)</span> heiko@jellyfish:~/virtenv/ansi<span class="err">$</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Als weitere Pakete werden pip-review (Updates der Software) und pip_search (Suche
nach Software) installiert.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="o">(</span>ansi<span class="o">)</span> heiko@jellyfish:~/virtenv/ansi<span class="nv">$ </span>pip3 <span class="nb">install </span>pip-review
<span class="o">(</span>ansi<span class="o">)</span> heiko@jellyfish:~/virtenv/ansi<span class="nv">$ </span>pip3 <span class="nb">install </span>pip_search
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Ein <code class="language-plaintext highlighter-rouge">pip_search ansible</code> listet u. a. folgendes Paket auf:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>│ 📂 ansible-core       │ 2.13.5      │ 11-10-2022 │ Radically simple IT automation                   │
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="o">(</span>ansi<span class="o">)</span> heiko@jellyfish:~/virtenv/ansi<span class="nv">$ </span>pip3 <span class="nb">install </span>ansible-core
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Jetzt ist Ansible installiert. Um Zugriff auf entsprechende Geräte zu erlangen, muss per Ansible Galaxy die entsprechende Kollektion heruntergeladen werden. Beispielsweise für Extreme Network:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="rouge-code"><pre><span class="o">(</span>ansi<span class="o">)</span> heiko@jellyfish:~/virtenv/ansi<span class="nv">$ </span>ansible-galaxy collection <span class="nb">install </span>extreme.exos
<span class="o">(</span>ansi<span class="o">)</span> heiko@jellyfish:~/virtenv/ansi<span class="nv">$ </span>ansible-galaxy collection <span class="nb">install </span>community.network

<span class="o">(</span>ansi<span class="o">)</span> heiko@jellyfish:~/virtenv/ansi<span class="nv">$ </span>ansible-galaxy collection list

Collection        Version
<span class="nt">-----------------</span> <span class="nt">-------</span>
ansible.netcommon 3.1.3  
ansible.utils     2.6.1  
community.network 4.0.1  
extreme.exos      0.1.1  
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Damit sind die benötigten Module installiert. Jetzt kann die Umgebung noch aktualisert werden.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="o">(</span>ansi<span class="o">)</span> heiko@jellyfish:~/virtenv/ansi<span class="nv">$ </span>pip-review <span class="nt">-a</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Diese Sammlung wird sich, je nach Anzahl der Hersteller im Netz, noch vergrößern.</p>

<h2 id="verzeichnisstruktur-anlegen">Verzeichnisstruktur anlegen</h2>
<p>Ansible setzt auf Variablen. <code class="language-plaintext highlighter-rouge">group_vars</code> und <code class="language-plaintext highlighter-rouge">host_vars</code> beschreiben Definitionen für die jeweiligen Geräte.  Um alle Geräte mit Variablen auszustatten, kann die Datei <code class="language-plaintext highlighter-rouge">group_vars/all.yml</code> angelegt werden.</p>

<p>Um einzelne Hosts mit Variablen auszustatten wird eine entsprechende Datei unter <code class="language-plaintext highlighter-rouge">host_vars/hostname.yml</code> angelegt.</p>

<p>Das “Arbeitsverzeichnis” von Ansbile benötgt die Datei <code class="language-plaintext highlighter-rouge">ansible.cfg</code>.
Diese sieht in etwa folgendermaßen aus (Beispiel Extreme Networks):</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="rouge-code"><pre>[defaults]
inventory=hosts
retry_files_enabled=False
gathering=explicit
host_key_checking=False
action_warnings=False
deprecation_warnings=False
ansible_user=bigboss
ansible_command_timeout=600
command_timeout=600
ask_pass=True
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Anschließend folgt das Inventory, hier werden sämtliche Gruppen der jeweiligen Geräte eingerichtet. Das Inventory liegt im Regelfall in der <code class="language-plaintext highlighter-rouge">hosts</code> Datei.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre>[edge]
sw01
sw02
sw03
#sw04

[dev]
sw01
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Es gibt die Gruppe <code class="language-plaintext highlighter-rouge">edge</code> und <code class="language-plaintext highlighter-rouge">dev</code>. Wenn <code class="language-plaintext highlighter-rouge">edge</code> jetzt andere Variablen erhalten soll als <code class="language-plaintext highlighter-rouge">dev</code>, wird unter <code class="language-plaintext highlighter-rouge">group_vars</code> die Datei edge.yml angelegt usw.</p>

<p>Ein Auflisten der Gruppen erfolgt mit
<code class="language-plaintext highlighter-rouge">ansible-inventory --graph</code>
und gibt folgendes aus:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre>@all:
  |--@ungrouped:
  |--@edge:
  |  |--sw01
  |  |--sw02
  |  |--sw03
  |--@dev:
  |  |--sw01
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Damit ist Ansbile installiert, grob konfiguriert und kann verwendet werden.</p>

<blockquote class="prompt-info">
  <p>Welche Zugriffsmöglichkeiten verwendet werden müssen, steht in der Ansible Dokumentation der Hersteller. Die meisten Möglichkeiten sind SSH, netconf, ssh mit sudo, APIs usw.</p>
</blockquote>]]></content><author><name>grumpy</name></author><category term="Ansible" /><category term="Redhat" /><category term="Linux" /><category term="ansible" /><category term="linux" /><category term="redhat" /><summary type="html"><![CDATA[Ansbile ist derzeit das Tool im Bereich Netzwerk, um Abläufe zu automatisieren. Bei den Netzwerkgeräten kommt es auf den jeweiligen Hersteller an, ob dieser unterstützt wird. Sollte der Drang bestehen, das Netzwerk komplett mit Ansible zu autmatisieren, sollte auf jeden Fall darauf geachtet werden, dass der Hersteller offiziell unter Ansible Galaxy vertreten ist.]]></summary></entry><entry><title type="html">Multicast Routing mit VyOS</title><link href="http://localhost:4000/posts/vyos-isis-pim/" rel="alternate" type="text/html" title="Multicast Routing mit VyOS" /><published>2023-02-10T13:09:00+01:00</published><updated>2023-02-10T13:09:00+01:00</updated><id>http://localhost:4000/posts/vyos-isis-pim</id><content type="html" xml:base="http://localhost:4000/posts/vyos-isis-pim/"><![CDATA[<p>VyOS ist in der Lage Multicast zu routen. Es wird PIM Sparde Mode, IGMP und IGMP-Proxy unterstützt. Im folgenden Beispiel soll Multicast über den
Rendevouz Point <strong>rp1</strong> gesteuert werden.</p>

<p>Folgende Topologie wird verwendet:</p>

<p><img src="/assets/img/vyos-pim.png" alt="Netzwerkplan" w="500" h="250" /></p>

<h3 id="basics">Basics</h3>
<p>Im ersten Schritt werden die Netzwerkkarten eingerichtet. Alle Router erhalten eine Adresse im Managementnetz, eine Adresse in Richtung Internet und eine “Adresse” für das LAN.</p>

<p><strong><em>mcr1</em></strong></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="rouge-code"><pre>vyos@mcr1# show interfaces
 ethernet eth0 <span class="o">{</span>
     address 172.23.40.11/24
     description <span class="s2">"-&gt; ISP"</span>
     hw-id 00:0c:29:0f:32:0b
 <span class="o">}</span>
 ethernet eth1 <span class="o">{</span>
     address 10.10.10.111/24
     description MGM
     hw-id 00:0c:29:0f:32:15
 <span class="o">}</span>
 ethernet eth2 <span class="o">{</span>
     address 172.23.20.10/24
     description LAN
     hw-id 00:0c:29:0f:32:1f
 <span class="o">}</span>
 loopback lo <span class="o">{</span>
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong><em>mcr2</em></strong></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="rouge-code"><pre>vyos@mcr2# show interfaces
 ethernet eth0 <span class="o">{</span>
     address 172.23.40.12/24
     description <span class="s2">"-&gt; ISP"</span>
     hw-id 00:0c:29:5a:17:8d
 <span class="o">}</span>
 ethernet eth1 <span class="o">{</span>
     address 10.10.10.112/24
     description MGM
     hw-id 00:0c:29:5a:17:97
 <span class="o">}</span>
 ethernet eth2 <span class="o">{</span>
     address 172.23.30.10/24
     description LAN
     hw-id 00:0c:29:5a:17:a1
 <span class="o">}</span>
 loopback lo <span class="o">{</span>
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><strong><em>rp1</em></strong></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="rouge-code"><pre>vyos@rp1# show interfaces
 ethernet eth0 <span class="o">{</span>
     address dhcp
     description Internet
     hw-id 00:0c:29:de:43:d5
 <span class="o">}</span>
 ethernet eth1 <span class="o">{</span>
     address 10.10.10.113/24
     description MGM
     hw-id 00:0c:29:de:43:df
 <span class="o">}</span>
 ethernet eth2 <span class="o">{</span>
     address 172.23.40.100/24
     description Transit
     hw-id 00:0c:29:de:43:e9
 <span class="o">}</span>
 loopback lo <span class="o">{</span>
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="dynamisches-routing-mit-is-is">Dynamisches Routing mit IS-IS</h3>
<p>Die Router sind soweit eingerichtet, allerdings haben <code class="language-plaintext highlighter-rouge">mcr1</code> und <code class="language-plaintext highlighter-rouge">mcr2</code> keinen Zugriff ins Internet. Ferner wird die PIM-RP Adresse noch nicht erreicht.
Damit keine statischen Routen eingerichtet werden müssen, werden die Netze
dynamisch geroutet. Als Protokoll kommt heute IS-IS zum Einsatz.</p>

<p>Der Designierte IS wird rp1. Als net Adresse wird das Schema
<code class="language-plaintext highlighter-rouge">49.Area-ID.Router.Loopback.IP.00</code> verwendet. Zur Authentifizierung wird ein Passwort gesetzt, nicht benötigte Interfaces sind passiv.</p>

<p>Die Router werden als Level-1 eingerichtet, da sie nur Nachbarn in der gleichen Area haben und nur Routinginformationen über diese eine Area benötigen.</p>

<h4 id="konfiguration-rp1">Konfiguration rp1</h4>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>vyos@rp1# show interfaces loopback
 loopback lo <span class="o">{</span>
     address 192.168.100.1/32
     description Loopback
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="rouge-code"><pre>vyos@rp1# sh
 default-information <span class="o">{</span>
     originate <span class="o">{</span>
         ipv4 <span class="o">{</span>
             level-1 <span class="o">{</span>
             <span class="o">}</span>
         <span class="o">}</span>
     <span class="o">}</span>
 <span class="o">}</span>
 interface eth0 <span class="o">{</span>
     passive
 <span class="o">}</span>
 interface eth1 <span class="o">{</span>
     passive
 <span class="o">}</span>
 interface eth2 <span class="o">{</span>
     password <span class="o">{</span>
         plaintext-password 12341234
     <span class="o">}</span>
 <span class="o">}</span>
 interface lo <span class="o">{</span>
     passive
 <span class="o">}</span>
 level level-1
 log-adjacency-changes
 metric-style wide
 net 49.0023.1921.6810.0001.00
</pre></td></tr></tbody></table></code></pre></div></div>

<h4 id="konfiguration-mcr1">Konfiguration mcr1</h4>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>vyos@mcr1# show interfaces loopback
 loopback lo <span class="o">{</span>
     address 192.168.210.1/32
     description Loopback
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="rouge-code"><pre>vyos@mcr1# show protocols isis
 interface eth0 <span class="o">{</span>
     password <span class="o">{</span>
         plaintext-password 12341234
     <span class="o">}</span>
     priority 0
 <span class="o">}</span>
 interface eth1 <span class="o">{</span>
     passive
 <span class="o">}</span>
 interface eth2 <span class="o">{</span>
     passive
 <span class="o">}</span>
 interface lo <span class="o">{</span>
     passive
 <span class="o">}</span>
 level level-1
 log-adjacency-changes
 metric-style wide
 net 49.0023.1921.6821.0001.00
</pre></td></tr></tbody></table></code></pre></div></div>

<h4 id="konfiguration-mcr2">Konfiguration mcr2</h4>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>vyos@mcr2# show interfaces loopback
 loopback lo <span class="o">{</span>
     address 192.168.220.1/32
     description Loopback
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="rouge-code"><pre>vyos@mcr2# show protocols isis
 interface eth0 <span class="o">{</span>
     password <span class="o">{</span>
         plaintext-password 12341234
     <span class="o">}</span>
     priority 0
 <span class="o">}</span>
 interface eth1 <span class="o">{</span>
     passive
 <span class="o">}</span>
 interface eth2 <span class="o">{</span>
     passive
 <span class="o">}</span>
 interface lo <span class="o">{</span>
     passive
 <span class="o">}</span>
 level level-1
 log-adjacency-changes
 metric-style wide
 net 49.0023.1921.6822.0001.00
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Anschließend sollten in der Routingtabelle IS-IS Routen auftauchen.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="rouge-code"><pre>vyos@mcr2# run sh ip route isis
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       &gt; - selected route, * - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

I&gt;* 0.0.0.0/0 [115/10] via 172.23.40.100, eth0, weight 1, 00:01:12
I   10.10.10.0/24 [115/20] via 172.23.40.11, eth0, weight 1, 00:01:12
                           via 172.23.40.100, eth0, weight 1, 00:01:12
I&gt;* 10.23.4.0/23 [115/20] via 172.23.40.100, eth0, weight 1, 00:01:12
I&gt;* 172.23.20.0/24 [115/20] via 172.23.40.11, eth0, weight 1, 00:01:12
I   172.23.40.0/24 [115/20] via 172.23.40.11, eth0 inactive, weight 1, 00:01:12
                            via 172.23.40.100, eth0 inactive, weight 1, 00:01:12
I&gt;* 192.168.100.1/32 [115/20] via 172.23.40.100, eth0, weight 1, 00:01:12
I&gt;* 192.168.210.1/32 [115/20] via 172.23.40.11, eth0, weight 1, 00:01:12
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="multicast-pim-einrichten">Multicast (PIM) einrichten</h3>
<p>Auf allen Interfaces zum und vom RP wird PIM aktiviert. Auf Interfaces, die mit Clients in Kontakt kommen können, wird zusätzlich IGMP aktiviert. Der RP benötigt hier im Beispiel kein IGMP.</p>

<h4 id="konfiguration-mcr1-1">Konfiguration mcr1</h4>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre>vyos@mcr1# show protocols pim
 interface eth0 <span class="o">{</span>
 <span class="o">}</span>
 interface eth2 <span class="o">{</span>
 <span class="o">}</span>
 rp <span class="o">{</span>
     address 192.168.255.1 <span class="o">{</span>
         group 224.0.0.0/4
     <span class="o">}</span>
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>vyos@mcr1# show protocols igmp
 interface eth2 <span class="o">{</span>
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h4 id="konfiguration-mcr2-1">Konfiguration mcr2</h4>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre>vyos@mcr1# show protocols pim
 interface eth0 <span class="o">{</span>
 <span class="o">}</span>
 interface eth2 <span class="o">{</span>
 <span class="o">}</span>
 rp <span class="o">{</span>
     address 192.168.255.1 <span class="o">{</span>
         group 224.0.0.0/4
     <span class="o">}</span>
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>vyos@mcr1# show protocols igmp
 interface eth2 <span class="o">{</span>
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h4 id="konfiguration-rp1-1">Konfiguration rp1</h4>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>vyos@rp1# show interfaces dummy
 dummy dum0 <span class="o">{</span>
     address 192.168.255.1/32
     description <span class="s2">"RP Interface"</span>
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre>vyos@rp1# show protocols pim
 interface dum0 <span class="o">{</span>
 <span class="o">}</span>
 interface eth1 <span class="o">{</span>
 <span class="o">}</span>
 interface eth2 <span class="o">{</span>
 <span class="o">}</span>
 rp <span class="o">{</span>
     address 192.168.255.1 <span class="o">{</span>
         group 224.0.0.0/4
     <span class="o">}</span>
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Die Adresse vom Dummy Interface gelangt nicht automatisch in den Routingprozess, daher wird die IP 192.168.255.1 ins IS-IS redistributiert.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="rouge-code"><pre>vyos@rp1# show policy
 prefix-list dummy-into-isis <span class="o">{</span>
     rule 5 <span class="o">{</span>
         action permit
         prefix 192.168.255.1/32
     <span class="o">}</span>
 <span class="o">}</span>
 route-map dummy-into-isis <span class="o">{</span>
     description <span class="s2">"Multicast Interface into ISIS"</span>
     rule 5 <span class="o">{</span>
         action permit
         match <span class="o">{</span>
             ip <span class="o">{</span>
                 address <span class="o">{</span>
                     prefix-list dummy-into-isis
                 <span class="o">}</span>
             <span class="o">}</span>
         <span class="o">}</span>
     <span class="o">}</span>
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre>vyos@rp1# show protocols isis redistribute
 ipv4 <span class="o">{</span>
     connected <span class="o">{</span>
         level-1 <span class="o">{</span>
             route-map dummy-into-isis
         <span class="o">}</span>
     <span class="o">}</span>
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Jetzt sollte die Adresse in der Routingtabelle von mcr1 und mcr2 auftauchen.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>vyos@mcr1# run show ip route 192.168.255.1
Routing entry <span class="k">for </span>192.168.255.1/32
  Known via <span class="s2">"isis"</span>, distance 115, metric 10, best
  Last update 00:04:20 ago
  <span class="k">*</span> 172.23.40.100, via eth0, weight 1
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="multicast-traffic-erzeugen">Multicast Traffic erzeugen</h3>
<p>Multicast Traffic wird auf zwei debian Systemen über das Tool <em><code class="language-plaintext highlighter-rouge">mcjoin</code></em> erzeugt.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>root@mc01:/opt/mcjoin/bin# ./mcjoin <span class="nt">-s</span> 224.6.7.8
</pre></td></tr></tbody></table></code></pre></div></div>

<p><img src="/assets/img/vyos-mc-01.jpg" alt="Client Traffic" w="600" h="300" /></p>

<p>Der Client taucht auf dem RP auf:</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>yos@rp1:~$ sh ip pim join
 Interface  Address        Source  Group      State  Uptime    Expire  Prune  
 eth2       172.23.40.100  *       224.6.7.8  JOIN   00:01:49  03:10   --:--  
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>vyos@rp1:~$ sh ip pim upstream
 Iif   Source         Group            State      Uptime    JoinTimer  RSTimer   KATimer   RefCnt  
 dum0  *              224.6.7.8        J          00:02:06  00:00:53   --:--:--  --:--:--  1       
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Auf dem zweiten Client wird ebenfalls mcjoin aktiviert.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>root@mc02:/opt/mcjoin/bin# ./mcjoin <span class="nt">-s</span> 225.6.7.8
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Dieser taucht ebenfalls auf dem RP auf.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre>vyos@rp1:~$ sh ip pim join
 Interface  Address        Source  Group      State  Uptime    Expire  Prune  
 eth2       172.23.40.100  *       224.6.7.8  JOIN   00:05:08  02:50   --:--  
 eth2       172.23.40.100  *       225.6.7.8  JOIN   00:00:26  03:03   --:--  
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>vyos@rp1:~$ sh ip pim upstream
 Iif   Source         Group            State      Uptime    JoinTimer  RSTimer   KATimer   RefCnt  
 eth2  172.23.30.128  224.1.2.3        NotJ       00:06:08  00:00:00   --:--:--  00:01:22  1       
 dum0  *              224.6.7.8        J          00:06:28  00:00:31   --:--:--  --:--:--  1       
 dum0  *              225.6.7.8        J          00:01:46  00:00:13   --:--:--  --:--:--  1            
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Damit arbeitet das Multicast Routing.</p>]]></content><author><name>grumpy</name></author><category term="Netzwerk" /><category term="VyOS" /><category term="IS-IS" /><category term="PIM" /><category term="vyos" /><category term="is-is" /><category term="pim" /><category term="multicast" /><summary type="html"><![CDATA[VyOS ist in der Lage Multicast zu routen. Es wird PIM Sparde Mode, IGMP und IGMP-Proxy unterstützt. Im folgenden Beispiel soll Multicast über den Rendevouz Point rp1 gesteuert werden.]]></summary></entry><entry><title type="html">BGP Routing mit Wireguard unter VyOS</title><link href="http://localhost:4000/posts/vyos-bgp-wireguard/" rel="alternate" type="text/html" title="BGP Routing mit Wireguard unter VyOS" /><published>2023-01-30T09:30:00+01:00</published><updated>2023-01-30T09:30:00+01:00</updated><id>http://localhost:4000/posts/vyos-bgp-wireguard</id><content type="html" xml:base="http://localhost:4000/posts/vyos-bgp-wireguard/"><![CDATA[<p>In den letzten Beispielen wurde statische Routen gesetzt, um lokale Netze
zur Verfügung zu stellen. Im folgenden Beispiel kommen sieben Netze hinzu.
Diese werden per BGP announciert werden, dafür wird lediglich eine statische
Route zum Loopback Interface des Nachbarrouters benötigt.</p>

<h4 id="topologie">Topologie</h4>

<p><img src="/assets/img/vyos-bgp-wg.png" alt="Netzwerkplan" w="550" h="250" /></p>

<h2 id="anpassungen-wg-r2">Anpassungen WG-R2</h2>
<p>Das Loopback Interface wird eingerichtet, die statischen Routen werden entfernt.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre><span class="nb">set </span>interfaces loopback lo address 10.2.2.2/32
del protocols static route 10.40.0.0/24
del protocols static route 192.168.0.0/24
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Die 172.16er Netze werden ebenfalls aufs Loopback konfiguriert, das “DMZ”
Interface eth3 wird konfiguriert.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre><span class="nb">set </span>interfaces loopback lo address 172.16.0.1/24
<span class="nb">set </span>interfaces loopback lo address 172.16.1.1/24
<span class="nb">set </span>interfaces loopback lo address 172.16.2.1/24
<span class="nb">set </span>interface eth3 address 10.200.40.10/24
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Die Loopback Interfaces müssen von beiden Routern erreichbar sein, damit die BGP
Session aufgebaut werden kann. Dies wird über eine statische Route realisiert.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="nb">set </span>protocols static route 10.1.1.1/32 interface wg0
<span class="nb">set </span>interfaces wireguard wg0 peer WG-R1 allowed-ips 10.1.1.1/32
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Die Routingtabelle sollte folgendermaßen aussehen:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="rouge-code"><pre>S&gt;* 0.0.0.0/0 [1/0] via 172.23.30.10, eth1, weight 1, 05:34:45
S&gt;* 10.1.1.1/32 [1/0] is directly connected, wg0, weight 1, 00:04:59
C&gt;* 10.2.2.2/32 is directly connected, lo, 00:21:48
C&gt;* 10.10.10.0/24 is directly connected, eth0, 05:34:49
C&gt;* 10.30.0.0/30 is directly connected, wg0, 05:34:46
C&gt;* 10.200.40.0/24 is directly connected, eth3, 02:43:56
C&gt;* 172.16.0.0/24 is directly connected, lo, 00:15:08
C&gt;* 172.16.1.0/24 is directly connected, lo, 00:15:08
C&gt;* 172.16.2.0/24 is directly connected, lo, 00:15:08
C&gt;* 172.23.30.0/24 is directly connected, eth1, 05:34:49
C&gt;* 192.168.1.0/24 is directly connected, eth2, 03:04:09
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="anpassungen-wg-r1">Anpassungen WG-R1</h2>
<p>Das Loopback Interface wird eingerichtet, die statischen Routen werden entfernt.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="nb">set </span>interfaces loopback lo address 10.1.1.1/32
del protocols static route 192.168.1.0/24
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Die 172.17er Netze werden ebenfalls aufs Loopback konfiguriert.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre><span class="nb">set </span>interfaces loopback lo address 172.17.0.1/24
<span class="nb">set </span>interfaces loopback lo address 172.17.1.1/24
<span class="nb">set </span>interfaces loopback lo address 172.17.2.1/24
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Die Loopback Interfaces müssen von beiden Routern erreichbar sein, damit die BGP
Session aufgebaut werden kann. Dies wird über eine statische Route realisiert.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="nb">set </span>protocols static route 10.2.2.2/32 interface wg0
<span class="nb">set </span>interfaces wireguard wg0 peer WG-R1 allowed-ips 10.2.2.2/32
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Beide Loopbacks sollten jetzt pingbar sein, die Routingtabelle sollte folgendermaßen
aussehen:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="rouge-code"><pre>S&gt;* 0.0.0.0/0 [1/0] via 172.23.20.10, eth1, weight 1, 05:32:16
C&gt;* 10.1.1.1/32 is directly connected, lo, 00:05:27
S&gt;* 10.2.2.2/32 [1/0] is directly connected, wg0, weight 1, 00:01:18
C&gt;* 10.10.10.0/24 is directly connected, eth0, 05:32:20
C&gt;* 10.30.0.0/30 is directly connected, wg0, 05:32:17
C&gt;* 10.40.0.0/24 is directly connected, wg1, 04:27:12
C&gt;* 172.17.0.0/24 is directly connected, lo, 00:05:27
C&gt;* 172.17.1.0/24 is directly connected, lo, 00:05:27
C&gt;* 172.17.2.0/24 is directly connected, lo, 00:05:27
C&gt;* 172.23.20.0/24 is directly connected, eth1, 05:32:20
C&gt;* 192.168.0.0/24 is directly connected, eth2, 05:32:20
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="bgp-policies">BGP Policies</h2>
<p>Folgende Policies werden im BGP eingerichtet:</p>
<ul>
  <li>Alle “connected” Netze werden ins BGP redistributiert.</li>
  <li>Ausnahme bildet das Managementnetz 10.10.10.0/24, welches auf eth0 liegt.</li>
  <li>Es wird ein Template “wireguard” erstellen.
    <ul>
      <li>Maximal 10 Routen werden angenommen.</li>
      <li>Es wird das Passwort <em>pass1234</em> verwendet.</li>
      <li>Routen werden über <em>bgp-out</em> exportiert.</li>
      <li>Routen werden über <em>bgp-in</em> importiert.
        <ul>
          <li>Es werden nur Routen mit “erlaubten” Communities angenommen.</li>
          <li>Default Routen werden verworfen.</li>
        </ul>
      </li>
    </ul>
  </li>
</ul>

<h2 id="wg-r2-konfigurieren">WG-R2 konfigurieren</h2>
<h3 id="community-list">Community-List</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre>vyos@wgr2# show policy community-list
 community-list 1 <span class="o">{</span>
     description <span class="s2">"permit AS65100 routing updates"</span>
     rule 1 <span class="o">{</span>
         action permit
         regex 65100:100
     <span class="o">}</span>
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="prefixlists">Prefixlists</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="rouge-code"><pre>vyos@wgr2# show policy prefix-list
 prefix-list connected-into-bgp <span class="o">{</span>
     description <span class="s2">"connected prefixes into bgp"</span>
     rule 5 <span class="o">{</span>
         action permit
         le 24
         prefix 172.16.0.0/16
     <span class="o">}</span>
     rule 10 <span class="o">{</span>
         action permit
         prefix 10.200.40.0/24
     <span class="o">}</span>
     rule 15 <span class="o">{</span>
         action permit
         prefix 192.168.1.0/24
     <span class="o">}</span>
 <span class="o">}</span>
 prefix-list deny-incoming-routes <span class="o">{</span>
     description <span class="s2">"deny default gw"</span>
     rule 5 <span class="o">{</span>
         action deny
         prefix 0.0.0.0/0
     <span class="o">}</span>
     rule 10 <span class="o">{</span>
         action permit
         le 32
         prefix 0.0.0.0/0
     <span class="o">}</span>
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="route-maps">Route-Maps</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
</pre></td><td class="rouge-code"><pre>vyos@wgr2# show policy route-map
 route-map bgp-in <span class="o">{</span>
     description <span class="s2">"BGP incoming"</span>
     rule 10 <span class="o">{</span>
         action permit
         match <span class="o">{</span>
             community <span class="o">{</span>
                 community-list 1
             <span class="o">}</span>
             ip <span class="o">{</span>
                 address <span class="o">{</span>
                     prefix-list deny-incoming-routes
                 <span class="o">}</span>
             <span class="o">}</span>
         <span class="o">}</span>
     <span class="o">}</span>
 <span class="o">}</span>
 route-map bgp-out <span class="o">{</span>
     description <span class="s2">"BGP outgoing"</span>
     rule 10 <span class="o">{</span>
         action permit
         match <span class="o">{</span>
             ip <span class="o">{</span>
                 address <span class="o">{</span>
                     prefix-list connected-into-bgp
                 <span class="o">}</span>
             <span class="o">}</span>
         <span class="o">}</span>
         <span class="nb">set</span> <span class="o">{</span>
             community <span class="o">{</span>
                 replace 65200:100
             <span class="o">}</span>
         <span class="o">}</span>
     <span class="o">}</span>
 <span class="o">}</span>
 route-map connected-into-bgp <span class="o">{</span>
     description <span class="s2">"connected into bgp"</span>
     rule 5 <span class="o">{</span>
         action permit
         match <span class="o">{</span>
             ip <span class="o">{</span>
                 address <span class="o">{</span>
                     prefix-list connected-into-bgp
                 <span class="o">}</span>
             <span class="o">}</span>
         <span class="o">}</span>
     <span class="o">}</span>
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="bgp">BGP</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
</pre></td><td class="rouge-code"><pre>vyos@wgr2# sh protocols bgp
 address-family <span class="o">{</span>
     ipv4-unicast <span class="o">{</span>
         redistribute <span class="o">{</span>
             connected <span class="o">{</span>
                 route-map connected-into-bgp
             <span class="o">}</span>
         <span class="o">}</span>
     <span class="o">}</span>
 <span class="o">}</span>
 neighbor 10.1.1.1 <span class="o">{</span>
     peer-group wireguard
     remote-as 65100
 <span class="o">}</span>
 parameters <span class="o">{</span>
     router-id 10.2.2.2
 <span class="o">}</span>
 peer-group wireguard <span class="o">{</span>
     address-family <span class="o">{</span>
         ipv4-unicast <span class="o">{</span>
             maximum-prefix 10
             route-map <span class="o">{</span>
                 <span class="nb">export </span>bgp-out
                 import bgp-in
             <span class="o">}</span>
             soft-reconfiguration <span class="o">{</span>
                 inbound
             <span class="o">}</span>
         <span class="o">}</span>
     <span class="o">}</span>
     description <span class="s2">"Wireguard Routers BGP"</span>
     disable-connected-check
     password pass1234
     update-source lo
 <span class="o">}</span>
 system-as 65200
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="wg-r1-konfigurieren">WG-R1 konfigurieren</h2>
<h3 id="community-list-1">Community-List</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre>vyos@wgr1# show policy community-list
 community-list 1 <span class="o">{</span>
     description <span class="s2">"permit AS65200 routing updates"</span>
     rule 1 <span class="o">{</span>
         action permit
         regex 65200:100
     <span class="o">}</span>
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="prefixlists-1">Prefixlists</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="rouge-code"><pre>vyos@wgr1# show policy prefix-list
 prefix-list connected-into-bgp <span class="o">{</span>
     description <span class="s2">"connected prefixes into bgp"</span>
     rule 5 <span class="o">{</span>
         action permit
         le 24
         prefix 172.17.0.0/16
     <span class="o">}</span>
     rule 10 <span class="o">{</span>
         action permit
         prefix 192.168.0.0/24
     <span class="o">}</span>
     rule 15 <span class="o">{</span>
         action permit
         prefix 10.40.0.0/24
     <span class="o">}</span>
 <span class="o">}</span>
 prefix-list deny-incoming-routes <span class="o">{</span>
     description <span class="s2">"filter incoming routes"</span>
     rule 5 <span class="o">{</span>
         action deny
         prefix 0.0.0.0/0
     <span class="o">}</span>
     rule 10 <span class="o">{</span>
         action permit
         le 32
         prefix 0.0.0.0/0
     <span class="o">}</span>
 <span class="o">}</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="route-maps-1">Route-Maps</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
</pre></td><td class="rouge-code"><pre>vyos@wgr1# sh policy route-map
 route-map bgp-in <span class="o">{</span>
     description <span class="s2">"BGP incoming"</span>
     rule 10 <span class="o">{</span>
         action permit
         match <span class="o">{</span>
             community <span class="o">{</span>
                 community-list 1
             <span class="o">}</span>
             ip <span class="o">{</span>
                 address <span class="o">{</span>
                     prefix-list deny-incoming-routes
                 <span class="o">}</span>
             <span class="o">}</span>
         <span class="o">}</span>
     <span class="o">}</span>
 <span class="o">}</span>
 route-map bgp-out <span class="o">{</span>
     description <span class="s2">"BGP outgoing"</span>
     rule 10 <span class="o">{</span>
         action permit
         match <span class="o">{</span>
             ip <span class="o">{</span>
                 address <span class="o">{</span>
                     prefix-list connected-into-bgp
                 <span class="o">}</span>
             <span class="o">}</span>
         <span class="o">}</span>
         <span class="nb">set</span> <span class="o">{</span>
             community <span class="o">{</span>
                 replace 65100:100
             <span class="o">}</span>
         <span class="o">}</span>
     <span class="o">}</span>
 <span class="o">}</span>
 route-map connected-into-bgp <span class="o">{</span>
     description <span class="s2">"connected into bgp"</span>
     rule 5 <span class="o">{</span>
         action permit
         match <span class="o">{</span>
             ip <span class="o">{</span>
                 address <span class="o">{</span>
                     prefix-list connected-into-bgp
                 <span class="o">}</span>
             <span class="o">}</span>
         <span class="o">}</span>
     <span class="o">}</span>
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="bgp-1">BGP</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
</pre></td><td class="rouge-code"><pre>vyos@wgr1# sh protocols bgp
 address-family <span class="o">{</span>
     ipv4-unicast <span class="o">{</span>
         redistribute <span class="o">{</span>
             connected <span class="o">{</span>
                 route-map connected-into-bgp
             <span class="o">}</span>
         <span class="o">}</span>
     <span class="o">}</span>
 <span class="o">}</span>
 neighbor 10.2.2.2 <span class="o">{</span>
     peer-group wireguard
     remote-as 65200
 <span class="o">}</span>
 parameters <span class="o">{</span>
     router-id 10.1.1.1
 <span class="o">}</span>
 peer-group wireguard <span class="o">{</span>
     address-family <span class="o">{</span>
         ipv4-unicast <span class="o">{</span>
             maximum-prefix 10
             route-map <span class="o">{</span>
                 <span class="nb">export </span>bgp-out
                 import bgp-in
             <span class="o">}</span>
             soft-reconfiguration <span class="o">{</span>
                 inbound
             <span class="o">}</span>
         <span class="o">}</span>
     <span class="o">}</span>
     description <span class="s2">"Wireguard Routers BGP"</span>
     disable-connected-check
     password pass1234
     update-source lo
 <span class="o">}</span>
 system-as 65100
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="netze-im-vpn-freischalten">Netze im VPN freischalten</h2>
<p>Alle Netze müssen im Site-2-Site Tunnel noch freigeschaltet werden.</p>

<h3 id="wg-r1">WG-R1</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="rouge-code"><pre>vyos@wgr1# show interfaces wireguard wg0
 address 10.30.0.1/30
 description VPN-&gt;WG-R2
 mtu 1420
 peer WG-R2 <span class="o">{</span>
     address 172.23.30.11
     allowed-ips 10.30.0.0/30
     allowed-ips 192.168.1.0/24
     allowed-ips 10.200.40.0/24
     allowed-ips 172.16.0.0/16
     allowed-ips 10.2.2.2/32
     port 51820
     public-key DOEIvmBXgMOY3va+xCo9ag4F0pzTOC5VsfwuSbESvVM<span class="o">=</span>
 <span class="o">}</span>
 port 51820
 private-key 4IyNUD+pduTl4cdL1EKVs44Cdx3HtdxCFPeomXod2HM<span class="o">=</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="wg-r2">WG-R2</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="rouge-code"><pre>vyos@wgr2# show interfaces wireguard wg0
 address 10.30.0.2/30
 description VPN-&gt;WG-R1
 mtu 1420
 peer WG-R1 <span class="o">{</span>
     address 172.23.20.11
     allowed-ips 10.30.0.0/30
     allowed-ips 172.16.0.0/16
     allowed-ips 10.40.0.0/24
     allowed-ips 192.168.0.0/24
     allowed-ips 10.1.1.1/32
     port 51820
     public-key Pz2oyw2876hk5+dOOqwWoN4bFsM9ThR20efHbgqAg1c<span class="o">=</span>
 <span class="o">}</span>
 port 51820
 private-key SOfyUcADKHg/aVBCv7WFJjfDzaIGFRWMSm+TDwNvTGc<span class="o">=</span>      
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Anschließend sollte der Zugriff auf alle Netze funktionieren.</p>

<h2 id="show-befehle">Show Befehle</h2>
<p>Die Routingtabellen sollten in etwa wie folgt aussehen:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre>vyos@wgr2:~<span class="nv">$ </span>sh ip bgp summary

IPv4 Unicast Summary <span class="o">(</span>VRF default<span class="o">)</span>:
BGP router identifier 10.2.2.2, <span class="nb">local </span>AS number 65200 vrf-id 0
BGP table version 52
RIB entries 19, using 3648 bytes of memory
Peers 1, using 724 KiB of memory
Peer <span class="nb">groups </span>1, using 64 bytes of memory

Neighbor        V         AS   MsgRcvd   MsgSent   TblVer  InQ OutQ  Up/Down State/PfxRcd   PfxSnt Desc
10.1.1.1        4      65100       252       257        0    0    0 02:45:35            5        5 N/A

Total number of neighbors 1
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre>vyos@wgr2:~$ sh ip bgp

  Network          Next Hop            Metric LocPrf Weight Path
*&gt; 10.40.0.0/24     10.1.1.1                 0             0 65100 ?
*&gt; 10.200.40.0/24   0.0.0.0                  0         32768 ?
*&gt; 172.16.0.0/24    0.0.0.0                  0         32768 ?
*&gt; 172.16.1.0/24    0.0.0.0                  0         32768 ?
*&gt; 172.16.2.0/24    0.0.0.0                  0         32768 ?
*&gt; 172.17.0.0/24    10.1.1.1                 0             0 65100 ?
*&gt; 172.17.1.0/24    10.1.1.1                 0             0 65100 ?
*&gt; 172.17.2.0/24    10.1.1.1                 0             0 65100 ?
*&gt; 192.168.0.0/24   10.1.1.1                 0             0 65100 ?
*&gt; 192.168.1.0/24   0.0.0.0                  0         32768 ?
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="rouge-code"><pre>vyos@wgr2:~<span class="nv">$ </span>sh ip route
Codes: K - kernel route, C - connected, S - static, R - RIP,
       O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
       T - Table, v - VNC, V - VNC-Direct, A - Babel, F - PBR,
       f - OpenFabric,
       <span class="o">&gt;</span> - selected route, <span class="k">*</span> - FIB route, q - queued, r - rejected, b - backup
       t - trapped, o - offload failure

S&gt;<span class="k">*</span> 0.0.0.0/0 <span class="o">[</span>1/0] via 172.23.30.10, eth1, weight 1, 03:43:29
S&gt;<span class="k">*</span> 10.1.1.1/32 <span class="o">[</span>1/0] is directly connected, wg0, weight 1, 03:43:29
C&gt;<span class="k">*</span> 10.2.2.2/32 is directly connected, lo, 03:43:32
C&gt;<span class="k">*</span> 10.10.10.0/24 is directly connected, eth0, 03:43:31
C&gt;<span class="k">*</span> 10.30.0.0/30 is directly connected, wg0, 03:43:29
B&gt;  10.40.0.0/24 <span class="o">[</span>20/0] via 10.1.1.1 <span class="o">(</span>recursive<span class="o">)</span>, weight 1, 02:40:11
  <span class="k">*</span>                       via 10.1.1.1, wg0 onlink, weight 1, 02:40:11
C&gt;<span class="k">*</span> 10.200.40.0/24 is directly connected, eth3, 03:43:31
C&gt;<span class="k">*</span> 172.16.0.0/24 is directly connected, lo, 03:43:32
C&gt;<span class="k">*</span> 172.16.1.0/24 is directly connected, lo, 03:43:32
C&gt;<span class="k">*</span> 172.16.2.0/24 is directly connected, lo, 03:43:32
B&gt;  172.17.0.0/24 <span class="o">[</span>20/0] via 10.1.1.1 <span class="o">(</span>recursive<span class="o">)</span>, weight 1, 02:46:11
  <span class="k">*</span>                        via 10.1.1.1, wg0 onlink, weight 1, 02:46:11
B&gt;  172.17.1.0/24 <span class="o">[</span>20/0] via 10.1.1.1 <span class="o">(</span>recursive<span class="o">)</span>, weight 1, 02:46:11
  <span class="k">*</span>                        via 10.1.1.1, wg0 onlink, weight 1, 02:46:11
B&gt;  172.17.2.0/24 <span class="o">[</span>20/0] via 10.1.1.1 <span class="o">(</span>recursive<span class="o">)</span>, weight 1, 02:46:11
  <span class="k">*</span>                        via 10.1.1.1, wg0 onlink, weight 1, 02:46:11
C&gt;<span class="k">*</span> 172.23.30.0/24 is directly connected, eth1, 03:43:31
B&gt;  192.168.0.0/24 <span class="o">[</span>20/0] via 10.1.1.1 <span class="o">(</span>recursive<span class="o">)</span>, weight 1, 02:46:11
  <span class="k">*</span>                         via 10.1.1.1, wg0 onlink, weight 1, 02:46:11
C&gt;<span class="k">*</span> 192.168.1.0/24 is directly connected, eth2, 03:43:31
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="zugriff-vom-client">Zugriff vom Client</h2>
<p>Der Zugriff aus dem VPN Pool sollte ebenfalls funktionieren.</p>

<p>Ein Trace wird folgendes ausgeben:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>client1:~# traceroute 10.200.40.100
traceroute to 10.200.40.100 <span class="o">(</span>10.200.40.100<span class="o">)</span>, 30 hops max, 46 byte packets
 1  10.40.0.1 <span class="o">(</span>10.40.0.1<span class="o">)</span>  1.504 ms  1.890 ms  1.108 ms
 2  10.30.0.2 <span class="o">(</span>10.30.0.2<span class="o">)</span>  3.753 ms  3.686 ms  2.536 ms
 3  10.200.40.100 <span class="o">(</span>10.200.40.100<span class="o">)</span>  3.284 ms  4.484 ms  3.351 ms
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Zugriff auf den Webserver funktioniert ebenfalls:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>client1:~# curl 10.200.40.100
&lt;html&gt;&lt;body&gt;&lt;h1&gt;It works!&lt;/h1&gt;&lt;/body&gt;&lt;/html&gt;
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Damit ist die BGP Einrichtung abgeschlossen.</p>]]></content><author><name>grumpy</name></author><category term="Netzwerk" /><category term="VyOS" /><category term="VPN" /><category term="BGP" /><category term="vyos" /><category term="wireguard" /><category term="vpn" /><category term="bgp" /><summary type="html"><![CDATA[In den letzten Beispielen wurde statische Routen gesetzt, um lokale Netze zur Verfügung zu stellen. Im folgenden Beispiel kommen sieben Netze hinzu. Diese werden per BGP announciert werden, dafür wird lediglich eine statische Route zum Loopback Interface des Nachbarrouters benötigt.]]></summary></entry><entry><title type="html">Remote Access mit Wireguard unter VyOS</title><link href="http://localhost:4000/posts/vyos-rac-wireguard/" rel="alternate" type="text/html" title="Remote Access mit Wireguard unter VyOS" /><published>2023-01-30T08:50:00+01:00</published><updated>2023-01-30T08:50:00+01:00</updated><id>http://localhost:4000/posts/vyos-rac-wireguard</id><content type="html" xml:base="http://localhost:4000/posts/vyos-rac-wireguard/"><![CDATA[<p>Wireguard ist eine Software zum Aufbau von verschlüsselten Verbindungen.
Die Software ist ab Linux Kernel 5.6 direkt im Kern eingebaut und erlaubt
somit höhere Verarbeitungsgeschwindigkeiten im Vergleich zu IPSec oder OpenVPN.</p>

<p>VyOS Router sind in der Lage, Remote Access VPN über das Wireguard Protokoll zu
ermöglichen. Im folgenden Beispiel wird die Topologie vom <a href="../vyos-s2s-wireguard/">Site-2-Site</a> Tunnel erweitert.</p>

<h4 id="topologie">Topologie</h4>

<p><img src="/assets/img/vyos-rac-wg.png" alt="Netzwerkplan" w="550" h="250" /></p>

<h3 id="erweiterung-der-konfiguration-von-wg-r1">Erweiterung der Konfiguration von WG-R1</h3>
<p>Auf WG-R1 wird das Interface <em>wg1</em> für Remote-Access eingerichtet, der Wireguard
Dienst läuft auf Port 2224.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="rouge-code"><pre>vyos@wgr1# run generate pki wireguard key-pair <span class="nb">install </span>interface wg1

vyos@wgr1# show interfaces wireguard wg1
 address 10.40.0.1/24
 description Remote-VPN
 mtu 1420
 peer RemoteVPN <span class="o">{</span>
     allowed-ips 0.0.0.0/32
     persistent-keepalive 15
     public-key NVWMpPecjOMhczxXOj9+bEiPfgvBBx9b9FRgaRNWf3M<span class="o">=</span>
 <span class="o">}</span>
 port 2224
 private-key 2BL+aYPsxkf89lOnDhJqIhAh/qjhS1I98jn6oyFwkFw<span class="o">=</span>

</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="client-konfiguration-erstellen">Client Konfiguration erstellen</h3>
<p>Mittels folgenden Befehl werden Konfigurationen sowohl für Router als auch für den
Client erstellt:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>generate wireguard client-config remote1 interface wg1 server 172.23.20.11 address 10.40.0.2/24
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="rouge-code"><pre>WireGuard client configuration <span class="k">for </span>interface: wg1

To <span class="nb">enable </span>this configuration on a VyOS router you can use the following commands:

<span class="o">===</span> VyOS <span class="o">(</span>server<span class="o">)</span> configurtation <span class="o">===</span>

<span class="nb">set </span>interfaces wireguard wg1 peer remote1 allowed-ips <span class="s1">'10.40.0.2/32'</span>
<span class="nb">set </span>interfaces wireguard wg1 peer remote1 public-key <span class="s1">'hF0DUTJd71U8dBn5RiF1RW8LsnH5oHZGbUR+pnmWvXo='</span>

<span class="o">===</span> RoadWarrior <span class="o">(</span>client<span class="o">)</span> configuration <span class="o">===</span>


<span class="o">[</span>Interface]
PrivateKey <span class="o">=</span> AC+077T2NP4iJMKzDp70NlOdQzfGIBOBRv2sWt4fW3c<span class="o">=</span>
Address <span class="o">=</span> 10.40.0.2/32
DNS <span class="o">=</span> 1.1.1.1

<span class="o">[</span>Peer]
PublicKey <span class="o">=</span> NVWMpPecjOMhczxXOj9+bEiPfgvBBx9b9FRgaRNWf3M<span class="o">=</span>
Endpoint <span class="o">=</span> 172.23.20.11:2224
AllowedIPs <span class="o">=</span> 0.0.0.0/0, ::/0
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Beide set Befehle müssen auf dem Router noch ausgeführt werden.</p>

<p>Anschließend kann die Konfiguration des Routers bereinigt werden:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>delete interfaces wireguard wg1 peer RemoteVPN
</pre></td></tr></tbody></table></code></pre></div></div>
<p>Diese wurde nur zum initialisieren auf wg1 benötigt.</p>

<p>Die finale Konfiguration sieht folgendermaßen aus:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="rouge-code"><pre>yos@wgr1# show interfaces wireguard wg1
 address 10.40.0.1/24
 description Remote-VPN
 mtu 1420
 peer remote1 <span class="o">{</span>
     allowed-ips 10.40.0.2/32
     persistent-keepalive 15
     public-key hF0DUTJd71U8dBn5RiF1RW8LsnH5oHZGbUR+pnmWvXo<span class="o">=</span>
 <span class="o">}</span>
 port 2224
 private-key 2BL+aYPsxkf89lOnDhJqIhAh/qjhS1I98jn6oyFwkFw<span class="o">=</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="linux-client-anpassen">Linux Client anpassen</h3>
<p>Zum Test wird ein Rechner mit Alpine Linux verwendet.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>apk add wireguard-tools
modprobe wireguard
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="nb">cd</span> /etc/wireguard
</pre></td></tr></tbody></table></code></pre></div></div>

<pre>vi wg0.conf</pre>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre><span class="o">[</span>Interface]
PrivateKey <span class="o">=</span> AC+077T2NP4iJMKzDp70NlOdQzfGIBOBRv2sWt4fW3c<span class="o">=</span>
Address <span class="o">=</span> 10.40.0.2/32
DNS <span class="o">=</span> 1.1.1.1

<span class="o">[</span>Peer]
PublicKey <span class="o">=</span> NVWMpPecjOMhczxXOj9+bEiPfgvBBx9b9FRgaRNWf3M<span class="o">=</span>
Endpoint <span class="o">=</span> 172.23.20.11:2224
AllowedIPs <span class="o">=</span> 0.0.0.0/0, ::/0

</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>wg-quick up wg0
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Der sollte sich der Client eingewählt haben. Jetzt sollte noch der Zugriff auf das LAN
hinter dem zweiten Router WG-R2 ermöglicht werden.</p>

<h3 id="erweiterung-der-konfiguration-von-wg-r2">Erweiterung der Konfiguration von WG-R2</h3>
<p>Der VPN-Pool muss in den erlaubten IPs des Peers eingetragen werden.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="nb">set </span>interfaces wireguard wg0 peer WG-R1 allowed-ips 10.40.0.0/24
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Die Route muss statisch nachgetragen werden.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="nb">set </span>protocols static route 10.40.0.0/24 interface wg0
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Damit kann WG-R2 den Client pingen.</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>yos@wgr2# run ping 10.40.0.2
PING 10.40.0.2 <span class="o">(</span>10.40.0.2<span class="o">)</span> 56<span class="o">(</span>84<span class="o">)</span> bytes of data.
64 bytes from 10.40.0.2: <span class="nv">icmp_seq</span><span class="o">=</span>1 <span class="nv">ttl</span><span class="o">=</span>63 <span class="nb">time</span><span class="o">=</span>2.25 ms
64 bytes from 10.40.0.2: <span class="nv">icmp_seq</span><span class="o">=</span>2 <span class="nv">ttl</span><span class="o">=</span>63 <span class="nb">time</span><span class="o">=</span>3.58 ms
64 bytes from 10.40.0.2: <span class="nv">icmp_seq</span><span class="o">=</span>3 <span class="nv">ttl</span><span class="o">=</span>63 <span class="nb">time</span><span class="o">=</span>3.52 ms
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Die Konfiguration ist somit abgeschlossen.</p>]]></content><author><name>grumpy</name></author><category term="Netzwerk" /><category term="VyOS" /><category term="VPN" /><category term="vyos" /><category term="wireguard" /><category term="vpn" /><summary type="html"><![CDATA[Wireguard ist eine Software zum Aufbau von verschlüsselten Verbindungen. Die Software ist ab Linux Kernel 5.6 direkt im Kern eingebaut und erlaubt somit höhere Verarbeitungsgeschwindigkeiten im Vergleich zu IPSec oder OpenVPN.]]></summary></entry><entry><title type="html">Site-2-Site Tunnel mit Wireguard unter VyOS</title><link href="http://localhost:4000/posts/vyos-s2s-wireguard/" rel="alternate" type="text/html" title="Site-2-Site Tunnel mit Wireguard unter VyOS" /><published>2023-01-29T08:33:00+01:00</published><updated>2023-01-29T08:33:00+01:00</updated><id>http://localhost:4000/posts/vyos-s2s-wireguard</id><content type="html" xml:base="http://localhost:4000/posts/vyos-s2s-wireguard/"><![CDATA[<p>Wireguard ist eine Software zum Aufbau von verschlüsselten Verbindungen.
Die Software ist ab Linux Kernel 5.6 direkt im Kern eingebaut und erlaubt
somit höhere Verarbeitungsgeschwindigkeiten im Vergleich zu IPSec oder OpenVPN.</p>

<p>VyOS Router sind ebenfalls in der Lage, Wireguard Verbindungen aufzubauen.
Im folgenden Beispiel soll ein Site-2-Site Tunnel aufgebaut werden.</p>

<h4 id="topologie">Topologie</h4>

<p><img src="/assets/img/vyos-s2s-wg.png" alt="Netzwerkplan" w="500" h="300" /></p>

<h2 id="basis-konfigurationen">Basis Konfigurationen</h2>
<h3 id="wg-router-1">WG Router 1</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="rouge-code"><pre>vyos@wgr1# show interfaces
 ethernet eth1 <span class="o">{</span>
     address 172.23.20.11/24
     description Uplink-&gt;ISP
     hw-id 00:0c:29:47:22:3d
 <span class="o">}</span>
 ethernet eth2 <span class="o">{</span>
     address 192.168.0.10/24
     description LAN
     hw-id 00:0c:29:47:22:47
 <span class="o">}</span>
 loopback lo <span class="o">{</span>
 <span class="o">}</span>

 vyos@wgr1# sh protocols
 static <span class="o">{</span>
     route 0.0.0.0/0 <span class="o">{</span>
         next-hop 172.23.20.10 <span class="o">{</span>
         <span class="o">}</span>
     <span class="o">}</span>
 <span class="o">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="wg-router-2">WG Router 2</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="rouge-code"><pre>vyos@wgr2# show interfaces
 ethernet eth1 {
     address 172.23.30.11/24
     description Uplink-&gt;ISP
     hw-id 00:0c:29:40:be:74
 }
 ethernet eth2 {
     address 192.168.1.10/24
     description LAN
     hw-id 00:0c:29:40:be:7e
 }
 loopback lo {
 }

 vyos@wgr2# sh protocols
 static {
     route 0.0.0.0/0 {
         next-hop 172.23.30.10 {
         }
     }
 }
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="isp-router">ISP Router</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
</pre></td><td class="rouge-code"><pre>vyos@ISP# show interfaces
 ethernet eth0 {
     address dhcp
     description Uplink-&gt;Internet
     hw-id 00:0c:29:e2:1c:9b
 }
 ethernet eth1 {
     address 172.23.20.10/24
     description "--&gt; WGR1"
     hw-id 00:0c:29:e2:1c:a5
 }
 ethernet eth2 {
     address 172.23.30.10/24
     description "--&gt; WGR2"
     hw-id 00:0c:29:e2:1c:af
 }
 loopback lo {
 }

 vyos@ISP# sh nat
 source {
     rule 998 {
         description "NAT WG R2"
         outbound-interface eth0
         source {
             address 172.23.30.0/24
         }
         translation {
             address masquerade
         }
     }
     rule 999 {
         description "NAT WG R1"
         outbound-interface eth0
         source {
             address 172.23.20.0/24
         }
         translation {
             address masquerade
         }
     }
 }
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="wireguard-konfiguration">Wireguard Konfiguration</h2>
<p>Es müssen Schlüsselpaare erstellt werden.</p>

<h3 id="wg-router-1--2">WG Router 1 &amp; 2</h3>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>vyos@wgr1:~$ generate pki wireguard key-pair
Private key: 4IyNUD+pduTl4cdL1EKVs44Cdx3HtdxCFPeomXod2HM=
Public key: Pz2oyw2876hk5+dOOqwWoN4bFsM9ThR20efHbgqAg1c=
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>vyos@wgr2:~$ generate pki wireguard key-pair
Private key: WD67y3hWSGBDq4doe8399Sb48R6DHMZFgiSXHNhOrFU=
Public key: +Dz6G2VezJ9aGXFOVOsbl/ZU7HjaPe+Ej7CpAIjWX14=
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Alle Schlüsselpaare sollten gesichert werden.</p>

<p>Jetzt werden beide Router als Wireguard Peer konfiguriert, verwendet wird das
Interface <em>wg0</em>.</p>

<h3 id="wg-router-1-1">WG Router 1</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre>vyos@wgr1# show interfaces wireguard wg0
 address 10.30.0.1/30
 description VPN-&gt;WG-R2
 mtu 1420
 peer WG-R2 <span class="o">{</span>
     address 172.23.30.11
     allowed-ips 192.168.1.0/24
     allowed-ips 10.30.0.0/30
     port 51820
     public-key DOEIvmBXgMOY3va+xCo9ag4F0pzTOC5VsfwuSbESvVM<span class="o">=</span>
 <span class="o">}</span>
 port 51820
 private-key 4IyNUD+pduTl4cdL1EKVs44Cdx3HtdxCFPeomXod2HM<span class="o">=</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="wg-router-2-1">WG Router 2</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="rouge-code"><pre>vyos@wgr2# show interfaces wireguard wg0
 address 10.30.0.2/30
 description VPN-&gt;WG-R1
 mtu 1420
 peer WG-R1 <span class="o">{</span>
     address 172.23.20.11
     allowed-ips 192.168.0.0/24
     allowed-ips 10.30.0.0/30
     port 51820
     public-key Pz2oyw2876hk5+dOOqwWoN4bFsM9ThR20efHbgqAg1c<span class="o">=</span>
 <span class="o">}</span>
 port 51820
 private-key SOfyUcADKHg/aVBCv7WFJjfDzaIGFRWMSm+TDwNvTGc<span class="o">=</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Damit beide internen Netze erreichbar sind, wird eine statische Route gesetzt.</p>

<h3 id="wg-router-1-2">WG Router 1</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="nb">set </span>protocols static route 192.168.1.0/24 interface wg0
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="wg-router-2-2">WG Router 2</h3>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="nb">set </span>protocols static route 192.168.0.0/24 interface wg0
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Damit sollte der Tunnel online sein.</p>

<h2 id="show-befehle">Show Befehle</h2>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre>vyos@wgr1:~<span class="nv">$ </span>show interfaces wireguard

Codes: S - State, L - Link, u - Up, D - Down, A - Admin Down
Interface        IP Address                        S/L  Description
<span class="nt">---------</span>        <span class="nt">----------</span>                        <span class="nt">---</span>  <span class="nt">-----------</span>
wg0              10.30.0.1/30                      u/u  VPN-&gt;WG-R2
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre>vyos@wgr1:~<span class="nv">$ </span>show interfaces wireguard wg0 summary

interface: wg0
  public key: Pz2oyw2876hk5+dOOqwWoN4bFsM9ThR20efHbgqAg1c<span class="o">=</span>
  private key: <span class="o">(</span>hidden<span class="o">)</span>
  listening port: 51820

peer: DOEIvmBXgMOY3va+xCo9ag4F0pzTOC5VsfwuSbESvVM<span class="o">=</span>
  endpoint: 172.23.30.11:51820
  allowed ips: 192.168.1.0/24
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Ein ping sollte jetzt die interne Router IP von WG-R2 erreichen.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
</pre></td><td class="rouge-code"><pre>vyos@wgr1:~<span class="nv">$ </span>ping 192.168.1.10
PING 192.168.1.10 <span class="o">(</span>192.168.1.10<span class="o">)</span> 56<span class="o">(</span>84<span class="o">)</span> bytes of data.
64 bytes from 192.168.1.10: <span class="nv">icmp_seq</span><span class="o">=</span>1 <span class="nv">ttl</span><span class="o">=</span>64 <span class="nb">time</span><span class="o">=</span>1.11 ms
64 bytes from 192.168.1.10: <span class="nv">icmp_seq</span><span class="o">=</span>2 <span class="nv">ttl</span><span class="o">=</span>64 <span class="nb">time</span><span class="o">=</span>2.37 ms
64 bytes from 192.168.1.10: <span class="nv">icmp_seq</span><span class="o">=</span>3 <span class="nv">ttl</span><span class="o">=</span>64 <span class="nb">time</span><span class="o">=</span>9.97 ms
64 bytes from 192.168.1.10: <span class="nv">icmp_seq</span><span class="o">=</span>4 <span class="nv">ttl</span><span class="o">=</span>64 <span class="nb">time</span><span class="o">=</span>2.18 ms
^C
<span class="nt">---</span> 192.168.1.10 ping statistics <span class="nt">---</span>
4 packets transmitted, 4 received, 0% packet loss, <span class="nb">time </span>3007ms
</pre></td></tr></tbody></table></code></pre></div></div>
<p>Damit ist die Konfiguration abgeschlossen.</p>]]></content><author><name>grumpy</name></author><category term="Netzwerk" /><category term="VyOS" /><category term="VPN" /><category term="vyos" /><category term="wireguard" /><category term="vpn" /><summary type="html"><![CDATA[Wireguard ist eine Software zum Aufbau von verschlüsselten Verbindungen. Die Software ist ab Linux Kernel 5.6 direkt im Kern eingebaut und erlaubt somit höhere Verarbeitungsgeschwindigkeiten im Vergleich zu IPSec oder OpenVPN.]]></summary></entry><entry><title type="html">Cloud im Eigenbau - Übersicht</title><link href="http://localhost:4000/posts/cloud-toc/" rel="alternate" type="text/html" title="Cloud im Eigenbau - Übersicht" /><published>2022-08-26T10:51:00+02:00</published><updated>2022-08-26T10:51:00+02:00</updated><id>http://localhost:4000/posts/cloud-toc</id><content type="html" xml:base="http://localhost:4000/posts/cloud-toc/"><![CDATA[<p>Nextcloud kann auf einer einzelnen Platine installiert werden, in der Hoffnung, dass immer alles funktioniert, oder man investiert viel Zeit und baut einen HA-Cluster mit Nextcloud. Dies ist entsprechend aufwendig, mehrere Dinge sind hierbei zu beachten:</p>

<p>Datenbanken,
Storage für User,
Webserver,
Nextcloud Applikation,
Session Caching,
Container für Apps.</p>

<p>Folgende Topologie wird exemplarisch eingerichtet:</p>

<p><img src="/assets/img/na-ha-topo.png" alt="Netzwerkplan" w="600" h="300" /></p>

<p>Diese Topologie ist nicht gehärtet, alle Zugriffe erfolgen mittels root, es sind keine Einschränkungen durch Firewalls eingerichtet. Diese Topologie sollte nicht produktiv betrieben werden. Die einzelnen Beispielinstallationen können unten angeklickt werden.</p>

<ul>
  <li><a href="../cloud-clusterctl/">DB Clustercontroller</a></li>
  <li><a href="../cloud-dblayer/">DB Datenbank Layer</a></li>
  <li><a href="../cloud-dbloadb/">DB Loadbalancer</a></li>
  <li><a href="../cloud-redis/">Redis Session Caching</a></li>
  <li><a href="../cloud-webserver/">Webserver</a></li>
  <li><a href="../cloud-container/">Container Apps</a></li>
</ul>]]></content><author><name>grumpy</name></author><category term="Linux" /><category term="Container" /><category term="Oracle" /><category term="linux" /><category term="nextcloud" /><category term="cloud" /><summary type="html"><![CDATA[Nextcloud kann auf einer einzelnen Platine installiert werden, in der Hoffnung, dass immer alles funktioniert, oder man investiert viel Zeit und baut einen HA-Cluster mit Nextcloud. Dies ist entsprechend aufwendig, mehrere Dinge sind hierbei zu beachten:]]></summary></entry><entry><title type="html">Cloud im Eigenbau - Container</title><link href="http://localhost:4000/posts/cloud-container/" rel="alternate" type="text/html" title="Cloud im Eigenbau - Container" /><published>2022-08-26T10:50:00+02:00</published><updated>2022-08-26T10:50:00+02:00</updated><id>http://localhost:4000/posts/cloud-container</id><content type="html" xml:base="http://localhost:4000/posts/cloud-container/"><![CDATA[<p>Damit einige Dienste nicht doch plötzlich extern kommunizieren, müssen diese zusätzlich als Container betrieben werden. Im Beispiel kommen zwei Oracle Linux 8.6 Systeme zum Einsatz. Für den Betrieb wird docker verwendet. Die Systeme sind platt und nicht weiter konfiguriert.</p>

<h2 id="onlyoffice">OnlyOffice</h2>

<p>OnlyOffice ermöglicht das gemeinsame Bearbeiten von Officedokumenten. Der Container wird folgendermaßen installiert:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>/usr/bin/docker run <span class="nt">-i</span> <span class="nt">-t</span> <span class="nt">-d</span> <span class="nt">-p</span> 127.0.0.1:9981:80 <span class="nt">-v</span> onlyoffice-fonts:/usr/share/fonts <span class="nt">--restart</span><span class="o">=</span>always <span class="nt">--name</span><span class="o">=</span>office onlyoffice/documentserver
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Um den Dienst zu nutzen muss dieser mittels Reverseproxy verfügbar gemacht werden. </p>

<h2 id="drawio">DrawIO</h2>

<p>DrawIO ermöglicht das Zeichen von diversen Diagrammen und Ablaufplänen. Damit keine Verbindung zu den Servern von DrawIO stattfindet, muss ein eigener Container betrieben werden. Der Container wird per</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>/usr/bin/docker run <span class="nt">-i</span> <span class="nt">-t</span> <span class="nt">-d</span> <span class="nt">-p</span> 127.0.0.1:8080:8080 <span class="nt">--restart</span><span class="o">=</span>always <span class="nt">--name</span><span class="o">=</span>draw fjudith/draw.io
</pre></td></tr></tbody></table></code></pre></div></div>

<p>installiert. Um den Dienst zu nutzen muss dieser mittels Reverseproxy verfügbar gemacht werden. </p>

<h2 id="imaginary">Imaginary</h2>

<p>Imaginary soll das Rendern von Vorschaubildern beschleunigen. Dieser Container wird per</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>/usr/bin/docker run <span class="nt">-i</span> <span class="nt">-t</span> <span class="nt">-d</span> <span class="nt">-p</span> 9000:9000 <span class="nt">--restart</span><span class="o">=</span>always <span class="nt">--name</span><span class="o">=</span>image h2non/imaginary <span class="nt">-p</span> 9000 <span class="nt">-enable-url-source</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>installiert. Der Dienst läuft auf Port 9000/tcp. Um den Dienst einzubinden wird die config.php um folgende Einträge erweitert:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre>'enabledPreviewProviders' =&gt; [
'OC\Preview\MP3',
'OC\Preview\TXT',
'OC\Preview\MarkDown',
'OC\Preview\OpenDocument',
'OC\Preview\Krita',
'OC\Preview\Imaginary',
],

'preview_imaginary_url' =&gt; 'http://10.10.10.11:9000',
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Die IP stammt von einem Loadbalancer, da die Docker Container redundant ausgelegt sind.</p>]]></content><author><name>grumpy</name></author><category term="Linux" /><category term="Container" /><category term="Oracle" /><category term="linux" /><category term="nextcloud" /><category term="cloud" /><category term="docker" /><summary type="html"><![CDATA[Damit einige Dienste nicht doch plötzlich extern kommunizieren, müssen diese zusätzlich als Container betrieben werden. Im Beispiel kommen zwei Oracle Linux 8.6 Systeme zum Einsatz. Für den Betrieb wird docker verwendet. Die Systeme sind platt und nicht weiter konfiguriert.]]></summary></entry><entry><title type="html">Cloud im Eigenbau – Webserver</title><link href="http://localhost:4000/posts/cloud-webserver/" rel="alternate" type="text/html" title="Cloud im Eigenbau – Webserver" /><published>2022-07-22T14:49:00+02:00</published><updated>2022-07-22T14:49:00+02:00</updated><id>http://localhost:4000/posts/cloud-webserver</id><content type="html" xml:base="http://localhost:4000/posts/cloud-webserver/"><![CDATA[<p>Im Beispiel werden zwei Webserver eingerichtet. Die Systeme arbeiten als active/passive Cluster. Als Webserver kommt Apache mit PHP zum Einsatz, installiert unter Oracle Linux 8.6. Die Daten werden über DRBD synchron gehalten, die Dienste werden über Pacemaker gesteuert.</p>

<p>Folgende Topologie wird eingerichtet:</p>

<p><img src="/assets/img/nc-ha-web-layer.png" alt="Netzwerkplan" w="400" h="200" /></p>

<h2 id="festplatten-einbinden">Festplatten einbinden</h2>

<p>Die Userdaten liegen auf einer DRBD Partition. Es wird das Verzeichnis <code class="language-plaintext highlighter-rouge">/cloudstore</code> erstellt. </p>

<p>Das Device <code class="language-plaintext highlighter-rouge">/dev/sda</code> wird per LVM vorbereitet und der Volumegruppe ol hinzugefügt.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre>fdisk /dev/sda
n p 1 &lt;enter&gt; &lt;enter&gt; t 8e w
pvcreate /dev/sda1
vgextend ol /dev/sda1
lvcreate <span class="nt">-n</span> cloud <span class="nt">-l</span> +100%FREE ol
<span class="nb">mkdir</span> /cloudstore
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Dies muss auf beiden Nodes ausgeführt werden.</p>

<h2 id="drbd-installieren">DRBD installieren</h2>

<p>Das Oracle 8 Epel Repo muss aktiviert werden.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>dnf <span class="nb">install </span>oracle-epel-release-el8
dnf <span class="nb">install </span>drbd drbd-bash-completion
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="drbd-einrichten">DRBD einrichten</h2>

<p>Folgende Dateien werden angepasst.</p>

<p><code class="language-plaintext highlighter-rouge">/etc/drbd.d/global_common.conf</code></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
</pre></td><td class="rouge-code"><pre>global {
usage-count no;

}

common {
       handlers {

       }

       startup {
       }

       options {

       }

       disk {
       }

       net {
       }
}
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Jetzt wird für den Cloudspeicher das Device <code class="language-plaintext highlighter-rouge">/dev/drbd0</code> eingerichtet.</p>

<p><code class="language-plaintext highlighter-rouge">/etc/drbd.d/cloud.res</code></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="rouge-code"><pre>resource cloud {
        protocol C;
        device /dev/drbd0;
        disk /dev/ol/cloud;
        meta-disk internal;
        handlers {
                split-brain "/usr/lib/drbd/notify-split-brain.sh root";
        }

        net {
        allow-two-primaries;
        cram-hmac-alg sha1;
        shared-secret "xxx";
        }

        syncer {
        rate 100M;
        verify-alg sha1;
        }

        on nc1.decon230.org {
        address 172.23.245.51:7789;
        }

        on nc2.decon230.org {
        address 172.23.245.52:7789;
        }
}
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Wichtig: DNS muss funktionieren, sollte dies nicht der Fall sein, muss die <code class="language-plaintext highlighter-rouge">/etc/hosts</code> angepasst werden. Die DRBD-Nodes müssen mit der Bezeichnung von <code class="language-plaintext highlighter-rouge">uname -a</code> eingetragen werden, andernfalls werden keine DRBD-Devices erstellt.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>drbdadm create-md cloud
initializing activity log
initializing bitmap <span class="o">(</span>320 KB<span class="o">)</span> to all zero
Writing meta data...
New drbd meta data block successfully created.
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Dies wird auf beiden Nodes durchgeführt.</p>

<p>Auf der primary &amp; secondary Node wird folgendes ausgeführt:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>systemctl start drbd
drbdadm up cloud
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Auf der primary Node </p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>drbdadm primary cloud <span class="nt">--force</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>ausführen.</p>

<p>Jetzt kann mit <code class="language-plaintext highlighter-rouge">cat /proc/drbd</code> der Status der Synchronisation geprüft werden.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre>version: 8.4.11 <span class="o">(</span>api:1/proto:86-101<span class="o">)</span>
srcversion: FC3433D849E3B88C1E7B55C
0: cs:SyncSource ro:Primary/Secondary ds:UpToDate/Inconsistent C r-----
ns:1312392 nr:0 dw:0 dr:1315928 al:8 bm:0 lo:0 pe:1 ua:2 ap:0 ep:1 wo:f oos:9169564
<span class="o">[=&gt;</span>..................] <span class="nb">sync </span>ed: 12.6% <span class="o">(</span>8952/10232<span class="o">)</span>M
finish: 0:04:06 speed: 37,168 <span class="o">(</span>37,476<span class="o">)</span> K/sec
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Alternativ: <code class="language-plaintext highlighter-rouge">watch -n1 'cat /proc/drbd'</code>.</p>

<p>Ein <code class="language-plaintext highlighter-rouge">drbdmadm status</code> muss folgendes ausgeben:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre>cloud role:Primary
disk:UpToDate
peer role:Secondary
replication:Established peer-disk:UpToDate
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Jetzt kann <code class="language-plaintext highlighter-rouge">/dev/drbd0</code> formatiert werden.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>mkfs <span class="nt">-t</span> ext4 /dev/drbd0
mount /dev/drbd0 /cloudstore/
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Jetzt können Daten auf das Device kopiert werden. Anschließend wird das Device ausgehangen, <code class="language-plaintext highlighter-rouge">drbdadm secondary cloud</code> auf Node 1 ausgeführt, <code class="language-plaintext highlighter-rouge">drbdadm primary cloud; mount /dev/drbd0 /cloudstore</code> auf Node 2 ausführen. Die Daten sollten jetzt auf Node 2 zu sehen sein.</p>

<p>Die Schritte werden jetzt für die Inhalte des Webservers wiederholt, für das Device <code class="language-plaintext highlighter-rouge">/dev/drbd1</code>. Dieses basiert auf <code class="language-plaintext highlighter-rouge">/dev/sdb</code>, welches als LVM www erstellt wird.</p>

<p><code class="language-plaintext highlighter-rouge">/etc/drbd.d/web.res</code></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="rouge-code"><pre>resource web {
        protocol C;
        device /dev/drbd1;
        disk /dev/ol/www;
        meta-disk internal;
        handlers {
                split-brain "/usr/lib/drbd/notify-split-brain.sh root";
        }

        net {
        allow-two-primaries;
        cram-hmac-alg sha1;
        shared-secret "xxx";
        }

        syncer {
        rate 100M;
        verify-alg sha1;
        }

        on nc1.decon230.org {
        address 172.23.245.51:7790;
        }

        on nc2.decon230.org {
        address 172.23.245.52:7790;
        }
}
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="cluster-konfigurieren">Cluster konfigurieren</h2>

<p>Damit DRBD einen automatischen Failover durchführt, wird Pacemaker als Clustersoftware installiert.</p>

<h3 id="installation--aktivierung-des-clusters">Installation &amp; Aktivierung des Clusters</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
</pre></td><td class="rouge-code"><pre>dnf <span class="nb">install </span>pacemaker pcs corosync drbd-pacemaker

systemctl <span class="nb">enable</span> <span class="nt">--now</span> pcsd.service

usermod <span class="nt">-s</span> /bin/bash hacluster

<span class="nb">mkdir</span> /home/hacluster

passwd hacluster
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Jetzt kann der Cluster initialisiert werden, die Schritte müssen nur auf einem Server ausgeführt werden.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="rouge-code"><pre><span class="o">[</span>root@nc1 ~]# pcs host auth nc1
Username: hacluster
Password:
nc1: Authorized

<span class="o">[</span>root@nc1 ~]# pcs host auth nc2
Username: hacluster
Password:
nc2: Authorized

<span class="o">[</span>root@nc1 ~]# pcs cluster setup cloud nc1 <span class="nv">addr</span><span class="o">=</span>172.23.241.51 nc2 <span class="nv">addr</span><span class="o">=</span>172.23.241.52

Destroying cluster on hosts: <span class="s1">'nc1'</span>, <span class="s1">'nc2'</span>...
nc1: Successfully destroyed cluster
nc2: Successfully destroyed cluster
Requesting remove <span class="s1">'pcsd settings'</span> from <span class="s1">'nc1'</span>, <span class="s1">'nc2'</span>
nc1: successful removal of the file <span class="s1">'pcsd settings'</span>
nc2: successful removal of the file <span class="s1">'pcsd settings'</span>
Sending <span class="s1">'corosync authkey'</span>, <span class="s1">'pacemaker authkey'</span> to <span class="s1">'nc1'</span>, <span class="s1">'nc2'</span>
nc1: successful distribution of the file <span class="s1">'corosync authkey'</span>
nc1: successful distribution of the file <span class="s1">'pacemaker authkey'</span>
nc2: successful distribution of the file <span class="s1">'corosync authkey'</span>
nc2: successful distribution of the file <span class="s1">'pacemaker authkey'</span>
Sending <span class="s1">'corosync.conf'</span> to <span class="s1">'nc1'</span>, <span class="s1">'nc2'</span>
nc1: successful distribution of the file <span class="s1">'corosync.conf'</span>
nc2: successful distribution of the file <span class="s1">'corosync.conf'</span>
Cluster has been successfully <span class="nb">set </span>up.

<span class="o">[</span>root@nc1 ~]# pcs cluster start <span class="nt">--all</span>
nc1: Starting Cluster...
nc2: Starting Cluster...

<span class="o">[</span>root@nc1 ~]# pcs cluster <span class="nb">enable</span> <span class="nt">--all</span>
nc1: Cluster Enabled
nc2: Cluster Enabled

pcs property <span class="nb">set </span>stonith-enabled<span class="o">=</span><span class="nb">false
</span>pcs property <span class="nb">set </span>no-quorum-policy<span class="o">=</span>ignore
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Damit ist der Clusterdienst eingerichtet.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="rouge-code"><pre><span class="o">[</span>root@nc1 ~]# pcs status
Cluster name: cloud
Cluster Summary:
<span class="k">*</span> Stack: corosync
<span class="k">*</span> Current DC: nc2 <span class="o">(</span>version 2.1.2-4.0.1.el8_6.2-ada5c3b36e2<span class="o">)</span> - partition with quorum
<span class="k">*</span> Last updated: Wed Jul 13 12:08:29 2022
<span class="k">*</span> Last change: Wed Jul 13 12:06:55 2022 by root via cibadmin on nc1
<span class="k">*</span> 2 nodes configured
<span class="k">*</span> 0 resource instances configured

Node List:
<span class="k">*</span> Online: <span class="o">[</span> nc1 nc2 <span class="o">]</span>

Full List of Resources:
<span class="k">*</span> No resources

Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="services-einrichten">Services einrichten</h2>
<h3 id="virtuelle-ip">virtuelle IP</h3>

<p>Die Services werden über die IP 172.23.241.50 erreichbar gemacht.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="o">[</span>root@nc1 ~]# pcs resource create VIP ocf:heartbeat:IPaddr2 <span class="nv">ip</span><span class="o">=</span>172.23.241.50 <span class="se">\</span>
 <span class="nv">cidr_netmask</span><span class="o">=</span>24 op monitor <span class="nv">interval</span><span class="o">=</span>30s

<span class="o">[</span>root@nc1 ~]# pcs resource
<span class="k">*</span> VIP <span class="o">(</span>ocf::heartbeat:IPaddr2<span class="o">)</span>: Started nc1
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="drbd">DRBD</h3>

<p>Beim Dateisystem müssen Abhängigkeiten und Startreihenfolgen beachtet werden. Da diese Konfiguration komplex ist, wird sie im ersten Schritt in eine Konfigurationsdatei geschrieben, anschließend in den Cluster geladen.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="rouge-code"><pre>[root@nc1 ~]# pcs cluster cib cluster.cfg

pcs -f cluster.cfg resource create clouddata ocf:linbit:drbd drbd_resource=cloud \
op monitor interval=30s

pcs -f cluster.cfg resource promotable clouddata clone_clouddata master-max=1 \
 master-node-max=1 clone-max=2 clone-node-max=1 notify=true

pcs -f cluster.cfg resource create fs_clouddata ocf:heartbeat:Filesystem \
device="/dev/drbd0" directory="/cloudstore" fstype="ext4"

pcs -f cluster.cfg constraint colocation add clone_clouddata with VIP INFINITY

pcs -f cluster.cfg constraint order VIP then clone_clouddata

pcs -f cluster.cfg constraint colocation add fs_clouddata with \
clone_clouddata INFINITY

pcs -f cluster.cfg constraint order promote clone_clouddata \
then start fs_clouddata

[root@nc1 ~]# pcs -f cluster.cfg resource status
* VIP (ocf::heartbeat:IPaddr2): Started nc1
* Clone Set: clone_clouddata [clouddata] (promotable):
* Stopped: [ nc1 nc2 ]
* fs_clouddata (ocf::heartbeat:Filesystem): Stopped

[root@nc1 ~]# pcs cluster cib-push cluster.cfg
CIB updated
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Jetzt sollte die Partition <code class="language-plaintext highlighter-rouge">/cloudstore</code> gemountet sein.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
</pre></td><td class="rouge-code"><pre><span class="o">[</span>root@nc1 ~]# mount | <span class="nb">grep</span> <span class="nt">-i</span> cloud
/dev/drbd0 on /cloudstore <span class="nb">type </span>ext4 <span class="o">(</span>rw,relatime<span class="o">)</span>

<span class="o">[</span>root@nc1 ~]# pcs status
Cluster name: cloud
Cluster Summary:
<span class="k">*</span> Stack: corosync
<span class="k">*</span> Current DC: nc1 <span class="o">(</span>version 2.1.2-4.0.1.el8_6.2-ada5c3b36e2<span class="o">)</span> - partition with quorum
<span class="k">*</span> Last updated: Wed Jul 13 13:44:37 2022
<span class="k">*</span> Last change: Wed Jul 13 13:32:35 2022 by root via cibadmin on nc1
<span class="k">*</span> 2 nodes configured
<span class="k">*</span> 4 resource instances configured

Node List:
<span class="k">*</span> Online: <span class="o">[</span> nc1 nc2 <span class="o">]</span>

Full List of Resources:
<span class="k">*</span> VIP <span class="o">(</span>ocf::heartbeat:IPaddr2<span class="o">)</span>: Started nc1
<span class="k">*</span> Clone Set: clone_clouddata <span class="o">[</span>clouddata] <span class="o">(</span>promotable<span class="o">)</span>:
<span class="k">*</span> Masters: <span class="o">[</span> nc1 <span class="o">]</span>
<span class="k">*</span> Stopped: <span class="o">[</span> nc2 <span class="o">]</span>
<span class="k">*</span> fs_clouddata <span class="o">(</span>ocf::heartbeat:Filesystem<span class="o">)</span>: Started nc1

Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Jetzt muss die Partition für den Webserver eingerichtet werden.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="rouge-code"><pre>pcs cluster cib apache.cfg

pcs <span class="nt">-f</span> apache.cfg resource create webdata ocf:linbit:drbd <span class="nv">drbd_resource</span><span class="o">=</span>web op monitor <span class="nv">interval</span><span class="o">=</span>30s

pcs <span class="nt">-f</span> apache.cfg resource promotable webdata clone_webdata master-ax<span class="o">=</span>1 master-node-max<span class="o">=</span>1 clone-max<span class="o">=</span>2 clone-node-max<span class="o">=</span>1 <span class="nv">notify</span><span class="o">=</span><span class="nb">true

</span>pcs <span class="nt">-f</span> apache.cfg resource create fs_webdata ocf:heartbeat:Filesystem <span class="nv">device</span><span class="o">=</span><span class="s2">"/dev/drbd1"</span> <span class="nv">directory</span><span class="o">=</span><span class="s2">"/var/www"</span> <span class="nv">fstype</span><span class="o">=</span><span class="s2">"ext4"</span>

pcs <span class="nt">-f</span> apache.cfg constraint colocation add clone_webdata with VIP INFINITY

pcs <span class="nt">-f</span> apache.cfg constraint order VIP <span class="k">then </span>clone_webdata

pcs <span class="nt">-f</span> apache.cfg constraint colocation add fs_webdata with clone_webdata INFINITY

pcs <span class="nt">-f</span> apache.cfg constraint order promote clone_webdata <span class="k">then </span>start fs_webdata

pcs <span class="nt">-f</span> apache.cfg resource status

pcs cluster cib-push apache.cfg
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Damit ist die Partition <code class="language-plaintext highlighter-rouge">/var/www</code> gemountet und einsatzbereit.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="o">[</span>root@nc1 ~]# mount | <span class="nb">grep</span> <span class="nt">-i</span> www
/dev/drbd1 on /var/www <span class="nb">type </span>ext4 <span class="o">(</span>rw,relatime<span class="o">)</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h3 id="apache">Apache </h3>

<p>Für den Webserver muss ebenfalls eine Ressource erstellt werden, vorher muss dieser jedoch erstmal installiert werden.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>dnf <span class="nb">install </span>oracle-epel-release-el8 <span class="nt">-y</span>
dnf <span class="nb">install </span>httpd mod_qos mod_ssl <span class="nt">-y</span>
<span class="nb">cd</span> /var/www
<span class="nb">chown </span>apache:apache /html
<span class="nb">chmod </span>750 /html
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Sollte mod_reqtime beim Apache in Verwendung sein, muss dieses Modul deaktiviert werden, andernfalls kommt es zu php_fcgid Fehlern.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre>vi /etc/httpd/conf.d/status.conf
&lt;Location /server-status&gt;
    SetHandler server-status
    Require <span class="nb">local</span>
&lt;/Location&gt;
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Jetzt muss die Clusterressource erstellt werden.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="rouge-code"><pre>pcs cluster cib httpd.cfg

pcs <span class="nt">-f</span> httpd.cfg resource create httpd ocf:heartbeat:apache <span class="nv">configfile</span><span class="o">=</span>/etc/httpd/conf/httpd.conf <span class="nv">statusurl</span><span class="o">=</span>http://127.0.0.1/server-status

pcs <span class="nt">-f</span> httpd.cfg constraint colocation add httpd with VIP INFINITY

pcs <span class="nt">-f</span> httpd.cfg constraint order fs_webdata <span class="k">then </span>start httpd

pcs <span class="nt">-f</span> httpd.cfg constraint order VIP <span class="k">then </span>httpd

pcs cluster cib-push httpd.cfg
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Anschließend sollte Apache starten.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="rouge-code"><pre><span class="o">[</span>root@nc1 ~]# pcs status
Cluster name: cloud
Cluster Summary:
<span class="k">*</span> Stack: corosync
<span class="k">*</span> Current DC: nc1 <span class="o">(</span>version 2.1.2-4.0.1.el8_6.2-ada5c3b36e2<span class="o">)</span> - partition with quorum
<span class="k">*</span> Last updated: Wed Jul 13 14:51:47 2022
<span class="k">*</span> Last change: Wed Jul 13 14:50:47 2022 by root via cibadmin on nc1
<span class="k">*</span> 2 nodes configured
<span class="k">*</span> 8 resource instances configured

Node List:
<span class="k">*</span> Online: <span class="o">[</span> nc1 nc2 <span class="o">]</span>

Full List of Resources:
<span class="k">*</span> VIP <span class="o">(</span>ocf::heartbeat:IPaddr2<span class="o">)</span>: Started nc1
<span class="k">*</span> Clone Set: clone_clouddata <span class="o">[</span>clouddata] <span class="o">(</span>promotable<span class="o">)</span>:
<span class="k">*</span> Masters: <span class="o">[</span> nc1 <span class="o">]</span>
<span class="k">*</span> Stopped: <span class="o">[</span> nc2 <span class="o">]</span>
<span class="k">*</span> fs_clouddata <span class="o">(</span>ocf::heartbeat:Filesystem<span class="o">)</span>: Started nc1
<span class="k">*</span> Clone Set: clone_webdata <span class="o">[</span>webdata] <span class="o">(</span>promotable<span class="o">)</span>:
<span class="k">*</span> Masters: <span class="o">[</span> nc1 <span class="o">]</span>
<span class="k">*</span> Stopped: <span class="o">[</span> nc2 <span class="o">]</span>
<span class="k">*</span> fs_webdata <span class="o">(</span>ocf::heartbeat:Filesystem<span class="o">)</span>: Started nc1
<span class="k">*</span> httpd <span class="o">(</span>ocf::heartbeat:apache<span class="o">)</span>: Started nc1

Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Der Webserverprozess wird somit erst aktiviert, nachdem DRBD /dev/drbd1 nach /var/www gemountet hat. Diese Reihenfolge ist wichtig, anderfalls wird Apache nicht starten. </p>

<p>Durch Pacemaker kann apachectl nicht mehr verwendet werden, daher muss der Prozess mit pcs resource restart httpd gesteuert werden.</p>

<h3 id="php">PHP</h3>

<p>Als Skriptsprache wird PHP 8.0.x verwendet. PHP wird folgendermaßen installiert:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="rouge-code"><pre>dnf <span class="nb">install </span>https://rpms.remirepo.net/enterprise/remi-release-8.rpm
dnf module reset php <span class="nt">-y</span>
dnf module <span class="nb">enable </span>php:remi-8.0

dnf <span class="nb">install</span> <span class="nt">-y</span> php php-cli php-common php-pdo php-fpm php-mbstring php-opcache php-sodium php-xml <span class="se">\</span>
php-mbstring php-intl php-pecl-zip php-pecl-apcu php-gmp php-bcmath php-ldap php-pecl-xmlrpc <span class="se">\</span>
php-process php-soap php-tidy php-pecl-imagick php-mysqlnd php-pear php-fedora-autoloader <span class="se">\</span>
php-pecl-redis5 php-pecl-igbinary php-pecl-msgpack php-pecl-mcrypt php-gd
/etc/php.ini anpassen:
output_buffering <span class="o">=</span> Off
max_execution_time <span class="o">=</span> 300
max_input_time <span class="o">=</span> 300
memory_limit <span class="o">=</span> 4096M
post_max_size <span class="o">=</span> 1024M
upload_max_filesize <span class="o">=</span> 1024M
max_file_uploads <span class="o">=</span> 100
file_uploads <span class="o">=</span> On
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Jetzt kann mittels systemctl restart php-fpm der Prozess gestartet werden, der Webserver sollte jetzt PHP-Skripte ausführen. PHP-FPM wird ebenfalls über Pacemaker gesteuert und nach dem Webserverprozess gestartet.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="rouge-code"><pre>pcs cluster cib phpfpm.cfg

pcs <span class="nt">-f</span> phpfpm.cfg resource create phpfpm systemd:php-fpm

pcs <span class="nt">-f</span> phpfpm.cfg constraint colocation add phpfpm with VIP INFINITY

pcs <span class="nt">-f</span> phpfpm.cfg constraint order httpd <span class="k">then </span>start phpfpm

pcs <span class="nt">-f</span> phpfpm.cfg constraint order VIP <span class="k">then </span>phpfpm

pcs cluster cib-push phpfpm.cfg
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Der Clusterstatus sollte jetzt so aussehen:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="rouge-code"><pre><span class="o">[</span>root@nc1 ~]# pcs status
Cluster name: cloud
Cluster Summary:
<span class="k">*</span> Stack: corosync
<span class="k">*</span> Current DC: nc1 <span class="o">(</span>version 2.1.2-4.0.1.el8_6.2-ada5c3b36e2<span class="o">)</span> - partition with quorum
<span class="k">*</span> Last updated: Fri Jul 15 17:28:39 2022
<span class="k">*</span> Last change: Fri Jul 15 12:18:49 2022 by root via cibadmin on nc1
<span class="k">*</span> 2 nodes configured
<span class="k">*</span> 9 resource instances configured

Node List:
<span class="k">*</span> Online: <span class="o">[</span> nc1 nc2 <span class="o">]</span>

Full List of Resources:
<span class="k">*</span> VIP <span class="o">(</span>ocf::heartbeat:IPaddr2<span class="o">)</span>: Started nc1
<span class="k">*</span> Clone Set: clone_clouddata <span class="o">[</span>clouddata] <span class="o">(</span>promotable<span class="o">)</span>:
<span class="k">*</span> Masters: <span class="o">[</span> nc1 <span class="o">]</span>
<span class="k">*</span> Stopped: <span class="o">[</span> nc2 <span class="o">]</span>
<span class="k">*</span> fs_clouddata <span class="o">(</span>ocf::heartbeat:Filesystem<span class="o">)</span>: Started nc1
<span class="k">*</span> Clone Set: clone_webdata <span class="o">[</span>webdata] <span class="o">(</span>promotable<span class="o">)</span>:
<span class="k">*</span> Masters: <span class="o">[</span> nc1 <span class="o">]</span>
<span class="k">*</span> Stopped: <span class="o">[</span> nc2 <span class="o">]</span>
<span class="k">*</span> fs_webdata <span class="o">(</span>ocf::heartbeat:Filesystem<span class="o">)</span>: Started nc1
<span class="k">*</span> httpd <span class="o">(</span>ocf::heartbeat:apache<span class="o">)</span>: Started nc1
<span class="k">*</span> phpfpm <span class="o">(</span>systemd:php-fpm<span class="o">)</span>: Started nc1

Daemon Status:
corosync: active/enabled
pacemaker: active/enabled
pcsd: active/enabled
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Somit sind Dateisystem, Webserver und Cluster installiert und (grob) konfiguriert.</p>

<h2 id="nextcloud-installieren">Nextcloud installieren</h2>

<p>Nextcloud herunterladen, entpacken und in die Webserverroot kopieren.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
</pre></td><td class="rouge-code"><pre>wget https://download.nextcloud.com/server/releases/latest.zip
unzip latest.zip
<span class="nb">cp</span> <span class="nt">-rv</span> nextcloud/<span class="k">*</span> /var/www/html
<span class="nb">cd</span> /var/www/html
<span class="nb">chown</span> <span class="nt">-R</span> apache:apache <span class="k">*</span>
find <span class="nb">.</span> <span class="nt">-type</span> f <span class="nt">-print0</span> | xargs <span class="nt">-0</span> <span class="nb">chmod </span>640
find <span class="nb">.</span> <span class="nt">-type</span> d <span class="nt">-print0</span> | xargs <span class="nt">-0</span> <span class="nb">chmod </span>750
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Das setzen der Rechte sollte, im Gegensatz zu GFS, schnell erledigt sein.</p>

<p>Anschließend wird https://172.23.241.50 aufgerufen (virtuelle IP des Webservercluster) und die Installation gestartet.</p>

<p>Wichtig: bei der Datenbankverbindung wird die virtuelle IP des DB-Loadbalancers eingetragen und Port 3307. Hier ist der HAProxyd gebunden.</p>

<p><img src="/assets/img/ncinst-01.png" alt="Netzwerkplan" w="250" h="400" /></p>

<p>Nach der Installation kann sich eingeloggt werden. Es tauchen diverse Fehler im Backend auf. </p>

<h2 id="nextcloud-konfigurieren">Nextcloud konfigurieren</h2>

<p>Die <code class="language-plaintext highlighter-rouge">config.php</code> muss um alle Webnodes erweitert werden.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
</pre></td><td class="rouge-code"><pre>'trusted_domains' =&gt;

array (

0 =&gt; 'nc1.decon230.org',
1 =&gt; 'nc2.decon230.org',
2 =&gt; 'nc.decon230.org',

),
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Ein lokaler Cache muss angeben werden.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>'memcache.local' =&gt; '\OC\Memcache\APCu',
</pre></td></tr></tbody></table></code></pre></div></div>
<p>Anschließend kann der Fehler </p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>An unhandled exception has been thrown:
OCP\HintException: [0]: Memcache \OC\Memcache\APCu not available for local cache
(Is the matching PHP module installed and enabled?)
</pre></td></tr></tbody></table></code></pre></div></div>

<p>auftreten. Dieser wird mittels <code class="language-plaintext highlighter-rouge">vi /etc/php.d/40-apcu.ini</code> und dem aktivieren von <code class="language-plaintext highlighter-rouge">apc.enable_cli=1</code> behoben.</p>

<p>Redis wird als Cache und File Locking Tool eingerichtet. Wer keinen Rediscluster benutzen möchte, verwendet folgende Einstellungen:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
</pre></td><td class="rouge-code"><pre>'filelocking.enabled' =&gt; true,
'memcache.locking' =&gt; '\OC\Memcache\Redis',
'memcache.distributed' =&gt; '\OC\Memcache\Redis',
'redis' =&gt; array(
'host' =&gt; '172.23.241.60',
'port' =&gt; 6379,
'dbindex' =&gt; 0,
'password' =&gt; 'xxx',
'timeout' =&gt; 0.0,
),
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Ein Rediscluster wird folgendermaßen konfiguriert:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="rouge-code"><pre>'filelocking.enabled' =&gt; true,
'memcache.locking' =&gt; '\\OC\\Memcache\\Redis',
'memcache.distributed' =&gt; '\\OC\\Memcache\\Redis',
'redis.cluster' =&gt;
array (
'seeds' =&gt;
array (
0 =&gt; '172.23.241.61:7000',
1 =&gt; '172.23.241.62:7000',
2 =&gt; '172.23.241.63:7000',
),
'timeout' =&gt; '0.0',
'read_timeout' =&gt; '0.0',
'password' =&gt; 'xxx',
'dbindex' =&gt; '0',
'failover_mode' =&gt; '\\RedisCluster::FAILOVER_ERROR',
),
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Die Datenintegrität wird mittels <code class="language-plaintext highlighter-rouge">sudo -u apache php occ maintenance:update:htaccess</code> wiederhergestellt.
Anschließend muss im Webinterface auf “Scan” geklickt werden.</p>

<p>Der Fehler <code class="language-plaintext highlighter-rouge">Your web server is not properly set up to resolve "/.well-known/nodeinfo".</code> wird  mittels Anpassung im Apachen behoben, ebenfalls der HSTS Fehler.</p>

<p><code class="language-plaintext highlighter-rouge">/etc/httpd/conf.d/nextcloud.conf</code></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre>Redirect 301 /.well-known/carddav /remote.php/dav
Redirect 301 /.well-known/caldav /remote.php/dav
Redirect 301 /.well-known/webfinger /index.php/.well-known/webfinger
Redirect 301 /.well-known/nodeinfo /index.php/.well-known/nodeinfo

Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Weitere Anpassungen, die nützlich sind:</p>

<p><em>Telefonregion:</em></p>

<p><code class="language-plaintext highlighter-rouge">'default_phone_region' =&gt; 'DE',</code></p>

<p><em>Integritätsprüfung:</em></p>

<p><code class="language-plaintext highlighter-rouge">'integrity.check.disabled' =&gt; true,</code></p>

<p><em>Logging:</em></p>

<p><code class="language-plaintext highlighter-rouge">'loglevel' =&gt; 0,</code></p>

<p><em>Theme:</em></p>

<p><code class="language-plaintext highlighter-rouge">'theme' =&gt; '',</code></p>

<h2 id="apps-installieren">Apps installieren</h2>

<p>Um Collaboration Features zu nutzen, müssen Apps nachinstalliert werden. Entweder geschieht dies über die WebGUI, oder per CLI. Um Deck zu installieren, wird folgender Befehl ausgeführt:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre><span class="nb">cd</span> /var/www/html
<span class="nb">sudo</span> <span class="nt">-u</span> apache php occ app:install deck
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Dies kann pro App einzeln ausgeführt werden, oder automatisch per Skript. Apps die sinnvoll sind, sind z. Bsp.</p>

<ul>
  <li>announcementcenter</li>
  <li>bookmarks</li>
  <li>calendar</li>
  <li>contacts</li>
  <li>files_accesscontrol</li>
  <li>files_automatedtagging</li>
  <li>files_markdown</li>
  <li>notes</li>
  <li>polls</li>
  <li>quota_warning</li>
  <li>tasks</li>
  <li>guests</li>
  <li>files_rightclick</li>
  <li>files_mindmap</li>
  <li>onlyoffice</li>
  <li>deck</li>
  <li>drawio</li>
  <li>checksum</li>
  <li>extract</li>
  <li>files_downloadactivity</li>
  <li>news</li>
  <li>apporder</li>
  <li>twofactor_backupcodes</li>
  <li>twofactor_totp</li>
  <li>collectives</li>
  <li>circles</li>
  <li>groupfolders</li>
</ul>

<h2 id="standard-cronjob">Standard Cronjob </h2>

<p>Zwecks Verwaltung wird ein Cronjob benötigt. Dieser kann zwar als Webcron eingerichtet werden, wird jedoch nicht empfohlen. Der Cronjob muss in diesem Falle als Apache laufen.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>crontab <span class="nt">-u</span> apache <span class="nt">-e</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>*/15 * * * * /usr/bin/php /var/www/html/cron.php
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Damit ist die Cloudsoftware installiert und konfiguriert.</p>

<h2 id="cluster-cronjob">Cluster Cronjob</h2>

<p>Da es sich hier um einen aktiv/passive Cluster handelt ist das Dateisystem nur auf dem aktiven Clusternode vorhanden. Als Folge wird ein “normaler” Cronjob auf der passive Node ins Leere verlaufen und Fehlermeldungen bringen. Um dies zu verhindern wird der Cronjob ebenfalls per Pacemaker eingerichtet.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre><span class="nb">mkdir</span> /opt/cron
vi /opt/cron/nccron
<span class="k">*</span>/15 <span class="k">*</span> <span class="k">*</span> <span class="k">*</span> <span class="k">*</span> apache /bin/php <span class="nt">-f</span> /var/www/html/cron.php
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Jetzt wird Pacemaker konfiguriert</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="rouge-code"><pre>pcs cluster cib cron.cfg

pcs <span class="nt">-f</span> cron.cfg resource create cron-nextcloud ocf:heartbeat:symlink <span class="se">\</span>
<span class="nb">link</span><span class="o">=</span>/etc/cron.d/nccron <span class="nv">target</span><span class="o">=</span>/opt/cron/nccron op monitor <span class="nv">interval</span><span class="o">=</span>30s

pcs <span class="nt">-f</span> cron.cfg constraint colocation add cron-nextcloud with VIP INFINITY

pcs <span class="nt">-f</span> cron.cfg constraint order httpd <span class="k">then </span>start cron-nextcloud

pcs <span class="nt">-f</span> cron.cfg constraint order VIP <span class="k">then </span>cron-nextcloud

pcs cluster cib-push cron.cfg
</pre></td></tr></tbody></table></code></pre></div></div>

<p>Damit ist auch der Cronjob hochverfügbar.</p>]]></content><author><name>grumpy</name></author><category term="Linux" /><category term="Nextcloud" /><category term="Oracle" /><category term="linux" /><category term="nextcloud" /><category term="cloud" /><category term="pacemaker" /><category term="drbd" /><category term="apache" /><category term="php" /><summary type="html"><![CDATA[Im Beispiel werden zwei Webserver eingerichtet. Die Systeme arbeiten als active/passive Cluster. Als Webserver kommt Apache mit PHP zum Einsatz, installiert unter Oracle Linux 8.6. Die Daten werden über DRBD synchron gehalten, die Dienste werden über Pacemaker gesteuert.]]></summary></entry></feed>