<?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: Melissa</title>
    <description>The latest articles on DEV Community by Melissa (@melnet).</description>
    <link>https://dev.to/melnet</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4179132%2F5b60383e-acb0-4ca6-aacc-06f409cae260.png</url>
      <title>DEV Community: Melissa</title>
      <link>https://dev.to/melnet</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/melnet"/>
    <language>en</language>
    <item>
      <title>ssh from 3 places: Why TinyCore inside Oracle VM worked when PuTTY and PowerShell didn't</title>
      <dc:creator>Melissa</dc:creator>
      <pubDate>Wed, 14 Oct 2026 13:03:15 +0000</pubDate>
      <link>https://dev.to/melnet/ssh-from-3-places-why-tinycore-inside-oracle-vm-worked-when-putty-and-powershell-didnt-4n4b</link>
      <guid>https://dev.to/melnet/ssh-from-3-places-why-tinycore-inside-oracle-vm-worked-when-putty-and-powershell-didnt-4n4b</guid>
      <description>&lt;p&gt;VyOS SSH - L4 Handshake vs L7 Banner / Keys / Auth&lt;/p&gt;

&lt;p&gt;VyOS eth0 (LAN) = 192.168.56.101&lt;br&gt;
VyOS eth1 (WAN) = 10.0.3.15&lt;/p&gt;

&lt;p&gt;1) SSH FROM PowerShell&lt;/p&gt;

&lt;p&gt;A. While SSH DISABLED:&lt;br&gt;
   Error: ssh: connect to host 192.168.56.101 port 22: Connection timed out&lt;/p&gt;

&lt;p&gt;B. Pre-checks (disabled):&lt;br&gt;
   nmap -p 22 VyOS_IP = NA&lt;br&gt;
   ncat -v VyOS_IP 22 =NA&lt;br&gt;
   Keys? = NA&lt;/p&gt;

&lt;p&gt;C. Pre-checks (after enable):&lt;br&gt;
   nmap = NA&lt;br&gt;
   ncat banner = NA&lt;br&gt;
   Keys = NA&lt;/p&gt;

&lt;p&gt;D. Login test (only if pre-checks green):&lt;br&gt;
   ssh user@VyOS_IP =&lt;br&gt;
   Result = NA&lt;/p&gt;

&lt;p&gt;Conclusion:&lt;br&gt;
L3/L4 Testing Limitation – Windows Host to VyOS LAN (192.168.56.101)&lt;/p&gt;

&lt;p&gt;Objective: Verify SSH (TCP 22) access to VyOS LAN interface from Windows PowerShell using Test-NetConnection, nmap, and ncat.&lt;/p&gt;

&lt;p&gt;Result: N/A – Failure at L3 (not L4)&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;L3 Test from Windows PowerShell (PS C:\Windows\system32&amp;gt;):
ping 192.168.56.101
-&amp;gt; Request timed out. 100% loss (4/4)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Test-NetConnection 192.168.56.101 -Port 22&lt;br&gt;
   -&amp;gt; TcpTestSucceeded : False / No response&lt;/p&gt;

&lt;p&gt;C:\Program Files (x86)\Nmap\nmap.exe -p 22 192.168.56.101&lt;br&gt;
   -&amp;gt; No output / hang – port state filtered (no L3 response)&lt;/p&gt;

&lt;p&gt;ncat -v 192.168.56.101 22&lt;br&gt;
   -&amp;gt; No connection&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;L3 Test from VyOS:&lt;br&gt;
ping 192.168.56.1 (Windows Host-Only adapter)&lt;br&gt;
-&amp;gt; Destination Host Unreachable&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Root Cause:&lt;br&gt;
VirtualBox &amp;gt; VyOS &amp;gt; Settings &amp;gt; Network &amp;gt; Adapter 1 (eth0)&lt;br&gt;
Current: Attached to: Internal Network&lt;br&gt;
Required for Windows access: Attached to: Host-Only Adapter&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Internal Network mode intentionally excludes the Windows host by design.&lt;br&gt;
   Therefore Windows can never reach Oracle VM at L3, so L4/L7 SSH tests from PowerShell are impossible.&lt;/p&gt;

