<?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: Remote.It</title>
    <description>The latest articles on DEV Community by Remote.It (@remoteit).</description>
    <link>https://dev.to/remoteit</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%2Forganization%2Fprofile_image%2F5821%2Fa14e1ccc-25cb-42cc-a069-a04790b7a852.png</url>
      <title>DEV Community: Remote.It</title>
      <link>https://dev.to/remoteit</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/remoteit"/>
    <language>en</language>
    <item>
      <title>Bouncer - Diagnose Network Connection Problems</title>
      <dc:creator>Brenda Strech</dc:creator>
      <pubDate>Wed, 21 Dec 2022 16:13:03 +0000</pubDate>
      <link>https://dev.to/remoteit/bouncer-diagnose-network-connection-problems-13co</link>
      <guid>https://dev.to/remoteit/bouncer-diagnose-network-connection-problems-13co</guid>
      <description>&lt;p&gt;In this article we describe Bouncer, an open source tool that we created to help solve some of the problems described in the previous two articles. We also describe some of the other networking issues we encountered in working with Docker containers, in particular on macOS. Bouncer is not limited to connections involving Docker containers though. &lt;/p&gt;

&lt;p&gt;‘Open source tool for determining MTU values in Docker containers’ covers the subject of asymmetric maximum transmission unit (MTU) and provides a basic overview of how Remote.It and Remote.It tools may be used to discover problems with MTU.&lt;/p&gt;

&lt;p&gt;We also found that Docker containers on macOS ignore the Don’t Fragment (DF) bit. Without support for the DF bit it turns out that it is difficult to discover the MTU and MRU of a network connection. Read more about 'Docker and the DF Bit'.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Bouncer?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/remoteit/MTU_Bouncer"&gt;Remote.It Bouncer&lt;/a&gt; is a software tool written by Remote.It to help diagnose connection problems. For example, Bouncer can help diagnose problems with MTU and the DF bit. Bouncer is a server that can test the MTU of a connection made using UDP. You connect to the Bouncer server with netcat, or a similar networking tool, and request the return of a UDP packet with a data size that you specify. Bouncer returns a packet with characteristics and properties that specify. For example, you can set the packet to be returned with the DF flag. You can also specify clearing the DF flag if supported in your OS. In our experience, macOS does not currently appear to support setting the DF flag.&lt;/p&gt;

&lt;p&gt;You can find Remote.It's open source Bouncer at Github &lt;a href="https://github.com/remoteit/MTU_Bouncer"&gt;https://github.com/remoteit/MTU_Bouncer&lt;/a&gt; provided under the MIT License.&lt;/p&gt;

&lt;p&gt;We have also used Bouncer to discover endpoints that do not allow fragmented packets. For example, you can request Bouncer to return a large MTU packet and set the DF bit on to test fragmented packets. If you do not get a response on an otherwise known good connection, then something, somewhere in your path may be dropping fragmented packets.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bouncer Usage
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;usage: ./mtu_bouncer [-h] [-v(erbose)] [-d][pid file] [-l listen_tcp_port]
        -h this output.
        -v console debug output.
        -d runs the program as a daemon with optional pid file.
         -l Listen port (defaults to 9999)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Examples of Bouncer use
&lt;/h2&gt;

&lt;p&gt;Run the Bouncer server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;./mtu_bouncer
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Connect to the Bouncer server using netcat:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;nc -u &amp;lt;serverIP&amp;gt; 9999
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bouncer uses UDP, so you will have to send response, even a null character, to allow Bouncer know your IP address. So, when you hit return after entering the netcat command, the terminal console will wait for you to enter the response. For example, you could use this command to send a newline and cause Bouncer to prompt you for action:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo -n "/n" | nc -v -u bouncer.remote.it 9999
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can ask the Bouncer server to send you a UDP packet with a payload of specified size. For example, you can successively enter 10, 100, 1472, 1473f to request Bouncer to send packets of size 10 (with DF=1), 100 (DF=1), 1472 (DF=1) and 1473 (with DF=0):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ops@ops-mac-mini ~ % nc -u &amp;lt;serverIP&amp;gt; 9999
10
Must be between 20 and 4000 (add f on end to allow fragmentation)
100
100 (128 MTU DF=1)
..............................................................................
1472
1472 (1500 MTU DF=1)
.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
1473
On size 1473 (1501 MTU dfrag=1) sender failed to send with error Message too long code 90
1473f
1473 (1501 MTU DF=0)
.........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Building Bouncer
&lt;/h2&gt;

&lt;p&gt;Using the makefile in the src directory of the repo should build Bouncer on most Linux or Unix platforms. There is also a win32 project for building on Windows console app.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is MTU?
&lt;/h2&gt;

&lt;p&gt;The OSI model consists of seven abstract layers: Physical, Data link, Network, Transport, Session, Presentation, and Application. The Physical layer may be Ethernet, for example. Ethernet carries frames that carry the packets.&lt;/p&gt;

&lt;p&gt;There is a limit on the size of the Ethernet frame that typically limits the size of data to 1500 bytes. This limit of the link layer is called the MTU, maximum transmission unit.&lt;/p&gt;

&lt;p&gt;If the IP layer has a datagram to send, and the datagram is larger than the link layer's MTU, IP performs fragmentation, breaking the datagram up into smaller pieces called fragments so that each fragment is smaller than the MTU.&lt;/p&gt;

