<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jose Truyol</title>
    <description>The latest articles on DEV Community by Jose Truyol (@josetruyol).</description>
    <link>https://dev.to/josetruyol</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F694684%2Fd099dffe-3359-4ddc-ac55-ad8265e2669a.jpeg</url>
      <title>DEV Community: Jose Truyol</title>
      <link>https://dev.to/josetruyol</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/josetruyol"/>
    <language>en</language>
    <item>
      <title>VPN Site-to-Site between Azure and Google Cloud Platform. Part 3</title>
      <dc:creator>Jose Truyol</dc:creator>
      <pubDate>Mon, 25 Oct 2021 17:10:33 +0000</pubDate>
      <link>https://dev.to/josetruyol/vpn-site-to-site-between-azure-and-google-cloud-platform-part-3-ed6</link>
      <guid>https://dev.to/josetruyol/vpn-site-to-site-between-azure-and-google-cloud-platform-part-3-ed6</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;You can find this story, with more information, on my website &lt;a href="https://blog.truyol.dev/vpn-site-to-site-between-gcp-and-azure-part-3/"&gt;https://blog.truyol.dev/vpn-site-to-site-between-gcp-and-azure-part-3/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you had been following along, in the &lt;a href="//%7B%7B%20site.baseurl%20%7D%7D/vpn-site-to-site-between-gcp-and-azure/"&gt;first part&lt;/a&gt;, we create a Site-to-Site VPN between Azure and GCP. In the &lt;a href="//%7B%7B%20site.baseurl%20%7D%7D/vpn-site-to-site-between-gcp-and-azure-part-2/"&gt;second part&lt;/a&gt; we tested that connection successfully. Now it's time to secure it&lt;/p&gt;

&lt;h2&gt;
  
  
  Current scenario
&lt;/h2&gt;

&lt;p&gt;At this point, we added 2 more VMs. Now we have 2 VMs on Azure and 2 VMs on GCP:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;VM&lt;/th&gt;
&lt;th&gt;Cloud Provider&lt;/th&gt;
&lt;th&gt;Private IP&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GCP-01&lt;/td&gt;
&lt;td&gt;Google Cloud&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.125.0.2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GCP-02&lt;/td&gt;
&lt;td&gt;Google Cloud&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.125.0.3&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure-01&lt;/td&gt;
&lt;td&gt;Azure&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.128.0.2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Azure-02&lt;/td&gt;
&lt;td&gt;Azure&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.128.0.3&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The goal
&lt;/h2&gt;

&lt;p&gt;Protect the network on Azure, allowing only specific IPs to be reached, in a maintainable way. This means that later on, we can change which IPs are whitelisted without the need to re-deploy a new VPN.&lt;/p&gt;

&lt;p&gt;On the first test we will prevent any incoming traffic to the Azure VNet keeping the outgoing traffic to the GCP network:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;From&lt;/th&gt;
&lt;th&gt;To&lt;/th&gt;
&lt;th&gt;Can connect?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GCP-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Azure-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GCP-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Azure-02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GCP-02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Azure-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GCP-02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Azure-02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Azure-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GCP-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Azure-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GCP-02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Azure-02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GCP-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Azure-02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GCP-02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--uqzB9yAD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v718rngbs0v2j5syumx7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--uqzB9yAD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v718rngbs0v2j5syumx7.png" alt="Diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And, in the second test we will allow incoming traffic to only the Azure-01 VM:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;From&lt;/th&gt;
&lt;th&gt;To&lt;/th&gt;
&lt;th&gt;Can connect?&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GCP-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Azure-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GCP-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Azure-02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GCP-02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Azure-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;GCP-02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Azure-02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Azure-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GCP-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Azure-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GCP-02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Azure-02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GCP-01&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Azure-02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;GCP-02&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zIyyUE-p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k6zuwzmckwh6tzabsy6d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zIyyUE-p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k6zuwzmckwh6tzabsy6d.png" alt="Diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How can we secure our Azure VPN?
&lt;/h2&gt;

