<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[JStubberfield Blog]]></title><description><![CDATA[The views and opinions displayed here are my own and if you have an issue with that CTRL+W is your friend]]></description><link>https://blog.jstubberfield.net/</link><image><url>https://blog.jstubberfield.net/favicon.png</url><title>JStubberfield Blog</title><link>https://blog.jstubberfield.net/</link></image><generator>Ghost 3.4</generator><lastBuildDate>Sun, 30 May 2021 07:03:14 GMT</lastBuildDate><atom:link href="https://blog.jstubberfield.net/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[pi-hole Conditional Forwarding]]></title><description><![CDATA[How to implement conditional forwarding using pi-hole]]></description><link>https://blog.jstubberfield.net/pihole-conditional-forwarding/</link><guid isPermaLink="false">5afa8b6f8ce6870001c1ae3e</guid><category><![CDATA[guide]]></category><category><![CDATA[pi-hole]]></category><category><![CDATA[homenetwork]]></category><dc:creator><![CDATA[Joseph Stubberfield]]></dc:creator><pubDate>Tue, 15 May 2018 07:38:50 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>I've had <a href="https://pi-hole.net/">pi-hole</a> for quite a while but something that hassled me was the choice between either running it as my DHCP server or forwarding all upstream queries through my router (which is my DHCP server today) and losing DNSSEC, performance and so on.</p>
<p>Today I finally got around to testing and implementing conditional forwarding for my pi-hole!</p>
<p><strong>Step 1</strong> - Create a custom configuration file, in my case it's called <code>0.5-custom.conf</code></p>
<pre><code>sudo vim /etc/dnsmasq.d/05-custom.conf
</code></pre>
<p><strong>Step 2</strong> - Into the file place the following</p>
<pre><code>server=/local/192.168.1.1
</code></pre>
<p>Essentially this tells DNSMASQ (which is the current backend DNS forwarder for pi-hole) to forward all requests for domains under local (eg - myiphone.local) to your router (eg - 192.168.1.1). Change the values to suit your network.</p>
<p><strong>Step 3</strong> - In the pi-hole gui feel free to change your upstream away from your router, to GoogleDNS or something else</p>
<p><strong>Step 4</strong> - Restart DNS on the pi-hole using <code>pihole restartdns</code> or the web ui</p>
<p>You're done. You can verify the effect using query logs and also using the pie chart on the pi-hole admin page which will start to change to show your new upstream whilst still showing requests to your router for local names.</p>
<p>Also if you want to override some public DNS (for say, running your own Steam cache) just use <code>address=</code> instead of <code>network=</code></p>
<pre><code>address=/content1.steampowered.com/192.168.1.2
address=/.steamcontent.com/192.168.1.2
</code></pre>
<p>Note the above list is incomplete, it includes <code>content1.steampowered.com</code> and all <code>*.steamcontent.com</code>.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Kerberos, Proxies and CNAMEs]]></title><description><![CDATA[<!--kg-card-begin: markdown--><p>Just another quick note on something I stumbled across recently that hopefully someone finds it useful.</p>
<p>Assuming you use a HTTP/HTTPS web proxy and you want authentication so that you can log requests against specific users chances are you are using Kerberos authentication.</p>
<p>The alternative is basic (but then</p>]]></description><link>https://blog.jstubberfield.net/kerberos-proxies-and-cnames-2/</link><guid isPermaLink="false">5987e4adce81960001032d3e</guid><dc:creator><![CDATA[Joseph Stubberfield]]></dc:creator><pubDate>Fri, 05 Jan 2018 08:29:07 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Just another quick note on something I stumbled across recently that hopefully someone finds it useful.</p>
<p>Assuming you use a HTTP/HTTPS web proxy and you want authentication so that you can log requests against specific users chances are you are using Kerberos authentication.</p>
<p>The alternative is basic (but then your users get prompted) or NTLM. The problem with NTLM is that it is comparitively heavy and if you require authentication for each connection is not feasable once you reach a certain size.</p>
<p>Kerberos uses a fraction of the resources of NTLM and allows for seamless high performance authentication. You can read more about how it actually works on <a href="https://technet.microsoft.com/en-us/library/cc961976.aspx">technet here</a>.</p>
<p>An important part of Kerberos is the server name. For a proxy server it's derived from the FQDN of the proxy. However something important to note is that Kerberos fully resolves the FQDN including CNAMES.</p>
<p>This means if you have proxy.redmond.com as a nice service DNS but you CNAME it to server50.redmond.com the Kerberos ticket will be issued against server50.redmond.com and <strong>NOT</strong> proxy.redmond.com.</p>
<p>So say you change the CNAME and suddenly SSO is no longer working and it's driving your users nuts. They get prompted and when you do a packet capture you can see that the users machine is waiting for credentials to ask for a Kerberos token. But why would it suddenly do this? It worked fine before?</p>
<p>Something I didn't know is that by default SSO only functions for sites in the &quot;Intranet&quot; IE security zone. Now the proxy isn't a site but it must still fall into the &quot;Intranet&quot; security zone for SSO to work. So how best to do that? We could use GPO to push a rule making server50.redmond.com sit in the &quot;Intranet&quot; zone.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Splunk, SAML and NotBefore Verification]]></title><description><![CDATA[A quick not for anyone running into 'NotBefore' condition errors when deploying SAML for Splunk and ADFS]]></description><link>https://blog.jstubberfield.net/splunk-saml-and-notbefore-verification/</link><guid isPermaLink="false">5987e4adce81960001032d3d</guid><category><![CDATA[splunk]]></category><category><![CDATA[saml]]></category><category><![CDATA[adfs]]></category><dc:creator><![CDATA[Joseph Stubberfield]]></dc:creator><pubDate>Mon, 19 Dec 2016 03:02:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Just a quick note to anyone deploying SAML (in my case ADFS) for Splunk. I'm running 6.5.0 and although it seemed to be working early on after not too long I started to see the following error on logon:</p>
<pre><code>The 'NotBefore' condition could not be verified successfully. The saml response is not valid.
</code></pre>
<p>After a little investigation it seemed likely that Splunk was rejecting the assertion from ADFS as it didn't like the &quot;NotBefore&quot; attribute. A little searching showed up that this may be due to clock skew between Splunk (the SP) and ADFS (the iDP).</p>
<p>There is a particularly good <a href="https://medium.com/@PrakhashS/saml-assertion-condition-notbefore-notonorafter-problem-due-to-unsynced-clocks-explained-90455bc8822f#.x8ppa9pzv">article on medium</a> which explains the issue.</p>
<p>However we checked clocks and noted that they appeared to be in Sync. As time went on it became clear that the issue was intermittent and was probably due to very subtle clock drift between the SP and the iDP.</p>
<p>A bit more searching showed up a good <a href="https://answers.splunk.com/answers/350999/using-saml-for-authentication-why-do-we-get-time-s.html">question on Splunk Answers</a> which seemed to be on the same track. Finally a Microsoft <a href="https://social.technet.microsoft.com/Forums/windowsserver/en-US/f42d4f48-8169-4f38-866f-c0da11702a0d/skewing-the-samlp-notbefore-in-adfs-v2?forum=winserverDS">question on technet</a> provided the full solution.</p>
<p>It seems Splunk is very aggressive when applying the NotBefore condition and doesn't allow for very much drift at all. As Splunk doesn't seem to have a configurable allowable window for this attribute we need to make a change in ADFS. Unfortunately this change isn't in the GUI but can be done using powershell and applied to the Splunk federation:</p>
<pre><code>Add-PSSnapin Microsoft.Adfs.PowerShell #Load up the ADFS PowerShell plug in
Get-ADFSRelyingPartyTrust –identifier “urn:party:sso” #Just to see what the values were
Set-ADFSRelyingPartyTrust –TargetIdentifier “urn:party:sso” –NotBeforeSkew 2 #Set the skew to 2 minutes
</code></pre>
<p>Credit goes to the <a href="https://social.technet.microsoft.com/Forums/windowsserver/en-US/f42d4f48-8169-4f38-866f-c0da11702a0d/skewing-the-samlp-notbefore-in-adfs-v2?forum=winserverDS">Technet answer</a> for the above PowerShell goodness.</p>
<p>Applying this change seemed to fix up the issue so if you have the same thing hopefully this helps you.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Docker, Ghost and Insufficient Memory]]></title><description><![CDATA[A potential solution to Ghost Blog in a docker container crashing with the non-descriptive line of "Killed" in the log]]></description><link>https://blog.jstubberfield.net/docker-ghost-and-insufficient-memory/</link><guid isPermaLink="false">5987e4adce81960001032d3c</guid><category><![CDATA[docker]]></category><category><![CDATA[ghost]]></category><dc:creator><![CDATA[Joseph Stubberfield]]></dc:creator><pubDate>Fri, 09 Sep 2016 01:40:56 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Not sure if this is specific to Ghost (possibly not) and I need to look into this more but I had an annoying issue recently while trying to do some memory restrictions on Docker for Ghost.</p>
<p>The blog would sometimes start but often fail during migration/upgrade or randomly when the admin interface was accessed. I'd recently made a change to introduce memory restrictions (to properly define boundaries for garbage collection) onto the OS. I was re-creating the docker containers (256Mb for the important blog and 128Mb for this one).</p>
<p>This worked fine for other containers but when I tried to spin up my blog I got this (or something similar):</p>
<pre><code>npm info it worked if it ends with ok
npm info using npm@2.15.9
npm info using node@v4.5.0
npm info prestart ghost@0.10.1
npm info start ghost@0.10.1

