EST. 2026 — บันทึกงานเซิร์ฟเวอร์จริง SYSADMIN · SECURITY · AI · DIRECTADMIN เล่มที่ 01
THE SYSADMIN ALMANAC
หน้าหลัก / Network / ยืม VLAN ให้เครื่องมือ Windows ที่ต้องอยู่ L2 เดียวกับอุปกรณ์
Network

ยืม VLAN ให้เครื่องมือ Windows ที่ต้องอยู่ L2 เดียวกับอุปกรณ์

โดย Ton-Or ·19 ก.ย. 2026·อ่าน 8 นาที
ยืม VLAN ให้เครื่องมือ Windows ที่ต้องอยู่ L2 เดียวกับอุปกรณ์

ปัญหาไม่ได้อยู่ที่เราเข้าไม่ถึงอุปกรณ์ แต่อยู่ที่โปรแกรมมันตะโกนถามด้วย broadcast แล้ว broadcast ไม่เดินทางข้ามเราเตอร์ ทางแก้เลยไม่ใช่การเปิดเส้นทางเพิ่ม แต่คือการเอาตัวคนถามไปยืนในวงเดียวกับคนตอบ

สรุปใน 1 นาที

อาการ/ปัญหา
ต่อ VPN แล้วโปรแกรมของผู้ผลิตยังหาอุปกรณ์ไม่เจอ เพราะ broadcast ไม่ข้าม L3
ใครควรอ่าน
คนที่ต้องใช้เครื่องมือ Windows ซึ่งต้องอยู่ L2 เดียวกับอุปกรณ์
ทางแก้แบบสั้น
สร้าง VM Windows ตัวเล็กบน Proxmox ที่ใช้ vlan-aware bridge แล้วปักขา VM ไว้ใน VLAN นั้น ตั้ง IP กับ RDP ก่อนใช้งาน
ข้ามไปขั้นตอน

พอดีผมต้องใช้โปรแกรมค้นหาอุปกรณ์ของผู้ผลิตกล้องเจ้าหนึ่ง ซึ่งเป็นโปรแกรมบน Windows อย่างเดียว หน้าที่ของมันคือหาอุปกรณ์ที่เพิ่งแกะกล่องซึ่งยังไม่มี IP ที่ใช้ได้ แล้วตั้งค่าเริ่มต้นให้ ปัญหาคือเครื่องที่ผมใช้ทำงานอยู่คนละที่กับไซต์ ต่อ VPN เข้าไปแล้วเปิดโปรแกรมก็ยังเห็นเป็นหน้าจอว่างเปล่า ไม่เจออุปกรณ์สักตัว ทั้งที่ ping ถึงหมด

เลข IP ชื่อเครื่อง หมายเลข VLAN และรหัสผ่านในบทความเป็นค่าตัวอย่าง ส่วนคำสั่ง ชื่อไฟล์คอนฟิก และอาการที่เจอคือของจริงจากเครื่องที่ผมดูแลเอง

ทำไมต่อ VPN แล้วยังมองไม่เห็นอุปกรณ์

เพราะโปรแกรมพวกนี้ไม่ได้ค้นหาด้วยการไล่ ping ทีละเบอร์ มันตะโกนถามด้วย broadcast แล้วรอใครตอบ ซึ่งเป็นวิธีเดียวที่จะคุยกับอุปกรณ์ที่ IP ยังไม่ถูกต้องได้ แต่ broadcast เป็นเรื่องของชั้นที่สอง มันไม่ข้ามเราเตอร์ VPN ที่แจก IP ให้เราแล้วส่งเราเตอร์ต่อไปหาปลายทาง เลยไม่ช่วยอะไรเลย

ทำงานได้

อยู่ใน L2 เดียวกัน

เครื่องกับอุปกรณ์อยู่ในโดเมน broadcast เดียวกัน คำถามถึงตัวอุปกรณ์ คำตอบกลับมาถึงเรา ใช้ได้แม้อุปกรณ์ยังถือ IP ค่าโรงงานที่คนละ subnet กับเราด้วยซ้ำ

ทำงานไม่ได้

ข้าม L3 มา ไม่ว่าทางไหน

