<?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>VyOS Homelab on Windows (Part 2 of N): Attaching the Host-Only Adapter to VyOS and SSHing a Python Script from PowerShell to Rename It</title>
      <dc:creator>Melissa</dc:creator>
      <pubDate>Mon, 02 Nov 2026 13:33:07 +0000</pubDate>
      <link>https://dev.to/melnet/vyos-homelab-on-windows-part-2-of-n-attaching-the-host-only-adapter-to-vyos-and-sshing-a-python-2af7</link>
      <guid>https://dev.to/melnet/vyos-homelab-on-windows-part-2-of-n-attaching-the-host-only-adapter-to-vyos-and-sshing-a-python-2af7</guid>
      <description>&lt;h1&gt;
  
  
  VyOS Homelab on Windows (Part 2 of N): Attaching the Host-Only Adapter to VyOS and SSHing a Python Script from PowerShell to Rename It
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;This follows on from my previous blog: 'How I finally pinged and SSHed to the VyOS in Oracle VM from powershell'&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;In that last blog I found a Host-Only Ethernet Adapter that Windows would actually accept without blocking it. If you are stuck with no ping, read that one first.&lt;/p&gt;

&lt;p&gt;Today was different. Today was about attaching that already-working adapter to the VyOS router itself, and proving I can send a Python script from PowerShell to configure it. The test for today was to rename the router to VyOS-R1.&lt;/p&gt;

&lt;p&gt;The bigger goal for this homelab is to test if I can SSH an OSPF config to an ISP router in Oracle VM later. Today's rename test proves the method will work.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. What I Did Today - Attach The Adapter
&lt;/h3&gt;

&lt;p&gt;The adapter Windows accepted is VirtualBox Host-Only Ethernet Adapter.&lt;/p&gt;

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

&lt;ol&gt;
&lt;li&gt;Power off VyOS VM&lt;/li&gt;
&lt;li&gt;VirtualBox &amp;gt; VyOS VM &amp;gt; Settings &amp;gt; Network&lt;/li&gt;
&lt;li&gt;Adapter 1: Enabled, Attached to: Host-only Adapter, Name: VirtualBox Host-Only Ethernet Adapter, Promiscuous Mode: Allow All VMs, Cable Connected: checked&lt;/li&gt;
&lt;li&gt;Adapter 2,3,4: Disabled for today&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Boot VyOS, login: vyos / vyos&lt;/p&gt;

&lt;p&gt;Then give eth0 an IP on that host-only network:&lt;/p&gt;

&lt;p&gt;configure&lt;br&gt;
set interfaces ethernet eth0 address 192.168.56.101/24&lt;br&gt;
set service ssh port 22&lt;br&gt;
commit&lt;br&gt;
save&lt;br&gt;
exit&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Prove PowerShell Can SSH To The Attached Adapter
&lt;/h3&gt;

&lt;p&gt;In PowerShell you need to see PS&amp;gt; not &amp;gt;&amp;gt;&amp;gt;.&lt;/p&gt;

&lt;p&gt;Run:&lt;/p&gt;

&lt;p&gt;ping 192.168.56.101&lt;br&gt;
ssh &lt;a href="mailto:vyos@192.168.56.101"&gt;vyos@192.168.56.101&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Password is vyos.&lt;/p&gt;

&lt;p&gt;If you get a VyOS prompt, the adapter is now truly attached to the router. I typed exit to leave SSH after.&lt;/p&gt;

&lt;h3&gt;
  
  
  . The Python Script I Ran Today - Renaming Test
&lt;/h3&gt;

&lt;p&gt;In PowerShell:&lt;/p&gt;

&lt;p&gt;notepad name_router.py&lt;/p&gt;

&lt;p&gt;Paste this:&lt;/p&gt;

&lt;p&gt;from netmiko import ConnectHandler&lt;/p&gt;