&lt;p&gt;Our Virtual Network Gateway was associated with a VNet (&lt;code&gt;default-vnet&lt;/code&gt; with one subnet), and there is where we can protect our resources. We will use the &lt;code&gt;Network Security Group&lt;/code&gt; (&lt;code&gt;NSG&lt;/code&gt;) with some custom rules. But first, let's create the &lt;code&gt;NSG&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rGSegEa1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kdp743xdvdx1lmjxv6pw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rGSegEa1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kdp743xdvdx1lmjxv6pw.png" alt="Creating the Network Security Group"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ciydCbzf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tz54qlxaipl99gzbpkxi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ciydCbzf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tz54qlxaipl99gzbpkxi.png" alt="Creating the Network Security Group"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If we go to the resource overview page we can take a look into the inbound and outbound security rules&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SrnQmX4L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/roem3jcdyzbzalh4u9p2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SrnQmX4L--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/roem3jcdyzbzalh4u9p2.png" alt="Creating the Network Security Group"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, we go to the VNet we want to secure and in the subnet, we apply the &lt;code&gt;vpn-test-ng&lt;/code&gt; Network Security Group&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gW__UpMU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1rspo5wb3ivn5jzwuxm9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gW__UpMU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1rspo5wb3ivn5jzwuxm9.png" alt="Creating the inconming rule"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We are now ready to start to implement our rules!&lt;/p&gt;

&lt;h2&gt;
  
  
  First test
&lt;/h2&gt;

&lt;p&gt;In the Network Security Group, we go to the &lt;code&gt;Inbound security rules&lt;/code&gt; on the sidebar and click on the &lt;code&gt;Add&lt;/code&gt; button. Let's see what we need:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Source&lt;/td&gt;
&lt;td&gt;Specify the incoming traffic from a specific type of source&lt;/td&gt;
&lt;td&gt;IP Addresses&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source IP addresses / CIDR ranges&lt;/td&gt;
&lt;td&gt;CIDR of the source network&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.125.0.0/20&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Source port ranges&lt;/td&gt;
&lt;td&gt;From which ports this rule will take effect&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Destination&lt;/td&gt;
&lt;td&gt;Specify the outgoing traffic of this rule&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Service&lt;/td&gt;
&lt;td&gt;Specify the destination protocol and port range for this rule&lt;/td&gt;
&lt;td&gt;Custom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Destination port ranges&lt;/td&gt;
&lt;td&gt;Ports of the destination targets&lt;/td&gt;
&lt;td&gt;&lt;code&gt;*&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Protocol&lt;/td&gt;
&lt;td&gt;To which protocol this rule will take effect&lt;/td&gt;
&lt;td&gt;Any&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Action&lt;/td&gt;
&lt;td&gt;Define if this rule will allow or deny the traffic if the conditions are met&lt;/td&gt;
&lt;td&gt;Deny&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Priority&lt;/td&gt;
&lt;td&gt;Sets the priority of this rule. Azure will evaluate from the lowest highest priority until it found a match rule&lt;/td&gt;
&lt;td&gt;4000&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We will use a high priority value because this is our fallback rule, denying everything. Later on, we can add specific rules to allow more narrowed traffic.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--lUjQ0ZGP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v462s4kt7g6egf9wq1i6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--lUjQ0ZGP--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/v462s4kt7g6egf9wq1i6.png" alt="Creating the inconming rule"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Our network should be secure from incoming traffic through the VPN. Let's check if we still have access to the GCP network:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;azureuser@Azure-01$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ping 10.125.0.2 &lt;span class="nt"&gt;-c&lt;/span&gt; 4
&lt;span class="go"&gt;PING 10.125.0.2 (10.125.0.2) 56(84) bytes of data.
64 bytes from 10.125.0.2: icmp_seq=1 ttl=64 time=50.644 ms
64 bytes from 10.125.0.2: icmp_seq=2 ttl=64 time=48.559 ms
64 bytes from 10.125.0.2: icmp_seq=3 ttl=64 time=53.577 ms
64 bytes from 10.125.0.2: icmp_seq=4 ttl=64 time=49.720 ms

