防火牆設定

在 Ubuntu Linux 上,可以使用 ufw 或 iptables 來設定防火牆。以下是相關指令,以及我一路上踩過的坑。🤣

UFW

  • 查看防火牆設定
    sudo ufw status
  • 新增防火牆規則
    # allow ssh
    sudo ufw allow ssh
    # allow specific ip to specific port
    sudo ufw allow from 123.123.123.123 to any port 22/tcp
  • 以編號列出防火牆規則
    sudo ufw status numbered
    範例
    root@localhost:~# sudo ufw status numbered
    Status: active

    To Action From
    -- ------ ----
    [ 1] 80/tcp ALLOW IN Anywhere
    [ 2] 443/tcp ALLOW IN Anywhere
    [ 3] 22/tcp ALLOW IN 123.123.123.123
    [ 4] 22/tcp ALLOW IN 123.123.123.124
    [ 5] 443/tcp (v6) ALLOW IN Anywhere (v6)
    [ 6] 80/tcp (v6) ALLOW IN Anywhere (v6)
  • 刪除特定規則
    sudo ufw delete [number]
  • 重新載入規則
    sudo ufw reload
  • 啟用/停用規則
    sudo ufw enable
    sudo ufw disable

IPTABLES

如果你用 ufw 新增了 port 22 的規則,可以用以下指令驗證。但最終應該檢查 sudo iptables -L INPUT -n --line-number 來確認規則確實存在。

  • 查看 port 22 的規則
    如果你用 ufw 新增了 port 22 的規則,可以這樣驗證
    sudo iptables -L -n | grep :22
    ACCEPT tcp -- 123.123.123.123 0.0.0.0/0 tcp dpt:22
    ACCEPT tcp -- 123.123.123.124 0.0.0.0/0 tcp dpt:22
  • 查看 input 規則
    sudo iptables -L INPUT -n --line-number
    • 機器 1
      root@localhost:~# sudo iptables -L INPUT -n --line-number
      Chain INPUT (policy DROP)
      num target prot opt source destination
      1 ufw-before-logging-input all -- 0.0.0.0/0 0.0.0.0/0
      2 ufw-before-input all -- 0.0.0.0/0 0.0.0.0/0
      3 ufw-after-input all -- 0.0.0.0/0 0.0.0.0/0
      4 ufw-after-logging-input all -- 0.0.0.0/0 0.0.0.0/0
      5 ufw-reject-input all -- 0.0.0.0/0 0.0.0.0/0
      6 ufw-track-input all -- 0.0.0.0/0 0.0.0.0/0
      7 ACCEPT tcp -- 123.123.123.123 0.0.0.0/0 tcp dpt:22
      8 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
    • 機器 2
      root@localhost:~#  sudo iptables -L INPUT -n --line-number
      Chain INPUT (policy DROP)
      num target prot opt source destination
      1 ACCEPT tcp -- 123.123.123.123 0.0.0.0/0 tcp dpt:22
      2 ACCEPT tcp -- 123.123.123.124 0.0.0.0/0 tcp dpt:22
      3 f2b-sshd tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 22
      4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
      5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
      ...
  • 新增 input 規則
    sudo iptables -A INPUT -p tcp -s 123.123.123.123 --dport 22 -j ACCEPT
  • 刪除 input 規則
    sudo iptables -D INPUT <line-number>

實戰心得

這篇文章的起因是公司另一個團隊因為缺乏防火牆設定且密碼複雜度不足而被駭。為了加強資訊安全,我決定將 port 22 的存取限制為 IP 白名單。不過由於對指令不熟悉,過程中踩了一些坑。

一般來說,加上防火牆白名單應該就足夠了。如果不是內部人員,就不應該能存取特定 IP(歡迎分享更好的方法 😆)。

在機器 1 上,使用以下指令設定 ufw:

sudo ufw allow from [IP] to any port 22/tcp

接著用

sudo iptables -L -n | grep :22

驗證後,我的 IP 位址有顯示出來。因此在機器 1 上,我可以用特定 IP 登入,提升了機器的安全性。然而,在機器 2 上用同樣的方法卻出了問題——我的 IP 無法登入(駭客登不進來,但我也登不進去 XD)。

主要原因是機器 2 的 ufw 規則沒有套用到 iptables,所以不管怎麼設定 ufw 都沒有作用(或者可能需要重新安裝 ufw)。

我最後的解法是直接用 iptables 加入白名單,確保規則確實寫入 iptables
sudo iptables -A INPUT -p tcp -s 123.123.123.123 --dport 22 -j ACCEPT