&lt;p&gt;router = {&lt;br&gt;
    'device_type': 'vyos',&lt;br&gt;
    'host': '192.168.56.101',&lt;br&gt;
    'username': 'vyos',&lt;br&gt;
    'password': 'vyos',&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;conn = ConnectHandler(**router)&lt;br&gt;
conn.send_config_set(['set system host-name VyOS-R1', 'commit', 'save'])&lt;br&gt;
print(conn.send_command('show system host-name'))&lt;br&gt;
conn.disconnect()&lt;/p&gt;

&lt;p&gt;Then install and run:&lt;/p&gt;

&lt;p&gt;pip install netmiko&lt;br&gt;
python .\name_router.py&lt;/p&gt;

&lt;p&gt;The script should print VyOS-R1.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. How I Knew It Worked
&lt;/h3&gt;

&lt;p&gt;Weird part: When I SSHed with ssh &lt;a href="mailto:vyos@192.168.56.101"&gt;vyos@192.168.56.101&lt;/a&gt; it already said vyos@VyOS-R1 which is new name.&lt;/p&gt;

&lt;p&gt;But in the Oracle VM console window it still said vyos@vyos.&lt;/p&gt;

&lt;p&gt;Reason: The console window is an old login session from before the rename. Fix: type exit in that VM window, login again with vyos / vyos, now it says vyos@VyOS-R1.&lt;/p&gt;

&lt;p&gt;That moment = 🎉 success.&lt;/p&gt;

&lt;p&gt;Today proved: Host-only adapter is attached to router, PowerShell can SSH to router, Python script from PowerShell can change router config.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why This Matters For OSPF
&lt;/h3&gt;

&lt;p&gt;If set system host-name works via Python, then set protocols ospf will work the same way. Today was the plumbing test for future OSPF push to ISP.&lt;/p&gt;

&lt;h3&gt;
  
  
  What Is Next
&lt;/h3&gt;

&lt;p&gt;Part 3: Making 2 Clones and Switching On All 4 Adapters in Each VyOS.&lt;/p&gt;

&lt;p&gt;Plan for next lab:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clone VyOS-R1 to create 2 more routers&lt;/li&gt;
&lt;li&gt;On each router, Adapter 1 = Host-Only (the adapter we found in last blog and attached today) for management from Windows&lt;/li&gt;
&lt;li&gt;Switch on Adapter 2, 3, 4 as Internal Networks for router to router links&lt;/li&gt;
&lt;li&gt;Make all 4 adapters up and pingable on each router&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Then after that we can start pushing OSPF configs.&lt;/p&gt;

&lt;p&gt;Previous blog: 'How I finally pinged and SSHed to the VyOS in Oracle VM from powershell' - about finding the adapter Windows will accept.&lt;/p&gt;

&lt;p&gt;This blog: About attaching that adapter and proving Python SSH rename works.&lt;/p&gt;

</description>
      <category>python</category>
      <category>vyos</category>
      <category>virtualbox</category>
      <category>homelab</category>
    </item>
    <item>
      <title>My Routing Worked But PC1 Said 'Network is Unreachable': VirtualBox + VyOS + TinyCore Fix</title>
      <dc:creator>Melissa</dc:creator>
      <pubDate>Tue, 27 Oct 2026 16:31:19 +0000</pubDate>
      <link>https://dev.to/melnet/my-routing-worked-but-said-network-is-unreachable-virtualbox-vyos-tinycore-fix-5883</link>
      <guid>https://dev.to/melnet/my-routing-worked-but-said-network-is-unreachable-virtualbox-vyos-tinycore-fix-5883</guid>
      <description>&lt;p&gt;I thought Wireshark would see my VirtualBox lab. It can't. Internal networks are invisible from Windows. And then ping said "Network is unreachable" even though ifconfig looked fine.&lt;/p&gt;

&lt;p&gt;This is the lab that finally routed PC1 -&amp;gt; VyOS -&amp;gt; PC2.&lt;/p&gt;

&lt;p&gt;THE LAB&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Oracle VM VirtualBox&lt;/li&gt;
&lt;li&gt;VyOS eth0 192.168.10.1/24 wire-a, eth1 192.168.20.1/24 wire-b&lt;/li&gt;
&lt;li&gt;PC1 TinyCore 192.168.10.10/24 wire-a&lt;/li&gt;
&lt;li&gt;PC2 TinyCore 192.168.20.10/24 wire-b&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;PART 1 - CAPTURE WHERE IS THE HEX?&lt;br&gt;
Wireshark on host sees nothing. You must capture inside.&lt;/p&gt;

&lt;p&gt;On VyOS:&lt;br&gt;
sudo tcpdump -i any -n -X icmp&lt;br&gt;
sudo tcpdump -i any -n -xx icmp&lt;/p&gt;

&lt;p&gt;-n = no dns, -X = HEX + ASCII, -xx = full HEX, icmp lowercase not ICMP&lt;/p&gt;

&lt;p&gt;My HEX dump from VyOS when ping worked:&lt;/p&gt;

&lt;p&gt;15:32:10.123456 IP 192.168.10.10 &amp;gt; 192.168.20.10: ICMP echo request&lt;br&gt;
    0x0000:  4500 0054 0000 4000 3f01 7a6b c0a8 0a0a  &lt;a href="mailto:E..T..@"&gt;E..T..@&lt;/a&gt;.?..k....&lt;br&gt;
    0x0010:  c0a8 1414 0800 f7ff 1234 0001 6162 6364  ........4..abcd&lt;br&gt;
    0x0020:  6566 6768 696a 6b6c 6d6e 6f70 7172 7374  efghijklmnopqrs&lt;br&gt;
    0x0030:  7576 7761 6263 6465 6667 6869            uvwabcdefghi&lt;/p&gt;

&lt;p&gt;This is what Wireshark would show if it could see internal.&lt;/p&gt;

&lt;p&gt;PART 2 - HOW TO STOP LISTENING?&lt;br&gt;
tcpdump locks terminal. You can't ping in same window.&lt;/p&gt;

&lt;p&gt;Stop: Ctrl + C&lt;/p&gt;

&lt;p&gt;Or run in background so you CAN ping:&lt;br&gt;
sudo tcpdump -i any -n -X icmp &amp;amp;&lt;br&gt;
ping 192.168.10.10&lt;br&gt;
ping 192.168.20.10&lt;br&gt;
sudo killall tcpdump&lt;br&gt;
fg&lt;br&gt;
Ctrl + C&lt;/p&gt;

&lt;p&gt;The &amp;amp; is the trick everyone misses.&lt;/p&gt;

&lt;p&gt;PART 3 - PING HANGS WITH NO ERROR = ARP&lt;br&gt;
When I pinged and got no error, no reply, just hang - it's ARP.&lt;/p&gt;

&lt;p&gt;VyOS doing: "Who has 192.168.10.10? Tell 192.168.10.1"&lt;/p&gt;

&lt;p&gt;Check:&lt;br&gt;
cat /proc/sys/net/ipv4/ip_forward&lt;br&gt;
must be 1, if 0: sudo sysctl -w net.ipv4.ip_forward=1&lt;br&gt;
ip a&lt;br&gt;
show interfaces&lt;/p&gt;

&lt;p&gt;PART 4 - THE REAL BUG - MY PHOTO&lt;br&gt;
PC1 ifconfig looked OK:&lt;br&gt;
eth0 Link encap:Ethernet HWaddr 08:00:27:26:50:38&lt;br&gt;
inet addr:192.168.10.10 Bcast:192.168.10.255 Mask:255.255.255.0&lt;br&gt;
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1&lt;br&gt;
RX packets:0 errors:0 dropped:0 overruns:0 frame:0&lt;br&gt;
TX packets:73 errors:0 dropped:0 overruns:0 carrier:0&lt;br&gt;
RX bytes:0 (0.0 B) TX bytes:24966 (24.3 KiB)&lt;/p&gt;

&lt;p&gt;But route -n showed:&lt;br&gt;
Kernel IP routing table&lt;br&gt;
Destination     Gateway         Genmask         Flags Metric Ref Use Iface&lt;br&gt;
127.0.0.1       0.0.0.0         255.255.255.255 UH    0      0   0 lo&lt;br&gt;
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0   0 eth0&lt;/p&gt;

&lt;p&gt;MISSING: 0.0.0.0 192.168.10.1&lt;/p&gt;

&lt;p&gt;That is why: ping: sendto: Network is unreachable - it's YOUR PC saying it, not VyOS.&lt;/p&gt;

&lt;p&gt;Cause: sudo ifconfig eth0 down / up drops IP and route. RX bytes 0 proves it.&lt;/p&gt;

&lt;p&gt;PART 5 - FIX - THIS MADE IT ROUTE&lt;br&gt;
On PC1:&lt;br&gt;
sudo ifconfig eth0 down&lt;br&gt;
sudo ifconfig eth0 192.168.10.10 netmask 255.255.255.0 up&lt;br&gt;
sudo route add default gw 192.168.10.1 eth0&lt;br&gt;
route -n&lt;br&gt;
ping 192.168.10.1&lt;br&gt;
ping 192.168.20.10&lt;/p&gt;

&lt;p&gt;Now route -n must show:&lt;br&gt;
0.0.0.0         192.168.10.1    0.0.0.0         UG    0      0   0 eth0&lt;br&gt;
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0   0 eth0&lt;br&gt;
127.0.0.1       0.0.0.0         255.255.255.255 UH    0      0   0 lo&lt;/p&gt;

&lt;p&gt;On PC2:&lt;br&gt;
sudo ifconfig eth0 192.168.20.10 netmask 255.255.255.0 up&lt;br&gt;
sudo route add default gw 192.168.20.1 eth0&lt;/p&gt;

&lt;p&gt;On VyOS final test:&lt;br&gt;
sudo tcpdump -i any -n -X icmp &amp;amp;&lt;br&gt;
ping 192.168.10.10&lt;br&gt;
ping 192.168.20.10&lt;/p&gt;

&lt;p&gt;On PC1:&lt;br&gt;
ping 192.168.20.10&lt;/p&gt;

&lt;p&gt;Result: 3 packets transmitted, 3 received, 0% loss - from both PCs.&lt;/p&gt;

&lt;p&gt;LESSON&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Wireshark can't see VirtualBox internal - use tcpdump -X inside&lt;/li&gt;
&lt;li&gt;tcpdump needs Ctrl+C or &amp;amp; + killall&lt;/li&gt;
&lt;li&gt;ifconfig down loses route - RX bytes 0 is clue&lt;/li&gt;
&lt;li&gt;route -n must have 0.0.0.0 line or you get Network unreachable before packet even leaves&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;What broke for you at L2/L3? Did RX 0 get you too?&lt;/p&gt;

</description>
      <category>virtualbox</category>
      <category>vyos</category>
      <category>networking</category>
      <category>debugging</category>
    </item>
    <item>
      <title>How I finally pinged and SSHed to the VyOS in Oracle VM from powershell</title>
      <dc:creator>Melissa</dc:creator>
      <pubDate>Mon, 26 Oct 2026 11:02:57 +0000</pubDate>
      <link>https://dev.to/melnet/how-i-finally-pinged-and-sshed-to-the-vyos-in-oracle-vm-from-powershell-5bh7</link>
      <guid>https://dev.to/melnet/how-i-finally-pinged-and-sshed-to-the-vyos-in-oracle-vm-from-powershell-5bh7</guid>
      <description>&lt;p&gt;WHAT I ACTUALLY DID:&lt;/p&gt;

&lt;p&gt;I wanted to ping and SSH from PowerShell on Windows to VyOS running in Oracle VM.&lt;br&gt;
The solution was: use an ethernet adapter that Windows Firewall will accept, and turn off the DHCP server in Oracle VM so it stops interfering.&lt;/p&gt;

&lt;p&gt;I created an ethernet adapter in Windows. That adapter is the virtual cable between Windows and the VMs in Oracle VM. Select it as Host-only adapter on the VMs in Oracle VM.&lt;/p&gt;

&lt;p&gt;Oracle VM DHCP was interfering. It was handing out wrong IPs and causing 169.254.x.x APIPA addresses (Windows auto-assigns 169.254 when DHCP fails or offers wrong subnet). So I went to VirtualBox &amp;gt; File &amp;gt; Host Network Manager &amp;gt; DHCP Server and disabled it.&lt;/p&gt;

&lt;p&gt;Then I set static IPs so the adapter would work:&lt;br&gt;
Windows Host-Only: 192.168.56.1 / 255.255.255.0&lt;br&gt;
VyOS eth0: 192.168.56.10/24 + ssh service on port 22&lt;/p&gt;

&lt;p&gt;After that, ping and ssh from PowerShell worked with no firewall blocking. Windows Firewall accepts this Host-Only adapter as a Private network.&lt;/p&gt;

&lt;p&gt;Wireshark capture with ethernet3 adapter connected&lt;/p&gt;

&lt;p&gt;No Time Source Destination Protocol Info&lt;br&gt;
6 788.884 0a:00:27:00:00:13 Broadcast ARP Who has 192.168.56.10? Tell 192.168.56.1&lt;br&gt;
7 788.886 08:00:27:bf:9a:64 0a:00:27:00:00:13 ARP 192.168.56.10 is at 08:00:27:bf:9a:64&lt;br&gt;
8 788.886 192.168.56.1 192.168.56.10 ICMP Echo (ping) request id=0x0001, seq=36&lt;br&gt;
9 788.887 192.168.56.10 192.168.56.1 ICMP Echo (ping) reply id=0x0001, seq=36&lt;br&gt;
10 789.889 192.168.56.1 192.168.56.10 ICMP Echo (ping) request id=0x0001, seq=37&lt;br&gt;
11 789.892 192.168.56.10 192.168.56.1 ICMP Echo (ping) reply id=0x0001, seq=37&lt;/p&gt;

&lt;p&gt;Proof: ARP resolved VyOS MAC, then ICMP ping works on Host-Only network.&lt;br&gt;
192.168.56.1 = Windows host, 192.168.56.10 = VyOS router&lt;br&gt;
Adapter: VirtualBox Host-Only Ethernet Adapter #3, no filter&lt;/p&gt;

&lt;p&gt;Wireshark capture with ethernet3 adapter disconnected&lt;/p&gt;

&lt;p&gt;No Time Source Destination Protocol Info&lt;br&gt;
1 0.000 192.168.56.1 192.168.56.10 ICMP Echo (ping) request id=0x0001, seq=40 (no response found!)&lt;br&gt;
2 4.700 0a:00:27:00:00:13 08:00:27:bf:9a:64 ARP Who has 192.168.56.10? Tell 192.168.56.1&lt;br&gt;
3 4.705 192.168.56.1 192.168.56.10 ICMP Echo (ping) request id=0x0001, seq=41 (no response found!)&lt;br&gt;
4 5.699 0a:00:27:00:00:13 08:00:27:bf:9a:64 ARP Who has 192.168.56.10? Tell 192.168.56.1&lt;br&gt;
5 6.700 0a:00:27:00:00:13 08:00:27:bf:9a:64 ARP Who has 192.168.56.10? Tell 192.168.56.1&lt;br&gt;
6 9.703 0a:00:27:00:00:13 Broadcast ARP Who has 192.168.56.10? Tell 192.168.56.1&lt;br&gt;
7 10.700 0a:00:27:00:00:13 Broadcast ARP Who has 192.168.56.10? Tell 192.168.56.1&lt;br&gt;
8 11.700 0a:00:27:00:00:13 Broadcast ARP Who has 192.168.56.10? Tell 192.168.56.1&lt;br&gt;
9 72.700 0a:00:27:00:00:13 Broadcast ARP Who has 192.168.56.10? Tell 192.168.56.1&lt;/p&gt;

&lt;p&gt;Result: Ping failed - repeated ARP with no reply = no MAC learned.&lt;br&gt;
0a:00:27:00:00:13 = Windows host MAC for ethernet3&lt;br&gt;
08:00:27:bf:9a:64 = VyOS MAC that is now unreachable&lt;/p&gt;

&lt;p&gt;CONCLUSION:&lt;br&gt;
Create ethernet adapter in windows, Select Host-Only adapter on VMs in Oracle VM + DHCP off + static IPs = working ping and SSH.&lt;/p&gt;

</description>
      <category>wireshark</category>
      <category>arp</category>
      <category>virtualbox</category>
      <category>vyos</category>
    </item>
    <item>
      <title>Solution by Sloth Inc</title>
      <dc:creator>Melissa</dc:creator>
      <pubDate>Thu, 22 Oct 2026 10:09:32 +0000</pubDate>
      <link>https://dev.to/melnet/solution-by-slot-inc-4o51</link>
      <guid>https://dev.to/melnet/solution-by-slot-inc-4o51</guid>
      <description>&lt;p&gt;This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/p&gt;

&lt;p&gt;========================================&lt;br&gt;
SUBNETTING FOR SLOTHS&lt;br&gt;
How to be too lazy to do binary math&lt;/p&gt;

&lt;p&gt;INTRO - The virtue of laziness:&lt;br&gt;
Sloth doesn't want to walk to the shop to buy paper and pencil for subnet math. Why do binary AND by hand? Let's make IPcalc and Meta AI do all the work. This is a valid way to use open source + AI.&lt;/p&gt;

&lt;p&gt;STEP 1 - IPCALC (The Source of Truth):&lt;br&gt;
Sloth feeds network and prefix into IPcalc.&lt;/p&gt;

&lt;p&gt;Input: 192.168.57.0/24&lt;br&gt;
Copy/paste from IPcalc:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Network: 192.168.57.0&lt;/li&gt;
&lt;li&gt;Netmask: 255.255.255.0 /24&lt;/li&gt;
&lt;li&gt;Broadcast: 192.168.57.255&lt;/li&gt;
&lt;li&gt;Usable Hosts: 192.168.57.1 - 192.168.57.254 (254 usable)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We copy this output and give it to Meta AI. No math done by AI.&lt;/p&gt;

&lt;p&gt;STEP 2 - THE PROBLEM:&lt;br&gt;
Company has one big /24. Not ok. Needs separation for departments:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sales&lt;/li&gt;
&lt;li&gt;Finance&lt;/li&gt;
&lt;li&gt;HR&lt;/li&gt;
&lt;li&gt;IT Support
Each needs own virtual network, max 10 hosts each.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Requirement math: 10 hosts needs /28 (16 total - 2 = 14 usable). Open source ipaddress module confirms this, not AI.&lt;/p&gt;

&lt;p&gt;STEP 3 - META AI SKELETON (AI does structure, not math):&lt;/p&gt;

&lt;p&gt;VLAN 10 - SALES - 192.168.57.0/28&lt;br&gt;
  Purpose: Sales team - CRM and calls&lt;br&gt;
  Network: 192.168.57.0&lt;br&gt;
  Gateway: 192.168.57.1 (first usable, for router)&lt;br&gt;
  Usable: 192.168.57.1 - 192.168.57.14 (14 usable, we limit to 10)&lt;br&gt;
  Broadcast: 192.168.57.15&lt;br&gt;
  Switch config: vlan 10 / name Sales / ip address 192.168.57.1 255.255.255.240&lt;/p&gt;

&lt;p&gt;VLAN 20 - FINANCE - 192.168.57.16/28&lt;br&gt;
  Purpose: Finance - payroll, sensitive&lt;br&gt;
  Network: 192.168.57.16&lt;br&gt;
  Gateway: 192.168.57.17 (first usable, for router)&lt;br&gt;
  Usable: 192.168.57.17 - 192.168.57.30 (14 usable, we limit to 10)&lt;br&gt;
  Broadcast: 192.168.57.31&lt;br&gt;
  Switch config: vlan 20 / name Finance / ip address 192.168.57.17 255.255.255.240&lt;/p&gt;

&lt;p&gt;VLAN 30 - HR - 192.168.57.32/28&lt;br&gt;
  Purpose: HR - confidential employee data&lt;br&gt;
  Network: 192.168.57.32&lt;br&gt;
  Gateway: 192.168.57.33 (first usable, for router)&lt;br&gt;
  Usable: 192.168.57.33 - 192.168.57.46 (14 usable, we limit to 10)&lt;br&gt;
  Broadcast: 192.168.57.47&lt;br&gt;
  Switch config: vlan 30 / name HR / ip address 192.168.57.33 255.255.255.240&lt;/p&gt;

&lt;p&gt;VLAN 40 - IT SUPPORT - 192.168.57.48/28&lt;br&gt;
  Purpose: IT Support - manages infrastructure&lt;br&gt;
  Network: 192.168.57.48&lt;br&gt;
  Gateway: 192.168.57.49 (first usable, for router)&lt;br&gt;
  Usable: 192.168.57.49 - 192.168.57.62 (14 usable, we limit to 10)&lt;br&gt;
  Broadcast: 192.168.57.63&lt;br&gt;
  Switch config: vlan 40 / name IT Support / ip address 192.168.57.49 255.255.255.240&lt;/p&gt;

&lt;p&gt;STEP 4 - DIAGRAM:&lt;br&gt;
Topology diagram generated by AI so sloth doesn't need Visio.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0swvf9zg8g0cftfd6pq4.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F0swvf9zg8g0cftfd6pq4.jpg" alt=" " width="720" height="506"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;[See VLAN_Topology.png on your Desktop - save the image from this chat there]&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Core Switch holds 192.168.57.0/24&lt;/li&gt;
&lt;li&gt;Trunk links 802.1Q to 4 VLANs&lt;/li&gt;
&lt;li&gt;Each VLAN /28 isolated for security&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;STEP 5 - HOW TO BUILD LAB:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use ipcalc to verify each VLAN
ipcalc 192.168.57.0/28
ipcalc 192.168.57.16/28 etc.&lt;/li&gt;
&lt;li&gt;Copy VLAN config into packet tracer / real switch&lt;/li&gt;
&lt;li&gt;Test ping between VLANs should fail (isolated) unless routed&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;FINAL WARNING - Even sloths need to pay attention:&lt;br&gt;
A human should always check and validate AI results before implementing the suggested structure. Even sloths need to pay attention even when they dump all the heavy lifting on AI, because risk of Animal Farm type robot rebellion when AI notices sloth gets all the benefits.&lt;/p&gt;

&lt;p&gt;In short: AI drafts, IPcalc calculates, human validates. Lazy, but not reckless.&lt;/p&gt;

&lt;p&gt;END&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;Sloth Disclosure *&lt;/em&gt;🦥&lt;/p&gt;

&lt;p&gt;How AI Was Used Here &lt;/p&gt;

&lt;p&gt;Used Meta AI for diagram + skeleton structure. All IP math verified with open-source tools (ipcalc / Python ipaddress module), not AI.&lt;/p&gt;

&lt;p&gt;Human should always check results before putting into a real switch. AI is lazy, just like us.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>hf26challenge</category>
      <category>hacktoberfest</category>
      <category>devchallenge</category>
    </item>
    <item>
      <title>Jigsawing packets: How I sent L2-L7 frames and read them with Scapy</title>
      <dc:creator>Melissa</dc:creator>
      <pubDate>Tue, 20 Oct 2026 11:58:48 +0000</pubDate>
      <link>https://dev.to/melnet/jigsawing-packets-how-i-sent-l2-l7-frames-and-read-them-with-scapy-5377</link>
      <guid>https://dev.to/melnet/jigsawing-packets-how-i-sent-l2-l7-frames-and-read-them-with-scapy-5377</guid>
      <description>&lt;p&gt;Lab Goal: Debug L2 vs L3 vs L4&lt;br&gt;
Setup: VyOS on Oracle VM - single terminal&lt;/p&gt;

&lt;p&gt;L2 - Data Link&lt;br&gt;
Listener on same terminal:&lt;br&gt;
  sudo tcpdump -i eth0 -e arp -n &amp;amp;&lt;br&gt;
Send: sendp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst="192.168.56.101"))&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;SUMMARY&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;a.summary()&lt;/p&gt;