--- 10.125.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3076ms
rtt min/avg/max/mdev = 48.559/50.625/53.577/2.063 ms
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Awesome, everything keeps working! Let's try from GCP now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;ubuntu@GCP-01$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ping 10.128.0.2 &lt;span class="nt"&gt;-c&lt;/span&gt; 4
&lt;span class="go"&gt;PING 10.128.0.2 (10.128.0.2) 56(84) bytes of data.
^C
--- 10.128.0.2 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3057ms
&lt;/span&gt;&lt;span class="gp"&gt;ubuntu@GCP-01$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ping 10.128.0.3 &lt;span class="nt"&gt;-c&lt;/span&gt; 4
&lt;span class="go"&gt;PING 10.128.0.3 (10.128.0.3) 56(84) bytes of data.
^C
-------- 10.128.0.3 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3053ms
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;ubuntu@GCP-02$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ping 10.128.0.2 &lt;span class="nt"&gt;-c&lt;/span&gt; 4
&lt;span class="go"&gt;PING 10.128.0.2 (10.128.0.2) 56(84) bytes of data.
^C
-------- 10.128.0.2 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3053ms
&lt;/span&gt;&lt;span class="gp"&gt;ubuntu@GCP-02$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ping 10.128.0.3 &lt;span class="nt"&gt;-c&lt;/span&gt; 4
&lt;span class="go"&gt;PING 10.128.0.3 (10.128.0.3) 56(84) bytes of data.
^C
-------- 10.128.0.3 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3057ms
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Excellent, our network is secure from any connection from the GCP network.&lt;/p&gt;

&lt;h2&gt;
  
  
  Second test
&lt;/h2&gt;

&lt;p&gt;It's time to open only the Azure-01 VM to the GCP network. This can be done by creating a new Incoming security rule:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hS4ghUDq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ds8h2rr4tu3ks4567ug8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hS4ghUDq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ds8h2rr4tu3ks4567ug8.png" alt="Creating the incoming rule"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In this rule, we will use the &lt;code&gt;IP Adresses&lt;/code&gt; destination with Azure-01 VM as the destination IP Address and the &lt;code&gt;Allow&lt;/code&gt; action. Let's apply and try it out!&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;ubuntu@GCP-01$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ping 10.128.0.2 &lt;span class="nt"&gt;-c&lt;/span&gt; 4
&lt;span class="go"&gt;PING 10.125.0.2 (10.125.0.2) 56(84) bytes of data.
64 bytes from 10.125.0.2: icmp_seq=1 ttl=64 time=50.644 ms
64 bytes from 10.125.0.2: icmp_seq=2 ttl=64 time=48.559 ms
64 bytes from 10.125.0.2: icmp_seq=3 ttl=64 time=53.577 ms
64 bytes from 10.125.0.2: icmp_seq=4 ttl=64 time=49.720 ms

-------- 10.125.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3076ms
rtt min/avg/max/mdev = 48.559/50.625/53.577/2.063 ms
&lt;/span&gt;&lt;span class="gp"&gt;ubuntu@GCP-01$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ping 10.128.0.3 &lt;span class="nt"&gt;-c&lt;/span&gt; 4
&lt;span class="go"&gt;PING 10.128.0.3 (10.128.0.3) 56(84) bytes of data.
^C
-------- 10.128.0.3 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3053ms
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;ubuntu@GCP-02$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ping 10.128.0.2 &lt;span class="nt"&gt;-c&lt;/span&gt; 4-
&lt;span class="go"&gt;PING 10.125.0.2 (10.125.0.2) 56(84) bytes of data.
64 bytes from 10.125.0.2: icmp_seq=1 ttl=64 time=50.644 ms
64 bytes from 10.125.0.2: icmp_seq=2 ttl=64 time=48.559 ms
64 bytes from 10.125.0.2: icmp_seq=3 ttl=64 time=53.577 ms
64 bytes from 10.125.0.2: icmp_seq=4 ttl=64 time=49.720 ms

-------- 10.125.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3076ms
rtt min/avg/max/mdev = 48.559/50.625/53.577/2.063 ms
&lt;/span&gt;&lt;span class="gp"&gt;ubuntu@GCP-02$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ping 10.128.0.3 &lt;span class="nt"&gt;-c&lt;/span&gt; 4
&lt;span class="go"&gt;PING 10.128.0.3 (10.128.0.3) 56(84) bytes of data.
^C
-------- 10.128.0.3 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3057ms
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Awesome! We can now limit which IP addresses can be reached from the other side of the VPN, thus securing our network.&lt;/p&gt;

&lt;p&gt;If you have a VPN device and wish to connect to the Azure VPN, you can refer to the &lt;a href="https://docs.microsoft.com/en-us/azure/vpn-gateway/vpn-gateway-about-vpn-devices"&gt;official documentation&lt;/a&gt; and check the default values used in this VPN implementation.&lt;/p&gt;