&lt;p&gt;When two hosts on one network communicate with each other, there is a single network MTU. When two hosts communicate using multiple networks, each link can have a different MTU. The important numbers are not the MTUs of the two networks to which the two hosts are connected, but the smallest MTU of any data link that packets traverse between the two hosts. The smallest network MTU is called the path MTU.&lt;/p&gt;

&lt;p&gt;The path MTU between any two hosts is not necessarily constant and may depend on the route being used at any time. Routing need not be symmetric so that the route from A to B may not be the route from B to A, and thus the path MTU need not be the same in both directions. In that case the MRU or maximum receive unit may not be the same as the MTU.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the DF bit?
&lt;/h2&gt;

&lt;p&gt;The DF bit is a single-bit field within the Internet Protocol (IP) header of a packet that determines whether a router is allowed to fragment a packet. IP fragmentation is an process that breaks a packet into pieces or fragments, so that the resulting pieces can pass through a link in a network connection that has a smaller MTU than can handle the original packet size. The fragments are then reassembled by the receiving host. RFC 1191 specifies the path MTU discovery mechanism (PMTUD), a way to determine the path MTU (PMTU) at any time using the DF bit.&lt;/p&gt;

&lt;p&gt;Following RFC1191, PMTUD uses the DF bit to discover the PMTU of a path. A source host initially assumes that the PMTU of a path is the known MTU of the first hop, and sends all datagrams on that path with the DF bit set. If a datagram is too large to be forwarded without fragmentation by a router along that path, then the router will discard the datagram and return a  Internet Control Message Protocol (ICMP) Destination Unreachable message with a code that corresponds to "fragmentation needed and DF set". Upon receiving that code and message, which is essentially a "Datagram Too Big" message, the source host reduces the assumed PMTU for the path.&lt;/p&gt;

&lt;p&gt;PMTUD will end when the host's estimate of the PMTU is low enough that datagrams can be delivered without fragmentation.  Or the host may end PMTUD by stopping to set the DF bit in the datagram headers because, for example, it is willing to have datagrams fragmented.  Normally, the host continues to set DF for all datagrams, so that if the path changes to a lower PMTU, the new PMTU will be discovered.&lt;/p&gt;

&lt;h2&gt;
  
  
  macOS tool issues
&lt;/h2&gt;

&lt;p&gt;One of the limitations that we found with netcat on macOS was a limit of 1024 bytes in terminal input. This system limit is set as follows, presumably inherited from BSD:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;define MAX_INPUT             1024   /* max bytes in terminal input */
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This 1024-byte limit makes it harder to use netcat to generate packets large enough to test the MTU of a path. &lt;a href="https://github.com/OperatorFoundation/NetworkExperiments"&gt;A Github project&lt;/a&gt;  documents some of other undocumented semantics of Apple's Network framework.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use Remote.It with Docker?
&lt;/h2&gt;

&lt;p&gt;Remote.It is a powerful connection tool that can connect any two hosts or devices using a peer-peer connection with an agent on each host. Remote.It can also connect using a web-based tool and a proxy to any target host, using a single agent on the target host.&lt;/p&gt;

&lt;p&gt;Developers can be used to connect containers within a host, containers in different hosts on the same network, containers on different networks, or even containers in different data centers for example.&lt;/p&gt;

&lt;p&gt;Suppose container 1 has a default IP address 172.17.0.1 and container 2 also has a default IP address 172.17.0.1. Remote.It allows you to connect these two containers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;We found a problem with support of the DF bit in a macOS Docker container. We also described MTU, how a path can have asymmetric MTU and an example of an asymmetric MTU situation in a Docker container and why it is important to support the DF bit in order to discover MTU and asymmetric MTU/MRU. We described how to discover an asymmetric MTU using Remote.It and the use of MTU Bouncer.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>opensource</category>
      <category>devops</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Docker and the DF bit</title>
      <dc:creator>Brenda Strech</dc:creator>
      <pubDate>Wed, 21 Dec 2022 16:12:49 +0000</pubDate>
      <link>https://dev.to/remoteit/docker-and-the-df-bit-j66</link>
      <guid>https://dev.to/remoteit/docker-and-the-df-bit-j66</guid>
      <description>&lt;p&gt;‘Open source tool for determining MTU values in Docker containers’ covers the subject of asymmetric maximum transmission unit (MTU) and provides a basic overview of how Remote.It and Remote.It's open source tools may be used to discover problems with MTU. &lt;/p&gt;

&lt;p&gt;We found that Docker containers on macOS ignore the Don’t Fragment (DF) bit. Without support for the DF bit, it is challenging to discover the MTU and MRU of a network connection. &lt;/p&gt;

&lt;p&gt;Why is this important? Without knowing the MRU and MTU for a connection, it is hard to create a network connection with maximum efficiency, and sometimes, it may even be hard to create a network connection that works at all.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is the DF bit?
&lt;/h2&gt;

&lt;p&gt;The DF bit is a single bit field within the Internet Protocol (IP) header of a packet that determines whether a router is allowed to fragment a packet. IP fragmentation is a process that breaks a packet into pieces or fragments so that the resulting pieces can pass through a link in a network connection that has a smaller MTU than can be handled by the original packet size. The fragments are then reassembled by the receiving host. RFC 1191 [Mogul and Deering 1990] specifies the path MTU discovery mechanism (PMTUD), a way to determine the path MTU (PMTU) at any time using the DF bit.&lt;/p&gt;