&lt;p&gt;Changing Adapter 1 to Host-Only Adapter is blocked – OK button greyed out while VM is running. Creating a new Host-Only adapter in VirtualBox Network Manager fails on this host. Powering off to change risks DHCP change of LAN/WAN IPs.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Conclusion:
L3 unreachable between Windows and Oracle VM.
Therefore L4 port 22 and L7 SSH app tests from PowerShell are N/A.
This is a Windows/VirtualBox boundary issue, not a VyOS ssh service failure.
Demonstrates effective isolation of management plane. SSH was verified locally on VyOS via show configuration and ss -tlnp.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2) SSH FROM PuTTY&lt;/p&gt;

&lt;p&gt;A. While SSH DISABLED:&lt;br&gt;
   Error popup: [ ]  NA&lt;/p&gt;

&lt;p&gt;B. Pre-checks (disabled):&lt;br&gt;
   nmap (from PowerShell) = NA&lt;br&gt;
   ncat (from PowerShell) = NA&lt;/p&gt;

&lt;p&gt;C. Pre-checks (after enable):&lt;br&gt;
   nmap = NA&lt;br&gt;
   ncat = NA&lt;/p&gt;

&lt;p&gt;D. Login test (only if green):&lt;br&gt;
   PuTTY connection type: SSH, port 22&lt;br&gt;
   Result / auth: NA&lt;/p&gt;

&lt;p&gt;Conclusion:&lt;/p&gt;

&lt;p&gt;PuTTY SSH Test to VyOS LAN – Not Tested&lt;/p&gt;

&lt;p&gt;PuTTY test to 192.168.56.101:22 – Not performed / Not Applicable.&lt;/p&gt;

&lt;p&gt;Reason: See PowerShell L3 failure section. Windows host has no Layer 3 connectivity to Oracle VM VyOS LAN (eth0 attached to Internal Network, not Host-Only Adapter).&lt;/p&gt;

&lt;p&gt;ping 192.168.56.101 = Request timed out (100% loss)&lt;br&gt;
ping 192.168.56.1 from VyOS = Destination Host Unreachable&lt;/p&gt;

&lt;p&gt;PuTTY requires L3 to establish TCP 22. As L3 is down at the Windows/VirtualBox boundary, any PuTTY attempt would timeout without ever reaching VyOS ssh service. Test would be irrelevant.&lt;/p&gt;

&lt;p&gt;3) SSH FROM TinyCore VM inside Oracle VM&lt;/p&gt;

&lt;p&gt;A. While SSH DISABLED:&lt;br&gt;
   Error: ssh not found&lt;/p&gt;

&lt;p&gt;B. Pre-checks (disabled):&lt;br&gt;
   nmap -p 22 VyOS_IP = NA&lt;br&gt;
   ncat -v VyOS_IP 22 = NA&lt;br&gt;
   Keys? =&lt;/p&gt;

&lt;p&gt;C. Pre-checks (after enable):&lt;br&gt;
   nmap = NA&lt;br&gt;
   ncat banner = NA&lt;br&gt;
   Keys = NA&lt;/p&gt;

&lt;p&gt;D. Login test (only if green):&lt;br&gt;
   ssh user@VyOS_IP =&lt;br&gt;
   Result = NA&lt;/p&gt;

&lt;p&gt;TinyCore VM - Connectivity Tests to VyOS LAN (192.168.56.101)&lt;/p&gt;

&lt;p&gt;L4 Tooling Issue on TinyCore:&lt;/p&gt;

