เวลาที่ใช้: ~3–4 ชั่วโมง
สภาพแวดล้อม: Linux (Ubuntu 22.04 / Debian 12 แนะนำ), สิทธิ์rootหรือsudo
เมื่อเสร็จสิ้น Lab นี้ นักศึกษาจะสามารถ:
nmap สแกนและวิเคราะห์ port / service ในเครือข่ายWireshark / tcpdump ดักจับและวิเคราะห์ trafficiptables และ ufwfail2banopenssl| รายการ | ข้อกำหนด |
|---|---|
| OS | Ubuntu 22.04 LTS / Debian 12 |
| RAM | 2 GB ขึ้นไป |
| Network Interface | อย่างน้อย 1 NIC |
| สิทธิ์ | sudo หรือ root |
sudo apt update && sudo apt upgrade -y
sudo apt install -y \
nmap \
tcpdump \
wireshark \
ufw \
iptables \
iptables-persistent \
fail2ban \
openssl \
net-tools \
traceroute \
curl \
wget \
nginx \
openssh-server
ip addr show
# หรือ
hostname -I
หมายเหตุ: บันทึก IP address ของเครื่องไว้ใช้ในแบบฝึกหัด เช่น
192.168.1.100
Nmap (Network Mapper) เป็นเครื่องมือ open-source สำหรับ network discovery และ security auditing ใช้ส่ง packet และวิเคราะห์ response เพื่อหา host ที่ active, port ที่เปิด, service และ OS ที่ใช้งาน
# 1. สแกน host เดียว
nmap 192.168.1.1
# 2. สแกนแบบ verbose (แสดงรายละเอียด)
nmap -v 192.168.1.1
# 3. สแกน subnet ทั้งหมด
nmap 192.168.1.0/24
# 4. สแกน port เฉพาะ
nmap -p 22,80,443 192.168.1.1
# 5. สแกน port ทั้งหมด (1-65535)
nmap -p- 192.168.1.1
# 6. ตรวจสอบ service version
nmap -sV 192.168.1.1
# 7. ตรวจสอบ OS
sudo nmap -O 192.168.1.1
# 8. Aggressive scan (OS + version + script + traceroute)
sudo nmap -A 192.168.1.1
# 9. สแกนแบบ stealth (SYN scan)
sudo nmap -sS 192.168.1.1
# 10. บันทึกผลลัพธ์เป็นไฟล์
nmap -oN output.txt 192.168.1.1
nmap -oX output.xml 192.168.1.1
Starting Nmap 7.93 ( https://nmap.org )
Nmap scan report for 192.168.1.1
Host is up (0.0012s latency).
Not shown: 995 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.9p1
80/tcp open http nginx 1.22.0
443/tcp open https nginx 1.22.0
3306/tcp open mysql MySQL 8.0.32
การวิเคราะห์ผล:
STATE: open → port กำลังเปิดรับ connectionSTATE: closed → port ตอบสนองแต่ไม่มี serviceSTATE: filtered → port ถูก firewall บล็อก ไม่ได้รับ responseเงื่อนไข: สแกนเครื่องของตัวเองและ gateway เครือข่าย
# ขั้นตอน 1: หา default gateway
ip route | grep default
# ขั้นตอน 2: สแกนเครื่องตัวเอง (localhost)
nmap -sV -O localhost
# ขั้นตอน 3: สแกน gateway
nmap -sV $(ip route | grep default | awk '{print $3}')
# ขั้นตอน 4: บันทึกผล
nmap -sV -oN ~/lab6_nmap_result.txt localhost
คำถามท้ายแบบฝึกหัด:
Packet Capture คือการดักจับ network packet เพื่อวิเคราะห์ traffic ช่วยให้เห็น protocol, payload, และพฤติกรรมของ traffic จริง
# 1. ดู interface ที่มี
tcpdump -D
# หรือ
ip link show
# 2. ดักจับ traffic บน interface ที่กำหนด
sudo tcpdump -i eth0
# 3. จำกัดจำนวน packet
sudo tcpdump -i eth0 -c 100
# 4. กรอง traffic เฉพาะ port 80
sudo tcpdump -i eth0 port 80
# 5. กรองเฉพาะ HTTP GET request
sudo tcpdump -i eth0 -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
# 6. กรอง traffic จาก/ไป IP เฉพาะ
sudo tcpdump -i eth0 host 192.168.1.1
# 7. กรอง ICMP (ping)
sudo tcpdump -i eth0 icmp
# 8. บันทึกเป็น pcap file
sudo tcpdump -i eth0 -w ~/lab6_capture.pcap
# 9. อ่าน pcap file
tcpdump -r ~/lab6_capture.pcap
# 10. แสดง packet ในรูปแบบ ASCII
sudo tcpdump -i eth0 -A port 80 -c 20
# กรอง TCP SYN packet (การเริ่ม connection)
sudo tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0'
# กรอง DNS query
sudo tcpdump -i eth0 udp port 53
# กรอง traffic ระหว่าง 2 host
sudo tcpdump -i eth0 'src host 192.168.1.10 and dst host 192.168.1.20'
# กรอง ARP
sudo tcpdump -i eth0 arp
# กรอง HTTPS
sudo tcpdump -i eth0 port 443
14:32:01.123456 IP 192.168.1.10.52341 > 192.168.1.1.80: Flags [S], seq 1234567890, win 64240, options [mss 1460,...], length 0
14:32:01.124000 IP 192.168.1.1.80 > 192.168.1.10.52341: Flags [S.], seq 987654321, ack 1234567891, win 65535, length 0
14:32:01.124100 IP 192.168.1.10.52341 > 192.168.1.1.80: Flags [.], ack 1, win 64240, length 0
การอ่าน Flags:
[S] = SYN (เริ่ม connection)[S.] = SYN-ACK (ตอบรับ)[.] = ACK (ยืนยัน)[F] = FIN (ปิด connection)[R] = RST (รีเซ็ต connection โดยทันที)[P] = PSH (ส่ง data)เงื่อนไข: ต้องมี nginx ทำงานอยู่บนเครื่อง
# Terminal 1: เริ่มดักจับ
sudo tcpdump -i lo port 80 -A -c 50 -w ~/lab6_http.pcap &
# Terminal 2: สร้าง HTTP request
curl http://localhost/
# หยุดดักจับและวิเคราะห์
tcpdump -r ~/lab6_http.pcap -A | head -100
# เปิด Wireshark (ต้องมี GUI)
sudo wireshark &
# หรือเปิดไฟล์ pcap ที่บันทึกไว้
wireshark ~/lab6_http.pcap
ขั้นตอนใน Wireshark:
eth0 หรือ lo)http → เฉพาะ HTTPtcp.port == 443 → เฉพาะ HTTPSip.addr == 192.168.1.1 → เฉพาะ IP นั้นtcp.flags.syn == 1 → เฉพาะ SYN packetFirewall ควบคุม traffic เข้า-ออกตามกฎที่กำหนด iptables เป็น low-level tool ที่ทำงานกับ Netfilter kernel module ส่วน ufw (Uncomplicated Firewall) เป็น frontend ที่ใช้งานง่ายกว่า
Tables: filter | nat | mangle | raw
Chains: INPUT | OUTPUT | FORWARD | PREROUTING | POSTROUTING
# ดูกฎทั้งหมด
sudo iptables -L -v -n
# ดูกฎพร้อมหมายเลข
sudo iptables -L --line-numbers
# ดู NAT table
sudo iptables -t nat -L -v -n
# ล้างกฎทั้งหมด (ระวัง!)
sudo iptables -F
# === INPUT Chain (traffic เข้าเครื่อง) ===
# อนุญาต loopback
sudo iptables -A INPUT -i lo -j ACCEPT
# อนุญาต established connections
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# อนุญาต SSH (port 22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# อนุญาต HTTP
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
# อนุญาต HTTPS
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# อนุญาต ICMP (ping)
sudo iptables -A INPUT -p icmp -j ACCEPT
# บล็อก IP เฉพาะ
sudo iptables -A INPUT -s 192.168.1.200 -j DROP
# บล็อก port 3306 จาก external (อนุญาตเฉพาะ local)
sudo iptables -A INPUT -p tcp --dport 3306 ! -s 127.0.0.1 -j DROP
# ปฏิเสธ traffic อื่นทั้งหมด (ต้องใส่เป็น rule สุดท้าย)
sudo iptables -A INPUT -j DROP
# === OUTPUT Chain (traffic ออกจากเครื่อง) ===
# อนุญาต DNS query
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
# บล็อก traffic ออกไปยัง IP เฉพาะ
sudo iptables -A OUTPUT -d 192.168.1.200 -j DROP
# จำกัดการ ping (ป้องกัน ping flood)
sudo iptables -A INPUT -p icmp --icmp-type echo-request \
-m limit --limit 1/s --limit-burst 4 -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j DROP
# จำกัดการ connect ใหม่ไปยัง port 80 (ป้องกัน SYN flood)
sudo iptables -A INPUT -p tcp --dport 80 --syn \
-m limit --limit 25/s --limit-burst 50 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 --syn -j DROP
# บล็อก port scan
sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
sudo iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
# บันทึกกฎ
sudo iptables-save > /etc/iptables/rules.v4
# โหลดกฎกลับมา
sudo iptables-restore < /etc/iptables/rules.v4
# โหลดอัตโนมัติเมื่อ boot (ต้องติดตั้ง iptables-persistent)
sudo netfilter-persistent save
# เปิดใช้งาน ufw
sudo ufw enable
# ดูสถานะ
sudo ufw status verbose
# ปฏิเสธ traffic ทั้งหมด (default)
sudo ufw default deny incoming
sudo ufw default allow outgoing
# อนุญาต SSH
sudo ufw allow ssh
# หรือ
sudo ufw allow 22/tcp
# อนุญาต HTTP/HTTPS
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
# อนุญาตจาก subnet เฉพาะ
sudo ufw allow from 192.168.1.0/24
# อนุญาตจาก IP เฉพาะไปยัง port เฉพาะ
sudo ufw allow from 192.168.1.10 to any port 3306
# บล็อก IP
sudo ufw deny from 192.168.1.200
# ลบกฎ
sudo ufw delete allow 80/tcp
# ดูกฎพร้อมหมายเลข
sudo ufw status numbered
# ลบกฎด้วยหมายเลข
sudo ufw delete 3
# ปิด ufw
sudo ufw disable
# Reset กฎทั้งหมด
sudo ufw reset
เงื่อนไข: ตั้งค่า firewall ให้อนุญาตเฉพาะ SSH, HTTP, HTTPS และ ping
# ขั้นตอน 1: ล้างกฎเดิม
sudo ufw reset
# ขั้นตอน 2: ตั้ง default policy
sudo ufw default deny incoming
sudo ufw default allow outgoing
# ขั้นตอน 3: อนุญาต services ที่จำเป็น
sudo ufw allow ssh
sudo ufw allow 'Nginx Full'
# ขั้นตอน 4: เปิดใช้งาน
sudo ufw enable
# ขั้นตอน 5: ตรวจสอบ
sudo ufw status verbose
# ขั้นตอน 6: ทดสอบ
nmap -p 22,80,443,3306,8080 localhost
ผลที่คาดหวัง:
openfilteredFail2ban วิเคราะห์ log file และ ban IP ที่แสดงพฤติกรรม brute-force หรือ malicious โดยอัตโนมัติ ผ่านการสร้างกฎ iptables ชั่วคราว
/etc/fail2ban/
├── fail2ban.conf # config หลัก (ไม่ควรแก้)
├── fail2ban.local # override config (แก้ที่นี่)
├── jail.conf # jail definitions หลัก
├── jail.local # override jails (แก้ที่นี่)
├── filter.d/ # filter rules
│ ├── sshd.conf
│ ├── nginx-http-auth.conf
│ └── ...
└── action.d/ # ban actions
├── iptables.conf
└── ...
# สร้างไฟล์ jail.local
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
# IP ที่ไม่ ban (whitelist)
ignoreip = 127.0.0.1/8 ::1 192.168.1.0/24
# ระยะเวลา ban (วินาที) — 3600 = 1 ชั่วโมง
bantime = 3600
# หน้าต่างเวลาที่นับความพยายาม (วินาที)
findtime = 600
# จำนวนครั้งที่ fail ก่อน ban
maxretry = 5
# backend สำหรับอ่าน log
backend = systemd
# action เมื่อ ban
action = %(action_mwl)s
# ===== SSH Jail =====
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = %(sshd_log)s
maxretry = 3
bantime = 7200
# ===== Nginx Login Page =====
[nginx-http-auth]
enabled = true
port = http,https
filter = nginx-http-auth
logpath = /var/log/nginx/error.log
maxretry = 5
# ===== Nginx Botsearch =====
[nginx-botsearch]
enabled = true
port = http,https
filter = nginx-botsearch
logpath = /var/log/nginx/access.log
maxretry = 2
# เริ่ม / หยุด / ตรวจสอบ service
sudo systemctl start fail2ban
sudo systemctl stop fail2ban
sudo systemctl status fail2ban
sudo systemctl enable fail2ban
# ดูสถานะ jail ทั้งหมด
sudo fail2ban-client status
# ดูสถานะ jail เฉพาะ
sudo fail2ban-client status sshd
# ดู IP ที่ถูก ban
sudo fail2ban-client status sshd | grep "Banned IP"
# Unban IP
sudo fail2ban-client set sshd unbanip 192.168.1.200
# Ban IP ด้วยตนเอง
sudo fail2ban-client set sshd banip 192.168.1.200
# ตรวจสอบ filter
sudo fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf
# Reload configuration
sudo fail2ban-client reload
# Log หลัก
sudo tail -f /var/log/fail2ban.log
# ดู ban events
sudo grep "Ban " /var/log/fail2ban.log
# ดู unban events
sudo grep "Unban " /var/log/fail2ban.log
2024-01-15 14:23:45,123 fail2ban.filter [1234]: INFO [sshd] Found 192.168.1.200 - 2024-01-15 14:23:45
2024-01-15 14:23:50,456 fail2ban.filter [1234]: INFO [sshd] Found 192.168.1.200 - 2024-01-15 14:23:50
2024-01-15 14:23:55,789 fail2ban.filter [1234]: INFO [sshd] Found 192.168.1.200 - 2024-01-15 14:23:55
2024-01-15 14:23:55,800 fail2ban.actions[1234]: NOTICE [sshd] Ban 192.168.1.200
# Terminal 1: ติดตาม log แบบ real-time
sudo tail -f /var/log/fail2ban.log &
sudo tail -f /var/log/auth.log &
# Terminal 2: ตรวจสอบ fail2ban status ก่อน
sudo fail2ban-client status sshd
# จำลอง failed SSH login (จาก terminal อื่นหรือ VM อื่น)
# *** ทดสอบกับเครื่องเสมือนเท่านั้น ***
for i in {1..5}; do
ssh invalid_user@127.0.0.1 2>/dev/null || true
sleep 1
done
# ตรวจสอบหลังทดสอบ
sudo fail2ban-client status sshd
sudo iptables -L f2b-sshd -v -n
SSL/TLS เป็น protocol เข้ารหัส communication ระหว่าง client และ server openssl เป็น command-line tool สำหรับสร้าง key, certificate, และทดสอบ SSL/TLS
# ขั้นตอน 1: สร้าง Private Key (RSA 4096-bit)
openssl genrsa -out server.key 4096
# ขั้นตอน 2: สร้าง CSR (Certificate Signing Request)
openssl req -new -key server.key -out server.csr \
-subj "/C=TH/ST=Bangkok/L=Bangkok/O=University/CN=lab6.local"
# ขั้นตอน 3: สร้าง Self-Signed Certificate (valid 365 วัน)
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
# ทางลัด: สร้าง key + certificate พร้อมกัน
openssl req -x509 -newkey rsa:4096 -keyout server.key -out server.crt \
-days 365 -nodes \
-subj "/C=TH/ST=Bangkok/L=Bangkok/O=University/CN=lab6.local"
# สร้าง CA Key
openssl genrsa -out ca.key 4096
# สร้าง CA Certificate (self-signed)
openssl req -x509 -new -nodes -key ca.key -sha256 -days 3650 -out ca.crt \
-subj "/C=TH/ST=Bangkok/O=MyCA/CN=My Root CA"
# สร้าง Server Key และ CSR
openssl genrsa -out server.key 2048
openssl req -new -key server.key -out server.csr \
-subj "/C=TH/ST=Bangkok/O=MyServer/CN=lab6.local"
# สร้าง Extension file
cat > server.ext << EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
subjectAltName = @alt_names
[alt_names]
DNS.1 = lab6.local
DNS.2 = www.lab6.local
IP.1 = 127.0.0.1
EOF
# Sign Certificate ด้วย CA
openssl x509 -req -in server.csr -CA ca.crt -CAkey ca.key \
-CAcreateserial -out server.crt -days 365 -sha256 -extfile server.ext
# ดูข้อมูล certificate
openssl x509 -in server.crt -text -noout
# ดูเฉพาะ subject และ issuer
openssl x509 -in server.crt -noout -subject -issuer
# ดูวันหมดอายุ
openssl x509 -in server.crt -noout -dates
# ตรวจสอบว่า key ตรงกับ certificate
openssl x509 -noout -modulus -in server.crt | openssl md5
openssl rsa -noout -modulus -in server.key | openssl md5
# ต้องได้ค่าเดียวกัน
# ทดสอบ SSL connection
openssl s_client -connect google.com:443
# ทดสอบ TLS version
openssl s_client -connect google.com:443 -tls1_2
openssl s_client -connect google.com:443 -tls1_3
# ตรวจสอบ SSL certificate ของ server
openssl s_client -connect lab6.local:443 -CAfile ca.crt
# สร้าง directory เก็บ certificate
sudo mkdir -p /etc/nginx/ssl
sudo cp server.crt server.key /etc/nginx/ssl/
# แก้ไข nginx config
sudo nano /etc/nginx/sites-available/lab6-ssl
server {
listen 443 ssl;
server_name lab6.local;
ssl_certificate /etc/nginx/ssl/server.crt;
ssl_certificate_key /etc/nginx/ssl/server.key;
# ปิด SSLv3 และ TLSv1/1.1 ที่ไม่ปลอดภัย
ssl_protocols TLSv1.2 TLSv1.3;
# กำหนด cipher ที่ปลอดภัย
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
# HSTS (HTTP Strict Transport Security)
add_header Strict-Transport-Security "max-age=63072000" always;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
# Redirect HTTP → HTTPS
server {
listen 80;
server_name lab6.local;
return 301 https://$host$request_uri;
}
# เปิดใช้งาน
sudo ln -s /etc/nginx/sites-available/lab6-ssl /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
เครื่องมือ diagnostic ช่วยตรวจสอบ connectivity, latency, routing, และปัญหา network
# ping พื้นฐาน
ping -c 4 google.com
ping -c 4 192.168.1.1
# ping พร้อมกำหนด packet size
ping -c 4 -s 1400 google.com
# traceroute (เส้นทาง packet)
traceroute google.com
# traceroute แบบ TCP (bypass firewall บางตัว)
sudo traceroute -T -p 80 google.com
# mtr (ping + traceroute แบบ real-time)
mtr google.com
mtr --report google.com
# ดู connection ทั้งหมด (ss แนะนำ)
ss -tulpn
# ดูเฉพาะ TCP
ss -tp
# ดู port ที่กำลัง listen
ss -tlnp
# ดู established connections
ss -tnp state established
# ดู network statistics
ss -s
# netstat (แบบเก่า)
netstat -tulpn
netstat -an | grep ESTABLISHED
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1234))
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:* users:(("nginx",pid=5678))
tcp ESTAB 0 0 192.168.1.100:22 192.168.1.10:54321 users:(("sshd",pid=9012))
# Query DNS record
dig google.com
dig google.com A
dig google.com MX
dig google.com NS
dig google.com TXT
# ใช้ DNS server เฉพาะ
dig @8.8.8.8 google.com
# Reverse DNS lookup
dig -x 8.8.8.8
# Query แบบสั้น
dig +short google.com
# ตรวจสอบ DNSSEC
dig +dnssec google.com
เงื่อนไข: วิเคราะห์ network ของตัวเอง
# 1. ดู network interface ทั้งหมด
ip addr show
# 2. ดู routing table
ip route show
# 3. ดู ARP table
ip neigh show
# 4. ดู active connections
ss -tulpn
# 5. ตรวจสอบ DNS
dig +short $(hostname)
# 6. ตรวจสอบ open ports ด้วย nmap
sudo nmap -sV -p- localhost
# 7. บันทึกผลทั้งหมด
{
echo "=== IP Addresses ==="
ip addr show
echo -e "\n=== Routes ==="
ip route show
echo -e "\n=== Listening Ports ==="
ss -tlnp
echo -e "\n=== Nmap Scan ==="
nmap -sV localhost
} > ~/lab6_network_audit.txt
echo "บันทึกผลที่: ~/lab6_network_audit.txt"
สถานการณ์: คุณได้รับมอบหมายให้ตรวจสอบและ harden web server ใหม่
# สแกน server เพื่อดู attack surface
sudo nmap -sV -A localhost -oN ~/step1_initial_scan.txt
# ดู services ที่กำลังทำงาน
sudo systemctl list-units --type=service --state=running
# ดู users ที่ login ได้
awk -F: '$7 != "/usr/sbin/nologin" && $7 != "/bin/false" {print $1}' /etc/passwd
# Reset และตั้งค่า ufw ใหม่
sudo ufw reset
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow ssh
sudo ufw allow 'Nginx Full'
sudo ufw enable
sudo ufw status verbose
sudo tee /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
ignoreip = 127.0.0.1/8 ::1
bantime = 3600
findtime = 600
maxretry = 5
backend = systemd
[sshd]
enabled = true
maxretry = 3
bantime = 7200
[nginx-http-auth]
enabled = true
port = http,https
logpath = /var/log/nginx/error.log
maxretry = 5
EOF
sudo systemctl restart fail2ban
sudo fail2ban-client status
# สร้าง self-signed cert สำหรับ testing
sudo openssl req -x509 -newkey rsa:2048 -keyout /etc/nginx/ssl/server.key \
-out /etc/nginx/ssl/server.crt -days 365 -nodes \
-subj "/C=TH/ST=Bangkok/O=Lab/CN=localhost"
sudo chmod 600 /etc/nginx/ssl/server.key
# ดักจับ 60 วินาทีหรือ 500 packet
sudo timeout 60 tcpdump -i lo -c 500 -w ~/step5_traffic.pcap 2>/dev/null &
# สร้าง test traffic
curl -s http://localhost/ > /dev/null
curl -sk https://localhost/ > /dev/null
# วิเคราะห์
wait
tcpdump -r ~/step5_traffic.pcap -n | head -30
echo "สรุป: $(tcpdump -r ~/step5_traffic.pcap 2>/dev/null | wc -l) packets"
# สแกนอีกครั้งเพื่อเปรียบเทียบ
sudo nmap -sV localhost -oN ~/step6_final_scan.txt
# เปรียบเทียบ
diff ~/step1_initial_scan.txt ~/step6_final_scan.txt
# สรุปผล
echo "=== Security Summary ==="
echo "Firewall: $(sudo ufw status | head -1)"
echo "Fail2ban: $(sudo fail2ban-client status | grep "Number of jail")"
echo "SSL Cert: $(openssl x509 -in /etc/nginx/ssl/server.crt -noout -dates 2>/dev/null | grep notAfter)"
นักศึกษาต้องตรวจสอบรายการต่อไปนี้และบันทึกผล:
#!/bin/bash
# security_check.sh — Lab 6 Security Checklist
echo "╔══════════════════════════════════════════╗"
echo "║ Lab 6 Security Hardening Checklist ║"
echo "╚══════════════════════════════════════════╝"
echo ""
# 1. SSH
echo "[1] SSH Configuration"
grep -E "^PermitRootLogin|^PasswordAuthentication|^Port" /etc/ssh/sshd_config 2>/dev/null || echo " ไม่พบ sshd_config"
echo ""
# 2. UFW
echo "[2] Firewall (UFW)"
sudo ufw status verbose 2>/dev/null
echo ""
# 3. Fail2ban
echo "[3] Fail2ban"
sudo fail2ban-client status 2>/dev/null
echo ""
# 4. Open Ports
echo "[4] Listening Ports"
ss -tlnp 2>/dev/null
echo ""
# 5. SSL
echo "[5] SSL Certificate"
[ -f /etc/nginx/ssl/server.crt ] && \
openssl x509 -in /etc/nginx/ssl/server.crt -noout -subject -dates || \
echo " ไม่พบ certificate"
echo ""
echo "✓ Checklist เสร็จสิ้น"
# บันทึกและรัน script
chmod +x security_check.sh
sudo ./security_check.sh | tee ~/lab6_security_report.txt
Nmap: ความแตกต่างระหว่าง TCP SYN scan (-sS) และ TCP Connect scan (-sT) คืออะไร? เมื่อใดควรใช้แต่ละแบบ?
Packet Capture: TCP Flags [S], [S.], [.] ใน tcpdump แทน step ใดของ TCP 3-Way Handshake?
Firewall: หากต้องการอนุญาตให้เฉพาะ IP 192.168.10.5 เข้าถึง MySQL (port 3306) โดยบล็อก IP อื่นทั้งหมด จะเขียน iptables rule อย่างไร?
Fail2ban: ความแตกต่างระหว่าง bantime, findtime, และ maxretry คืออะไร? และมีผลกระทบต่อ false positive อย่างไร?
SSL/TLS: ความแตกต่างระหว่าง Self-Signed Certificate และ Certificate ที่ signed โดย CA ที่น่าเชื่อถือคืออะไร?
| รายการ | ไฟล์ | คะแนน |
|---|---|---|
| Nmap scan result | lab6_nmap_result.txt |
20 |
| tcpdump capture | lab6_http.pcap |
20 |
| Firewall config | ufw status output |
20 |
| Fail2ban config | /etc/fail2ban/jail.local |
20 |
| SSL Certificate info | openssl x509 output |
10 |
| Security report | lab6_security_report.txt |
10 |
nmap -sV -O -A -p- TARGET # Full scan
nmap -sn 192.168.1.0/24 # Ping sweep (host discovery)
nmap --script vuln TARGET # Vulnerability scan
tcpdump -i eth0 -nn -A port 80 # HTTP traffic
tcpdump -i eth0 'tcp[tcpflags]==0x02' # SYN packets only
tcpdump -i eth0 -w file.pcap # บันทึกไฟล์
iptables -L -v -n --line-numbers # ดูกฎทั้งหมด
iptables -D INPUT 3 # ลบกฎที่ 3 ใน INPUT chain
iptables -I INPUT 1 -j ACCEPT # เพิ่มกฎที่ตำแหน่ง 1
fail2ban-client status [jail] # ดูสถานะ
fail2ban-client set sshd unbanip IP # ยกเลิก ban
fail2ban-regex /var/log/auth.log /etc/fail2ban/filter.d/sshd.conf # ทดสอบ filter
openssl x509 -in cert.crt -text -noout # ดู certificate
openssl s_client -connect host:443 # ทดสอบ SSL
openssl verify -CAfile ca.crt server.crt # ตรวจสอบ cert chain