&lt;p&gt;Following RFC1191, PMTUD uses the DF bit to discover the PMTU of a path. A source host initially assumes that the PMTU of a path is the known MTU of the first hop, and sends all datagrams on that path with the DF bit set. If a datagram is too large to be forwarded without fragmentation by a router along that path, then the router will discard the datagram and return an Internet Control Message Protocol (ICMP) Destination Unreachable message with a code that corresponds to "fragmentation needed and DF set". Upon receiving that code and message, which is essentially a "Datagram Too Big" message, the source host reduces the assumed PMTU for the path.&lt;/p&gt;

&lt;p&gt;PMTUD will end when the host's estimate of the PMTU is low enough that datagrams can be delivered without fragmentation.  The host may also end PMTUD by stopping to set the DF bit in the datagram headers because, for example, it is willing to have datagrams fragmented.  Normally, the host continues to set DF for all datagrams, so that if the path changes to a lower PMTU, the new PMTU will be discovered.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker and the DF bit
&lt;/h2&gt;

&lt;p&gt;We performed some experiments using a Docker container running on macOS. We summarize these results first, and then show the corresponding macOS Terminal logs.&lt;/p&gt;

&lt;p&gt;We used the &lt;a href="https://github.com/remoteit/MTU_Bouncer"&gt;Remote.It MTU Bouncer tool&lt;/a&gt; to send or bounce packets back to us of a certain requested size both with and without the DF bit being set (DF=1). We first ask to be sent a series of packets with DF=1 and  length 1770 (which fails, too long), 1470 (succeeds), 1472 (succeeds), 1473 (fails to send, too long). Then we ask for a packet with DF=0 of length 1473 and that packet never arrives, and the same occurs with length 1472. Thus, we suspect that Docker does not maintain the DF bit somewhere between the Docker container and the macOS host OS.&lt;/p&gt;

&lt;p&gt;To check this, we then move to the host macOS, eliminating the Docker container, and ask for a packet with DF=1 length 1472 (succeeds), DF=1 length 1473 (fails, too long), then DF=0 length 1473 (which succeeds but previously failed inside the Docker container).&lt;/p&gt;

&lt;p&gt;We can conclude that somewhere the DF bit is not being communicated somewhere between the macOS Docker container and host macOS.&lt;/p&gt;

&lt;p&gt;Here is the macOS Terminal log corresponding to the experiments and results described above:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~ # nc -u bouncer.remote.it 9999
1770
On size 1770 (1798 MTU dfrag=1) sender failed to send with error Message too long code 90
17
Must be between 20 and 65535 (add f on end to allow fragmentation)
1470
1470 (1498 MTU DF=1)
..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Must be between 20 and 65535 (add f on end to allow fragmentation)
1472
1472 (1500 MTU DF=1)
..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Must be between 20 and 65535 (add f on end to allow fragmentation)
1473
On size 1473 (1501 MTU dfrag=1) sender failed to send with error Message too long code 90
1473f
1472f
1472 (1500 MTU DF=0)
..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................^C~ #
~ # exit
ops@ops-mac-mini ~ % nc -u bouncer.remote.it 9999
1472
1472 (1500 MTU DF=1)
..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
Must be between 20 and 65535 (add f on end to allow fragmentation)
1473
On size 1473 (1501 MTU dfrag=1) sender failed to send with error Message too long code 90
1473f
1473 (1501 MTU DF=0)
..........................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................
ops@ops-mac-mini ~ %
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note in this case, when we connect to a server located at bouncer.remote.it using netcat and you hit return after entering the netcat command, the terminal console waits for you to enter something. In the above example, we asked the server to send packets of length 1770, 17, 1470, 1472, 1473, 1473f (the f flag sets DF=0), 1472f, 1472, 1473, 1473f, as we probed the path to determine the MTU.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Docker?
&lt;/h2&gt;

&lt;p&gt;Docker allows you to package and run an application in a loosely isolated secure environment called a container. The isolation and security allow you to run many containers simultaneously on a single host. Containers are lightweight and possess everything needed to run the application, so you do not need to rely on anything installed on the host. You can share containers with anyone and ensure that the same container that works in the same way everywhere.&lt;/p&gt;

&lt;p&gt;Docker is written in the Go and takes advantage of several features of the Linux kernel to perform its functions. For example, Docker uses a technology called namespaces to provide the isolated workspace that forms the container. When you run a container, Docker creates a set of namespaces for each container.&lt;/p&gt;

&lt;p&gt;Docker thus has some characteristics that are inherited from Linux and some characteristics that are determined by or inherited from the host OS, in our case macOS. This “split personality”, can cause problems and this article describes one of problems.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why use Remote.It with Docker?
&lt;/h2&gt;

&lt;p&gt;Remote.It is a powerful network connection tool. Remote.It can connect any two hosts or devices using a peer-peer connection with an agent on each host. Remote.It can also connect using a web-based tool and a proxy to any target host, using a single agent on the target host.&lt;/p&gt;

