# 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
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://kawsing.gitbook.io/opensystem/andoid-shou-ji/untitled/fang-huo-qiang.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