&gt; ghost@0.10.1 start /usr/src/ghost
&gt; node index

Killed

npm info ghost@0.10.1 Failed to exec start script
npm ERR! Linux 3.16.0-4-amd64
npm ERR! argv &quot;/usr/local/bin/node&quot; &quot;/usr/local/bin/npm&quot; &quot;start&quot;
npm ERR! node v4.5.0
npm ERR! npm  v2.15.9
npm ERR! code ELIFECYCLE
npm ERR! ghost@0.10.1 start: `node index`
npm ERR! Exit status 137
npm ERR!
npm ERR! Failed at the ghost@0.10.1 start script 'node index'.
npm ERR! This is most likely a problem with the ghost package,
npm ERR! not with npm itself.
npm ERR! Tell the author that this fails on your system:
npm ERR!     node index
npm ERR! You can get information on how to open an issue for this project with:
npm ERR!     npm bugs ghost
npm ERR! Or if that isn't available, you can get their info via:
npm ERR!
npm ERR!     npm owner ls ghost
npm ERR! There is likely additional logging output above.
npm ERR! Linux 3.16.0-4-amd64
npm ERR! argv &quot;/usr/local/bin/node&quot; &quot;/usr/local/bin/npm&quot; &quot;start&quot;
npm ERR! node v4.5.0
npm ERR! npm  v2.15.9
npm ERR! path npm-debug.log.896050243
npm ERR! code EACCES
npm ERR! errno -13
npm ERR! syscall open