&lt;p&gt;Remote.It can be used to connect containers within a host, containers in different hosts on the same network, containers on different networks, or even containers in different data centers, for example.&lt;/p&gt;

&lt;p&gt;As an example of a network connection that would be difficult to create by other methods, suppose container 1 has a default private IP address  172.17.0.1 and container 2 also has the same default IP address  172.17.0.1. Remote.It allows you to connect these two containers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker asymmetric MTU
&lt;/h2&gt;

&lt;p&gt;If we run Remote.It in a Docker container running on macOS we see the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Connected to ID user@remote.it - f3:25:9f:01:33:b9:f1:ed at 192.168.2.21:37020
Session Max Packet Detected 1450 (MTU) Max Data Tunnel Size 1386 bytes.
Session Max Packet Received 1500 (MRU) Max Data Tunnel Size 1436 bytes.
last packet from Session peer 0 seconds ago
retry at count 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that we have an asymmetric MTU: the container has an MTU of 1450 bytes (allowing to a tunnel payload of 1386 bytes with a header and encryption overhead of 64 bytes) but an MRU of 1500 bytes (with the same 64-byte overhead).&lt;/p&gt;

&lt;p&gt;The asymmetric MTU was discovered using the DF bit. Without support for the DF bit the discovery of MTU and asymmetric MTU, or different MTU and MRU, would be very difficult. As outlined earlier, you also can contend with the support of the DF bit in a macOS Docker container.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;We described the problem we found with the support of the DF bit in a macOS Docker container. We also described MTU, how a path could have asymmetric MTU, and an example of an asymmetric MTU situation in a Docker container, and why it is important to support the DF bit in order to discover MTU and asymmetric MTU/MRU. We described how to discover an asymmetric MTU using Remote.It and the use of &lt;a href="https://github.com/remoteit/MTU_Bouncer"&gt;MTU Bouncer&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>opensource</category>
      <category>productivity</category>
      <category>devops</category>
    </item>
    <item>
      <title>Open source tool for determining MTU values in Docker containers</title>
      <dc:creator>Brenda Strech</dc:creator>
      <pubDate>Wed, 21 Dec 2022 16:12:39 +0000</pubDate>
      <link>https://dev.to/remoteit/open-source-tool-for-determining-mtu-values-in-docker-containers-5m9</link>
      <guid>https://dev.to/remoteit/open-source-tool-for-determining-mtu-values-in-docker-containers-5m9</guid>
      <description>&lt;p&gt;This article provides a basic overview of how Remote.It's open source tool may be used to discover problems with MTU (maximum transmission unit). Did you know MTU values can by asymmetrical? Do you know how to test for this within your Docker network?  Remote.It has written a tool to help identify these issues.&lt;/p&gt;

&lt;h2&gt;
  
  
  Docker asymmetric MTU
&lt;/h2&gt;

&lt;p&gt;If we run Remote.It or other services in a Docker container running on macOS we see the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Connected to ID user@remote.it - f3:25:9f:01:33:b9:f1:ed at 192.168.2.21:37020
Session Max Packet Detected 1450 (MTU) Max Data Tunnel Size 1386 bytes.
Session Max Packet Received 1500 (MRU) Max Data Tunnel Size 1436 bytes.
last packet from Session peer 0 seconds ago
retry at count 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that we have an asymmetric MTU: the container has an MTU of 1450 bytes (allowing for a tunnel payload of 1386 bytes with a header and encryption overhead of 64 bytes) but an MRU of 1500 bytes (with the same 64-byte overhead). In this case, Remote.It has discovered the MTU by sending packets of various lengths. The discovery is a step-by-step process and Remote.It stops when it has found a packet length that works. The discovery algorithm is granular in that Remote.It may stop a few bytes before the actual MTU. If we run a test program and exhaustively search for the exact MTU, we find the Docker MTU on macOS is 1478 bytes (with a UDP data payload of1450 bytes)&lt;/p&gt;

&lt;p&gt;Now, If we run Remote.It on the macOS machine we see the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Session List
session index 1 of id 0x558C1B10794B03B05571579018B7AB4433F4DD9A is in state 3 encrypt type 3
using spi is 0x33F4DD9A
Connected to ID user@remote.it - 80:00:01:7f:7e:03:c7:3c at 10.60.0.3:63804
Session Max Packet Detected 1500 (MTU) Max Data Tunnel Size 1436 bytes.
Session Max Packet Received 1500 (MRU) Max Data Tunnel Size 1436 bytes.
Session at 19 seconds of 7200 seconds max life
last packet from Session peer 5 seconds ago
retry at count 0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we see the full symmetric MTU of 1500 bytes. Note: This connection was made using chacha20 encryption. If we had used a lighter weight encryption, we might see Tunnel Size 1450 bytes.&lt;/p&gt;

&lt;p&gt;Looking at the Docker interface on the container running inside macOS, we see the following:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;~ # ifconfig
eth0    Link encap:Ethernet  HWaddr 02:42:AC:11:00:02
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:34808 errors:0 dropped:0 overruns:0 frame:0
          TX packets:40066 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:16585975 (15.8 MiB)  TX bytes:9236031 (8.8 MiB)lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:1 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:151 (151.0 B)  TX bytes:151 (151.0 B)~ #
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The container thinks the MTU is 1500 bytes. Without further information, we would think the MTU is symmetric but we have seen above that it is not.&lt;/p&gt;

