Netman (netman@study-area.org) Linux 的防火牆設計與應用 Netman (netman@study-area.org)
防火牆的工作原理 Linux 的防火牆版本 iptables 程式介紹 iptables 應用例析 常見問題及解決方案 主題大綱 防火牆的工作原理 Linux 的防火牆版本 iptables 程式介紹 iptables 應用例析 常見問題及解決方案
1.防火牆的工作原理 所謂網路連線其實就是兩個端點的連線
1.防火牆的工作原理 連線兩端透過封包傳遞資料
封包基本由 header 與 payload 組成 Packet 透過封裝傳遞 1.防火牆的工作原理 封包基本由 header 與 payload 組成 Packet 透過封裝傳遞
1.防火牆的工作原理 不同協定之封包封裝
1.防火牆的工作原理 TCP 封包之 header 內容
1.防火牆的工作原理 IP 封包之 header 內容
Socket 是連線兩端的封包起止站 Socket 由 Address 與 Port 組成 1.防火牆的工作原理 Socket 是連線兩端的封包起止站 Socket 由 Address 與 Port 組成
1.防火牆的工作原理 每一個封包都含有一對 socket pair Source Socket: 1.防火牆的工作原理 每一個封包都含有一對 socket pair Source Socket: - Source Port (TCP Header bit 0-15) - Source Address (IP Header bit 96-127) Destination Socket: - Destination Port (TCP Header bit 16-31) - Destination Address (IP Header bit 128-159)
TCP 連線的建立方式 (three-way-handshake) tcp header 之 bit 106-111 1.防火牆的工作原理 TCP 連線的建立方式 (three-way-handshake) tcp header 之 bit 106-111
NAT 的工作原理 透過 socket 替換達成 routing 1.防火牆的工作原理 NAT 的工作原理 透過 socket 替換達成 routing
防火牆可透過檢查封包 header(or payload) 的內容來決定封包是否能夠通過。 1.防火牆的工作原理 防火牆可透過檢查封包 header(or payload) 的內容來決定封包是否能夠通過。
防火牆常被部署在對內(信任)與對外(不信任) 網路之間的必經通道之上 1.防火牆的工作原理 防火牆常被部署在對內(信任)與對外(不信任) 網路之間的必經通道之上
DMZ 是防火牆部署中常見的設計 主要用來區隔堡壘主機,以降低入侵風險。 1.防火牆的工作原理 DMZ 是防火牆部署中常見的設計 主要用來區隔堡壘主機,以降低入侵風險。
DMZ 之設計是多樣的 安全與成本及難度成正比、與便利成反比。 1.防火牆的工作原理 DMZ 之設計是多樣的 安全與成本及難度成正比、與便利成反比。
Internet 的連線常經過多重的防火牆過濾 1.防火牆的工作原理 Internet 的連線常經過多重的防火牆過濾
2. Linux 的防火牆版本 Linux 的防火牆版本以 kernel 版本為別 - Kernel 2.0.x: ipfwadm (搭配模組 ip_fw_*.o) - Kernel 2.2.x: ipchains (搭配模組 ip_masq_*.o) - Kernel 2.4.x (2.6.x): iptables (搭配模組 ip*.o, ip_nat_*.o, ip_conntrack_*.o)
2. Linux 的防火牆版本 kernel 2.4.x 之 ipchains ipchains 仍可編譯以模組方式載入 ipchains 不能與 iptables 同時載入 但 2.4.x 並沒提供 ipchains 可用的模組 結論: 盡量不要在 kernel 2.4.x 及以後版本使用 ipchains。
防火牆程式根據規則(rule)來處理封包 rule by rule first match policy 3. Iptables 程式介紹 防火牆程式根據規則(rule)來處理封包 rule by rule first match policy
防火牆規則收集於不同的鏈(chain)中 chain by chain all through 3. Iptables 程式介紹 防火牆規則收集於不同的鏈(chain)中 chain by chain all through
不同的鏈存在於不同的表(table)中 different table for different job table by table 3. Iptables 程式介紹 不同的鏈存在於不同的表(table)中 different table for different job table by table
3. Iptables 程式介紹 Iptables 內建三個 tables (及常用鏈): filter nat mangle INPUT FORWARD OUTPUT nat PREROUTING POSTROUTING mangle …
Linux 系統可能處理的封包 From outside From local 3. Iptables 程式介紹 Linux 系統可能處理的封包 From outside From local
Linux 系統對封包的 routing 處理 To local To outside 3. Iptables 程式介紹 Linux 系統對封包的 routing 處理 To local To outside
封包於 iptables 之穿行 When? Where?
封包於 iptables 之處理 Which table? Which chain? Concentrated
3. Iptables 程式介紹 一個非本機封包於 iptables 之處理
3. Iptables 程式介紹 iptables 命令格式: iptables [-t table] -CMD CHAIN rule -j TARGET 常見 command: 列視規則:-L [CHAIN] [-n] 增加規則:-A CHAIN rule 插入規則:-I CHAIN [ln] rule 替換規則:-R CHAIN ln rule 刪除規則:-D CHAIN <ln | rule> 清空整鏈:-F [CHAIN] 設定原則:-P CHAIN <DROP | ACCEPT> --------------------- 建立自定鏈:-N C_CHAIN 刪除自定鏈:-X C_CHAIN
3. Iptables 程式介紹 常用 iptables 規則內容: -i interface (only in PREROUTING, INPUT, FORWARD) -o interface (only in POSTROUING, OUTPUT, FORWARD) -s src.addr (can be ip, net/mask, hostname) -d dest.addr (can be ip, net/mask, hostname) -p proto (can be TCP, UDP, ICMP, ALL) --sport src:port (only with -p TCP & -p UDP, can be port, port:range) --dport dest:port (only with -p TCP & -p UDP, can be port, port:range) --icmp-type (only with -p ICMP, can be type, type/error_code) -j TARGET (depends on table & CHAIN, can be ACCEPT, DROP, SNAT, DNAT, MASQUERADE, REDIRECT, RETURN… etc. ) * tips: 規則內容越多,符合之封包越少。反之,則越多
3. Iptables 程式介紹 關於 -m (match) 之應用: -m state --state <STATE> NEW (新建連線) ESTABLISHED (已成功建立之連線) RELATED (新建連線,但由已建立連線所引發) INVALID (非法連線) UNKOWN (不明連線) -m mac --mac-source <MAC> (比對封包的來源 MAC 位址,僅限 local subnet。) -m limit --limit <nu/unit> [--limit-burst <burst>] (比對每一時間單位最大封包數,及觸發限制的數量。) -m owner --uid-owner <uid> (比對本機使用者 id。) …
3. Iptables 程式介紹 常用 iptables 之 TARGET: filter TARGET ACCEPT: 允許封包通過當前的鏈 DROP: 拒絕封包通過當前的鏈 REJECT: 同 DROP ,但會送回 icmp 通知 nat TARGET SNAT: 修改 source socket DNAT: 修改 destination socket MASQUERADE:動態修改 source socket others REDIRECT: 將連線導至本機行程 RETURN: 結束自定鏈返回原鏈之下一規則
3. Iptables 程式介紹 iptables 命令行範例 拒絕新建連線進入本機: 允許從外部界面(eth0)連至本機之 web 連線: iptables -t filter -A INPUT -m state --state NEW -j DROP 允許從外部界面(eth0)連至本機之 web 連線: iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT 允許穿過本機之確認連線(通常為內部發起之連線): iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT 將內部(192.168.1.x)送至 Internet 的封包作偽裝: iptables -t nat -A POSRTOUTING -o eth0 -s 192.168.1.0/24 \ --sport 1024:65535 -j MASQUERADE
4. Iptables 應用例析 常見 Linux Firewall 應用: 單一 client 允許單向連外,集中在 filter INPUT 。 單一 server 允許本機連外及特定服務,集中在 filter INPUT 。
4. Iptables 應用例析 常見 Linux Firewall 應用(續): Gateway 允許本機連外及遠端操控,集中在 filter INPUT 。 允許由內連外,集中在 filter FORWARD 。 允許由外連內之特定服務,集中在 filter FORWARD 。 需啟用 ip_forward。 NAT 允許由內連外,集中在 nat POSTROUTING 。 允許由外連內之特定服務,集中在 nat PREROUTING 。 可省略 filter FORWARD (路由不通) 。
4. Iptables 應用例析 4.1 單一 client 主機規則範例: # 清空規則 iptables -F # 接受確認連線 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # 接受 loopback 連線 iptables -A INPUT -i lo -j ACCEPT # 除 ping 外,接受 ICMP 封包 iptables -A INPUT -p icmp --icmp-type 8 -j DROP iptables -A INPUT -p icmp -j ACCEPT # 其餘全部封殺 iptables -A INPUT -j DROP
4. Iptables 應用例析 4.2 單一 server 主機(web)規則範例: iptables -F iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p icmp -j ACCEPT # 接受 www 之連線 iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -j DROP
4. Iptables 應用例析 4.3 單一 gateway 主機(可路由)應用:
4. Iptables 應用例析 4.3 單一 gateway 主機(可路由)規則範例: iptables -F iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p icmp -j ACCEPT # 允許信任操作主機連線 iptables -A INPUT -i eth1 -s 211.47.56.117 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -j DROP # 允許確認連線 iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT # 允許內部連線 iptables -A FORWARD -m state --state NEW \ -i eth1 -o eth0 -s 211.47.56.112/29 -j ACCEPT
4. Iptables 應用例析 4.3 單一 gateway 主機(可路由)規則範例(續): # 允許 DNS 服務連線 iptables -A FORWARD -p udp --dport 53 -d 211.47.56.114 -j ACCEPT # 允許 WEB 服務連線 iptables -A FORWARD -p tcp --dport 80 -d 211.47.56.115 -j ACCEPT # 允許 SMTP 服務連線 iptables -A FORWARD -p tcp --dport 25 -d 211.47.56.116 -j ACCEPT # 允許 SSH 服務連線 iptables -A FORWARD -p tcp --dport 22 -d 211.47.56.117 -j ACCEPT # 其餘拒絕 iptables -A FORWARD -j DROP
4. Iptables 應用例析 4.4 單一 nat 主機(不可路由)應用:
4. Iptables 應用例析 4.4 單一 nat 主機(不可路由)規則範例: iptables -F iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p icmp -j ACCEPT iptables -A INPUT -i eth1 -s 10.0.1.117 -p tcp --dport 22 -j ACCEPT iptables -A INPUT -j DROP # 為內部連線作封包偽裝 iptables -t nat -A POSTROUTING -o eth0 -s 10.0.1.0/24 -j MASQUERADE
4. Iptables 應用例析 4.4 單一 nat 主機(不可路由)規則範例(續): # 為 DNS 作 port-mapping iptables -t nat -A PRETROUTING -i eth0 -d 211.47.56.113 \ -p udp --dport 53 -j DNAT –to 10.0.1.114 # 為 WEB 作 port-mapping -p tcp --dport 80 -j DNAT –to 10.0.1.115 # 為 SMTP 作 port-mapping -p tcp --dport 25 -j DNAT –to 10.0.1.116 # 為 SSH 作 port-mapping -p tcp --dport 22 -j DNAT –to 10.0.1.117
4.5 Transparent Proxy 應用: 免除 client 端設定 增加可控性 4. Iptables 應用例析 4.5 Transparent Proxy 應用: 免除 client 端設定 增加可控性
4. Iptables 應用例析 4.5 Transparent Proxy 規則範例: iptables 設定: iptables -t nat -A PRETROUTING -i eth0 -p tcp --dport 80 \ -j REDIRECT --to-ports 3128 squid 設定(squid.conf): httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on
5.常見問題及解決方案 5.1 auth 協定所導至的服務延 解決方案 視服務程式需求而定 由 server 端發起 連至 client 端 tcp/113 解決方案 允許 auth 連線 -p tcp --dport 113 -j ACCEPT 拒絕 auth 連線 -p tcp --dport 113 -j REJECT
5.2 ftp 服務連線無法建立資料通道 ftp 連線分兩個通道進行: 5.常見問題及解決方案 5.2 ftp 服務連線無法建立資料通道 ftp 連線分兩個通道進行:
5.2 ftp 服務連線無法建立資料通道 防火牆會擋掉由外之內的建立連線: 5.常見問題及解決方案 5.2 ftp 服務連線無法建立資料通道 防火牆會擋掉由外之內的建立連線:
5.2 ftp 服務連線無法建立資料通道 使用 passive mode 可穿越: 5.常見問題及解決方案 5.2 ftp 服務連線無法建立資料通道 使用 passive mode 可穿越:
5.2 ftp 服務連線無法建立資料通道 或搭配 ip_conntrack_ftp 模組亦可以解決: 5.常見問題及解決方案 5.2 ftp 服務連線無法建立資料通道 或搭配 ip_conntrack_ftp 模組亦可以解決:
5.3 NAT 之下的 ftp 連線 NAT 只修改了 tcp/ip header ,並沒修改 ftp packet: 5.常見問題及解決方案 5.3 NAT 之下的 ftp 連線 NAT 只修改了 tcp/ip header ,並沒修改 ftp packet:
5.常見問題及解決方案 5.3 NAT 之下的 ftp 連線 使用 ip_conntrack_ftp, ip_nat_ftp 及 --state RELATED 來解決:
5.4 在同一 subnet 裡的 DNAT Source Socket 沒被修改,及發生 ICMP host-redirect : 5.常見問題及解決方案 5.4 在同一 subnet 裡的 DNAT Source Socket 沒被修改,及發生 ICMP host-redirect :
5.常見問題及解決方案 5.4 在同一 subnet 裡的 DNAT 同時對 Source Socket 作修改即可解決: iptables -t nat -A POSTROUTING -d 10.1.2.4 -s 10.1.2.0/24 -j SNAT -to 10.1.2.254 * 其他方法: DNS
5.常見問題及解決方案 5.6 Subnet 太小不便切割 使用 proxy arp 降低浪費: echo 1 > /proc/sys/net/ipv4/conf/all/proxy_arp
5.7 Transparent Firewall 的應用 減少 IP 浪費 & 簡化部署難度 提高防禦安全(本身無 IP 可連接) 5.常見問題及解決方案 5.7 Transparent Firewall 的應用 減少 IP 浪費 & 簡化部署難度 提高防禦安全(本身無 IP 可連接)
5.常見問題及解決方案 5.7 Transparent Firewall 的設定 編譯核心修補,設為 bridge (以 kernel 2.4.25 為例): cd /usr/src/linux-2.4.25 wget http://heanet.dl.sourceforge.net/sourceforge/ebtables/ebtables-brnf- 5_vs_2.4.25.diff.gz zcat ebtables-brnf-5_vs_2.4.25.diff.gz | patch -p1 將 802.1d Ethernet Bridging 與 Bridge: ebtables (NEW) 及其子項目全 選 重編 kernel,並以之開機。 載入模組:modprobe bridge
5.常見問題及解決方案 5.7 Transparent Firewall 的設定(續): 安裝 bridge-utils (以 rh9 為例) : wget http://bridge.sourceforge.net/bridge-utils/bridge-utils-0.9.6.tar.gz tar zxvf bridge-utils-0.9.6.tar.gz cp bridge-utils/bridge-utils.spec /usr/src/redhat/SPECS/ cp bridge-utils-0.9.6.tar.gz /usr/src/redhat/SOURCES/ rpmbuild -bb /usr/src/redhat/SPECS/bridge-utils.spec rpm -ivh /usr/src/redhat/RPMS/i386/bridge-utils-* brctl addbr mybridge brctl addif mybridge eth0 brctl addif mybridge eth1 ifconfig eth0 0.0.0.0 promisc ifconfig eth1 0.0.0.0 promisc echo “1” > /proc/sys/net/ipv4/ip_forward
謝謝﹗ Q & A