npm ERR! Error: EACCES: permission denied, open 'npm-debug.log.896050243'
npm ERR!     at Error (native)
npm ERR!  { [Error: EACCES: permission denied, open 'npm-debug.log.896050243']
npm ERR!   errno: -13,
npm ERR!   code: 'EACCES',
npm ERR!   syscall: 'open',
npm ERR!   path: 'npm-debug.log.896050243' }
npm ERR!
npm ERR! Please try running this command again as root/Administrator.

npm ERR! Please include the following file with any support request:
npm ERR!     /usr/src/ghost/npm-debug.log
</code></pre>
<p>After much stuffing around I discovered the really important part of this log is the <code>Killed</code> line.</p>
<blockquote>
<p>npm install ran out of memory and was unable to complete. You’ll need to increase the virtual memory available to npm.</p>
</blockquote>
<p><a href="http://support.ghost.org/troubleshooting/">Source</a></p>
<p>So at least for now it seems I can't get the official Ghost docker container to run with less than 256Mb memory. I might follow up on this and try to find out why but I thought I'd post it on here in case anyone else has a similar issue.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Docker interface in Synology appliances doesn't show some tags]]></title><description><![CDATA[Why the docker interface in Synology NAS appliances isn't currently showing some recent tags for docker images stored on the Docker Hub.]]></description><link>https://blog.jstubberfield.net/so-docker-in-your-synology-isnt-showing-latest-tags-2/</link><guid isPermaLink="false">5987e4adce81960001032d3a</guid><category><![CDATA[synology]]></category><category><![CDATA[docker]]></category><dc:creator><![CDATA[Joseph Stubberfield]]></dc:creator><pubDate>Wed, 10 Aug 2016 01:00:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p><strong>Update 25 Nov 2016</strong> - This issue is resolved in the DSM 6.1 Beta, hopefully it's coming down the line soon!</p>
<p>So most of my little bits an pieces (including this blog at present) are now hosted on my Synology NAS using Docker. It'll let me move stuff around if traffic increases but at the moment it suites me just fine.</p>
<p>Anyway a problem I've noticed recently is that the newer versions of Ghost weren't appearing in the tags list when I attempt to pull the image down.</p>
<p><img src="https://blog.jstubberfield.net/content/images/2016/08/syn-docker-tags.png" alt="Docker Screenshot"></p>
<p>This is what you see in the WebUI for docker but if I look at the hub page there are tags for latest, 0.9 and 0.8 (and some others).</p>
<p><img src="https://blog.jstubberfield.net/content/images/2016/08/docker-hub-tags.png" alt="Docker Hub Tags Screenshot"></p>
<p>So whats going on here. I don't pretend to be an expert in Docker so  I do some digging and ask around. Surprisingly Synology came back to me fairly quickly (although initially reported a bug in Docker Hub) and pointed out that this is related to Docker Hub changing to a new API.</p>
<p>Essentially Docker Hub is running 2 versions of their API (v1 and v2). The V2 API is a big change from the first so both are still available. Here are the links to the tags for Ghost.</p>
<p><a href="https://registry.hub.docker.com/v1/repositories/library/ghost/tags">https://registry.hub.docker.com/v1/repositories/library/ghost/tags</a><br>
<a href="https://registry.hub.docker.com/v2/repositories/library/ghost/tags/">https://registry.hub.docker.com/v2/repositories/library/ghost/tags/</a></p>
<p>If we look at both the JSON objects returned it becomes pretty obvious what is happening. The V1 API isn't sending out any of the newer tags.</p>
<p>Now I couldn't find anywhere official that points this out but asking in Docker IRC channels leads me to understand Docker Hub has now depracated the V1 API and as a result it is now <strong>Read Only</strong>.</p>
<p>End result is because Synology queries V1 first then if it doesn't return anything has a shot at V2 it's not getting the new tags.</p>
<p>Synology support tells me the next update to the Docker Package should remove support for the V1 API or at least query V2 first. If you want the update faster I encourage you to log support tickets with Synology.</p>
<p>The workaround is that you can use SSH to run docker commands straight on the Synology if you absolutely must have a tag that's not showing up.</p>
<p><strong>TLDR</strong> : Synology is looking at old data from a deprecated API on Docker Hub for its tags. Issue will be fixed in a coming update.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item><item><title><![CDATA[Providing an IPSEC VPN Endpoint on OpenWRT for IOS]]></title><description><![CDATA[Learn how to setup an IPSec VPN concentrator on your OpenWRT router and set it up with a profile for iPhone access]]></description><link>https://blog.jstubberfield.net/providing-an-ipsec-vpn-endpoint-on-openwrt-for-ios/</link><guid isPermaLink="false">5987e4adce81960001032d38</guid><category><![CDATA[ipsec]]></category><category><![CDATA[openwrt]]></category><category><![CDATA[guide]]></category><dc:creator><![CDATA[Joseph Stubberfield]]></dc:creator><pubDate>Wed, 27 Jul 2016 04:53:00 GMT</pubDate><content:encoded><![CDATA[<!--kg-card-begin: markdown--><p>Long title, I know. First some background, I’ve tried this in the past and haven’t been able to get it to work. I tried it this weekend and had it working in no time at all so that’s good. This is the first cut of this guide so I might update it as OpenWRT changes and as I optimize my configuration or write a new post if it seems like a better way to go.</p>
<p>First off, my environment is a Netgear WNDR3700 running Barrier Breaker 14.07. The IOS device used is an iPhone 6 running IOS 8.1.2. Although there are guides out there for this I thought it might need a little more detail given I had some problems with my firewall on the router and certificate verification on the IOS device introduced in IOS 8. I used StrongSwan as my VPN terminator.</p>
<h4 id="1installrequiredpackages">1 - Install Required Packages</h4>
<p>Log into router using SSH (I’m using the shell for my instructions here) and run the following:</p>
<pre><code>opkg update