&lt;h2&gt;
  
  
  Wireshark
&lt;/h2&gt;

&lt;p&gt;If we look at the packets on the wire using Wireshark for example we can see the MTU. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5MpBQd0b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7ph6jqwhz4zy2z4deh99.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5MpBQd0b--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7ph6jqwhz4zy2z4deh99.png" alt="Wireshark packet inspection" width="880" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  MTU Bouncer &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Remote.It has written and released an open source tool called MTU Bouncer to allow you to check for asymmetric MTU. MTU Bouncer sends a UDP packet back to you with a given length.&lt;/p&gt;

&lt;p&gt;See &lt;a href="https://github.com/remoteit/MTU_Bouncer"&gt;https://github.com/remoteit/MTU_Bouncer &lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is sample output from running MTU Bouncer:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Home-MacBook-Pro:~ user$ nc -u bouncer.remote.it 9999
17
17 (45 MTU)
...Must be between 16 and 1472
^CHome-MacBook-Pro:~ user$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bouncer uses UDP, so you will have to send response, even a null character, to allow Bouncer know your IP address. So, when you hit return after entering the netcat command, the terminal console will wait for you to enter the response. In the above case, we entered 17 to request Bouncer to send a UDP packet of length 17 with DF=1 (You can also set DF=0, meaning that the bit is not set).&lt;/p&gt;

&lt;h2&gt;
  
  
  What is MTU? &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;The OSI model consists of seven abstract layers: Physical, Data link, Network, Transport, Session, Presentation, and Application. The Physical layer may be Ethernet, for example. Ethernet carries frames that carry the packets.&lt;/p&gt;

&lt;p&gt;There is a limit on the size of the Ethernet frame that typically limits the size of data to 1500 bytes. This limit of the link layer is called the MTU, maximum transmission unit.&lt;/p&gt;

&lt;p&gt;If the IP layer has a datagram to send, and the datagram is larger than the link layer's MTU, IP performs fragmentation, breaking the datagram up into smaller pieces called fragments so that each fragment is smaller than the MTU.&lt;/p&gt;

&lt;p&gt;When two hosts on one network communicate with each other, there is a single network MTU. When two hosts communicate using multiple networks, each link can have a different MTU. The important numbers are not the MTUs of the two networks to which the two hosts are connected, but the smallest MTU of any data link that packets traverse between the two hosts. The smallest network MTU is called the path MTU.&lt;/p&gt;

&lt;p&gt;RFC 1191 [Mogul and Deering 1990] specifies the path MTU discovery mechanism, a way to determine the path MTU at any time.&lt;/p&gt;

&lt;p&gt;The path MTU between any two hosts is not necessarily constant and may depend on the route being used at any time. Routing need not be symmetric so that the route from A to B may not be the route from B to A, and thus the path MTU need not be the same in both directions. In that case the MRU or maximum receive unit may not be the same as the MTU.&lt;/p&gt;

&lt;p&gt;A network with an asymmetric MTU is the situation the focus of this article.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Docker? &lt;a&gt;&lt;/a&gt;
&lt;/h2&gt;

&lt;p&gt;Docker allows you to package and run an application in a loosely isolated secure environment called a container. The isolation and security allows you to run many containers simultaneously on one host. Containers are lightweight and contain everything needed to run the application, so you do not need to rely on what is currently installed on the host. You can easily share containers, and be sure that everyone you share with gets the same container that works in the same way.&lt;/p&gt;

&lt;p&gt;A container is a runnable instance of an image. You can create, start, stop, move, or delete a container using the Docker API or CLI. You can connect a container to one or more networks, attach storage to it, or even create a new image based on its current state.&lt;/p&gt;

&lt;p&gt;Docker is written in the Go programming language and takes advantage of several features of the Linux kernel to deliver its functionality. Docker uses a technology called namespaces to provide the isolated workspace called the container. When you run a container, Docker creates a set of namespaces for that container.&lt;/p&gt;

&lt;p&gt;These namespaces provide the layer of isolation. Each aspect of a container runs in a separate namespace and its access is limited to that namespace.&lt;/p&gt;

&lt;p&gt;One of the reasons Docker containers and services are so powerful is that you can connect them together, or connect them to non-Docker workloads. Docker containers and services do not even need to be aware that they are deployed on Docker, or whether their peers are also Docker workloads or not. Whether your Docker hosts run Linux, Windows, or a mix of the two, you can use Docker to manage them in a platform-agnostic way. &lt;/p&gt;

&lt;h2&gt;
  
  
  Why use Remote.It with Docker?
&lt;/h2&gt;

&lt;p&gt;Remote.It is a powerful connection tool that can connect any two hosts or devices using a peer-peer connection with an agent on each host. Remote.It can also connect using a web-based tool and a proxy to any target host, using a single agent on the target host.&lt;/p&gt;

&lt;p&gt;Developers can be used to connect containers within a host, containers in different hosts on the same network, containers on different networks, or even containers in different data centers for example.&lt;/p&gt;

&lt;p&gt;Suppose container 1 has a default IP address  172.17.0.1 and container 2 also has a default IP address  172.17.0.1. Remote.It allows you to connect these two containers.&lt;/p&gt;

&lt;h2&gt;
  
  
  Summary