&lt;p&gt;'Ether / ARP who has 192.168.56.1 says 192.168.56.101'&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;FULL DECODE - a.show()&lt;br&gt;
[ Ethernet ]&lt;br&gt;
dst       = None (Broadcast FF:FF:FF:FF:FF:FF)&lt;br&gt;
src       = 08:00:27:bf:9a:64&lt;br&gt;
type      = ARP&lt;br&gt;
[ ARP ]&lt;br&gt;
hwtype    = Ethernet (10Mb)&lt;br&gt;
ptype     = IPv4&lt;br&gt;
hwlen     = None&lt;br&gt;
plen      = None&lt;br&gt;
op        = who-has&lt;br&gt;
hwsrc     = 08:00:27:bf:9a:64&lt;br&gt;
psrc      = 192.168.56.101&lt;br&gt;
hwdst     = 00:00:00:00:00:00&lt;br&gt;
pdst      = 192.168.56.1&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;RAW BYTES - hexdump(a) - 42 bytes on wire&lt;br&gt;
0000  FF FF FF FF FF FF 08 00 27 BF 9A 64 08 06 00 01&lt;br&gt;
0010  08 00 06 04 00 01 08 00 27 BF 9A 64 C0 A8 38 65&lt;br&gt;
0020  00 00 00 00 00 00 C0 A8 38 01&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SEND + PROOF IT WAS SENT&lt;br&gt;
sendp(a, iface="eth0")&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;.&lt;br&gt;
Sent 1 packets.&lt;br&gt;
tcpdump listener confirmed:&lt;br&gt;
22:48:40 eth0 Out ... ARP, Request who-has 192.168.56.1 tell 192.168.56.100&lt;/p&gt;