opkg install strongswan-default strongswan-mod-dhcp strongswan-mod-af-alg strongswan-mod-gcrypt strongswan-mod-blowfish strongswan-mod-md4 strongswan-mod-openssl strongswan-mod-pkcs11 strongswan-mod-pkcs8 strongswan-mod-test-vectors strongswan-mod-farp strongswan-mod-kernel-libipsec kmod-tun openssl-utils
</code></pre>
<p>This should install all the required packages.</p>
<h4 id="2addrequiredconfiguration">2 – Add Required Configuration</h4>
<p>Add the following section to your /etc/ipsec.conf file:</p>
<pre><code>conn ios
         keyexchange=ikev1
         authby=xauthrsasig
         xauth=server
         left=%any
         leftsubnet=0.0.0.0/0
         leftfirewall=yes
         leftcert=serverCert.pem
         right=%any
         rightsubnet=192.168.1.0/24
         rightsourceip=%dhcp
         rightcert=clientCert.pem
         forceencaps=yes
         auto=add
</code></pre>
<p>Make sure you change <mark>192.168.1.0/24</mark> to the whole subnet on the LAN side of your router. This configuration will cause the client device to be automatically allocated an IP address from your dynamically allocated range on the LAN side of your router as though it was joining the network via WIFI or wired ethernet connection.</p>
<p>Add the following to your /etc/ipsec.secrets file:</p>
<pre><code>: RSA serverKey.pem
anyuser : XAUTH &quot;anypassword&quot;
</code></pre>
<p>Replace <mark>user</mark> and <mark>password</mark> with a username and password of your choice (this will be the “account” and “password” fields on your IOS device).</p>
<p><strong>Replace</strong> your /etc/strongswan.conf with the following:</p>
<pre><code># strongswan.conf - strongSwan configuration file