&lt;/h2&gt;

&lt;p&gt;We have described MTU, how a path can have asymmetric MTU and an example of an asymmetric MTU situation in a Docker container. We described how to discover an asymmetric MTU using Remote.It and the use of MTU Bouncer.&lt;/p&gt;

&lt;p&gt;Learn more about &lt;a href="//www.remote.it/resources/a-remote-it-connection-how-are-they-made"&gt;how Remote.It makes connections&lt;/a&gt; by reading this article.&lt;/p&gt;

</description>
      <category>docker</category>
      <category>opensource</category>
      <category>devops</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Is your MySQL server open to the public internet?</title>
      <dc:creator>Brenda Strech</dc:creator>
      <pubDate>Thu, 21 Jul 2022 00:17:00 +0000</pubDate>
      <link>https://dev.to/remoteit/is-your-mysql-server-open-to-the-public-internet-30i</link>
      <guid>https://dev.to/remoteit/is-your-mysql-server-open-to-the-public-internet-30i</guid>
      <description>&lt;p&gt;According to an &lt;a href="https://www.shadowserver.org/news/over-3-6m-exposed-mysql-servers-on-ipv4-and-ipv6/"&gt;article by Shadowserver foundation&lt;/a&gt;, there were 2.3 million MySQL server instances on port 3306 that were scanned and found accessible worldwide. I was really surprised by the large number and am pretty certain that most people didn't do this on purpose.&lt;/p&gt;

&lt;p&gt;First, let’s talk about the reason why having your MySQL (or any port) accessible on the public internet is an attack surface. Any port which is accessible on a public IP address will be scanned, this is a fact. Once a port has been scanned and found that there is a service responding, then the attacks will begin. These will include brute force attacks of username/password combinations, known exploits of OS and applications, various other known Common Vulnerabilities and Exposures, and new hacks are being developed constantly.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mitigation
&lt;/h2&gt;

&lt;p&gt;Here are the common things people do to attempt to remove the risk.&lt;/p&gt;

&lt;h3&gt;
  
  
  Add a VPN
&lt;/h3&gt;

&lt;p&gt;You could add a VPN to allow access to the MySQL server to allow you to close the external port on the public IP address. &lt;/p&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;You got your MySQL port off the public internet and you can do the same for other resources&lt;/li&gt;
&lt;li&gt;You can manage the users who need access centrally&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Trading one public IP address and port for another. &lt;/li&gt;
&lt;li&gt;Can be expensive&lt;/li&gt;
&lt;li&gt;Some MySQL databases only have a public endpoint such as an AWS RDS MySQL setup for public access.  VPNs can't solve this problem.&lt;/li&gt;
&lt;li&gt;Authenticated VPN users still can see all of the resources tied to the VPN even though they are not authorized to use all of them&lt;/li&gt;
&lt;li&gt;Subnet Collision can render this solution untenable.
You can end up with some headaches down the road, especially when you are in the cloud and have multiple VPCs with resources you need to access simultaneously. For example, you have a developer who needs to access MySQL, Redis, RDS Postgres, DynamoDB, etc at the same time, but they are on different VPCs with subnet collision (CIDRs which are the same). Your VPN client will not work in this situation&lt;/li&gt;
&lt;li&gt;You may need public access for some users and resources. In this case you will need to have an access list.  Now you are maintaining both a VPN and an allow list. This would be the case for a contractor. &lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Use IP allow lists
&lt;/h3&gt;

&lt;p&gt;Another option is to manage an IP allow list to prevent port scanners from detecting the port. This can be an additional step to adding a VPN to prevent the VPN port from being detected.&lt;/p&gt;

&lt;p&gt;Pros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Only requests originating from the list of IP addresses that are allowed will be able to detect the port and connect&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Cons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;These lists are hard to maintain since you will need these security group definitions in many places when you are deployed to multiple VPC and/or Cloud Vendors&lt;/li&gt;
&lt;li&gt;Hard to ensure that the IP address you allowed is static to a user/resource. For example, a cellular hotspot dynamic IP&lt;/li&gt;
&lt;li&gt;User onboarding and offboarding is often incomplete, leaving a potential attack vector.&lt;/li&gt;
&lt;li&gt;As users change locations or their IP address gets reassigned and the authorized user needs to wait for DevOps to update the rules resulting in productivity and time loss.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The above solutions are not Zero Trust Network Architecture where you are giving each user access to only the resources to which they are authorized. Least privileges possible.&lt;/p&gt;

&lt;h3&gt;
  
  
  Use Remote.It
&lt;/h3&gt;

&lt;p&gt;Remote.It allows you to close the open port while still allowing your people and resources access. When you connect to a resource such as MySQL via Remote.It, you will be given a localhost address and a unique port. You can use this in your development environment connection configuration, database query tools, etc. There is no connecting, disconnecting, and reconnecting when you change locations or your laptop wakes up from sleep. These on demand connections will go idle when you are not actively using it and go active when you do.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Easy to install

&lt;ul&gt;
&lt;li&gt;Simple one line install for most resources&lt;/li&gt;
&lt;li&gt;Works in the cloud (AWS, Azure, Google Cloud) as well as on-prem servers.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Easy to implement

