<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Networking on Logan's Nest</title><link>https://blog.han.life/tags/networking/</link><description>Recent content in Networking on Logan's Nest</description><generator>Hugo</generator><language>en-au</language><lastBuildDate>Wed, 20 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://blog.han.life/tags/networking/index.xml" rel="self" type="application/rss+xml"/><item><title>Why Sentry events silently vanished from our Fargate Node app</title><link>https://blog.han.life/posts/2026/2026-05-20-sentry-fargate-ipv6-hang/</link><pubDate>Wed, 20 May 2026 00:00:00 +0000</pubDate><guid>https://blog.han.life/posts/2026/2026-05-20-sentry-fargate-ipv6-hang/</guid><description>&lt;h2 id="tldr"&gt;TL;DR&lt;/h2&gt;&#10;&lt;p&gt;Sentry&amp;rsquo;s Node SDK uses Node&amp;rsquo;s native &lt;code&gt;https.Agent&lt;/code&gt;, which in Node 18+ does Happy Eyeballs dual-stack connections by default. When DNS returns AAAA records but the host (e.g. an ECS Fargate ENI) has no IPv6 routing, the IPv6 connect attempts don&amp;rsquo;t fail fast — they hang until the agent&amp;rsquo;s default 2-second timeout, producing &lt;code&gt;AggregateError [ETIMEDOUT]&lt;/code&gt; and silently dropping the event. &lt;code&gt;curl&lt;/code&gt; from the same host works fine because curl falls back to IPv4 in milliseconds. The fix is one line: tell the Sentry transport to force IPv4 via a custom &lt;code&gt;httpModule&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>CloudFront Anycast IP</title><link>https://blog.han.life/posts/2025/2025-10-09-cloudfront-anycastp-ip/</link><pubDate>Thu, 09 Oct 2025 00:00:00 +0000</pubDate><guid>https://blog.han.life/posts/2025/2025-10-09-cloudfront-anycastp-ip/</guid><description>&lt;p&gt;I recently worked with a new AWS product called &lt;strong&gt;CloudFront Anycast IP&lt;/strong&gt;, which costs &lt;strong&gt;$3,000/month&lt;/strong&gt;. After testing it, I found the offering to be quite misleading, so I’m sharing my findings here.&lt;/p&gt;</description></item><item><title>WireGuard Setup</title><link>https://blog.han.life/posts/2025/2025-03-14-wireguard-setup/</link><pubDate>Fri, 14 Mar 2025 00:00:00 +0000</pubDate><guid>https://blog.han.life/posts/2025/2025-03-14-wireguard-setup/</guid><description>&lt;p&gt;I spent some time figuring out how WireGuard works and found the guidelines, including the official ones, to be rather complex. So, I&amp;rsquo;m jotting down my learnings here.&lt;/p&gt;&#10;&lt;p&gt;If you can&amp;rsquo;t be bothered with all the key and config files, &lt;a href="https://www.wireguardconfig.com/"&gt;https://www.wireguardconfig.com/&lt;/a&gt; provides one click setup for that with QR code.&lt;/p&gt;</description></item><item><title>Add HTTP auth username into envoy proxy logging</title><link>https://blog.han.life/posts/2021/2021-06-01-envoy-proxy-log-auth-user/</link><pubDate>Tue, 01 Jun 2021 00:00:00 +0000</pubDate><guid>https://blog.han.life/posts/2021/2021-06-01-envoy-proxy-log-auth-user/</guid><description>&lt;p&gt;Oddly couldn&amp;rsquo;t find any useful copy &amp;amp; paste solution for this.&lt;/p&gt;&#10;&lt;p&gt;As always, base64 decoding and split function copy &amp;amp; pasted from somewhere else.&lt;/p&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt; 1&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 2&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 3&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 4&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 5&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 6&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 7&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 8&#10;&lt;/span&gt;&lt;span class="lnt"&gt; 9&#10;&lt;/span&gt;&lt;span class="lnt"&gt;10&#10;&lt;/span&gt;&lt;span class="lnt"&gt;11&#10;&lt;/span&gt;&lt;span class="lnt"&gt;12&#10;&lt;/span&gt;&lt;span class="lnt"&gt;13&#10;&lt;/span&gt;&lt;span class="lnt"&gt;14&#10;&lt;/span&gt;&lt;span class="lnt"&gt;15&#10;&lt;/span&gt;&lt;span class="lnt"&gt;16&#10;&lt;/span&gt;&lt;span class="lnt"&gt;17&#10;&lt;/span&gt;&lt;span class="lnt"&gt;18&#10;&lt;/span&gt;&lt;span class="lnt"&gt;19&#10;&lt;/span&gt;&lt;span class="lnt"&gt;20&#10;&lt;/span&gt;&lt;span class="lnt"&gt;21&#10;&lt;/span&gt;&lt;span class="lnt"&gt;22&#10;&lt;/span&gt;&lt;span class="lnt"&gt;23&#10;&lt;/span&gt;&lt;span class="lnt"&gt;24&#10;&lt;/span&gt;&lt;span class="lnt"&gt;25&#10;&lt;/span&gt;&lt;span class="lnt"&gt;26&#10;&lt;/span&gt;&lt;span class="lnt"&gt;27&#10;&lt;/span&gt;&lt;span class="lnt"&gt;28&#10;&lt;/span&gt;&lt;span class="lnt"&gt;29&#10;&lt;/span&gt;&lt;span class="lnt"&gt;30&#10;&lt;/span&gt;&lt;span class="lnt"&gt;31&#10;&lt;/span&gt;&lt;span class="lnt"&gt;32&#10;&lt;/span&gt;&lt;span class="lnt"&gt;33&#10;&lt;/span&gt;&lt;span class="lnt"&gt;34&#10;&lt;/span&gt;&lt;span class="lnt"&gt;35&#10;&lt;/span&gt;&lt;span class="lnt"&gt;36&#10;&lt;/span&gt;&lt;span class="lnt"&gt;37&#10;&lt;/span&gt;&lt;span class="lnt"&gt;38&#10;&lt;/span&gt;&lt;span class="lnt"&gt;39&#10;&lt;/span&gt;&lt;span class="lnt"&gt;40&#10;&lt;/span&gt;&lt;span class="lnt"&gt;41&#10;&lt;/span&gt;&lt;span class="lnt"&gt;42&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;http_filters&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;envoy.filters.http.lua&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;typed_config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;&amp;#34;@type&amp;#34;: &lt;/span&gt;&lt;span class="l"&gt;type.googleapis.com/envoy.extensions.filters.http.lua.v3.Lua&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;inline_code&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="sd"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; b=&amp;#39;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/&amp;#39;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; function base64decode(data)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; data = string.gsub(data, &amp;#39;[^&amp;#39;..b..&amp;#39;=]&amp;#39;, &amp;#39;&amp;#39;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; return (data:gsub(&amp;#39;.&amp;#39;, function(x)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; if (x == &amp;#39;=&amp;#39;) then return &amp;#39;&amp;#39; end&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; local r,f=&amp;#39;&amp;#39;,(b:find(x)-1)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; for i=6,1,-1 do r=r..(f%2^i-f%2^(i-1)&amp;gt;0 and &amp;#39;1&amp;#39; or &amp;#39;0&amp;#39;) end&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; return r;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; end):gsub(&amp;#39;%d%d%d?%d?%d?%d?%d?%d?&amp;#39;, function(x)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; if (#x ~= 8) then return &amp;#39;&amp;#39; end&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; local c=0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; for i=1,8 do c=c+(x:sub(i,i)==&amp;#39;1&amp;#39; and 2^(8-i) or 0) end&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; return string.char(c)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; end))&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; end&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; function split(s, delimiter)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; result = {};&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; for match in (s..delimiter):gmatch(&amp;#34;(.-)&amp;#34;..delimiter) do&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; table.insert(result, match);&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; end&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; return result;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; end&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; function envoy_on_request(request_handle)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; local auth_header = request_handle:headers():get(&amp;#34;Authorization&amp;#34;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; if auth_header ~= nil then&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; local auth_token = split(auth_header,&amp;#34; &amp;#34;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; if auth_token[1] == &amp;#34;Basic&amp;#34; then&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; local auth_decoded = split(base64decode(auth_token[2]),&amp;#34;:&amp;#34;)&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; request_handle:headers():replace(&amp;#34;x-username&amp;#34;, auth_decoded[1])&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; auth_header = null&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; auth_token = null&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; autn_decoded = null&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; end&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; end&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="sd"&gt; end&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;- &lt;span class="nt"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;envoy.filters.http.router&lt;/span&gt;&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;typed_config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;{}&lt;span class="w"&gt;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;Then it can be added into the log by using &lt;code&gt;%REQ(x-username)%&lt;/code&gt; from &lt;code&gt;envoy.extensions.access_loggers.file.v3.FileAccessLog.format&lt;/code&gt;&lt;/p&gt;</description></item><item><title>CloudFlare Log Search</title><link>https://blog.han.life/posts/2020/2020-06-19-cloudflare-log-search/</link><pubDate>Fri, 19 Jun 2020 00:00:00 +0000</pubDate><guid>https://blog.han.life/posts/2020/2020-06-19-cloudflare-log-search/</guid><description>&lt;ol&gt;&#10;&lt;li&gt;Get the Zone ID&lt;br&gt;&#10;Select domain name from the dashboard then zone ID will show on bottom right corner.&lt;/li&gt;&#10;&lt;li&gt;Get the API Key&lt;br&gt;&#10;Select log search template to give minimum privilege&lt;/li&gt;&#10;&lt;li&gt;(Optional) Look up the fields available&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;curl -s -H &lt;span class="s2"&gt;&amp;#34;X-Auth-Email: &amp;lt;EMAIL&amp;gt;&amp;#34;&lt;/span&gt; -H &lt;span class="s2"&gt;&amp;#34;Authorization: Bearer &amp;lt;API KEY&amp;gt;&amp;#34;&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://api.cloudflare.com/client/v4/zones/&amp;lt;Zone ID&amp;gt;/logs/received/fields&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; jq .&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;4. Run Log Search (modify date &amp;amp; time bit as you need)&lt;/p&gt;</description></item><item><title>AWS TGW VPN using Unify UDM</title><link>https://blog.han.life/posts/2020/2020-06-13-aws-tgw-vpn-using-unify-udm/</link><pubDate>Sat, 13 Jun 2020 00:00:00 +0000</pubDate><guid>https://blog.han.life/posts/2020/2020-06-13-aws-tgw-vpn-using-unify-udm/</guid><description>&lt;p&gt;Transit Gateway (TGW) is a managed cloud router service provided by AWS and it supports direct VPN attachment.&lt;/p&gt;&#10;&lt;p&gt;The setup is little bit tricky as UDM doesn&amp;rsquo;t support BGP.&lt;/p&gt;&#10;&lt;p&gt;1. Create a Customer Gateway&lt;br&gt;&#10;Select Dynamic routing and enter your router public IP&lt;/p&gt;</description></item><item><title>Pooq Proxy</title><link>https://blog.han.life/posts/2018/2018-01-14-pooq/</link><pubDate>Sun, 14 Jan 2018 00:00:00 +0000</pubDate><guid>https://blog.han.life/posts/2018/2018-01-14-pooq/</guid><description>&lt;p&gt;This is my current setup for watching Pooq in Australia for anyone interested. With local proxy, below 4k streaming (UHD) seems alright with NBN via AussieBB. TPG might have better throughput as they have &lt;a href="https://en.wikipedia.org/wiki/Pipe_Pacific_Cable"&gt;PPC-1&lt;/a&gt; submarine cable.&lt;/p&gt;</description></item><item><title>F5 AAM Cache for app generated pages</title><link>https://blog.han.life/posts/2015/2015-11-16-f5-aam-cache-for-app-generated-pages/</link><pubDate>Mon, 16 Nov 2015 00:00:00 +0000</pubDate><guid>https://blog.han.life/posts/2015/2015-11-16-f5-aam-cache-for-app-generated-pages/</guid><description>&lt;p&gt;Dynamic content requires cache-control(max-age) and/or expires header to be cached.&lt;/p&gt;&#10;&lt;p&gt;The headers also need to be honoured from AAM policy which is not enabled by default.&lt;/p&gt;&#10;&lt;p&gt;Debug header decode: &lt;code&gt;wainfodecode [X-WA-INFO header content]&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Ports for WDS</title><link>https://blog.han.life/posts/2015/2015-03-31-ports-for-wds/</link><pubDate>Tue, 31 Mar 2015 00:00:00 +0000</pubDate><guid>https://blog.han.life/posts/2015/2015-03-31-ports-for-wds/</guid><description>&lt;p&gt;Ports for WDS&lt;/p&gt;&#10;&lt;p&gt;Google search said &amp;lsquo;The following TCP ports need to be open for WDS to work across a firewall: 135 and 5040 for RPC and 137 thru 139 for SMB.&amp;rsquo;&lt;/p&gt;</description></item><item><title>Run Citrix NetScaler VPX from KVM</title><link>https://blog.han.life/posts/2014/2014-01-23-run-citrix-netscaler-vpx-kvm/</link><pubDate>Thu, 23 Jan 2014 00:00:00 +0000</pubDate><guid>https://blog.han.life/posts/2014/2014-01-23-run-citrix-netscaler-vpx-kvm/</guid><description>&lt;p&gt;1. Download Hyper-V image and extract .vhd&lt;/p&gt;&#10;&lt;p&gt;2. Covert it via running: qemu-img convert -O qcow2 NSVPX-ESX-10.1-119.7_nc-disk1.vhd NSVPX-XEN-10.1-119.7_nc.qcow2&lt;/p&gt;&#10;&lt;p&gt;3. Create a VM, mount the image.&lt;/p&gt;&#10;&lt;p&gt;4. Login via nsroot/nsroot and run &amp;lsquo;config ns&amp;rsquo; for initial network setup. Oddly, this menu doesn&amp;rsquo;t list routing option including default gateway. Add it manually via &amp;lsquo;config add route 0.0.0.0 255.255.255.255 your_gateway_ip&amp;rsquo;&lt;/p&gt;</description></item><item><title>Disable msi with minimal interruption</title><link>https://blog.han.life/posts/2013/2013-10-14-disable-msi-minimal-interruption/</link><pubDate>Mon, 14 Oct 2013 00:00:00 +0000</pubDate><guid>https://blog.han.life/posts/2013/2013-10-14-disable-msi-minimal-interruption/</guid><description>&lt;div class="highlight"&gt;&lt;div class="chroma"&gt;&#10;&lt;table class="lntable"&gt;&lt;tr&gt;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code&gt;&lt;span class="lnt"&gt;1&#10;&lt;/span&gt;&lt;span class="lnt"&gt;2&#10;&lt;/span&gt;&lt;span class="lnt"&gt;3&#10;&lt;/span&gt;&lt;span class="lnt"&gt;4&#10;&lt;/span&gt;&lt;span class="lnt"&gt;5&#10;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&#10;&lt;td class="lntd"&gt;&#10;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-fallback" data-lang="fallback"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ifconfig eth0 down&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;rmmod bnx2&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;modprobe bnx2 disable_msi=1&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;ifconfig eth0 up&#10;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;route add -net default netmask 0.0.0.0 gw [default gw here] eth0&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&#10;&lt;/div&gt;&#10;&lt;/div&gt;&lt;p&gt;For bonding interface:&lt;/p&gt;</description></item><item><title>L2L VPN with ASA - Connection established but no packet coming from one side</title><link>https://blog.han.life/posts/2012/2012-07-05-l2l-vpn-with-asa-connection-established-but-no-packet-coming-from-one-side/</link><pubDate>Thu, 05 Jul 2012 00:00:00 +0000</pubDate><guid>https://blog.han.life/posts/2012/2012-07-05-l2l-vpn-with-asa-connection-established-but-no-packet-coming-from-one-side/</guid><description>&lt;p&gt;Symtom:&lt;/p&gt;&#10;&lt;p&gt;1. Connection established.&lt;/p&gt;&#10;&lt;p&gt;2. 0 en/decapsulated packet from one side.&lt;/p&gt;&#10;&lt;p&gt;Solution:&lt;/p&gt;&#10;&lt;p&gt;Seems like ASA pickup Dynamic VPN profile if it has higher priority than L2L.&lt;/p&gt;&#10;&lt;p&gt;Resolved after change dynamic profile priority.&lt;/p&gt;</description></item><item><title>Cisco Router config for ACME PACKET</title><link>https://blog.han.life/posts/2011/2011-12-21-cisco-router-config-for-acme-packet/</link><pubDate>Wed, 21 Dec 2011 00:00:00 +0000</pubDate><guid>https://blog.han.life/posts/2011/2011-12-21-cisco-router-config-for-acme-packet/</guid><description>&lt;p&gt;&lt;code&gt;sip-ua&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;authentication username&lt;/code&gt; &lt;code&gt;-snip-&lt;/code&gt; &lt;code&gt;password&lt;/code&gt; &lt;code&gt;7&lt;/code&gt; &lt;code&gt;-snip-&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;registrar dns:realm.domain expires&lt;/code&gt; &lt;code&gt;3600&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;sip-server dns:&lt;/code&gt;realm.domain&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;connection-reuse&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;``&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;voice service voip&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;no ip address trusted authenticate&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;allow-connections sip to sip&lt;/code&gt;&lt;/p&gt;&#10;&lt;p&gt;&lt;code&gt;no supplementary-service sip moved-temporarily&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Using additional public ip address over pppoe nat with cisco router</title><link>https://blog.han.life/posts/2011/2011-09-30-using-additional-public-ip-address-over-pppoe-nat-with-cisco-router/</link><pubDate>Fri, 30 Sep 2011 00:00:00 +0000</pubDate><guid>https://blog.han.life/posts/2011/2011-09-30-using-additional-public-ip-address-over-pppoe-nat-with-cisco-router/</guid><description>&lt;p&gt;To allocate router a non-NAT IP (for AWS VPC etc etc)&lt;/p&gt;&#10;&lt;p&gt;1. Create a loopback interface and put given ip &amp;amp; subnet 2. profit!&lt;/p&gt;&#10;&lt;p&gt;Otherwise,&lt;/p&gt;&#10;&lt;p&gt;ip nat inside source route-map NONAT interface Dialer1 overload ip nat inside source static 192.168.?.? PUBLIC_IP_HERE&lt;/p&gt;</description></item></channel></rss>