charon {

        dns1 = 192.168.1.1

        threads = 16

        plugins {

                dhcp {
                        server = 192.168.1.1
                }
        }

}

pluto {

}

libstrongswan {

        #  set to no, the DH exponent size is optimized
        #  dh_exponent_ansi_x9_42 = no
}
</code></pre>
<p>Replace <mark>192.168.1.1</mark> with the LAN IP address of your OpenWRT router.</p>
<p>Add the following to your /etc/firewall.user file in order to permit ipsec traffic:</p>
<pre><code>iptables -I INPUT  -m policy --dir in --pol ipsec --proto esp -j ACCEPT
iptables -I FORWARD  -m policy --dir in --pol ipsec --proto esp -j ACCEPT
iptables -I FORWARD  -m policy --dir out --pol ipsec --proto esp -j ACCEPT
iptables -I OUTPUT   -m policy --dir out --pol ipsec --proto esp -j ACCEPT
</code></pre>
<p>Add the following to your /etc/config/firewall file in order to permit ipsec traffic:</p>
<pre><code>config rule
 option src 'wan'
 option proto 'esp'
 option target 'ACCEPT'

config rule
 option src 'wan'
 option proto 'udp'
 option dest_port '500'
 option target 'ACCEPT'

config rule
 option src 'wan'
 option proto 'udp'
 option dest_port '4500'
 option target 'ACCEPT'

config rule
 option src 'wan'
 option proto 'ah'
 option target 'ACCEPT'
