222 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
			
		
		
	
	
			222 lines
		
	
	
		
			6.1 KiB
		
	
	
	
		
			HTML
		
	
	
	
	
	
<!DOCTYPE html>
 | 
						||
<html>  <head>
 | 
						||
    
 | 
						||
    <meta charset="utf-8">
 | 
						||
    <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no">
 | 
						||
 | 
						||
    
 | 
						||
    <link rel="stylesheet" href="/bootstrap-4.4.1.min.css" crossorigin="anonymous">
 | 
						||
 | 
						||
    
 | 
						||
    
 | 
						||
    <link rel="stylesheet" href="https://router7.org/sass/sidebar.css">
 | 
						||
 | 
						||
    <title>router7: architecture</title>
 | 
						||
  </head>
 | 
						||
<body>
 | 
						||
        <div id="content">
 | 
						||
	  <div class="container">
 | 
						||
	    <div class="row">
 | 
						||
	      <div class="col-md-10"><nav class="navbar navbar-expand-lg navbar-light bg-light">
 | 
						||
  <a class="navbar-brand" href="#">router7</a>
 | 
						||
  <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarNavAltMarkup" aria-controls="navbarNavAltMarkup" aria-expanded="false" aria-label="Toggle navigation">
 | 
						||
    <span class="navbar-toggler-icon"></span>
 | 
						||
  </button>
 | 
						||
  <div class="collapse navbar-collapse" id="navbarNavAltMarkup">
 | 
						||
    <div class="navbar-nav ml-auto">
 | 
						||
      
 | 
						||
      
 | 
						||
      
 | 
						||
      <a class="nav-item nav-link " href="/">Home </a>
 | 
						||
      
 | 
						||
      
 | 
						||
      <a class="nav-item nav-link active" href="/architecture/">Architecture <span class="sr-only">(current)</span></a>
 | 
						||
      
 | 
						||
      
 | 
						||
      <a class="nav-item nav-link " href="/installation/">Installation </a>
 | 
						||
      
 | 
						||
      
 | 
						||
      <a class="nav-item nav-link " href="https://github.com/rtr7/router7">GitHub </a>
 | 
						||
      
 | 
						||
    </div>
 | 
						||
  </div>
 | 
						||
</nav>
 | 
						||
<h1 id="architecture">Architecture</h1>
 | 
						||
<p>router7 is based on <a href="https://gokrazy.org/">gokrazy</a>: it is an appliance which gets packed into a hard disk image, containing a FAT partition with the kernel, a read-only SquashFS partition for the root file system and an ext4 partition for permanent data.</p>
 | 
						||
<p>The individual services can be found in <a href="https://pkg.go.dev/github.com/rtr7/router7/cmd">github.com/rtr7/router7/cmd</a></p>
 | 
						||
<ul>
 | 
						||
<li>Each service runs in a separate process.</li>
 | 
						||
<li>Services communicate with each other by persisting state files. E.g., <code>cmd/dhcp4</code> writes <code>/perm/dhcp4/wire/lease.json</code>.</li>
 | 
						||
<li>A service notifies other services about state changes by sending them signal <code>SIGUSR1</code>.</li>
 | 
						||
</ul>
 | 
						||
<h2 id="configuration-files">Configuration files</h2>
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
<table class="table table-striped table-bordered">
 | 
						||
<thead>
 | 
						||
<tr>
 | 
						||
<th>File</th>
 | 
						||
<th>Consumer(s)</th>
 | 
						||
<th>Purpose</th>
 | 
						||
</tr>
 | 
						||
</thead>
 | 
						||
<tbody>
 | 
						||
<tr>
 | 
						||
<td><code>/perm/interfaces.json</code></td>
 | 
						||
<td><code>netconfigd</code></td>
 | 
						||
<td>Set IP/MAC addresses of <code>uplink0</code> and <code>lan0</code></td>
 | 
						||
</tr>
 | 
						||
<tr>
 | 
						||
<td><code>/perm/portforwardings.json</code></td>
 | 
						||
<td><code>netconfigd</code></td>
 | 
						||
<td>Configure nftables port forwarding rules</td>
 | 
						||
</tr>
 | 
						||
<tr>
 | 
						||
<td><code>/perm/dhcp6/duid</code></td>
 | 
						||
<td><code>dhcp6</code></td>
 | 
						||
<td>Set DHCP Unique Identifier (DUID) for obtaining static leases</td>
 | 
						||
</tr>
 | 
						||
</tbody>
 | 
						||
</table>
 | 
						||
 | 
						||
 | 
						||
<h2 id="state-files">State files</h2>
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
<table class="table table-striped table-bordered">
 | 
						||
<thead>
 | 
						||
<tr>
 | 
						||
<th>File</th>
 | 
						||
<th>Producer</th>
 | 
						||
<th>Consumer(s)</th>
 | 
						||
<th>Purpose</th>
 | 
						||
</tr>
 | 
						||
</thead>
 | 
						||
<tbody>
 | 
						||
<tr>
 | 
						||
<td><code>/perm/dhcp4/wire/ack</code></td>
 | 
						||
<td><code>dhcp4</code></td>
 | 
						||
<td><code>dhcp4</code></td>
 | 
						||
<td>last DHCPACK packet for renewals across restarts</td>
 | 
						||
</tr>
 | 
						||
<tr>
 | 
						||
<td><code>/perm/dhcp4/wire/lease.json</code></td>
 | 
						||
<td><code>dhcp4</code></td>
 | 
						||
<td><code>netconfigd</code></td>
 | 
						||
<td>Obtained DHCPv4 lease</td>
 | 
						||