&lt;p&gt;Hope you found this series useful.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>VPN Site-to-Site between Azure and Google Cloud Platform. Part 2</title>
      <dc:creator>Jose Truyol</dc:creator>
      <pubDate>Thu, 21 Oct 2021 16:29:36 +0000</pubDate>
      <link>https://dev.to/josetruyol/vpn-site-to-site-between-azure-and-google-cloud-platform-part-2-431p</link>
      <guid>https://dev.to/josetruyol/vpn-site-to-site-between-azure-and-google-cloud-platform-part-2-431p</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;You can find this story, with more information, on my website &lt;a href="https://blog.truyol.dev/vpn-site-to-site-between-gcp-and-azure-part-2/" rel="noopener noreferrer"&gt;https://blog.truyol.dev/vpn-site-to-site-between-gcp-and-azure-part-2/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;If you had been following along, in the &lt;a href="https://dev.to/josetruyol/vpn-site-to-site-between-azure-and-google-cloud-platform-part-1-3bdh"&gt;first part&lt;/a&gt;, we create a Site-to-Site VPN between Azure and GCP. Now it's time to test it&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02x8axi4sl6xn0wsl7s9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F02x8axi4sl6xn0wsl7s9.png" alt="Diagram"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The goal
&lt;/h2&gt;

&lt;p&gt;Our goal today will be:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a Virtual Machine on each cloud provider, inside the VNet used on the VPN configuration. For GCP will be the subnet &lt;code&gt;10.125.0.0/20&lt;/code&gt; and for Azure will be within the address space &lt;code&gt;10.128.0.0/9&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Check if the VM can see each other using the &lt;code&gt;ping&lt;/code&gt; command using their private IPs&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Creating the Virtual Machines
&lt;/h2&gt;

&lt;p&gt;We will create simple and cheap VMs with Linux as the Operating System. So, we will use only &lt;code&gt;bash&lt;/code&gt; when we reach the test part.&lt;/p&gt;

&lt;h3&gt;
  
  
  GCP
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73oyd8iqgziajfgg0y9p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F73oyd8iqgziajfgg0y9p.png" alt="GCP Virtual Machine Wizard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs2pi0gilcu0mzkycx4yt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs2pi0gilcu0mzkycx4yt.png" alt="GCP Virtual Machine Wizard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Azure
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp9w68i6dter4l6yedypt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp9w68i6dter4l6yedypt.png" alt="Azure Virtual Machine Wizard"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Accessing the Virtual Machines
&lt;/h2&gt;

&lt;p&gt;Now, let's open 2 new terminal windows and connect to each machine using SSH:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GCP: &lt;code&gt;gcloud beta compute ssh --zone "us-east1-b" "vpn-test-vm" --project "vpn-test-419573"&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Azure: &lt;code&gt;ssh -i .ssh/azure_vm_key.pem azureuser@39.125.46.15&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next, we will find each machine IP address:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GCP:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;jose@vpn-test-vm:~$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ip addr
&lt;span class="gp"&gt;1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
&lt;span class="go"&gt;    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
&lt;/span&gt;&lt;span class="gp"&gt;2: ens4: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mtu 1460 qdisc mq state UP group default qlen 1000
&lt;span class="go"&gt;    link/ether 42:01:0a:7d:00:02 brd ff:ff:ff:ff:ff:ff
    inet 10.125.0.2/32 brd 10.125.0.2 scope global dynamic ens4
       valid_lft 76728sec preferred_lft 76728sec
    inet6 fe80::4001:aff:fe7d:2/64 scope link
       valid_lft forever preferred_lft forever
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Azure:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;ubuntu@Gitlab:~$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ip addr
&lt;span class="gp"&gt;1: lo: &amp;lt;LOOPBACK,UP,LOWER_UP&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
&lt;span class="go"&gt;    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
&lt;/span&gt;&lt;span class="gp"&gt;2: eth0: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;mtu 1500 qdisc mq state UP group default qlen 1000
&lt;span class="go"&gt;    link/ether 00:0d:3a:02:16:98 brd ff:ff:ff:ff:ff:ff
    inet 10.128.0.4/24 brd 10.128.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::20d:3aff:fe02:1698/64 scope link
       valid_lft forever preferred_lft forever
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Awesome, we have the private IP of the GCP VM (&lt;code&gt;10.125.0.2&lt;/code&gt;) and the Azure VM (&lt;code&gt;10.128.0.4&lt;/code&gt;)&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing the VPN
&lt;/h2&gt;