VPN ทุกชนิด เราเตอร์ทุกตัว การ forward พอร์ต ไม่ช่วยเลยสักทาง เพราะสิ่งที่ขาดคือ broadcast ไม่ใช่เส้นทาง ปลายทางอาจ ping ถึง แต่โปรแกรมยังหาไม่เจอ

ทางแก้ที่ตรงที่สุดคือเอาเครื่องที่รันโปรแกรมไปวางในวงนั้น ทีนี้ไซต์ที่ผมดูแลมี Proxmox อยู่แล้วตัวหนึ่ง ตั้งอยู่ในตู้เดียวกับสวิตช์ และพอร์ตที่มันเสียบเป็น trunk ที่มี VLAN วิ่งผ่านหลายวงอยู่แล้ว ผมเลยไม่ต้องเดินสายอะไรเพิ่ม แค่สร้าง VM Windows ตัวเล็กแล้วบอกว่าขาของมันอยู่ VLAN ไหน

ทางที่เลือกเครื่องผมนอกวง->VPN / RDPชั้น 3 พอ->VM Windowsบน Proxmox->ขา net0 tag=20อยู่ใน VLAN กล้อง->อุปกรณ์ตอบ broadcast

ข้อดีที่ทำให้ผมเลือกทางนี้ คือ ไม่ต้องแตะพอร์ตสวิตช์เลยสักพอร์ต ไม่ต้องขอ downtime ไม่ต้องเสี่ยงตั้ง VLAN ผิดแล้วคนทั้งชั้นเน็ตหลุด ทุกอย่างจบที่ฝั่ง Proxmox ตัวเดียว และวันที่ไม่ใช้ก็ปิด VM ทิ้งไว้ เปิดเมื่อต้องใช้

ทำ bridge ให้รู้จัก VLAN ก่อน

เงื่อนไขข้อแรกคือ bridge ที่ VM จะเกาะต้องเป็น vlan-aware และต้องประกาศไว้ว่ายอมให้ VLAN ไหนผ่านบ้าง ถ้าไม่ประกาศ แล้วไปตั้ง tag ที่ VM มันจะเงียบ ไม่ error แต่ไม่มีอะไรวิ่ง

# /etc/network/interfaces
auto vmbr0
iface vmbr0 inet static
    address 192.168.10.6/24
    gateway 192.168.10.1
    bridge-ports bond0
    bridge-stp off
    bridge-fd 0
    bridge-vlan-aware yes
    bridge-vids 20 30 99

bridge-vids คือรายการ VLAN ที่ยอมให้ผ่าน ตอนผมเพิ่ม VLAN ใหม่เข้าไป ก็แค่เติมเลขต่อท้ายบรรทัดนั้น

อย่าสั่ง ifreload ตอนที่มี VM รันอยู่

คำสั่งที่ทุกคนคุ้นมือหลังแก้ไฟล์นี้คือ ifreload -a ซึ่งมันจะยกอินเทอร์เฟซขึ้นใหม่ทั้งชุด VM ที่รันอยู่จะเน็ตหลุดชั่วขณะ และบางตัวไม่กลับมาเอง ผมเลยแก้แบบเติมอย่างเดียว ไม่ลบของเดิม สำรองไฟล์ไว้ก่อนทุกครั้ง แล้วรอหน้าต่างเวลาที่นัดไว้ค่อย reload หรือรอรอบรีบูตของโหนดไปเลย ถ้างานไม่ด่วน

cp /etc/network/interfaces /etc/network/interfaces.bak-vlan20
# แก้ไฟล์ แล้วตรวจไวยากรณ์ก่อน อย่าเพิ่ง reload
ifquery -a --check
# ดูว่า bridge ตอนนี้ยอมให้ VLAN ไหนผ่านบ้างจริงๆ
bridge vlan show dev bond0

สร้าง VM แล้วปักขาไว้ที่ VLAN ที่ต้องการ

ตัวเครื่องเสมือนไม่ต้องใหญ่ครับ โปรแกรมค้นหาอุปกรณ์กินทรัพยากรน้อยมาก ที่ต้องระวังคือ Windows รุ่นใหม่บังคับให้มี TPM กับบูตแบบ UEFI