&lt;p&gt;I wanted to do an L4 port check from TinyCore to VyOS.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;nmap - Attempted install via:&lt;br&gt;
tce-load -wi nmap.tcz&lt;br&gt;
Failed to install on the base TinyCore image.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;em&gt;Alternative L4 tool: ss&lt;/em&gt; - The tool you suggested in this chat, sudo ss -tlnp, was tried as an alternative to nmap. This also did not work as an L4 probe from the TinyCore side due to TinyCore's minimal base install.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;As a result, we used ping for L3 and the ssh client itself as the L4 test.&lt;/p&gt;

&lt;p&gt;L3 - Ping to VyOS LAN - SUCCESSFUL:&lt;br&gt;
ping 192.168.56.101&lt;br&gt;
Result: 3 packets transmitted, 3 received, 0% packet loss - L3 is up.&lt;/p&gt;

&lt;p&gt;L4 - SSH from TinyCore while SSH is DISABLED on VyOS:&lt;br&gt;
ssh &lt;a href="mailto:vyos@192.168.56.101"&gt;vyos@192.168.56.101&lt;/a&gt;&lt;br&gt;
Error message:&lt;br&gt;
ssh: connect to host 192.168.56.101 port 22: Connection refused&lt;br&gt;
L4/L7 - SSH from TinyCore AFTER SSH was enabled on VyOS - FAILED:&lt;/p&gt;

&lt;p&gt;After enabling SSH on VyOS, the SSH attempt from TinyCore still did not succeed.&lt;br&gt;
ssh &lt;a href="mailto:vyos@192.168.56.101"&gt;vyos@192.168.56.101&lt;/a&gt;&lt;br&gt;
Error message:&lt;br&gt;
 - still Connection refused / timed out]&lt;br&gt;
Next Step: This failure, plus the observation that SSH doesn't appear to stay enabled on VyOS after a reboot/save, will be investigated in the next section on the VyOS VM.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;## ssh from TinyCore finally succeeded, read on for details:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The client was missing&lt;/p&gt;

&lt;p&gt;tc@box:~$ ssh -v &lt;a href="mailto:vyos@192.168.56.101"&gt;vyos@192.168.56.101&lt;/a&gt;&lt;br&gt;
-sh: ssh: not found&lt;/p&gt;

&lt;p&gt;TinyCore doesn't include SSH. The fix was one command:&lt;/p&gt;

&lt;p&gt;tce-load -wi openssh&lt;/p&gt;

&lt;p&gt;After that, the same ssh command connected. That was my first ever SSH - TinyCore .102 to VyOS .101. While checking the ARP table I also found 192.168.56.20 alive and pingable on the same host-only wire. Three hosts, not two.&lt;/p&gt;

&lt;p&gt;VyOS was innocent&lt;/p&gt;

&lt;p&gt;I suspected VyOS for hours, but sudo ss -tlnp src 192.168.56.101 showed the truth: sshd pid 4670 LISTEN 192.168.56.101:22. The daemon was waiting the whole time. I just had no client to call it with.&lt;/p&gt;

&lt;p&gt;Why VM-to-VM worked but PowerShell/PuTTY didn't&lt;/p&gt;

&lt;p&gt;Both VMs live inside VirtualBox Host-Only 192.168.56.0/24 - same L2 cable. TinyCore .102 to VyOS .101 needs no firewall. PowerShell/PuTTY from Windows has to go through the 192.168.56.1 host adapter and Windows Firewall, which blocks the path. Same listener, different door.&lt;/p&gt;

</description>
      <category>linux</category>
      <category>vyos</category>
      <category>networking</category>
      <category>ssh</category>
    </item>
    <item>
      <title>Why Scapy Instead of Ping? - Layer Locking</title>
      <dc:creator>Melissa</dc:creator>
      <pubDate>Mon, 12 Oct 2026 11:24:28 +0000</pubDate>
      <link>https://dev.to/melnet/why-scapy-instead-of-ping-layer-locking-4mbi</link>
      <guid>https://dev.to/melnet/why-scapy-instead-of-ping-layer-locking-4mbi</guid>
      <description>&lt;p&gt;Reason for layer locking: More accurate result.&lt;br&gt;
