# firewalld防火牆

## 由於omv本身的防火牆功能較陽春(系統主動建立的連線設定問題多)，改用firewalld防火牆

```
sudo apt remove --purge ufw
sudo apt install firewalld
```

#### sudo systemctl status firewalld 的錯誤訊息

#### debian 10 firewalld 0.6.3 Error: COMMAND\_FAILED: '/usr/sbin/ip6tables-restore -w -n' failed: ip6tables-restore v1.8.2 (nf\_tables): line 4: RULE\_REPLACE failed (No such file or directory): rule in chain OUTPUT 解決辦法

vim /etc/firewalld/firewalld.conf&#x20;

有個InvividualCalls=no 把它改成InvividualCalls=yes&#x20;

儲存離開

sudo  systemctl restart firewalld&#x20;

```
# 啟動 firewalld 服務
systemctl start firewalld
# 停止 firewalld 服務
systemctl stop firewalld
# 設定開機自動啟動 firewalld 服務
systemctl enable firewalld
# 列出所有設定
sudo firewall-cmd --list-all
```

## 重要設置:白名單 IP 位址

#### 方法一(推薦)

```
#若要將特定的 IP 位址設定為白名單，讓它可以連接任何的連接埠，這樣做很快便完成：
# 將 172.16.10.80 加入白名單
firewall-cmd --zone=public   --add-rich-rule='rule family="ipv4" source address="172.16.10.80/32" accept'
# 將 120.115.4.0/24 列為 public 區域的白名單，馬上生效
firewall-cmd --zone=public \
  --add-rich-rule='rule family="ipv4" source address="120.115.4.0/24" accept'
#將以上設定寫入常駐服務
sudo firewall-cmd --runtime-to-permanent
```

#### 方法二

```
# 永久將 120.115.4.0/24 列為 public 區域的白名單，需reload
sduo firewall-cmd --zone=public \
  --add-rich-rule='rule family="ipv4" source address="120.115.4.0/24" accept' \
  --permanent
 sudo firewall-cmd --reload
```

### 關閉白名單IP(請先把ssh服務開通，不然就通通不通)

```
firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="120.115.4.0/24" service name="ssh" accept'
```

```
 firewall-cmd --zone=public --remove-rich-rule='rule family="ipv4" source address="120.115.4.0/24" accept'
```

## 指定zone的網路介面

```
sudo firewall-cmd --zone=public --change-interface=eno1
sudo firewall-cmd --get-zone-of-interface=eno1
sudo firewall-cmd --runtime-to-permanent
```

## cat /etc/firewalld/zones/public.xml

```
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <interface name="eno1"/>
  <rule family="ipv4">
    <source address="120.115.4.0/24"/>
    <service name="ssh"/>
    <accept/>
  </rule>
  <rule family="ipv4">
    <source address="120.115.4.0/24"/>
    <accept/>
  </rule>
</zone>

```

## 查詢區域設定

列出 firewalld 中已經定義好的區域，執行：

```
# 列出所有的區域
firewall-cmd --get-zones
```

## 設定預設 ZONE

```
firewall-cmd --set-default-zone=public
```

## 列出所有的區域與內容

```
sudo firewall-cmd --list-all-zones
```

## 查詢public zone永久設定值

```
sudo firewall-cmd --zone=public --list-all --permanent
```

## 區域簡介

firewalld 的區域（zone）可用來設定網路連線、介面等所處的運作環境，對內使用的區域其防火牆規則會較為寬鬆，反之若是對外的區域其規則會較為嚴謹。

一條網路連線或介面只能隸屬於一個區域，我們可以自訂區域的設定，也可以直接從 firewalld 預設的幾個區域中選擇：

| 區域         | 描述                                                                              |
| ---------- | ------------------------------------------------------------------------------- |
| `drop`     | 任何往內的封包都會被丟棄，只允許往外傳送的封包。                                                        |
| `block`    | 任何來自於外部的連線都會被阻擋，只允許自己系統主動建立的連線。                                                 |
| `public`   | 公開區域，預設不信任其他電腦與網路，只有被允許的連線才能進入。通常大部分的連線設定都會放在這裡。                                |
| `external` | 公開區域，適用於 NAT 網路環境。                                                              |
| `dmz`      | 非軍事區域（demilitarized zone，有點像是放在外頭的危險區域），允許外部的連線進入，但其對內的連線則有限制，只有被允許的連線才能連進內部網路。 |
| `work`     | 公司內部等工作區域，在此區域中不應該會有惡意的攻擊者。只有被允許的連線可以進入。                                        |
| `home`     | 家裡頭的網路區域，在此區域中不應該會有惡意的攻擊者。只有被允許的連線可以進入。                                         |
| `internal` | 內部網路區域，在此區域中不應該會有惡意的攻擊者。只有被允許的連線可以進入。                                           |
| `trusted`  | 完全信任的區域，接受所有連線。                                                                 |