qm create 102 --name win-l2tool --ostype win11 \
  --memory 16384 --cores 8 --cpu host \
  --bios ovmf --machine q35 \
  --efidisk0 local-lvm:1,efitype=4m,pre-enrolled-keys=1 \
  --tpmstate0 local-lvm:1,version=v2.0 \
  --scsihw virtio-scsi-single \
  --scsi0 local:64,discard=on,ssd=1 \
  --net0 virtio,bridge=vmbr0,tag=20 \
  --ide2 local:iso/windows.iso,media=cdrom \
  --ide0 local:iso/virtio-win.iso,media=cdrom

qm start 102

หัวใจอยู่ที่ tag=20 บรรทัดเดียว ขาของ VM ตัวนี้จะโผล่ใน VLAN 20 เหมือนเสียบสายเข้าพอร์ต access ของวงนั้นจริงๆ มองจากฝั่งอุปกรณ์ปลายทางแล้วไม่มีอะไรต่างเลย

discard=on ก็สำคัญ อธิบายเหตุผลในหัวข้อถัดไป ส่วน --ide0 ที่ใส่แผ่น virtio เข้าไปด้วย ไม่ได้ใส่เผื่อสวย

ตอนลง Windows จะมองไม่เห็นดิสก์และไม่มีการ์ดเน็ต

ถ้าไม่รู้เรื่องนี้มาก่อนจะติดตั้งไม่ผ่านตั้งแต่หน้าแรก เพราะตัวติดตั้งไม่รู้จัก virtio-scsi ต้องกด Load driver แล้วชี้ไปที่แผ่น virtio ในโฟลเดอร์ vioscsi ของรุ่นและสถาปัตยกรรมที่ตรงกัน ดิสก์ถึงจะโผล่ขึ้นมา แล้วพอลงเสร็จบูตเข้า Windows ครั้งแรก จะยังไม่มีการ์ดเน็ต ต้องลง virtio guest tools จากแผ่นเดิมก่อน ถึงจะมีขาให้ใช้

ยืนยันว่าขาของ VM อยู่ใน VLAN นั้นจริง

ตรงนี้อย่าเชื่อว่าตั้งแล้วต้องได้ ผมเจอมาสองรอบว่าคำสั่งผ่าน แต่ VLAN ไม่ได้วิ่งจริง ครั้งหนึ่งเพราะลืมเติมเลขใน bridge-vids อีกครั้งเพราะพอร์ตฝั่งสวิตช์ที่โหนดเสียบอยู่ไม่ได้อนุญาต VLAN นั้นให้ผ่าน trunk มา สองอาการนี้เหมือนกันเป๊ะเมื่อมองจากใน VM คือได้ขามา แต่ไม่มีใครตอบ

# ฝั่ง Proxmox: ดูว่า tag ที่ตั้งไว้ตรงกับที่ตั้งใจ
qm config 102 | grep -E '^net|^scsi'
# ดูว่า tap ของ VM ตัวนี้ถูกผูกกับ VLAN ไหนจริง
bridge vlan show | grep -A2 "tap102"
# ดูว่า bridge ยอมให้ VLAN นั้นผ่านฝั่ง uplink ด้วยไหม
bridge vlan show dev bond0 | grep -w 20

ถ้าสามคำสั่งนั้นตรงกันหมดแล้วยังเงียบ ให้ลงไปดูที่ระดับแพ็กเก็ตเลย วิธีที่เร็วที่สุดคือดักดูว่ามีอะไรวิ่งเข้ามาที่ tap ของ VM บ้าง ถ้าเงียบสนิทแปลว่าปัญหาอยู่เหนือขึ้นไป ไม่ใช่ที่ VM

# ดักดู ARP กับ broadcast ที่เข้าถึงขาของ VM ตัวนี้
tcpdump -ni tap102i0 -e 'arp or broadcast' -c 20

# เทียบกับที่วิ่งอยู่บน uplink ของโหนด กรองเฉพาะ VLAN ที่สนใจ
tcpdump -ni bond0 -e vlan 20 -c 20