</code></pre>
<h4 id="3certificategeneration">3 – Certificate Generation</h4>
<p><strong>Generate the CA Certificate</strong></p>
<p>Run the following commands to generate the CA key. You may leave all the certificate details as below or you may set the certificate attributes if you want. There are no requirements on the CA Key for IOS:</p>
<pre><code>ipsec pki --gen --outform pem &gt; caKey.pem
ipsec pki --self --in caKey.pem --dn &quot;C=DE, O=xxx, CN=xxxx&quot; --ca --outform pem &gt; caCert.pem
</code></pre>
<p><strong>Generate and Sign the Server Certificate</strong></p>
<p>Run the following commands to generate the server side (OpenWRT router) certificate and sign it with your custom CA certificate:</p>
<pre><code>ipsec pki --gen --outform pem &gt; serverKey.pem
ipsec pki --pub --in serverKey.pem | ipsec pki --issue --cacert caCert.pem --cakey caKey.pem --dn &quot;C=DE, O=xxx, CN=xxx.dyndns.org&quot; --san=&quot;xxx.dyndns.org&quot; --flag serverAuth --flag ikeIntermediate --outform pem &gt; serverCert.pem
</code></pre>
<p>Here you <strong>must</strong> replace <mark>xxx.dyndns.org</mark> with the Hostname or IP address you are entering into the “server” field on your IOS device. The IOS device will validate the certificate and that will fail if it does not match when you try to create the VPN connection on your IOS device.</p>
<p><strong>Generate and Sign the Client Certificate</strong></p>
<p>Run the following commands to generate the client side (IOS device) certificate and sign it with your custom CA certificate:</p>
<pre><code> ipsec pki --gen --outform pem &gt; clientKey.pem
 ipsec pki --pub --in clientKey.pem | ipsec pki --issue --cacert caCert.pem --cakey caKey.pem --dn &quot;C=DE, O=xxx, CN=client&quot; --outform pem &gt; clientCert.pem
</code></pre>
<p>Now you have to convert the certificate to the format IOS is after. When you get prompted for a password you must specify one, if you don’t you will not be able to install the certificate as IOS prompts for one even when one doesn’t exist and the field on IOS won’t validate if it’s blank:</p>
<pre><code>openssl pkcs12 -export -inkey clientKey.pem -in clientCert.pem -name &quot;client&quot; -certfile caCert.pem -caname &quot;xxxx&quot; -out clientCert.p12
</code></pre>
<p><strong>Copy the Certificates</strong><br>
You now have to copy the certificates to where Strongswan expects them:</p>
<pre><code>cp caCert.pem /etc/ipsec.d/cacerts/
cp serverCert.pem /etc/ipsec.d/certs/
cp serverKey.pem /etc/ipsec.d/private/
cp clientCert.pem /etc/ipsec.d/certs/
cp clientKey.pem /etc/ipsec.d/private/
</code></pre>
<h4 id="5startopenswan">5 – Start OpenSwan</h4>
<p>Run <code>/etc/init.d/ipsec</code> start to start OpenSwan (make sure there are no errors). Set OpenSwan to start at bootup using <code>/etc/init.d/ipsec enable</code>.</p>
<h4 id="6additionalfirewallsetting">6 – Additional Firewall Setting</h4>
<p>I had trouble with my firewall so this section is a bit of a workaround. Under “Firewall” settings in the web interface on the router change “Forward” to “accept”. Without this I could only ever get connectivity to the router itself but nothing on the LAN. Once I enabled this setting I was able to get full access as though I was on the local LAN.</p>
<h4 id="7sendcertificatestotheiosdeviceandcreatevpnsetting">7 – Send Certificates to the IOS Device and Create VPN Setting</h4>
<p>Download <code>caCert.pem</code> and <code>clientCert.p12</code> from your router and then email them to an email account you have on the iPhone. Open the email on your iPhone and import the certificates by tapping on the attachments. I’m not including screenshots of this bit because it is quite straightforward. If you need them let me know and I’ll expand this article.</p>
<p>Create a VPN configuration and select IPSec.</p>
<ul>
<li>Server : VPN Server, remember this hostname/IP must match the CN attribute in the client certificate or it won’t validate</li>
<li>Account/Password : The username/password from the ipsec.secrets file</li>
<li>Use Certificate : Set to on</li>
<li>Certificate : Select the client certificate imported earlier</li>
</ul>
<p><img src="https://blog.jstubberfield.net/content/images/2016/07/IMG_0216-169x300.png" alt="iPhone VPN Setup"></p>
<p>At this point you should be able to turn the VPN on on your IOS device and it should connect fine. If you have problems I suggest you check the log on your OpenWRT router, there is a great deal of information about connectivity and authentication in the logs that should help you.</p>
<!--kg-card-end: markdown-->]]></content:encoded></item></channel></rss>