</tr>
 | 
						||
<tr>
 | 
						||
<td><code>/perm/dhcp6/wire/lease.json</code></td>
 | 
						||
<td><code>dhcp6</code></td>
 | 
						||
<td><code>netconfigd</code>, <code>radvd</code></td>
 | 
						||
<td>Obtained DHCPv6 lease</td>
 | 
						||
</tr>
 | 
						||
<tr>
 | 
						||
<td><code>/perm/dhcp4d/leases.json</code></td>
 | 
						||
<td><code>dhcp4d</code></td>
 | 
						||
<td><code>dhcp4d</code>, <code>dnsd</code></td>
 | 
						||
<td>DHCPv4 leases handed out (including hostnames)</td>
 | 
						||
</tr>
 | 
						||
</tbody>
 | 
						||
</table>
 | 
						||
 | 
						||
 | 
						||
<h2 id="available-ports">Available ports</h2>
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
 | 
						||
<table class="table table-striped table-bordered">
 | 
						||
<thead>
 | 
						||
<tr>
 | 
						||
<th>Port</th>
 | 
						||
<th>Purpose</th>
 | 
						||
</tr>
 | 
						||
</thead>
 | 
						||
<tbody>
 | 
						||
<tr>
 | 
						||
<td><code><public>:8053</code></td>
 | 
						||
<td><code>dnsd</code> metrics (forwarded requests)</td>
 | 
						||
</tr>
 | 
						||
<tr>
 | 
						||
<td><code><public>:8066</code></td>
 | 
						||
<td><code>netconfigd</code> metrics (nftables counters)</td>
 | 
						||
</tr>
 | 
						||
<tr>
 | 
						||
<td><code><private>:80</code></td>
 | 
						||
<td>gokrazy web interface</td>
 | 
						||
</tr>
 | 
						||
<tr>
 | 
						||
<td><code><private>:67</code></td>
 | 
						||
<td><code>dhcp4d</code></td>
 | 
						||
</tr>
 | 
						||
<tr>
 | 
						||
<td><code><private>:58</code></td>
 | 
						||
<td><code>radvd</code></td>
 | 
						||
</tr>
 | 
						||
<tr>
 | 
						||
<td><code><private>:53</code></td>
 | 
						||
<td><code>dnsd</code></td>
 | 
						||
</tr>
 | 
						||
<tr>
 | 
						||
<td><code><private>:8077</code></td>
 | 
						||
<td><code>backupd</code> (serve backup.tar.gz)</td>
 | 
						||
</tr>
 | 
						||
<tr>
 | 
						||
<td><code><private>:7733</code></td>
 | 
						||
<td><code>diagd</code> (perform diagnostics)</td>
 | 
						||
</tr>
 | 
						||
<tr>
 | 
						||
<td><code><private>:5022</code></td>
 | 
						||
<td><code>captured</code> (serve captured packets)</td>
 | 
						||
</tr>
 | 
						||
</tbody>
 | 
						||
</table>
 | 
						||
 | 
						||
 | 
						||
<p>Here’s an example of <code>cmd/diagd</code> output:</p>
 | 
						||
<p><img src="https://github.com/rtr7/router7/raw/master/2018-07-14-diagd.png"
 | 
						||
width="800" alt="diagd output"></p>
 | 
						||
<p>Here’s an example of <code>cmd/netconfigd</code> metrics when scraped with <a href="https://prometheus.io/">Prometheus</a> and displayed in <a href="https://grafana.com/">Grafana</a>:</p>
 | 
						||
<p><img src="https://github.com/rtr7/router7/raw/master/2018-07-14-grafana.png"
 | 
						||
width="800" alt="metrics in grafana"></p>
 | 
						||
 | 
						||
 | 
						||
<hr>
 | 
						||
 | 
						||
<p class="small">
 | 
						||
  © 2018 Michael Stapelberg and contributors
 | 
						||
</p>
 | 
						||
	      </div>
 | 
						||
	      <div class="col-md-2">
 | 
						||
		<aside class="bd-toc">
 | 
						||
		  <nav id="TableOfContents">
 | 
						||
  <ul>
 | 
						||
    <li><a href="#configuration-files">Configuration files</a></li>
 | 
						||
    <li><a href="#state-files">State files</a></li>
 | 
						||
    <li><a href="#available-ports">Available ports</a></li>
 | 
						||
  </ul>
 | 
						||
</nav>
 | 
						||
		</aside>
 | 
						||
	      </div>
 | 
						||
	    </div>
 | 
						||
 | 
						||
 | 
						||
	  </div>
 | 
						||
        </div>    
 | 
						||
    
 | 
						||
    <script src="/jquery-3.4.1.slim.min.js" integrity="sha384-J6qa4849blE2+poT4WnyKhv5vZF5SrPo0iEjwBvKU7imGFAV0wwj1yYfoRSJoZ+n" crossorigin="anonymous"></script>
 | 
						||
    <script src="/popper-1.16.0.min.js" integrity="sha384-Q6E9RHvbIyZFJoft+2mJbHaEWldlvI9IOYy5n3zV9zzTtmI3UksdQRVvoxMfooAo" crossorigin="anonymous"></script>
 | 
						||
    <script src="/bootstrap-4.4.1.min.js" integrity="sha384-wfSDF2E50Y2D1uUdj0O3uMBJnjuUD4Ih7YwaYd1iqfktj0Uod8GCExl3Og8ifwB6" crossorigin="anonymous"></script>
 | 
						||
  </body>
 | 
						||
</html>
 | 
						||
</body>
 | 
						||
</html>
 |