เห็นทราฟฟิกที่ bond0 แต่ไม่เห็นที่ tap102i0 คือปัญหาอยู่ที่ bridge ฝั่งเรา เห็นทั้งสองที่แต่โปรแกรมยังหาไม่เจอ คืออุปกรณ์ปลายทางไม่ตอบเอง ไม่ใช่เรื่องเน็ตเวิร์กแล้ว ส่วนไม่เห็นเลยทั้งสองที่ คือฝั่งสวิตช์ไม่ได้ส่ง VLAN นั้นมาให้ ต้องไปคุยกับคนคุมสวิตช์

ทางของ broadcast จากสวิตช์ถึงขาของ VM และจุดที่ดักแพ็กเก็ตสวิตช์ trunkต้องปล่อย VLAN 20bond0uplink ของโหนดvmbr0vlan-awaretap102i0tag=20VM Windowsขา net0tcpdump bond0tcpdump tap102i0ผลดักแพ็กเก็ต บอกว่าปัญหาอยู่ฝั่งไหนเห็นที่ bond0 แต่ไม่เห็นที่ tap102i0ต้นเหตุ: bridge ฝั่งเราเห็นทั้งสองที่ แต่โปรแกรมยังหาไม่เจอต้นเหตุ: อุปกรณ์ปลายทางไม่ตอบเองไม่เห็นเลยทั้งสองที่ต้นเหตุ: ฝั่งสวิตช์ไม่ส่ง VLAN นั้นมา
ดักที่ bond0 กับที่ tap102i0 แล้วเทียบกัน ว่าเห็นที่ไหนบ้าง ก็รู้ว่าปัญหาอยู่ที่ bridge ของเรา ที่อุปกรณ์ หรือที่สวิตช์
ทดสอบด้วย ARP ก่อนเปิดโปรแกรมของผู้ผลิต

โปรแกรมพวกนี้เวลาหาไม่เจอมันไม่บอกอะไรเลย แค่แสดงหน้าจอว่าง ซึ่งใช้ไล่หาสาเหตุไม่ได้เลย ผมเลยใช้การกวาด ARP ทั้งวงด้วยเครื่องมือมาตรฐานก่อนเสมอ ถ้ากวาดแล้วเห็น MAC ของอุปกรณ์โผล่มา แปลว่าชั้นที่สองเชื่อมถึงกันแล้ว เหลือแค่เรื่องของตัวโปรแกรม แยกสองเรื่องนี้ออกจากกันได้ตั้งแต่ต้น ประหยัดเวลาไปได้ครึ่งวัน

กับดักที่แพงที่สุด ไม่ได้อยู่ที่เน็ตเวิร์ก แต่อยู่ที่ดิสก์

ตอนผมสร้าง VM ตัวนี้ มันเกือบทำ VM ตัวอื่นที่รันงานจริงอยู่พังไปด้วย เพราะพื้นที่ของ thin pool มันเต็ม

thin pool คือพื้นที่ที่จองไว้แบบยืดหยุ่น VM แต่ละตัวเห็นดิสก์ใหญ่ตามที่ตั้งไว้ แต่กินที่จริงเท่าที่เขียนลงไป ซึ่งดีมากตอนวางแผน แต่แปลว่ารวมทุกตัวแล้ว จองเกินพื้นที่จริงได้ และวันที่มันเต็มจริง สิ่งที่เกิดขึ้นไม่ใช่แค่สร้าง VM ใหม่ไม่ได้ แต่ VM ที่กำลังรันอยู่จะเจอ I/O error กลางอากาศ

# ดูว่า thin pool ใช้ไปเท่าไหร่แล้ว ดูคอลัมน์ Data%
lvs -a
# ยังมีที่เหลือใน volume group ให้ขยายไหม
vgs
# ขยาย pool ถ้ายังมีที่เหลือ
lvextend -L +15G /dev/pve/data
100%ตอนที่ pool เต็ม
+15Gที่ขยายไปได้
91%หลังขยายแล้ว
1Gที่เหลือใน VG

ผมขยายไปได้ 15 GB แล้วเหลือที่ใน volume group อีกแค่ 1 GB คือขยายอีกไม่ได้แล้ว ต้องไปหาที่คืนแทน ที่ได้คืนมาง่ายที่สุดคือไฟล์ ISO ที่ลืมทิ้งไว้ กับดิสก์ของ VM ที่ลบไปแล้วแต่ก้อนดิสก์ยังค้างอยู่ ผมลบสองอย่างนี้ได้คืนมาสิบกว่ากิกะ