&lt;ul&gt;
&lt;li&gt;Use the organization feature to create tags on your resources&lt;/li&gt;
&lt;li&gt;Create roles to define your member permissions (including filtering by tags)&lt;/li&gt;
&lt;li&gt;Add members to your organization by email address&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;Easy to maintain in one central location for all of your resources&lt;/li&gt;
&lt;li&gt;Easy to audit (Logs are available for connections to your resources)&lt;/li&gt;
&lt;li&gt;Can manage this via a Desktop UI or graphQL API&lt;/li&gt;
&lt;li&gt;You can also roll this out gradually without needing to do a big switch.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Is your MySQL server exposed?
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://link.remote.it/remoteit-mysql-portscanner"&gt;Use our tool&lt;/a&gt; to see if your MySQL server is exposed.&lt;/p&gt;

&lt;p&gt;If your MySQL server is exposed, consider implementing the mitigations listed above. The recommendations can be used together. Remote.It accounts are free for up to 5 endpoints.&lt;/p&gt;

&lt;p&gt;We support these popular cloud providers:&lt;br&gt;
&lt;a href="https://link.remote.it/documentation-aws/overview"&gt;AWS&lt;/a&gt;&lt;br&gt;
&lt;a href="https://link.remote.it/documentation-azure/overview"&gt;Azure&lt;/a&gt;&lt;br&gt;
&lt;a href="https://link.remote.it/documentation-gcp/overview"&gt;Google Cloud&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Have a self-hosted database? We support that as well with options for Windows and Linux distributions.&lt;br&gt;
&lt;a href="https://link.remote.it/connectivity/getting-started"&gt;Learn more about Remote.It and get started&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you have any questions, comment below or drop us a line at &lt;a href="//mailto:support@remote.it"&gt;support@remote.it&lt;/a&gt;&lt;/p&gt;

</description>
      <category>mysql</category>
      <category>security</category>
      <category>devops</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Solve Your Cloud Access Problems In Less Than 5 Minutes</title>
      <dc:creator>Brenda Strech</dc:creator>
      <pubDate>Tue, 28 Jun 2022 22:29:56 +0000</pubDate>
      <link>https://dev.to/remoteit/solve-your-cloud-access-problems-in-less-than-5-minutes-298c</link>
      <guid>https://dev.to/remoteit/solve-your-cloud-access-problems-in-less-than-5-minutes-298c</guid>
      <description>&lt;h2&gt;
  
  
  Spend time developing, not managing
&lt;/h2&gt;

&lt;p&gt;There are many challenges that cloud developers face today and many revolve around quick, simple, and consistent access to the cloud resources such as databases. As a developer, you want to build software, not spend your time dealing with setting up your development environment.&lt;/p&gt;

&lt;p&gt;Whether you are using an existing database or creating a new one, the process can be painful and take a lot of time. You want to make sure your data is accessible but also private, but sometimes you may be making choices that compromise one goal or the other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Maintaining “developer” databases to run locally:&lt;/strong&gt; To stay productive, you may use a database that allows a developer to run a database server locally. The scripts to set up the database must be maintained and only have a small sample of example data. The more database types you need the more CPU, memory and storage the developer laptop needs, for example postgreSQL, MySQL, redis, etc. Such a model is not a full-scale representation of the real-world environment and that makes it difficult to reproduce, debug, or test fixes. Deploying debug versions of your application so you can reproduce an issue with extra logging is time consuming.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Making copies of production databases to run locally:&lt;/strong&gt;  This can put a strain on your laptop, you may have a database that is just too big to run locally, or your data contains PII or other sensitive data that should not be on a  laptop.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IP allow lists:&lt;/strong&gt; You need to hide your open ports on public IP addresses and ports such as 3306 for MySQL, or you open your port for attacks. You can try and use IP lists and security groups, but the problem is that you need to maintain these lists in each environment. As a developer, this can mean access is complicated by the manual process of adding your IP address, or if you move location or work from home where you may not have a fixed external IP address, you are faced with repeated requests to devops to update the access rules. This process can introduce security risks when you don’t remove invalid IP addresses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Using VPNs:&lt;/strong&gt; VPNs become more and more complicated and limiting as you expand to multi-cloud or multiple VPCs and accounts that lead  to subnet collisions. Such a problem may mean you can only connect to one VPN at a time. You may still end up with an open port that you may try to hide with IP allow lists that are maintained at each location where a VPN is used. We know that VPNs are not as secure as once thought.&lt;/p&gt;

&lt;p&gt;All of these issues make on-boarding and off-boarding new developers or contractors much more time intensive tasks, resulting in less time developing or making sure that access is cut off when a contractor or developer leaves. &lt;/p&gt;

&lt;p&gt;What if you could have the benefits of access to your cloud resources without any of those problems?&lt;/p&gt;

&lt;h2&gt;
  
  
  The Solution
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.remote.it/"&gt;Remote.It&lt;/a&gt; enables remote development, staging, and production resources to be directly available as if they are running directly on the developer's local machine.  You can start coding independent of your location and multi or hybrid cloud environments.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deployment is quick and easy:&lt;/strong&gt;  Taking away all of these hassles (Setup typically takes 5 minutes or less). &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Access can be granted and removed centrally:&lt;/strong&gt; With the Organization Management feature, access can be granted specifically by resource, unlike a VPN where you technically get access to the entire LAN. You can create roles that have specific permissions and assign the roles to members of the development team based on their need for access. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Add SAML integration:&lt;/strong&gt; Where login credentials are controlled by your SAML provider, you just simply manage the role of the user. User management can be handled by either the Desktop Application, Web Portal, or GraphQL API. This creates Zero Trust Network Access (ZTNA).&lt;/p&gt;

