<?xml version='1.0' encoding='utf-8' ?>

<rss version='2.0' xmlns:lj='http://www.livejournal.org/rss/lj/1.0/' xmlns:atom10='http://www.w3.org/2005/Atom'>
<channel>
  <title>Move along, nothing to read</title>
  <link>https://robbat2.dreamwidth.org/</link>
  <description>Move along, nothing to read - Dreamwidth Studios</description>
  <lastBuildDate>Sun, 21 May 2017 05:45:16 GMT</lastBuildDate>
  <generator>LiveJournal / Dreamwidth Studios</generator>
  <lj:journal>robbat2</lj:journal>
  <lj:journaltype>personal</lj:journaltype>
  <image>
    <url>https://v2.dreamwidth.org/8564366/483469</url>
    <title>Move along, nothing to read</title>
    <link>https://robbat2.dreamwidth.org/</link>
    <width>100</width>
    <height>100</height>
  </image>

<item>
  <guid isPermaLink='true'>https://robbat2.dreamwidth.org/238949.html</guid>
  <pubDate>Sun, 21 May 2017 05:45:16 GMT</pubDate>
  <title>ebtables for EC2-like metadata server on 169.254.169.254 AND bridge</title>
  <link>https://robbat2.dreamwidth.org/238949.html</link>
  <description>&amp;lt;&amp;gt;Playing with the concepts around Cloud metadata services, specifically those that are network-based, rather than the ConfigDrive or serial port variants. 

&lt;p&gt;EC2 ensures that 169.254.169.254 is magically provide your instance with your data, and it won&apos;t be accessible to another instance.  This is trivial to achieve if your instances are using routed or tap network; but is more complex if you are on a bridged network: the client will try to send the packets for 169.254.169.254 to the MAC of the default gateway. &lt;/p&gt;

&lt;p&gt;So far I can force bridged packets that would otherwise be headed for the gateway to be routed locally (and put  169.254.169.254/32 locally on the host). I don&apos;t have a good way to associate the packets with a specific instance yet. Using kernel packet marks work, but  isn&apos;t really scalable. Main requirement is that a simple web service should be able to uniquely identify the client, even if they try to spoof themselves (learn mac+IP of another instance on the same hypervisor &amp; bridge, and ask for it&apos;s metadata from the wrong interface)&lt;/p&gt;

&lt;h3&gt; Variant 1&lt;/h3&gt;
&lt;pre&gt;  ebtables -t nat -N metadata || ebtables -t nat -F metadata
for i in $(seq 0 20) ; do
   ebtables -t nat -A metadata -i vnet$i -j mark --mark-set $((256+$i)) --mark-target CONTINUE
done
ebtables -t broute -A metadata --limit 10/minute --limit-burst 2 --log --log-level debug --log-prefix &quot;ebtables metadata&quot; --log-ip
ebtables -t nat -A metadata -j redirect
ebtables -t nat -F PREROUTING
ebtables -t nat -A PREROUTING -p IPv4 --logical-in br0 --ip-src 169.254.169.254 -j metadata
ebtables -t nat -A PREROUTING -p IPv4 --logical-in br0 --ip-dst 169.254.169.254 -j metadata
&lt;/pre&gt;

&lt;h3&gt;Variant 2&lt;/h3&gt;
&lt;pre&gt;
ebtables -t broute -N metadata || ebtables -t broute -F metadata
ebtables -t broute -F BROUTING
ebtables -t broute -A BROUTING -p IPv4 --ip-src 169.254.169.254 -j metadata
ebtables -t broute -A BROUTING -p IPv4 --ip-dst 169.254.169.254 -j metadata
ebtables -t broute -A metadata --limit 10/minute --limit-burst 2 --log --log-level debug --log-prefix &quot;ebtables metadata&quot; --log-ip
# Repeat the marks if you want them.
ebtables -t broute -A metadata -j redirect
&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;img src=&quot;https://www.dreamwidth.org/tools/commentcount?user=robbat2&amp;ditemid=238949&quot; width=&quot;30&quot; height=&quot;12&quot; alt=&quot;comment count unavailable&quot; style=&quot;vertical-align: middle;&quot;/&gt; comments</description>
  <comments>https://robbat2.dreamwidth.org/238949.html</comments>
  <category>metadata</category>
  <category>ec2</category>
  <category>amazon</category>
  <category>networking</category>
  <category>bridge</category>
  <lj:security>public</lj:security>
  <lj:reply-count>0</lj:reply-count>
</item>
</channel>
</rss>