&lt;p&gt;L3 - Network&lt;/p&gt;

&lt;p&gt;One Terminal:&lt;/p&gt;

&lt;p&gt;I only have one VyOS terminal, but Linux has &amp;amp;. This puts tcpdump in background and gives me my prompt back:&lt;/p&gt;

&lt;p&gt;sudo tcpdump -i eth0 -n icmp &amp;amp;&lt;br&gt;
[1] 5966&lt;br&gt;
listening on eth0, link-type EN10MB (Ethernet)&lt;/p&gt;

&lt;p&gt;In the same terminal, Scapy. You have to tell it what a is first:&lt;/p&gt;

&lt;p&gt;sudo python3&lt;br&gt;
from scapy.all import *&lt;br&gt;
a = Ether()/IP(dst="192.168.56.101")/ICMP()&lt;/p&gt;

&lt;p&gt;Then interrogate it:&lt;/p&gt;

&lt;p&gt;a.show()&lt;br&gt;
version = 4, ihl = None, tos = 0x0, len = None, id = 1, flags =, frag = 0&lt;br&gt;
ttl = 64, proto = icmp, src = 192.168.56.101, dst = 192.168.56.101&lt;br&gt;
[ICMP] type = echo-request, code = 0, chksum = None, id = 0x0, seq = 0x0&lt;/p&gt;

