็†ฑ้–€ๅˆ†้กž
 ่ผ‰ๅ…ฅไธญ…
็›ฎ้Œ„

๐Ÿ” Fail2Ban + iptables ้˜ฒๆšดๅŠ›็ ด่งฃๅฏฆๆˆฐ(SSH ่ˆ‡ๅธธ่ฆ‹ๆœๅ‹™)

    ๐Ÿ” Fail2Ban + iptables ้˜ฒๆšดๅŠ›็ ด่งฃๅฏฆๆˆฐ(SSH ่ˆ‡ๅธธ่ฆ‹ๆœๅ‹™)

    ๆšดๅŠ›็ ด่งฃ(Brute-force)ๆ”ปๆ“Šๆ˜ฏๅธธ่ฆ‹็š„ๅ…ฅไพตๆ‰‹ๆณ•,็‰นๅˆฅ้‡ๅฐ SSH、FTP、ๅ’Œๅ„็จฎ็ถฒ่ทฏๆœๅ‹™。ๆœฌๆ–‡็”จๅฏฆๅ‹™ๆ“ไฝœๆ•™ไฝ ๅฆ‚ไฝ•็”จ Fail2Ban ๆญ้… iptables ๅฟซ้€Ÿๅปบ็ซ‹้˜ฒ่ญทๆฉŸๅˆถ,ๅซ่จญๅฎš็ฏ„ไพ‹、ๆธฌ่ฉฆๆ–นๅผ่ˆ‡ๆณจๆ„ไบ‹้ …,้ฉ็”จๆ–ผไผบๆœๅ™จ็ฎก็†่€…่ˆ‡่ณ‡ๅฎ‰็ถญ้‹ไบบๅ“ก。

    ๐Ÿ“Œ ๆ–‡็ซ ้‡้ปž(ๅฟซ้€ŸๅฐŽ่ฆฝ)

    • Fail2Ban ๆ˜ฏไป€้บผ,ไปฅๅŠๅฆ‚ไฝ•่ˆ‡ iptables ๆ•ดๅˆ
    • ๅฎ‰่ฃ่ˆ‡ๅŸบๆœฌ่จญๅฎš(Debian/Ubuntu ่ˆ‡ RHEL/CentOS ็ฏ„ไพ‹)
    • ็ฏ„ไพ‹ jail ่ˆ‡่‡ช่จ‚ action(block via iptables)
    • ๆธฌ่ฉฆๆ”ปๆ“Š、ๆŸฅ็œ‹ๅฐ้Ž–่จ˜้Œ„่ˆ‡่งฃ้™คๅฐ้Ž–
    • ้ƒจ็ฝฒๅปบ่ญฐ่ˆ‡้€ฒ้šŽ้˜ฒ่ญท่ฆ้ปž

    1️⃣ Fail2Ban ่ˆ‡ iptables:็ฐก็Ÿญ่ชชๆ˜Ž

    Fail2Ban ๆœƒ็›ฃๆŽงๆ—ฅ่ชŒ(ๅฆ‚ /var/log/auth.log、/var/log/secure),็•ถๅตๆธฌๅˆฐ้‡่ค‡ๅคฑๆ•—็™ป้Œ„ๆˆ–ๅฏ็–‘่กŒ็‚บๆ™‚,้€้Ž「action」ๅ‘ผๅซ็ณป็ตฑ้˜ฒ็ซ็‰†(ไพ‹ๅฆ‚ iptables)ๆŠŠๆ”ปๆ“Šไพ†ๆบ IP ๆšซๆ™‚ๅฐ้Ž–。้€™็จฎ「ๅณๆ™‚ๅตๆธฌ+ๅ‹•ๆ…‹ๅฐ้Ž–」ๅฐๆŠ—ๆšดๅŠ›็ ด่งฃ้žๅธธๆœ‰ๆ•ˆ。

    2️⃣ ๅฎ‰่ฃ(ๅฟซ้€ŸๆŒ‡ไปค)

    ไปฅไธ‹ๆไพ› Debian/Ubuntu ่ˆ‡ RHEL/CentOS ็š„ๅฎ‰่ฃๆŒ‡ไปค:

    # Debian / Ubuntu
    sudo apt update
    sudo apt install -y fail2ban iptables
    
    # RHEL / CentOS / AlmaLinux
    sudo yum install -y epel-release
    sudo yum install -y fail2ban iptables
    sudo systemctl enable --now iptables   # ่‹ฅไฝฟ็”จ legacy iptables
    

    3️⃣ ๅŸบๆœฌ่จญๅฎšๆช”ไฝ็ฝฎ่ˆ‡ๅทฅไฝœๆต็จ‹

    • /etc/fail2ban/jail.conf:้ ่จญๆจฃๆฟ(ไธ่ฆ็›ดๆŽฅๆ”น,ๆ”น็”จ jail.local)
    • /etc/fail2ban/jail.local:ๆ”พไฝ ็š„่‡ช่จ‚ jail ่ˆ‡ๅƒๆ•ธ
    • /etc/fail2ban/action.d/:ๅฎš็พฉๅฐ้Ž–ๆ–นๅผ(iptables、firewalld、ufw ็ญ‰)

    4️⃣ ็ฏ„ไพ‹:้‡ๅฐ SSH ็š„ jail.local

    ๆŠŠไปฅไธ‹ๅ…งๅฎนๅŠ ๅ…ฅ /etc/fail2ban/jail.local(ๆˆ–ๅœจ jail.d/ ๅปบๆช”):

    [DEFAULT]
    # ๅ…จๅŸŸ้ ่จญ
    bantime  = 3600        # ๅฐ้Ž–ๆ™‚้–“(็ง’)— 1 ๅฐๆ™‚
    findtime = 600         # ๅœจๅคšๅฐ‘็ง’ๅ…ง่จˆ็ฎ—ๅคฑๆ•—ๆฌกๆ•ธ — 10 ๅˆ†้˜
    maxretry = 5           # ่ถ…้Žๅคฑๆ•—ๆฌกๆ•ธๅ‰‡ๅฐ้Ž–
    backend = auto
    usedns = no
    
    [sshd]
    enabled = true
    port = ssh
    filter = sshd
    logpath = /var/log/auth.log
    maxretry = 5
    bantime = 3600
    action = iptables-multiport[name=SSH, port="ssh", protocol=tcp]
    

    5️⃣ iptables action ็ฏ„ไพ‹(้ ่จญ้€šๅธธๅทฒๅญ˜ๅœจ)

    Fail2Ban ๆœƒไฝฟ็”จ action.d/ ไธ‹็š„ๅ‹•ไฝœ。็ณป็ตฑ้€šๅธธๅทฒๆไพ› iptables-multiport。่‹ฅไฝ ๆƒณ็ขบ่ชๆˆ–่‡ช่จ‚,ๅฏๅƒ่€ƒ:

    # ็ฏ„ไพ‹ๅ‹•ไฝœ็‰‡ๆฎต(็ฐกๅŒ–)
    /sbin/iptables -I f2b- 1 -s  -j DROP
    # ๆˆ–ไฝฟ็”จ REJECT
    /sbin/iptables -I f2b- 1 -s  -j REJECT --reject-with icmp-port-unreachable
    

    6️⃣ ๅปบ็ซ‹ๅฐˆ็”จ iptables chain(Fail2Ban ่‡ชๅ‹•ๅปบ็ซ‹)

    ๅ•Ÿ็”จ Fail2Ban ไธฆๅ•Ÿๅ‹• jail ๅพŒ,Fail2Ban ๆœƒ่‡ชๅ‹•ๅปบ็ซ‹ๅƒๆ˜ฏ f2b-sshd ็š„้ˆ(chain),ไธฆๆŠŠๅฐๆ‡‰่ฆๅ‰‡ๅŠ ๅ…ฅ INPUT。ไฝ ๅฏไปฅ็”จไปฅไธ‹ๆŒ‡ไปคๆชข่ฆ–:

    sudo iptables -L -n --line-numbers
    sudo iptables -L f2b-sshd -n --line-numbers    # ๆชขๆŸฅ f2b ๅฐ้Ž–ๆธ…ๅ–ฎ

    7️⃣ ้‡ๅฐๅคšๆœๅ‹™(HTTP / vsftpd / postfix)็ฏ„ไพ‹ jail

    [apache-auth]
    enabled = true
    port = http,https
    filter = apache-auth
    logpath = /var/log/apache2/error.log
    maxretry = 3
    bantime = 86400
    
    [vsftpd]
    enabled = true
    port = ftp
    filter = vsftpd
    logpath = /var/log/vsftpd.log
    maxretry = 5
    bantime = 7200
    
    [postfix]
    enabled = true
    port = smtp
    filter = postfix
    logpath = /var/log/mail.log
    maxretry = 5
    bantime = 7200
    

    8️⃣ ๆธฌ่ฉฆ่ˆ‡้™ค้Œฏ

    ๆธฌ่ฉฆๅฐ้Ž–ๅฏไปฅ็”จๆจกๆ“ฌๅคฑๆ•—็™ปๅ…ฅๆˆ–็›ดๆŽฅ็”จๆธฌ่ฉฆ IP ่งธ็™ผ:

    # ้‡ๅ•Ÿ fail2ban ๅพŒๆชขๆŸฅ็‹€ๆ…‹
    sudo systemctl restart fail2ban
    sudo systemctl status fail2ban
    
    # ๆŸฅ็œ‹ jail ็‹€ๆ…‹
    sudo fail2ban-client status
    sudo fail2ban-client status sshd
    
    # ๆŸฅ็œ‹ๆŸ jail ็š„ๅฐ้Ž– IP ๅˆ—่กจ
    sudo fail2ban-client status sshd
    
    # ๆ‰‹ๅ‹•ๅฐ้Ž– / ่งฃๅฐ
    sudo fail2ban-client set sshd banip 1.2.3.4
    sudo fail2ban-client set sshd unbanip 1.2.3.4
    

    9️⃣ ้€ฒ้šŽ:่‡ช่จ‚ filter(็ฏ„ไพ‹็‚บ SSH)

    Filter ๅฎš็พฉๅœจ /etc/fail2ban/filter.d/sshd.conf。่‹ฅ่ฆๅŠ ๅ…ฅ่‡ช่จ‚ๅตๆธฌ,ๅฏๅปบ็ซ‹่‡ช่จ‚ filter:

    # /etc/fail2ban/filter.d/custom-ssh.conf
    [Definition]
    failregex = ^%(__prefix_line)s(?:error: PAM: )?Authentication failure for .* from (?: port \d*)?(?: ssh\d*)?$
                ^%(__prefix_line)sFailed password for .* from  port \d+
    ignoreregex =
    

    ๐Ÿ”Ÿ ๆธฌ่ฉฆๆ”ปๆ“Š(ๅฎ‰ๅ…จๆธฌ่ฉฆๆญฅ้ฉŸ)

    ่ซ‹ๅชๅœจไฝ ่‡ชๅทฑ็š„ๆธฌ่ฉฆ็’ฐๅขƒๆˆ–ๅ–ๅพ—่จฑๅฏ็š„็ณป็ตฑไธŠๅŸท่กŒๆจกๆ“ฌๆ”ปๆ“Š。ไธ‹้ข็คบ็ฏ„ๅฆ‚ไฝ•็”จ sshpass ๅšๅคšๆฌก้Œฏ่ชคๅฏ†็ขผๅ˜—่ฉฆ(ๆœƒ่ขซๅฐ้Ž–):

    # ๅฎ‰่ฃๆธฌ่ฉฆๅทฅๅ…ท(ๆธฌ่ฉฆ็’ฐๅขƒ)
    sudo apt install -y sshpass
    
    # ๆจกๆ“ฌ้Œฏ่ชค็™ปๅ…ฅ 6 ๆฌก(ๆœƒ่งธ็™ผ maxretry)
    for i in {1..6}; do
      sshpass -p "wrongpassword" ssh -o StrictHostKeyChecking=no user@your-server.example.com exit
    done

    1️⃣1️⃣ ๆ—ฅ่ชŒ่ˆ‡่ฟฝ่นค

    Fail2Ban ็š„ๆดปๅ‹•ๆœƒๅฏซๅ…ฅ็ณป็ตฑๆ—ฅ่ชŒ(้€šๅธธๆ˜ฏ /var/log/fail2ban.log),ๅŒๆ™‚ๆœƒๅœจ systemd journal ไธญๆœ‰็›ธ้—œ็ด€้Œ„:

    sudo tail -n 200 /var/log/fail2ban.log
    sudo journalctl -u fail2ban -f

    1️⃣2️⃣ ้ƒจ็ฝฒๆณจๆ„ไบ‹้ …่ˆ‡ๆœ€ไฝณๅฏฆๅ‹™

    • ้ฟๅ…่ชคๅฐ้Ž–ๅ…ง้ƒจ IP:ๅฐๆ–ผๅฏไฟกไปป็š„ๅ…ง้ƒจ็ถฒๆฎตๅฏๅœจ ignoreip ไธญๅŠ ๅ…ฅ,ๅฆ‚ ignoreip = 127.0.0.1/8 10.0.0.0/8
    • ๆ•ดๅˆ fail2ban ่ˆ‡ firewalld / nftables:่‹ฅ็ณป็ตฑไฝฟ็”จ firewalld ๆˆ– nftables,่ซ‹้ธๆ“‡็›ธๅฎน็š„ action(ๅฆ‚ firewalld action ๆˆ– nftables action),้ฟๅ…ๅŒๆ™‚ๆทท็”จ iptables legacy ่ˆ‡ nft。
    • ็›ฃๆŽง่ˆ‡ๅ‘Š่ญฆ:ๆŠŠ fail2ban log ่ˆ‡ๅฐ้Ž–ไบ‹ไปถๆŽจๅˆฐ้›†ไธญๅŒ–ๆ—ฅ่ชŒๆˆ–็›ฃๆŽง(ๅฆ‚ ELK / Grafana Loki),ไปฅไพฟ็ตฑ่จˆๆ”ปๆ“Šไพ†ๆบ่ˆ‡่ถจๅ‹ข。
    • ่ชฟๆ•ด bantime ่ˆ‡ maxretry:ๆ นๆ“šๆœๅ‹™็š„้‡่ฆๆ€ง่ˆ‡ๆต้‡ๆจกๅผๆฑบๅฎšๅฐ้Ž–ๆ™‚้–“;ๅฐๆ–ผ้ซ˜้ขจ้šชๆœๅ‹™ๅฏๆŽก้•ทๆ™‚้–“ๅฐ้Ž–。
    • ๆญ้…ๅคšๅ› ็ด ่ช่ญ‰ (MFA):Fail2Ban ๆ˜ฏ้˜ปๆ“‹่‡ชๅ‹•ๅŒ–ๆ”ปๆ“Š็š„ๅฅฝๅทฅๅ…ท,ไฝ†ๆ‡‰่ˆ‡ SSH key + 2FA ไธ€่ตทไฝฟ็”จ,ๆ‰่ƒฝ้”ๅˆฐๆ›ดๅผท็š„ไฟ่ญท。

    1️⃣3️⃣ ๅธธ่ฆ‹ๅ•้กŒ(FAQ)

    • Q:Fail2Ban ็„กๆ•ˆๆˆ–ไธๅฐ้Ž–?
      A:ๆชขๆŸฅ logpath ่ˆ‡ filter ็š„ failregex ๆ˜ฏๅฆๅฐๆ—ฅ่ชŒๆ ผๅผๅŒน้…,ไธฆ็ขบ่ช fail2ban ๆœ‰ๆฌŠ่ฎ€ๅ– log ๆช”。
    • Q:ๅฆ‚ไฝ•ๆฐธไน…ๅฐ้Ž–็‰นๅฎš IP?
      A:ๅฏ็›ดๆŽฅๅœจ้˜ฒ็ซ็‰†ๅŠ ๅ…ฅ DROP ่ฆๅ‰‡,ๆˆ–ๅœจ fail2ban action ๆ”น็‚บๆฐธไน…ๅฐ้Ž–(bantime = -1)。
    • Q:ไฝฟ็”จ cloud provider(ๅฆ‚ AWS)ๆ™‚ๆ€Ž้บผๅš?
      A:ๅœจ cloud ไธญๅปบ่ญฐๆญ้… security group、WAF、ไปฅๅŠ้›†ไธญๅŒ–้˜ฒ่ญท,fail2ban ้ฉ็”จๆ–ผ instance ๅฑค้ข็š„ๅณๆ™‚ๅฐ้Ž–。

    ๐Ÿ“˜ ็ต่ชž

    Fail2Ban ่ˆ‡ iptables ็š„ๆญ้…่ƒฝๅฟซ้€Ÿๅปบ็ซ‹ๅฐๆŠ—ๆšดๅŠ›็ ด่งฃ็š„็ฌฌไธ€้“้˜ฒ็ทš。้€™ๅฅ—ๆ–นๆกˆ้ƒจ็ฝฒๆˆๆœฌไฝŽ、ๅ›ž้ฅ‹ๅฟซ,ๆ˜ฏๅคงๅคšๆ•ธ Linux ไผบๆœๅ™จ็š„ๅฟ…ๅ‚™้˜ฒ่ญทๅทฅๅ…ท。ไธ‹ไธ€ๆญฅๅฏ่€ƒๆ…ฎ็ตๅˆ้›†ไธญๆ—ฅ่ชŒ、WAF ่ˆ‡ IAM ๆœ€ไฝณๅฏฆๅ‹™,ๅปบ็ซ‹ๅคšๅฑคๆฌก็š„่ณ‡ๅฎ‰้˜ฒ่ญท。


    ๐Ÿ”— ๅปถไผธ้–ฑ่ฎ€

    — WWFandy・็ณป็ตฑๅฎ‰ๅ…จ่ˆ‡็ถญ้‹็ญ†่จ˜

    ๐Ÿ”— ๅˆ†ไบซ้€™็ฏ‡ LINE Facebook X

    ๆฒ’ๆœ‰็•™่จ€:

    ๅผต่ฒผ็•™่จ€

    ๅญ—็ดš