&lt;p&gt;When you connect to a resource such as MySQL via &lt;a href="https://www.remote.it/"&gt;Remote.It&lt;/a&gt;, you will be given a localhost address and a unique port. You can use this in your development environment connection configuration, database query tools, etc. There is no connecting, disconnecting, and reconnecting when you change locations or your laptop wakes up from sleep. These on demand connections will go idle when you are not actively using it and go active when you do.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup&lt;/strong&gt;&lt;br&gt;
Setup will be creating a VM which will act as a jump box to reach your database resources, registering it in Remote.It, and then adding the services (access endpoints for the resources).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;You will need:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Remote.It Desktop Application (version 3.5.2 or greater)&lt;/li&gt;
&lt;li&gt;A Remote.It account&lt;/li&gt;
&lt;li&gt;AWS console access to the account which can access the VPC where the database(s) reside&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Example provided here is for AWS, but is similar for Google Cloud and Azure.&lt;/p&gt;

&lt;p&gt;Follow along using this &lt;a href=""&gt;video&lt;/a&gt; or the written directions on &lt;a href="https://link.remote.it/docs/aws"&gt;Zero-Trust AWS Access&lt;/a&gt; &amp;amp; &lt;a href="https://link.remote.it/docs/rds-setup"&gt;AWS RDS (Postgres and MySQL)&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/3okGzFS1AbU"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Launch and register your Jump VM.&lt;/strong&gt;&lt;br&gt;
After signing in to the account and selecting the region where your database is hosted, launch a new instance from the EC2 dashboard. (You can leave the instance type at t2.micro).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Key Pair:&lt;/strong&gt; Select an existing one for your account or create a new one. This is used for SSH access to this instance.&lt;br&gt;
&lt;strong&gt;Network Setting:&lt;/strong&gt; You can create a new security group and deselect SSH. This will ensure no exposed external ports. Don’t worry you can still access SSH from Remote.It.&lt;br&gt;
&lt;strong&gt;Open Advanced Settings:&lt;/strong&gt; We will be entering the one-line command into the User data field&lt;/p&gt;

&lt;p&gt;Open Remote.It and get your one-line command:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nffE0vFz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lmlk6sruj97tjmky8u1b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nffE0vFz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lmlk6sruj97tjmky8u1b.png" alt="Add your cloud device" width="822" height="527"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Iz0N5A-E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/brcsboe78phi16r4dk0u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Iz0N5A-E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/brcsboe78phi16r4dk0u.png" alt="AWS Registration Code" width="858" height="552"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the "User data", field enter #!/bin/sh + return and your copied command&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o_wYZaTR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5n21l2p90zdw26sjew9g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o_wYZaTR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5n21l2p90zdw26sjew9g.png" alt="Enter #!b/bin//sh and your copied command" width="880" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click “Launch Instance”&lt;br&gt;
Once the instance initializes, it will automatically appear in your Remote.It desktop with an SSH service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Add service endpoints for your database(s).&lt;/strong&gt;&lt;br&gt;
Get your internal endpoint address or internal IP address for your database (Example of MySQL at AWS show below)&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cTcWIPOg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rkrqg1odylqbcshnbe2e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cTcWIPOg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rkrqg1odylqbcshnbe2e.png" alt="Get your internal endpoint address or IP address" width="880" height="653"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click “Add Service” and enter required information&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6zb1-dCy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lp0t7ui2bn7u0kpbmsxj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6zb1-dCy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lp0t7ui2bn7u0kpbmsxj.png" alt='Click plus icon to "Add Service"' width="880" height="560"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Save.&lt;br&gt;
In a couple of moments, you will be able to connect to the service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Create your org and/or add your team members (optional).&lt;/strong&gt;&lt;br&gt;
Remote.It provides a couple of different options to manage access to your resources  which even includes limiting access to specific services.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://link.remote.it/support/organizations"&gt;Learn more about organizations&lt;/a&gt;&lt;br&gt;
&lt;a href="https://link.remote.it/docs/sharing"&gt;Learn more about sharing&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usage&lt;/strong&gt;&lt;br&gt;
Now that you have &lt;a href="https://www.remote.it/"&gt;Remote.It&lt;/a&gt; set up, create the connection(s) you need. Remote.It will provide an address and port that resolves to localhost. Use this in your tools such as MySQL Workbench, PGAdmin, or in your IDE development environment variables where you normally put the address. The address is unique to you, but will be ready on demand whenever you use them. Try switching networks where your public IP changes. This connection is resilient to those changes and doesn’t require a VPN, but you have the confidence that the port(s) are not on the public internet.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/BAUqFAHpWc4"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;For more information about how to use &lt;a href="https://www.remote.it/"&gt;Remote.It&lt;/a&gt;, check out the support documentation &lt;a href="https://link.remote.it/support/remote-it-overview"&gt;here&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>productivity</category>
      <category>developer</category>
      <category>database</category>
    </item>
  </channel>
</rss>