ส่วนก้อนใหญ่ที่สุดที่กินอยู่ 307 GB และคืนไม่ได้ คือดิสก์ของ VM ตัวหนึ่งที่ตอนสร้าง ไม่ได้เปิด discard ไว้ พื้นที่ที่ลบไปแล้วในระบบไฟล์ข้างใน VM เลยไม่ถูกส่งกลับมาบอก pool ว่าคืนได้ ทางแก้คือเปิด discard สั่ง fstrim ข้างใน แล้ว ต้องรีบูต VM ตัวนั้น ซึ่งเป็นเครื่องที่รันงานจริงอยู่ เลยต้องรอหน้าต่างเวลาที่นัดกับเจ้าของงาน จบด้วยการค้างไว้ในรายการที่ต้องทำ

เปิด discard ตั้งแต่วันสร้าง จะไม่ต้องมานั่งรอ downtime

ตอนสร้าง VM ใหม่ใส่ discard=on กับ ssd=1 ไปเลยตั้งแต่แรก มันไม่ได้ทำให้ช้าลงอย่างมีนัยสำคัญบน SSD แต่ทำให้พื้นที่ที่ลบข้างใน VM คืนกลับมาที่ pool ได้จริง ค่านี้แก้ทีหลังได้ก็จริง แต่ต้องรีบูต VM ซึ่งกับเครื่องที่รันงานจริงคือต้องนัดเวลา ตั้งให้ถูกตั้งแต่วันแรกถูกกว่ามาก

ตั้ง IP กับ RDP ให้เรียบร้อย ก่อนจะปิดคอนโซล

VM ตัวนี้จะไม่มีใครนั่งอยู่หน้าจอ ผมเลยต้องมั่นใจว่าเข้าทาง RDP ได้ก่อนที่จะปิดหน้าคอนโซลไป เคยพลาดมาแล้วคือปิดไปก่อนแล้วเข้าไม่ได้ ต้องมาเปิดคอนโซลกดใหม่ทั้งชุด

# ตั้ง IP คงที่ในวงของ VLAN นั้น อย่าปล่อย DHCP ลอย
New-NetIPAddress -InterfaceAlias "Ethernet" -IPAddress 192.168.20.50 `
  -PrefixLength 24 -DefaultGateway 192.168.20.1
Set-DnsClientServerAddress -InterfaceAlias "Ethernet" -ServerAddresses 192.168.20.1

# เปิด RDP แล้วเปิดช่องในไฟร์วอลล์ของ Windows ให้เฉพาะวงที่ใช้เข้า
Set-ItemProperty "HKLM:\System\CurrentControlSet\Control\Terminal Server" `
  -Name fDenyTSConnections -Value 0
Enable-NetFirewallRule -DisplayGroup "Remote Desktop"
Get-NetFirewallRule -DisplayGroup "Remote Desktop" |
  Set-NetFirewallRule -RemoteAddress 192.168.10.0/24

บรรทัดสุดท้ายอย่าข้ามครับ มันจำกัดว่า RDP รับการเชื่อมต่อจากวงไหนได้บ้าง ไม่งั้นเราเพิ่งเอาเครื่อง Windows ที่เปิด RDP กว้างไปวางในวงกล้อง ซึ่งเป็นวงที่ตั้งใจแยกออกมาให้ปลอดภัยกว่าเดิม

ฝั่ง Proxmox ก็ตั้งให้มันไม่บูตขึ้นมาเองตอนโหนดรีสตาร์ต เพราะเราตั้งใจให้มันปิดอยู่เป็นค่าปกติ

qm set 102 --onboot 0                    # ไม่ต้องขึ้นมาเองตอนโหนดบูต
qm set 102 --description "เครื่องมือ L2 เปิดเฉพาะตอนใช้ ปิดทุกครั้งที่เสร็จ"
qm start 102 && sleep 60 && qm status 102
qm shutdown 102                          # สั่งปิดแบบสุภาพ ไม่ใช่ qm stop