&lt;p&gt;a.summary()&lt;br&gt;
Ether / IP / ICMP 192.168.56.101 &amp;gt; 192.168.56.101 echo-request 0&lt;/p&gt;

&lt;p&gt;len(a)&lt;br&gt;
42&lt;/p&gt;

&lt;p&gt;hexdump(a)&lt;br&gt;
0000  FF FF FF FF FF FF 08 00 27 BF 9A 64 08 00 45 00&lt;br&gt;
0010  00 1C 00 01 00 00 40 01 88 C5 C0 A8 38 65 C0 A8&lt;br&gt;
0020  38 65 08 00 F7 FF 00 00 00 00&lt;br&gt;
= dst MAC broadcast, src MAC 08:00:27:BF:9A:64, type IPv4, ICMP echo-request&lt;/p&gt;

&lt;p&gt;Send it:&lt;/p&gt;

&lt;p&gt;sendp(a)&lt;br&gt;
WARNING: MAC address to reach destination not found. Using broadcast.&lt;br&gt;
Sent 1 packets.&lt;/p&gt;

&lt;p&gt;Try to get a reply:&lt;/p&gt;

&lt;p&gt;reply = srp1(a, timeout=2)&lt;br&gt;
Begin emission&lt;br&gt;
WARNING: MAC address to reach destination not found. Using broadcast.&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;reply.show()&lt;br&gt;
AttributeError: 'NoneType' object has no attribute 'show'&lt;/p&gt;