Operating systems are generic, Scapy frames are specific, so Scapy frames give troubleshooting accuracy.&lt;/p&gt;

&lt;p&gt;Environment: VyOS router in Oracle VM VirtualBox. &lt;/p&gt;

&lt;p&gt;LAYER 2 - Data Link Test&lt;/p&gt;

&lt;p&gt;Steps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Put listener on eth0 on VyOS&lt;/li&gt;
&lt;li&gt;Run Scapy frame&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Scapy frame to send (L2 broadcast - locks to L2):&lt;/p&gt;

&lt;p&gt;Layer 2 Lock Test - Pure L2 - VyOS eth0&lt;/p&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;from scapy.all import *&lt;br&gt;
p = Ether(dst="ff:ff:ff:ff:ff:ff")&lt;br&gt;
hexdump(p)&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;p&gt;0000  FF FF FF FF FF FF 00 00 00 00 00 00 90 00&lt;/p&gt;

&lt;p&gt;Breakdown:&lt;br&gt;
FF FF FF FF FF FF = dst - broadcast all MACs&lt;br&gt;
00 00 00 00 00 00 = src - zero - Scapy default when no MAC bound&lt;br&gt;
90 00 = type - Loopback - blank L2 frame&lt;/p&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;srp(p, iface="eth0", timeout=3)&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;p&gt;Begin emission:&lt;br&gt;
Finished sending 1 packets.&lt;br&gt;
Received 0 packets, got 0 answers, remaining 1 packets&lt;/p&gt;

&lt;p&gt;Result: L2 TX works - frame was put on wire, layer-locked, no IP.&lt;/p&gt;

&lt;p&gt;LAYER 3 - Network Layer Test&lt;/p&gt;

&lt;p&gt;L3 Test - Hardcoded MAC + Static IP - VyOS eth0&lt;/p&gt;

&lt;p&gt;Goal: Exclude DHCP and ARP to prove L3 TX.&lt;/p&gt;

&lt;p&gt;STEP 1 - Find MAC (Linux command)&lt;br&gt;
$ cat /sys/class/net/eth0/address&lt;br&gt;
08:00:27:bf:9a:64&lt;/p&gt;

&lt;p&gt;STEP 2 - Put static IP (VyOS config)&lt;br&gt;
configure&lt;br&gt;
set interfaces ethernet eth0 address 192.168.56.10/24&lt;br&gt;
commit&lt;br&gt;
save&lt;br&gt;
exit&lt;/p&gt;

&lt;p&gt;STEP 3 - Put listener in background (same terminal)&lt;br&gt;
$ sudo tcpdump -i eth0 -e -n icmp &amp;amp;&lt;br&gt;
[1] 3047&lt;br&gt;
tcpdump: listening on eth0, link-type EN10MB&lt;/p&gt;