เข้าใช้งาน กับการเอาไฟล์ออกมา

  1. ตั้ง IP ให้ VM แบบจอง ไม่ปล่อย DHCP ลอย เพราะเราจะต่อ RDP เข้าไปตลอด และไม่อยากมานั่งหาว่าวันนี้มันได้เบอร์อะไร
  2. เปิด RDP ในตัว Windows แล้ววางบัญชีที่ใช้เข้าไว้เฉพาะงานนี้ ตั้งรหัสที่ไม่ซ้ำกับที่อื่น เก็บใน password manager
  3. เข้า VM ผ่าน RDP ปกติ ตัวคอนโซลบนหน้าเว็บ Proxmox ใช้ดูตอนบูตหรือตอน RDP ไม่ขึ้น
  4. ใช้โปรแกรมค้นหาอุปกรณ์ในนั้น ทำงานที่ต้องอยู่ L2 ให้จบ แล้วปิด VM เมื่อไม่ใช้
  5. ไฟล์ที่ต้องเอาออกมา ใช้การแชร์ไดรฟ์ของ RDP แล้วก๊อปผ่าน \\tsclient\C\... ไม่ต้องยกไฟล์ขึ้นที่อื่น

เรื่องสุดท้ายนี้เป็นเกร็ดเล็กแต่ช่วยได้มาก คอนโซลบนหน้าเว็บของ Proxmox คัดลอกข้อความหรือไฟล์ออกมาไม่ได้ ถ้าเข้าทางนั้นแล้วจะเอาผลลัพธ์ออกมา ต้องพิมพ์ตามหรือถ่ายรูปจอ ซึ่งไร้สาระ พอเข้าทาง RDP แล้วเปิดแชร์ไดรฟ์ไว้ ไฟล์ทุกอย่างลากออกมาได้ตรงๆ

VM ตัวนี้เป็นขาที่ยืนอยู่ในวงที่ควรจะปิด อย่าลืมมัน

สิ่งที่เราเพิ่งทำคือเอาเครื่อง Windows ไปวางไว้ในวงที่ตั้งใจแยกออกมา ซึ่งลดระดับการแยกวงลงจริงๆ ผมเลยถือกฎว่า ปิด VM เมื่อไม่ได้ใช้ ไม่ลงโปรแกรมอื่นในนั้นนอกจากที่จำเป็น ไม่ใช้บัญชีเดียวกับเครื่องอื่น อัปเดตทุกครั้งก่อนเปิดใช้ และจดไว้ในทะเบียนว่ามีเครื่องตัวนี้อยู่ ของแบบนี้ที่อันตรายที่สุดคือตัวที่ทุกคนลืมไปแล้วว่ายังเปิดอยู่

ส่วนตัวผมมองว่าวิธีนี้เหมาะกับงานที่ต้องทำเป็นครั้งคราวเท่านั้น ถ้าเป็นงานประจำที่ต้องอยู่ในวงนั้นตลอด ควรวางเครื่องจริงตัวเล็กๆ ไว้ที่หน้างานแล้วคุมด้วยกฎไฟร์วอลล์ให้ชัด จะจัดการง่ายกว่าและตรวจสอบง่ายกว่า ใครที่ไม่มี Proxmox อยู่ในไซต์ก็ใช้เครื่องเล็กเสียบพอร์ต access ของวงนั้นแล้วต่อ RDP เข้าไปก็ได้ผลเหมือนกัน ตามของที่มีครับ

ที่ยังค้างในแผนของผมคือทำสคริปต์สร้าง VM ตัวนี้ให้จบในคำสั่งเดียวพร้อมตั้ง VLAN ตามที่ป้อน แล้วมีตัวนับว่าเปิดค้างไว้เกินกี่ชั่วโมงจะเตือนให้ปิด ตรงไหนผมอธิบายตกหล่นหรือพิมพ์ผิด เดี๋ยวกลับมาแก้เพิ่มให้ภายหลังครับ

เคยเจองานแบบนี้ไหม? ติดตรงไหน?

มาแลกวิธีกันต่อในบอร์ด LinuxThai

→ คุยต่อในบอร์ด

ความคิดเห็น 0

ยังไม่มีความคิดเห็น — เป็นคนแรกเลย