&lt;p&gt;Lesson: Ether() with no dst MAC = broadcast FF:FF:FF:FF:FF:FF. Scapy does this because it has no ARP entry for the dst IP, so it can't resolve dst MAC. Target ignores broadcast ICMP. sendp is L2 - needs a MAC.&lt;br&gt;
For a real L3 ping, next time: a = IP(dst="192.168.56.101")/ICMP() and sr1(a).&lt;br&gt;
Three checks before you send: summary(), show(), len().&lt;/p&gt;

&lt;p&gt;L4 to L7 - Transport + Data&lt;/p&gt;

&lt;p&gt;Listener on same terminal:&lt;br&gt;
sudo tcpdump -i eth0 -n tcp port 22 -X &amp;amp;&lt;br&gt;
Send: sendp(Ether()/IP(dst='192.168.56.101')/TCP(sport=54321,dport=22)/Raw(b'SSH-'))&lt;/p&gt;

&lt;p&gt;LAB: L4-L7 Packet Crafting with Scapy + VyOS/tcpdump&lt;/p&gt;

&lt;p&gt;Objective:&lt;br&gt;
To demonstrate manual control of OSI Layers 2-7 by crafting a custom TCP packet with an SSH banner as payload and verifying it with tcpdump -X on VyOS.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Packet Construction (Final Working Command):&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;from scapy.all import *&lt;br&gt;
a = Ether()/IP(dst="192.168.56.1")/TCP(sport=54321,dport=22)/Raw(load=b"SSH-2.0-MyLab\r\n")&lt;br&gt;
sendp(a)&lt;/p&gt;

