# DMZ Host 基本介紹與設定 ## DMZ ![102](https://hackmd.io/_uploads/ryhpV90o1l.png) 有時候公司或組織會需要提供對外的服務,像是 mail server 或 web server,讓別人從外網可以存取到這些提供的服務,但同時公司也有一些東西不想被外界存取、只想給公司內部使用。這時就可以用 Demilitarized zone(DMZ)非軍事化區域(又稱作 perimeter network 或 screened subnet)。 非軍事化區域其實就是在公司/組織的內網和外網之間多一個 physical 或 logical 的 subnetwork。將欲提供給外部使用的伺服器都放在 DMZ 裡面,外網的使用者可以存取到 DMZ 裡面的服務;而公司不想讓外界存取的東西則用防火牆擋住,放在公司的 LAN 裡面,讓外界無法存取到 LAN 內的東西。 ## Architectures of DMZ 有許多不同的方式可以用來設計 DMZ,其中兩種最基本的方式是使用 single firewall 以及 dual firewalls。這些架構可以被擴展來建立更複雜的架構。 ### Single Firewall DMZ ![image](https://hackmd.io/_uploads/Sybfr7E3Jg.png) > https://en.wikipedia.org/wiki/File:DMZ_network_diagram_1_firewall.svg 此架構只有使用一層防火牆建立 DMZ,從圖片可以看到此防火牆必須要有三個網路 interfaces 才能建立出對外網、LAN、以及 DMZ 的 interface。 ### Dual Firewall DMZ ![image](https://hackmd.io/_uploads/Byl1eBQN3yg.png) >https://en.wikipedia.org/wiki/File:DMZ_network_diagram_2_firewall.svg 此架構會用到兩層防火牆,第一層防火牆必須被設定成只允許到達 DMZ 的流量,第二層防火牆則是只允許由 LAN 到 DMZ 的流量。 ## DMZ Host ![104](https://hackmd.io/_uploads/H16sB9Csyg.png) 有些路由器會提供 DMZ host 的功能,所謂的 DMZ host 跟前面提到那些位在 DMZ 內的伺服器是不太一樣的概念。 DMZ host 是位在 LAN 內的一個裝置,只要設定好 DMZ host,那所有目的地是 router WAN IP 的流量,且若未符合任何防火牆規則,那就全部都會被轉發到 DMZ host。 ![image](https://hackmd.io/_uploads/HkKqmZV31l.png) 例如,假設現在有個 LAN 是 `192.168.50.0/24` - DMZ host 是 `192.168.50.60` - Gateway IP 是 `192.168.50.1` - 假設 router 的 WAN IP 是 `123.123.123.123` 那所有通往 router WAN IP `123.123.123.123` 的流量都會全部被轉發到位在內網的 DMZ host,也就是 `192.168.50.60`。 所以可以看到,DMZ host 跟位在真正的 DMZ 裡面的 server 是不一樣的。Router 並沒有將 DMZ host 跟內網做隔離,而真正的 DMZ 則會經由防火牆將內網與 DMZ 做隔離。 :::success DMZ host 跟 port forwarding 的行為有點像,都是將來自外網的流量轉發到位在內網的裝置,而他們的差異在於: - DMZ host 是將沒有符合防火牆規則的外部流量,全部都轉發到指定的 LAN 裝置,也就是 DMZ host - Port forwarding 只轉發特定 port 的流量到 LAN 內的裝置 ::: ## 用 OpenWRT 裝置設定 DMZ Host ### 測試環境 > 由於拿不到 public IP,所以以下都是用 LAN 來模擬~ ![dmz_test](https://hackmd.io/_uploads/HywrSqshJg.png) - 一台位在 `192.168.50.0/24` 的 MacBook,IP 是 `192.168.50.61` - 安裝 OpenWRT 的 Marvell ESPRESSObin v7 開發板,在這裡當作是 router 的腳色 - 其 `wan` interface 位在 `192.168.50.0/24`,IP 是 `192.168.50.99` - 其 `lan` interface 則是 `192.168.60.0/24` 的 gateway,IP 是 `192.168.60.1` - 一個 Ubuntu 裝置,IP 是 `192.168.60.248`,要把它設定為 DMZ host ### 設定 DMZ Host 從前面的說明可以知道要把所有到 Marvell ESPRESSObin v7 開發板 WAN IP 的封包,都轉發到 Ubuntu 裝置 -> 所以必須要做 DNAT,將封包的 Destination IP address 改為 DMZ host 的 IP,也就是 `192.168.60.248` 另外,從 DMZ host 發出的封包,在經過 Marvell ESPRESSObin v7 開發板時,也必須將 source IP address 改成 Marvell ESPRESSObin v7 開發板的 wan IP -> 所以必須要做 SNAT,將封包的 source IP address 改為 `192.168.50.99` #### ++設定 DNAT++ ![pic02](https://hackmd.io/_uploads/Skg_6-43kg.png) 在 OpenWRT 裝置的 `/etc/config/firewall` 內新增以下一個新的 `redirect` config: ```config config redirect option name 'DMZ-Host' option src 'wan' option dest 'lan' option dest_ip '192.168.60.248` option target 'DNAT' ``` #### ++設定 SNAT++ ![pic01](https://hackmd.io/_uploads/rylvT-43Jg.png) 修改 OpenWRT 裝置的 `/etc/config/firewall` 的 `wan` zone config: - `option forward` 是 `'ACCEPT'` - 允許 `wan` 做轉發 - `option masq` 是 `'1'` - 允許 masquerade,也就是將封包的 source IP address 改成 `wan` interface 的 IP - PS. OpenWRT 的防火牆的 `redirect` 主要是拿來做 DNAT,不是拿來做 SNAT。若要做 SNAT 主要就是將 `/etc/config/firewall` 的 `wan` zone 的 `masq` 設為 `1` 修改完這些防火牆的 configuration 後,記得要輸入以下指令重啟防火牆,這樣剛剛做的設定才會生效喔~ ```shell /etc/init.d/firewall reload ``` ### 使用 `iperf3` 測試 ![dmz_iper3_test](https://hackmd.io/_uploads/HyGPr9in1x.png) 做完前述的設定後,首先,在 Ubuntu 裝置(也就是這裡設定的 DMZ host)執行以下指令,讓 Ubuntu 裝置成為 `iperf3` 的 server: ```shell $ iperf3 -s ``` 在 MacBook 輸入以下指令,讓 MacBook 成為 `iperf3` 客戶端,並嘗試連到 `192.168.50.99`: ```shell $ iperf3 -c 192.168.50.99 ``` 以下是執行的截圖,可以看到雖然 MacBook 執行的是 `iperf3 -c 192.168.50.99`,指定的是 Marvell ESPRESSObin v7 開發板的 IP,但是 Ubuntu 的 `iperf3` 卻有收到封包,代表有成功將流量轉發到 DMZ host。 ![iperf3_s](https://hackmd.io/_uploads/B1Ob8csn1e.png) ![pic02](https://hackmd.io/_uploads/HJrjR-Enyx.png) #### 若都沒做設定 若前面都沒做 DMZ host 的設定,直接執行 `iperf3`,會看到以下畫面: ![image](https://hackmd.io/_uploads/SyhiZMN2Je.png) ### 使用 SSH 測試 接下來來測試看看若在 MacBook 執行 ssh 連線的指令,IP 指定 Marvell ESPRESSObin v7 開發板的 `wan` IP,看是否會將這個 ssh 連線請求轉發到 DMZ host。 ![dmz_ssh_test](https://hackmd.io/_uploads/Sk0Orqo2Jg.png) 以下是測試的結果,可以看到在 MacBook 端執行 ssh 指令,並指定 Marvell ESPRESSObin v7 開發板的 `wan` IP 後,有成功連上 Ubuntu 裝置: ![pic03](https://hackmd.io/_uploads/HyCXDfV31g.png) ## References https://en.wikipedia.org/wiki/DMZ_(computing) <!-- --- ![Screen Shot 2025-03-09 at 11.57.19 PM](https://hackmd.io/_uploads/rycVo4sokl.png) ![image](https://hackmd.io/_uploads/HycLjNso1g.png) ![image](https://hackmd.io/_uploads/HkZkhEoo1e.png) INITAIL CONFIG ![Screen Shot 2025-03-09 at 11.58.27 PM](https://hackmd.io/_uploads/rkXroNojJx.png) ![image](https://hackmd.io/_uploads/r1m_iVii1g.png) ```shell root@OpenWrt:/# uci show network.wan network.wan=interface network.wan.device='wan' network.wan.proto='dhcp' ``` ```shell root@OpenWrt:/# uci set network.wan.proto='static' root@OpenWrt:/# uci set network.wan.ipaddr='192.168.50.166' root@OpenWrt:/# uci set network.wan.netmask='255.255.255.0' root@OpenWrt:/# uci set network.wan.gateway='192.168.50.1' root@OpenWrt:/# uci set network.wan.dns='8.8.8.8' root@OpenWrt:/# uci commit network root@OpenWrt:/# /etc/init.d/network restart ``` ```uci config zone option name 'wan' list network 'wan' list network 'wan6' option input 'REJECT' option output 'ACCEPT' option forward 'REJECT' option masq '1' option mtu_fix '1' config forwarding option src 'lan' option dest 'wan' ``` ```uci config redirect option name 'DMZ-Host' option src 'wan' option dest 'lan' option dest_ip '192.168.60.66' option target 'DNAT' ``` ![image](https://hackmd.io/_uploads/SJKci4ooJx.png) ![image](https://hackmd.io/_uploads/Sk-jo4iokl.png) -->