&lt;p&gt;Using the private IPs we will ping each other using the &lt;code&gt;ping&lt;/code&gt; command. Let's find out if the VPN is up and running.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GCP:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;jose@vpn-test-vm:~$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ping 10.128.0.4 &lt;span class="nt"&gt;-c&lt;/span&gt; 4
&lt;span class="go"&gt;PING 10.128.0.4 (10.128.0.4) 56(84) bytes of data.
64 bytes from 10.128.0.4: icmp_seq=1 ttl=63 time=40.3 ms
64 bytes from 10.128.0.4: icmp_seq=2 ttl=63 time=41.6 ms
64 bytes from 10.128.0.4: icmp_seq=3 ttl=63 time=42.1 ms
64 bytes from 10.128.0.4: icmp_seq=4 ttl=63 time=42.0 ms

--- 10.128.0.4 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 8ms
rtt min/avg/max/mdev = 40.268/41.482/42.059/0.734 ms
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Azure:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="gp"&gt;ubuntu@Gitlab:~$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;ping 10.125.0.2 &lt;span class="nt"&gt;-c&lt;/span&gt; 4
&lt;span class="go"&gt;PING 10.125.0.2 (10.125.0.2) 56(84) bytes of data.
64 bytes from 10.125.0.2: icmp_seq=1 ttl=63 time=44.1 ms
64 bytes from 10.125.0.2: icmp_seq=2 ttl=63 time=43.2 ms
64 bytes from 10.125.0.2: icmp_seq=3 ttl=63 time=41.9 ms
64 bytes from 10.125.0.2: icmp_seq=4 ttl=63 time=41.7 ms

--- 10.125.0.2 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3003ms
rtt min/avg/max/mdev = 41.702/42.745/44.118/1.007 ms
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Excellent! We had proven that our VPN works on both ends. But, with the current approach, we left everything open on both sides. What if we want to restrict access to only 1 target machine in the network? We can do this by providing a more narrowed address space when creating the VPN but this is a security hole.&lt;/p&gt;

&lt;p&gt;In the next part, we will be looking for a better solution.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>VPN Site-to-Site between Azure and Google Cloud Platform. Part 1</title>
      <dc:creator>Jose Truyol</dc:creator>
      <pubDate>Tue, 19 Oct 2021 21:18:34 +0000</pubDate>
      <link>https://dev.to/josetruyol/vpn-site-to-site-between-azure-and-google-cloud-platform-part-1-3bdh</link>
      <guid>https://dev.to/josetruyol/vpn-site-to-site-between-azure-and-google-cloud-platform-part-1-3bdh</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;You can find this story, with more information, on my website &lt;a href="https://blog.truyol.dev/vpn-site-to-site-between-gcp-and-azure/"&gt;https://blog.truyol.dev/vpn-site-to-site-between-gcp-and-azure/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I never had the chance to deploy a VPN Server or configure a Site-to-Site connection. So this was a huge "must" on my professional bucket list.&lt;/p&gt;

&lt;p&gt;Luckily I was tasked to perform some tests between Azure and GCP using IPsec IKEv2, and set the ground on how the company will create and protect this kind of connection. The task list was:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choose the service with the best cost/feature ratio.&lt;/li&gt;
&lt;li&gt;Create the resources on both ends and establish a connection.&lt;/li&gt;
&lt;li&gt;Test the network&lt;/li&gt;
&lt;li&gt;Limit the connection to specific IP/resources&lt;/li&gt;
&lt;li&gt;Validate that we can deploy multiple VPN connections with different customers.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without further ado, let's get into it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choosing the service
&lt;/h2&gt;

&lt;p&gt;These secure connections will be needed only for the development and stage of our products. This way we can extract data securely from our client's data sources. That's why we don't need High Availability services on either end.&lt;/p&gt;

&lt;h3&gt;
  
  
  Azure
&lt;/h3&gt;

&lt;p&gt;Azure offers 3 types of connections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;VNet-to-VNet: Simple way to connect VNets in azure. Similar to a Site-to-Site IPsec connection to an on-premises location.&lt;/li&gt;
&lt;li&gt;Site-to-Site (IPsec): Composed by a &lt;code&gt;VPN Gateway&lt;/code&gt;, a &lt;code&gt;Local Gateway&lt;/code&gt; and a &lt;code&gt;Connection&lt;/code&gt;, allows to send encrypted traffic between an Azure's VNet and an on-premises location through the public internet.&lt;/li&gt;
&lt;li&gt;ExpressRoute: Lets us create private connections between Azure datacenters and on-premises infrastructure through the Microsoft private network. Also, have higher bandwidth over a Site-to-Site connection (up to 10Gbps vs &amp;lt;100Mbps)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We will use the Site-to-Site VPN this time.&lt;/p&gt;