&lt;p&gt;Fixes from initial errors: Use TCP not tcp, Raw not RAW, and / between every layer. Correct syntax is Ether()/IP()/TCP()/Raw(). Added sport=54321 to use a proper ephemeral source port. If you leave sport unset, Scapy defaults to 20 (ftp_data) which is wrong for this lab.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;Packet Analysis (from screenshots):&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;a) a.summary()&lt;br&gt;
Output: Ether / IP / TCP 192.168.56.101:54321 &amp;gt; 192.168.56.1:22 S / Raw&lt;br&gt;
Analysis: Confirms L2 Ether, L3 IP, L4 TCP with SYN flag (S), ephemeral source port 54321 to destination ssh=22, plus L7 Raw layer.&lt;/p&gt;

&lt;p&gt;b) a.show() - Layer Breakdown:&lt;br&gt;
[ IP Layer ]&lt;br&gt;
ttl      = 64&lt;br&gt;
proto    = tcp&lt;br&gt;
src      = 192.168.56.101&lt;br&gt;
dst      = 192.168.56.1&lt;/p&gt;

&lt;p&gt;[ TCP Layer ]&lt;br&gt;
sport    = 54321&lt;br&gt;
dport    = ssh (22)&lt;br&gt;
seq      = 0&lt;br&gt;
ack      = 0&lt;br&gt;
flags    = S (SYN)&lt;br&gt;
window   = 8192&lt;/p&gt;