&lt;p&gt;STEP 4 - Scapy - hardcode MAC and IP to kill ARP&lt;br&gt;
$ sudo python3&lt;/p&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;from scapy.all import *&lt;br&gt;
my_mac = "08:00:27:bf:9a:64"&lt;br&gt;
my_ip = "192.168.56.10"&lt;br&gt;
p = Ether(dst=my_mac, src=my_mac) / IP(dst=my_ip, src=my_ip) / ICMP()&lt;br&gt;
hexdump(p)&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;p&gt;0000 08 00 27 BF 9A 64 08 00 27 BF 9A 64 08 00 45 00..'.d..'.d..E.&lt;br&gt;
0010 00 1C 00 01 00 00 40 01 89 7B C0 A8 38 0A C0 &lt;a href="mailto:A8......@"&gt;A8......@&lt;/a&gt;..{..8...&lt;br&gt;
0020 38 0A 08 00 F7 FF 00 00 00 00 8.........&lt;/p&gt;

&lt;p&gt;Breakdown:&lt;br&gt;
08 00 27 BF 9A 64 = dst MAC = your eth0 (hardcoded)&lt;br&gt;
08 00 27 BF 9A 64 = src MAC = your eth0 (hardcoded)&lt;br&gt;
08 00 = Type = IPv4&lt;br&gt;
45 00 = IP version / header&lt;br&gt;
C0 A8 38 0A = hex for 192.168.56.10 src&lt;br&gt;
C0 A8 38 0A = hex for 192.168.56.10 dst&lt;br&gt;
08 00 = ICMP Echo Request&lt;/p&gt;

&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;srp(p, iface="eth0", timeout=3)&lt;/p&gt;
&lt;/blockquote&gt;


&lt;/blockquote&gt;

&lt;p&gt;Begin emission:&lt;br&gt;
Finished sending 1 packets.&lt;br&gt;
13:38:43.976853 08:00:27:bf:9a:64 &amp;gt; 08:00:27:bf:9a:64, ethertype IPv4 (0x0800), length 42: 192.168.56.10 &amp;gt; 192.168.56.10: ICMP echo request&lt;br&gt;
.&lt;br&gt;
Received 0 packets, got 0 answers, remaining 1 packets&lt;/p&gt;

&lt;p&gt;RESULT:&lt;br&gt;
L3 TX UP - Confirmed.&lt;br&gt;
tcpdump saw the frame on eth0 (line above), proving Layer 2 and Layer 3 headers were built correctly and transmitted with no DHCP/ARP.&lt;/p&gt;

&lt;p&gt;Received 0 is EXPECTED here because we pinged ourselves (src=dst). Linux routes self-pings via lo, not eth0, so no Echo Reply is generated on eth0. This is not L3 down.&lt;/p&gt;

&lt;p&gt;For full L3 up with reply, ping gateway 192.168.56.1 with its MAC, and srp will show "got 1 answers".&lt;/p&gt;

&lt;p&gt;LAYER 4 - Transport Layer Test&lt;/p&gt;

&lt;p&gt;L4 Test - UDP Port 50001&lt;/p&gt;

&lt;p&gt;Why put a listener on port 50001?&lt;/p&gt;

&lt;p&gt;We use 50001 because it is in the clean dynamic range 49152-65535. Nothing else on VyOS uses it, so there is no L5-L7 app interfering. If something arrives there, we know it is pure L4 Transport being tested. We also need a listener (nc -l -u -p 50001) otherwise the OS would drop the UDP and we would see nothing.&lt;/p&gt;

&lt;p&gt;The listener was run in one terminal as:&lt;br&gt;
sudo nc -l -u -p 50001 &amp;gt; /tmp/udp.txt &amp;amp;&lt;br&gt;
The frame we sent:&lt;/p&gt;

&lt;p&gt;L4 must be carried inside L3, so we still need an IP. We used loopback because we are sending from VyOS to itself:&lt;br&gt;
from scapy.all import *&lt;br&gt;
udp_clean = IP(dst="127.0.0.1")/UDP(dport=50001)/Raw(load="L4-TEST")&lt;br&gt;
send(udp_clean)&lt;br&gt;
Breakdown:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IP(dst="127.0.0.1") = L3 part - VyOS lo loopback&lt;/li&gt;
&lt;li&gt;/UDP(dport=50001) = L4 part - clean port&lt;/li&gt;
&lt;li&gt;/Raw(load="L4-TEST") = payload to prove delivery&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sent with:&lt;br&gt;
sudo python3 -c "from scapy.all import *; send(IP(dst='127.0.0.1')/UDP(dport=50001)/Raw(load='L4-TEST'), verbose=1)"&lt;br&gt;
The result:&lt;br&gt;
cat /tmp/udp.txt&lt;br&gt;
L4-TEST&lt;br&gt;
And tcpdump -i lo -n port 50001 showed the packet on lo.&lt;/p&gt;

&lt;p&gt;Conclusion: Payload L4-TEST was delivered to clean port 50001. No other service uses this port. This proves L4 UDP is UP.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>vyos</category>
      <category>scapy</category>
      <category>homelab</category>
    </item>
  </channel>
</rss>