&lt;h3&gt;
  
  
  Google Cloud Platform
&lt;/h3&gt;

&lt;p&gt;GCP offers 3 types of connections:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Cloud VPN: This service has 2 subtypes:

&lt;ul&gt;
&lt;li&gt;HA VPN: This is a High Availability Cloud VPN that lets us securely connect on-premises networks to our private networks on GCP through an IPsec VPN connection.&lt;/li&gt;
&lt;li&gt;Classic VPN: In contrast to HA VPN, Classic VPN have a single interface and a single external IP address.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Cloud Interconnect: Provides low latency and high availability connections to reliably transfer data between on-premises and GCP through a supported service provider or Google's network with no public internet dependency.&lt;/li&gt;
&lt;li&gt;Cloud Router: Fully distributed and managed GCP Service that uses Border Gateway Protocol (BGP). Support custom dynamic routes based on the BGP advertisements that it receives from a peer.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this opportunity, we will use Classic VPN&lt;/p&gt;

&lt;h2&gt;
  
  
  Create the resources
&lt;/h2&gt;

&lt;p&gt;Requirements:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Azure:

&lt;ul&gt;
&lt;li&gt;VNet with address space &lt;code&gt;10.128.0.0/9&lt;/code&gt;. In this case, it will be on &lt;code&gt;useast-2&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;GCP:

&lt;ul&gt;
&lt;li&gt;VNet with a subnet with address space &lt;code&gt;10.125.0.0/20&lt;/code&gt;. In this case it will be &lt;code&gt;default&lt;/code&gt; VPC with the &lt;code&gt;vpn-subnet&lt;/code&gt; on &lt;code&gt;us-east1&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It could be any address space, the most important is that they don't overlap.&lt;/p&gt;

&lt;h3&gt;
  
  
  Azure
&lt;/h3&gt;

&lt;p&gt;Let's create a &lt;code&gt;Virtual Network Gateway&lt;/code&gt; on Azure. This resource will be the public face of our VNet&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IzBCFFgk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6l0ihwigvz5mj921cey0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IzBCFFgk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6l0ihwigvz5mj921cey0.png" alt="Virtual Network Gateway"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Name of the Virtual Network Gateway&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vpn-test&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;The same as our VNet&lt;/td&gt;
&lt;td&gt;&lt;code&gt;East US 2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Gateway Type&lt;/td&gt;
&lt;td&gt;Type of connection to use&lt;/td&gt;
&lt;td&gt;&lt;code&gt;VPN&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;VPN Type&lt;/td&gt;
&lt;td&gt;Type of VPN to use. Route based will allow us to define the address space of this VPN&lt;/td&gt;
&lt;td&gt;&lt;code&gt;VPN&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SKU&lt;/td&gt;
&lt;td&gt;Tier of service to use. &lt;code&gt;VpnGwX&lt;/code&gt; allows us to use IPsec&lt;/td&gt;
&lt;td&gt;&lt;code&gt;VpnGw1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virtual Network&lt;/td&gt;
&lt;td&gt;The VNet to associate to this VPN&lt;/td&gt;
&lt;td&gt;&lt;code&gt;test-vnet&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When everything is created, we can see the public IP &lt;code&gt;20.97.253.157&lt;/code&gt; on the Overview page of the resource.&lt;/p&gt;

&lt;p&gt;Now, let's jump to GCP&lt;/p&gt;

&lt;h3&gt;
  
  
  GCP
&lt;/h3&gt;

