ข้ามไปยังเนื้อหา
Secret Knock

อธิบาย Port knocking

Port knocking ทำให้บริการมองไม่เห็น จนกว่าจะมีผู้พิสูจน์ว่ารู้ความลับ คู่มือนี้อธิบายวิธีทำงาน การใช้งานที่พบได้บ่อยสองแบบ — knockd และ fwknop — และสาเหตุที่การเคาะไม่สำเร็จในการใช้งานจริง

Port knocking ทำงานอย่างไร

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

รูปแบบนั้นคือการเคาะ สำหรับ knockd จะเป็นลำดับความพยายามเชื่อมต่อไปยังพอร์ตเฉพาะตามลำดับที่กำหนดและภายในเวลาจำกัด สำหรับ fwknop จะเป็นแพ็กเก็ตเข้ารหัสเพียงแพ็กเก็ตเดียว

knockd: ลำดับการเคาะ

knockd รับฟังบนอินเทอร์เฟซและจับคู่ความพยายามเชื่อมต่อกับลำดับใน /etc/knockd.conf ลำดับหนึ่งสามารถผสมพอร์ต TCP และ UDP ได้ เมื่อจับคู่ได้ knockd จะรันคำสั่ง — โดยทั่วไปคือกฎ iptables หรือ nftables สำหรับที่อยู่ที่กำลังเคาะ (%IP%)

ตัวอย่างนี้เปิด SSH สำหรับที่อยู่ที่กำลังเคาะ และปิดอีกครั้งหลัง 10 วินาที เซสชัน SSH ที่มีอยู่จะยังทำงานต่อหากไฟร์วอลล์ของคุณยอมรับการเชื่อมต่อที่สร้างขึ้นแล้ว

[options]
    UseSyslog

[openSSH]
    sequence      = 7311:tcp,8822:tcp,9133:udp
    seq_timeout   = 10
    tcpflags      = syn
    start_command = /usr/sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    cmd_timeout   = 10
    stop_command  = /usr/sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
/etc/knockd.conf — เปิด SSH เป็นเวลา 10 วินาที

เลือกพอร์ตของคุณเอง และอย่าใช้พอร์ตจากตัวอย่างที่เผยแพร่แล้วซ้ำ tcpflags = syn ทำให้ knockd นับเฉพาะแพ็กเก็ตที่มีแฟล็ก SYN — แพ็กเก็ตแรกของความพยายามเชื่อมต่อ

fwknop: Single Packet Authorization

fwknop แทนที่ลำดับด้วยแพ็กเก็ต UDP หนึ่งแพ็กเก็ตที่เข้ารหัส (AES) และยืนยันตัวตน (HMAC) เซิร์ฟเวอร์ fwknopd จะดักรับแบบพาสซีฟ ตรวจสอบ ยืนยันว่าไม่ใช่การเล่นซ้ำ และเปิดพอร์ตที่ร้องขอสำหรับที่อยู่ภายในแพ็กเก็ต

สร้างคีย์ด้วย fwknop --key-gen แล้วใส่ไว้ใน access.conf ของเซิร์ฟเวอร์ Secret Knock นำเข้าฝั่งไคลเอนต์จาก .fwknoprc ของคุณ

SOURCE              ANY
OPEN_PORTS          tcp/22
KEY_BASE64          <output of fwknop --key-gen>
HMAC_KEY_BASE64     <output of fwknop --key-gen>
FW_ACCESS_TIMEOUT   30
/etc/fwknop/access.conf — อนุญาต SSH ด้วยคีย์ SPA

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

เหตุใดการเคาะจึงไม่สำเร็จ

  • IPv4 กับ IPv6: การเคาะออกผ่านตระกูลที่อยู่หนึ่ง แต่ SSH เชื่อมต่อผ่านอีกตระกูลหนึ่ง ไฟร์วอลล์เปิดประตูให้กับที่อยู่ที่คุณไม่ได้ใช้อยู่
  • ที่อยู่สาธารณะที่ต่างกัน: เมื่อใช้ข้อมูลมือถือ อยู่หลัง carrier NAT หรือ VPN เซิร์ฟเวอร์อาจเห็น IP อื่นจากที่คุณคาดไว้ ตรวจสอบที่อยู่ที่คุณใช้เคาะ
  • SYN ที่ส่งซ้ำ: หากการเคาะ TCP ไม่ได้รับคำตอบ ระบบปฏิบัติการของไคลเอนต์จะส่ง SYN เดิมอีกครั้ง จากการทดสอบของเรา knockd 0.8 จะรีเซ็ตลำดับเมื่อพบ SYN ซ้ำดังกล่าว ไคลเอนต์จึงต้องส่งการเคาะแต่ละครั้งเพียงครั้งเดียวและยุติการพยายามเชื่อมต่ออย่างรวดเร็ว
  • เวลา: การเคาะที่มาถึงนอก seq_timeout หรือมาในลำดับผิด จะเริ่มลำดับใหม่
  • อุปกรณ์ตัวกลาง: เครือข่ายบางแห่งบล็อกหรือแก้ไขทราฟฟิกที่ส่งไปยังพอร์ตที่ไม่ปกติ ดังนั้นการเคาะที่ใช้ได้ที่บ้านอาจไม่สำเร็จบนเครือข่ายโรงแรมหรือสำนักงาน

ปลอดภัยหรือไม่

ลำดับ knockd ส่งโดยไม่เข้ารหัส ทุกคนที่ดูทราฟฟิกของคุณได้สามารถเล่นซ้ำได้ ใช้เพื่อซ่อนบริการจากเครื่องสแกน โดยวางไว้หน้าคีย์ SSH ไม่ใช่ใช้แทนคีย์ fwknop SPA ปิดช่องโหว่นั้นด้วยการเข้ารหัส HMAC และการป้องกันการเล่นซ้ำ จึงเป็นตัวเลือกที่ดีกว่าเมื่อทราฟฟิกของคุณอาจถูกสังเกต

การเคาะจาก iPhone, Mac และ Apple Watch

Secret Knock ส่งลำดับ knockd และแพ็กเก็ต fwknop SPA จาก iPhone, iPad และ Mac ตรวจสอบว่าพอร์ตตอบสนอง และเปิดแอป SSH ของคุณ Apple Watch เคาะผ่าน iPhone ที่จับคู่ไว้ เนื่องจาก watchOS ไม่อนุญาตให้แอปส่งแพ็กเก็ต TCP หรือ UDP ดิบ เมื่ออยู่ห่างจาก iPhone จะส่ง SPA ผ่าน HTTP ไปยังเซิร์ฟเวอร์ที่เปิดใช้ได้

คู่มือสำหรับการตั้งค่าของคุณ

ปิดประตูไว้ พกการเคาะไปด้วย

Secret Knock กำลังจะมาถึง App Store สำหรับ iPhone, iPad, Mac และ Apple Watch

Secret Knock →