## 列出預設區域

```
# 列出預設區域
firewall-cmd --get-default-zone
public
若要更改 firewalld 預設的區域，可以執行
```

## 設定預設區域

```
# 設定預設區域
firewall-cmd --set-default-zone=work
firewall-cmd --get-default-zone
```

### 列出預先定義的服務名稱

```
# 列出預先定義的服務名稱
firewall-cmd --get-services
```

若要將指定的服務新增至指定的區域中，可執行：

```
# 將 http 服務新增至 public 區域中
sudo firewall-cmd --zone=public --add-service=http
```

上面這行指令只是暫時將 `http` 服務新增至 `public` 區域中，重新開機後這個設定就不見了，若測試沒問題，再將設定寫入設定檔，永久保存：

```
# 使用 --permanent(常駐) 永久將 http 服務新增至 public 區域中
sudo firewall-cmd --zone=public --permanent --add-service=http
```

sudo firwall-cmd --permanent --add-port=8000/tcp 插入防火墻規則，放通8000端口。&#x20;

埠號的部分也可以用範圍的方式指定，一次開通多個連接埠：

```
# 開啟 udp 的 1812 至 1813 連接埠
sudo firewall-cmd --zone=public --add-port=1812-1813/udp

# 永久開啟 udp 的 1812 至 1813 連接埠
sudo firewall-cmd --zone=public --permanent --add-port=1812-1813/udp
```

### 移除服務

若要將指定的服務從某個區域中移除，可以執行：

```
# 將 http 服務從 public 區域中移除
sudo firewall-cmd --zone=public --remove-service=http

# 永久將 http 服務從 public 區域中移除
sudo firewall-cmd --zone=public --permanent --remove-service=http
```

如果是要移除自訂的通訊協定與埠號，則執行：

```
# 關閉  連接埠
sudo firewall-cmd --zone=public --remove-port=1812-1813/udp

# 永久關閉 連接埠
sudo firewall-cmd --zone=public --permanent --remove-port=1812-1813/udp
```

### 新增服務名稱

除了直接指定通訊協定與埠號之外，我們也可以自訂新的服務名稱，加入 firewalld 的服務名稱清單中，這樣就可以使用服務名稱的方式來設定開啟的服務，這樣做的好處是可以讓防火牆的設定看起來更容易理解，清楚說明埠號的用途。

若要使用名稱(如之前的8000/tcp)，可以參考/usr/lib/firewalld/services 添加cloudcmd.xml到/etc/firewalld/cloudcmd.xml

```
<?xml version="1.0" encoding="utf-8"?>
<service>
  <short>cloudcmd</short>
  <description>Cloud Commander is a file manager for the web. It includes a com$
  <port protocol="tcp" port="8000"/>
</service>
```

### 重新載入設定

```
# 重新載入設定
sudo firewall-cmd --reload
```

```
#add source IP 限制
firewall-cmd --zone=public \
  --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" accept' \
  --permanent
#remove source IP 限制
 firewall-cmd --zone=public   --remove-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" accept' --permanent
```

cat /etc/firewalld/public.xml

```
<?xml version="1.0" encoding="utf-8"?>
<zone>
  <short>Public</short>
  <description>For use in public areas. You do not trust the other computers on networks to not harm your computer. Only selected incoming connections are accepted.</description>
  <service name="ssh"/>
  <service name="dhcpv6-client"/>
  <service name="cockpit"/>
  <service name="syncthing-gui"/>
  <service name="cloudcmd"/>
  <rule family="ipv4">
    <source address="192.168.0.0/24"/>
    <service name="http"/>
    <accept/>
  </rule>
</zone>
```

firewall-cmd --zone=public --add-source=120.115.4.29

firewall-cmd --zone=public --remove-source=120.115.4.29

firewall-cmd --runtime-to-permanent

用於apt-get&#x20;

```
# DNS
-A INPUT -p tcp -m tcp --sport 53 -j ACCEPT
-A INPUT -p udp -m udp --sport 53 -j ACCEPT

# apt-get
-A INPUT -p tcp --sport 80 -j ACCEPT
```
