# 防火牆 ###### tags: `LSA` ## 什麼是防火牆 - 簡單:用來保護我們網路環境的東西 (ex. 可能會有惡意攻擊) - 廣義:透過規則來分析、過濾進出我們(管理的)網域的封包 - 黑名單 - 白名單 ## Internet Protocol Suite  :::spoiler application 是使用 WAF ::: ## Base Package Install ```shell= sudo apt install route ``` ## [Routing](https://man7.org/linux/man-pages/man8/route.8.html) :::info route [-n] ::: Destination|Gateway|Genmask|Flags|Metric|Ref|Use|Iface| |----------|-------|-------|-----|------|---|---|-----| 0.0.0.0|59.223.48.1|0.0.0.0|UG|0|0|0|eth0| 10.15.0.0|0.0.0.0|255.255.0.0|U|0|0|0|eth0 10.104.0.0|0.0.0.0|255.255.240.0|U|0|0|0|eth1 159.223.48.0|0.0.0.0|255.255.240.0|U|0|0|0|eth0 ## iptables  ### 架構 - table (同一類型形成一 table) - filter(default) - 過濾封包 - nat - 改變封包以用於網路位址轉換 - mangle - raw - security - Chain (在哪個時刻) - INPUT : 進入主機的封包。 - OUTPUT : 主機送出的封包。 - FORWARD : 經由主機轉送的封包。 - PREROUTING : 進行路由前的封包。 - POSTORTING : 被送出前的封包。 - Rule (規則) - ACCEPT - DROP - REJECT - 等 ### 指令操作 #### ==查看==規則 - -L : 列出目前的 table 的規則 - 其他參數 - `-n` : 不進行 IP 與 HOSTNAME 的反查 - `-v` : 列出更多的資訊,ex:通過該規則的封包總位元數、相關的網路介面等 - `--line-number` : 顯示行數 - `-t` : 要看哪個 table - ==新增==規則: - `-A`: append 新增加一條規則,該規則增加在原本規則的最後面 - `-I`: insert 插入一條規則,如果沒有指定順序,預設是插入變成第一條規則。 - ==清除==規則 - `-F`:清除所有iptable規則 - `-D` : 刪除特定規則 - 其他參數 - `-j` : 後面接動作,主要的動作有接受(ACCEPT)、丟棄(DROP)、拒絕(REJECT)及記錄(LOG) - ex: `sudo iptables -R INPUT 1 -j DROP` - `-p` : 協定 ex:udp、tcp、icmp - `--sport` : 限制來源端port number - `--dport` : 限制目標的port number(要進去的防火牆的port) - `-i` : 封包所進入的那個網路介面,ex:eth0, lo。 - `-o` : 封包所傳出的那個網路介面,ex:eth0, lo。 - `-s` : 封包來自哪個 IP 位址 - `-d` : 封包要去哪個 IP 位址 ### 阻擋外部連線進伺服器 - 擋掉該網卡進來的連線 ```shell= sudo iptables -A INPUT -j DROP -i {網卡} ``` - 擋掉該 IP 進來的連線 ```shell= sudo iptables -A INPUT -j DROP -s {IP} ``` - 擋掉 http ```shell= sudo iptables -A INPUT -j DROP -p tcp --dport 80 ``` - 擋掉 ping ```shell= sudo iptables -A INPUT -j DROP -p icmp --icmp-type 8 ``` ### 阻擋伺服器連線出去 - 擋掉該網卡出去的連線 ```shell= sudo iptables -A OUTPUT -j DROP -i {網卡} ``` - 擋掉該 IP 出去的連線 ```shell= sudo iptables -A INPUT -j DROP -d {IP} ``` - 擋掉 http ```shell= sudo iptables -A OUTPUT -j DROP -p tcp --dport 80 ``` - 擋掉 ping ```shell= sudo iptables -A OUTPUT -j DROP -p icmp --icmp-type 8 ``` ### NAT  #### [What is NAT](https://en.wikipedia.org/wiki/Network_address_translation) |IP|種類| |--|---| |10.0.0.0/8|A| |172.16.0.0/12|B| |192.168.0.0/16|C| :::info 作為一種解決IPv4位址短缺的方案,對所有網卡發虛擬 IP(如:192.168.0.0/16),所有網卡再透過一個或多個 Public IP 連接到網際網路上 :::  NAT Translation Table |內網IP|外網IP| |-----|------| |192.168.100.3:3855|145.12.131.7:6282 192.168.100.3:5566|145.12.131.7:9200 192.168.100.4:80|145.12.131.7:9201 192.168.100.4:4465|145.12.131.7:9202  #### How To Do This :::info lan:連接內網的網卡 wan:連接外網的網卡 dmz: 連接 dmz 的網卡 firewall IP:firewall 那台的內網 ip http ip: http 那台的內網 ip ::: ##### FORWARD ACCEPT 從內網段來的封包,目的地是要到別的網段的 ```shell= sudo iptables -A FORWARD -i {lan} -o {wan} -j ACCEPT ``` ##### FORWARD ACCEPT 回來的封包 (已建立連線的連線(ESTABLISHED)、相關的連線) ```shell= sudo iptables -A FORWARD \ -m conntrack --ctstate "ESTABLISHED,RELATED" \ -j ACCEPT ``` ##### 要出去的封包要做 MASQUERADE :::info 因為內網的 IP 外部網段無法到達,要用 MASQUERADE 將內網IP轉成外網IP,再出去 ::: ```shell= sudo iptables -t nat \ -A POSTROUTING -o {wan} -j MASQUERADE ``` ##### 拒絕其他轉送需求 ```shell= sudo iptables -A FORWARD -j REJECT ``` ##### 開啟 kernel 轉送的功能 modify file ```shell= sudo vim /etc/sysctl.conf ```  load file ```shell= sudo sysctl -p ``` ##### 內網的電腦(student)設定 gateway ```shell= sudo route add default gw {firewall IP} ``` ### DMZ  #### What is DMZ :::info 非軍事區 (有點危險,但又得開放給大家用) - 讓外網有限制的存取內網資源 - 需要讓外網能夠連進來,但不希望隨便讓外網連進DMZ的所有東西 ::: #### DMZ can out (為了安裝軟體) ```shell= sudo iptables -I FORWARD -i {dmz} -o {wan} -j ACCEPT ``` ```shell= sudo route add default gw {firewall IP} ``` #### How To Do DMZ ##### 封包轉送至指定 ip:port ```shell= sudo iptables -t nat -A PREROUTING \ -p tcp --dport 8080 \ -i {wan} \ -j DNAT --to {http ip}:80 ``` ##### FORWARD ACCEPT 去該台 80 port 的封包 ```shell= sudo iptables -I FORWARD -d {http ip} -p tcp --dport 80 -j ACCEPT ``` ```shell= sudo iptables -I FORWARD -i {lan} -o {dmz} -j ACCEPT sudo iptables -t nat \ -A POSTROUTING -o {dmz} -j MASQUERADE ```
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up