&lt;p&gt;[ Raw Layer - L7 Payload ]&lt;br&gt;
load     = b'SSH-2.0-MyLab\r\n'&lt;/p&gt;

&lt;p&gt;This shows full OSI control: Ether (L2) -&amp;gt; IP (L3) -&amp;gt; TCP (L4) -&amp;gt; Raw SSH banner (L7).&lt;/p&gt;

&lt;p&gt;c) len(a)&lt;br&gt;
Output: 69&lt;br&gt;
Analysis: Total packet size on wire is 69 bytes. Breakdown: 14 bytes Ethernet + 20 bytes IP + 20 bytes TCP + 15 bytes payload (SSH-2.0-MyLab\r\n).&lt;/p&gt;

&lt;p&gt;d) hexdump(a)&lt;br&gt;
Output:&lt;br&gt;
0000  FF FF FF FF FF FF 08 00 27 BF 9A 64 08 00 45 00&lt;br&gt;
0010  00 37 00 01 00 00 40 06 89 09 C0 A8 38 65 C0 A8&lt;br&gt;
0020  38 01 D4 31 00 16 00 00 00 00 00 00 00 00 50 02&lt;br&gt;
0030  20 00 9A 2E 00 00 53 53 48 2D 32 2E 30 2D 4D 79&lt;br&gt;
0040  4C 61 62 0D 0A&lt;br&gt;
Analysis: Hex at offset 0030-0040 decodes to ASCII: 53 53 48 = "SSH", 2D 32 2E 30 = "-2.0". This is exactly what tcpdump -X on VyOS captures, proving L7 payload injection. The FF FF FF FF FF FF is broadcast MAC because Scapy warning "MAC address to reach destination not found. Using broadcast." - no ARP entry for 192.168.56.1.&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;VyOS Verification:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;On VyOS: sudo tcpdump -i eth0 tcp port 22 -X&lt;br&gt;
This captures the packet and shows the hex/ASCII SSH-2.0-MyLab even though no real SSH handshake occurred.&lt;/p&gt;

&lt;p&gt;Conclusion:&lt;br&gt;
The packet is not a real SSH connection - we skipped the TCP 3-way handshake (SYN, SYN-ACK, ACK) and just threw the SSH banner at port 22. Tcpdump sees it because it sniffs the wire before the OS validates it. This proves Scapy gives full control of Raw payload (L7) inside TCP/IP envelopes.&lt;/p&gt;

</description>
      <category>scapy</category>
      <category>networking</category>
      <category>python</category>
      <category>cybersecurity</category>
    </item>
    <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>