&lt;p&gt;Now that we have the public IP and the address space on the Azure side, we will create the Classic Cloud VPN resource&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--De4Qauyx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hgtxqy2fd8wl0dhaa3mt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--De4Qauyx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hgtxqy2fd8wl0dhaa3mt.png" alt="Cloud VPN"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--RfRtZ3B1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uvu3inkz9nv3uki7xr57.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--RfRtZ3B1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uvu3inkz9nv3uki7xr57.png" alt="Cloud VPN Basic Data"&gt;&lt;/a&gt;&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--b8cCpmek--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uekq5jduaia6tmo302jp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--b8cCpmek--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uekq5jduaia6tmo302jp.png" alt="Cloud VPN Tunnel Data"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cloud VPN&lt;/strong&gt;  &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Name of the Cloud VPN resource&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vpn-test&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Network&lt;/td&gt;
&lt;td&gt;GCP Network to link with this VPN&lt;/td&gt;
&lt;td&gt;&lt;code&gt;default&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Region&lt;/td&gt;
&lt;td&gt;GCP Region where our subnet is located&lt;/td&gt;
&lt;td&gt;&lt;code&gt;us-east1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IP address&lt;/td&gt;
&lt;td&gt;New IP address request for this VPN&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vpn-test-ip&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Tunnel&lt;/strong&gt;  &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Name&lt;/td&gt;
&lt;td&gt;Name of the VPN Tunnel&lt;/td&gt;
&lt;td&gt;vpn-test-tunnel-1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remote peer IP Address&lt;/td&gt;
&lt;td&gt;Azure's VPN Gateway public IP&lt;/td&gt;
&lt;td&gt;20.97.253.157&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IKE version&lt;/td&gt;
&lt;td&gt;Versión de IKE a usar&lt;/td&gt;
&lt;td&gt;IKEv2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IKE pre-shared key&lt;/td&gt;
&lt;td&gt;Key to encrypt the traffic&lt;/td&gt;
&lt;td&gt;secret&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Routing options&lt;/td&gt;
&lt;td&gt;For simplicity we will use Route-Based routing&lt;/td&gt;
&lt;td&gt;Route-Based&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Remote network IP ranges&lt;/td&gt;
&lt;td&gt;Correspond to the address space on Azure&lt;/td&gt;
&lt;td&gt;10.128.0.0/9&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;After this resource is created we will copy and save the public IP address &lt;code&gt;34.138.192.84&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Let's jump back to Azure to finish the VPN configuration&lt;/p&gt;

&lt;h3&gt;
  
  
  Azure
&lt;/h3&gt;

&lt;p&gt;Now that we have the Virtual Network Gateway, we will create a Local Network Gateway with the GPC information.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XXYn_jlv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g4q6uyv1t3akwsl1o4nh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XXYn_jlv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g4q6uyv1t3akwsl1o4nh.png" alt="Local Network Gateway"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;IP address&lt;/td&gt;
&lt;td&gt;Public IP of the GCP gateway&lt;/td&gt;
&lt;td&gt;&lt;code&gt;34.138.192.84&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Address space&lt;/td&gt;
&lt;td&gt;Address space on GCP to connect with&lt;/td&gt;
&lt;td&gt;&lt;code&gt;10.125.0.0/20&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;We are almost there! Now we need to create the Connection using the Virtual Network Gateway and the Local Network Gateway previously created.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mpGrRX7E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qggoktofk410ncd6q4xm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mpGrRX7E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qggoktofk410ncd6q4xm.png" alt="Local Network Gateway"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--14UT95OC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u6lnap3bvzrq0vizcvg1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--14UT95OC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/u6lnap3bvzrq0vizcvg1.png" alt="Local Network Gateway"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;th&gt;Value&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Connection Type&lt;/td&gt;
&lt;td&gt;VPN Connection type&lt;/td&gt;
&lt;td&gt;&lt;code&gt;Site-to-Site IPsec&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Virtual network gateway&lt;/td&gt;
&lt;td&gt;Virtual network previously created. The image is out-of-date&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vpn-test&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local network gateway&lt;/td&gt;
&lt;td&gt;Local Network Gateway previously created&lt;/td&gt;
&lt;td&gt;&lt;code&gt;vpn-test-lng&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Shared key (PSK)&lt;/td&gt;
&lt;td&gt;Secret key used in the GCP VPN&lt;/td&gt;
&lt;td&gt;&lt;code&gt;secret&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;IKE Protocol&lt;/td&gt;
&lt;td&gt;The same as the GCP VPN&lt;/td&gt;
&lt;td&gt;&lt;code&gt;IKEv2&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Verification
&lt;/h2&gt;

&lt;p&gt;Finally, we have our VPN Site-to-Site completely created. We can verify this by checking the connection status on each side. In Azure, it should show &lt;code&gt;Status: Connected&lt;/code&gt; on the Connection resource. In GCP it should show &lt;code&gt;Status: Tunnel is up and running&lt;/code&gt; with a green check on the VPN Tunnel.&lt;/p&gt;

&lt;p&gt;In the next part, we will verify that any virtual machine can reach the other side of the VPN using the private IPs.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
