動作

OB2D Firewall

出自 Itsmw

使用Linux架設透通式防火牆簡介

 本文「透通式防火牆(Bridge Firewall)」的定義是:在不改變 IP 範圍下,在實體網路的出口處架設一台封包過濾器,一方面可以控制內外網路的通訊埠,另一方面可以鎖某設備的 MAC 位址,令其無法上網。其架構圖如下所示:

Bridge fw.png



設定原理

準備作業

確認 bridge-utils 套件是否安裝

  • 列出套件名稱,檢視是否有 bridge-utils
    root@fw:~# dpkg -l |grep bridge-utils
    若出現下面那一行,代表已經安裝。
ii  bridge-utils         1.x-x        Utilities for configuring the Linux Ethernet bridge

  

  • 若沒有安裝,請補上
    root@fw:~# apt-get update
    root@fw:~# apt-get install bridge-utils
    註:本套件提供一個重要工具:「brctl」指令



關閉不必要的服務

  • 在終端機下指令: ntsysv,設定開機後自動開啟的服務
  • 若沒特定目的,只需保留以下服務
    • anacron → 若有排程,因故在時間到還沒做(例,時間到仍未開機),在重開機時自動補做
    • atd → 與排程有關
    • autofs
    • cron
    • dhcp3-server(若需配送IP才啟動)
    • gdm → 視窗介面
    • kerneld → 與核心相關
    • klogd → 與核心相關
    • makedev → 與核心相關
    • rmnologin
      當管理者下「touch /etc/nologin」指令,產生 nologin 空檔時,系統會轉為「不允許登入」狀態。而 rmnologin 的目的,在於重開機時檢查是否存在【/etc/nologin】空檔,若存在,刪除之,恢復成可以登入。
    • ssh → 遠端安全登入或檔案傳輸
    • sysklogd → 與核心相關
    • xinetd → 輕量級服務統管



修改設定檔

設定網路介面

 在架構圖中,我們已註明,兩張網卡的 ip address 必須設為 0.0.0.0 ,而且要多加一個網路介面「br0」,而這些設定必須由 /etc/rc.local 內處理。因此在這裡要修改網卡設定檔 /etc/network/interfaces 把 eth0 及 eth1 拿掉,只留 lo 設定。

  • root@fw:~# vi /etc/network/interfaces  (內容示例如下)
auto lo
iface lo inet loopback

註:Ubuntu預設便是如此,不必再處理



設定防火牆規則列

 這裡的設定是能否成功最重要的地方,其設定過程可分成兩大重點:一是啟動橋接功能,以能成功轉送(Forward)封包,二是封包過濾以達資安控管機制。在設定時,最好依這兩部分,一步步完成,先啟動橋接並測試,成功後才設定封包過濾政策。


啟動橋接功能

  • 把原來的 /etc/rc.local ,改名為 rc.local.bak
    root@fw:~# mv /etc/rc.local /etc/rc.local.bak
  • 建立新的 /etc/rc.local ,內容如下所示
    root@fw:~# vi /etc/rc.local

#! /bin/bash

IPTABLES="/sbin/iptables"

BRCTL="/usr/sbin/brctl"
IFCONFIG="/sbin/ifconfig"
ROUTE="/sbin/route"

BRIP="163.26.182.3"
FW_IP="163.26.182.3"
BRMASK="255.255.255.0"
GATEWAY="163.26.182.254"
BRBROADCAST="163.26.182.255"

FW_IFACE="br0"


# 先關閉這三組網路介面
eth1exist=$(/sbin/ifconfig |grep "eth1")
if [ "$eth1exist" != "" ]; then
    $IFCONFIG eth1 down
fi

eth0exist=$(/sbin/ifconfig |grep "eth0")
if [ "$eth0exist" != "" ]; then
    $IFCONFIG eth0 down
fi

br0exist=$(/sbin/ifconfig |grep "br0")
if [ "$br0exist" != "" ]; then
    $IFCONFIG br0 down
    # 再關閉 birdge 的 binding
    $BRCTL delif br0 eth1
    $BRCTL delif br0 eth0
    $BRCTL delbr br0
fi

# 設定 eth0 及 eth1 網卡介面
$IFCONFIG eth0 0.0.0.0
$IFCONFIG eth1 0.0.0.0

#啟動 bridge 與 網卡的 Binding
$BRCTL addbr br0
$BRCTL addif br0 eth0
$BRCTL addif br0 eth1

# 設定 br0 介面
$IFCONFIG br0 $BRIP netmask $BRMASK broadcast $BRBROADCAST

# 設定 gateway 值,使 fw 本身可以上網 
$ROUTE add default gw $GATEWAY

# 啟動封包轉送
echo "1" > /proc/sys/net/ipv4/ip_forward

# 本行不可刪除
exit 0

  註:這裡的設定值是以本頁架構圖為範例來撰寫。

  • 執行至此,要先套用規則列,並在 eth1 網卡上連接一台集線及電腦進行測試是否可以上網。若可以上網,再繼續執行通訊埠管制措施。



加入 IPv6 封包轉送

# eth0 , eth1 的 ipv6 address 應不必清空才對
# /bin/ip -6 addr del 2001:288:75xx::1/64 dev eth0
# /bin/ip -6 addr del 2001:288:75xx::1/64 dev eth1
ipv6addr=$(/sbin/ifconfig |grep "inet6 addr: 2001:288:75a6::3")
if [ "$ipv6addr" == "" ]; then
	/bin/ip -6 addr add 2001:288:75a6::3/64 dev br0
fi
  • 啟用 IPv6 路由轉送
    echo "1" > /proc/sys/net/ipv6/conf/all/forwarding
  • 加上 IPv6 之後的 rc.local 示例

#! /bin/bash

IPTABLES="/sbin/iptables"

BRCTL="/usr/sbin/brctl"
IFCONFIG="/sbin/ifconfig"
ROUTE="/sbin/route"

BRIP="163.26.182.3"
FW_IP="163.26.182.3"
BRMASK="255.255.255.0"
GATEWAY="163.26.182.254"
BRBROADCAST="163.26.182.255"
FW_IP6="2001:288:75a6::3"
GATEWAY6="2001:288:75a6::fffe"

FW_IFACE="br0"


# 先關閉這三組網路介面
eth1exist=$(/sbin/ifconfig |grep "eth1")
if [ "$eth1exist" != "" ]; then
    $IFCONFIG eth1 down
fi

eth0exist=$(/sbin/ifconfig |grep "eth0")
if [ "$eth0exist" != "" ]; then
    $IFCONFIG eth0 down
fi

br0exist=$(/sbin/ifconfig |grep "br0")
if [ "$br0exist" != "" ]; then
    $IFCONFIG br0 down
    # 再關閉 birdge 的 binding
    $BRCTL delif br0 eth1
    $BRCTL delif br0 eth0
    $BRCTL delbr br0
fi

# 設定 eth0 及 eth1 網卡介面
$IFCONFIG eth0 0.0.0.0
$IFCONFIG eth1 0.0.0.0

#啟動 bridge 與 網卡的 Binding
$BRCTL addbr br0
$BRCTL addif br0 eth0
$BRCTL addif br0 eth1

# 設定 br0 介面
$IFCONFIG br0 $BRIP netmask $BRMASK broadcast $BRBROADCAST

ipv6addr=$($IFCONFIG |grep "inet6 addr: $FW_IP6")
if [ "$ipv6addr" == "" ]; then
    /bin/ip -6 addr add $FW_IP6/64 dev br0
fi

# 設定 gateway 值,使 fw 本身可以上網 
$ROUTE add default gw $GATEWAY
$ROUTE -A inet6 add ::/0 gw $GATEWAY6

# 啟動封包轉送
echo "1" > /proc/sys/net/ipv4/ip_forward
echo "1" > /proc/sys/net/ipv6/conf/all/forwarding

# 本行不可刪除
exit 0

  註:這裡的設定值是以本頁架構圖為範例來撰寫。


有管制通訊埠之過濾政策設定

注意

  1. 底下仍是 /etc/rc.local 的內容,請沿續上面的設定繼續往下寫,但記得 exit 0 這一行必須要往下推至檔尾
  2. 下文所提供的過濾政策僅供參考,各人可依需求,自行增減。


 ......

###-----------------------------------------------------###
# 清除封包過濾規則列
###-----------------------------------------------------###
# 清除預設表 filter 中,所有規則鏈中的規則
$IPTABLES -F
# 清除預設表 filter 中,使用者自訂鏈中的規則
$IPTABLES -X

# 清除mangle表中,所有規則鏈中的規則
$IPTABLES -F -t mangle
# 清除mangle表中,使用者自訂鏈中的規則
$IPTABLES -t mangle -X

# 清除nat表中,所有規則鏈中的規則
$IPTABLES -F -t nat
# 清除nat表中,使用者自訂鏈中的規則
$IPTABLES -t nat -X


# 預設政策,中止封包轉送,只開放必要的
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP

###--------------------------------------------------------------###
# 鎖 mac address 使防火牆內部的電腦無法上網
# 註:一定要寫在最開頭的位置, 否則會失效
###--------------------------------------------------------------###
# $IPTABLES -A FORWARD -o $FW_IFACE -p tcp -m mac --mac-source ##:##:##:D8:11:3C -j DROP

###-----------------------------------------------------###
# open 對內部機器可以取得外面 DHCP 功能
###-----------------------------------------------------###
$IPTABLES -A FORWARD -o $FW_IFACE -p udp --sport 68 --dport 67 -j ACCEPT
$IPTABLES -A FORWARD -i $FW_IFACE -p udp --sport 67 --dport 68 -j ACCEPT

###-----------------------------------------------------###
# open DNS port 53
###-----------------------------------------------------###
# 第一次會用 udp 封包來查詢
$IPTABLES -A FORWARD -o $FW_IFACE -p udp --sport 1024:65535 --dport 53 -j ACCEPT
$IPTABLES -A FORWARD -i $FW_IFACE -p udp --sport 53 --dport 1024:65535 -j ACCEPT

# 若有錯誤,會改用 tcp 封包來查詢
$IPTABLES -A FORWARD -o $FW_IFACE -p tcp --sport 1024:65535 --dport 53 -j ACCEPT
$IPTABLES -A FORWARD -i $FW_IFACE -p tcp ! --syn --sport 53 --dport 1024:65535 -j ACCEPT

# 開放這台主機上的 DNS 和外部的 DNS 主機互動查詢:使用 udp
$IPTABLES -A FORWARD -p udp -s $FW_IP --sport 53 -d any/0 --dport 53 -j ACCEPT
$IPTABLES -A FORWARD -p udp -s any/0 --sport 53 -d $FW_IP --dport 53 -j ACCEPT
# 開放這台主機上的 DNS 和外部的 DNS 主機互動查詢:使用 tcp
$IPTABLES -A FORWARD -p tcp -s $FW_IP --sport 53 -d any/0 --dport 53 -j ACCEPT
$IPTABLES -A FORWARD -p tcp ! --syn -s any/0 --sport 53 -d $FW_IP --dport 53 -j ACCEPT

###-----------------------------------------------------###
# open 對外部主機 ftp port 21
###-----------------------------------------------------###
# 以下是打開命令 channel 21
$IPTABLES -A FORWARD -o $FW_IFACE -p tcp --sport 1024:65535 --dport 21 -j ACCEPT
$IPTABLES -A FORWARD -i $FW_IFACE -p tcp ! --syn --sport 21 --dport 1024:65535 -j ACCEPT

# 以下是打開資料 channel 20
$IPTABLES -A FORWARD -i $FW_IFACE -p tcp --sport 20 --dport 1024:65535 -j ACCEPT
$IPTABLES -A FORWARD -o $FW_IFACE -p tcp ! --syn --sport 1024:65535 --dport 20 -j ACCEPT

# 以下是打開 passive mode FTP 資料通道
$IPTABLES -A FORWARD -o $FW_IFACE -p tcp --sport 1024:65535 --dport 1024:65535 -j ACCEPT
$IPTABLES -A FORWARD -i $FW_IFACE -p tcp ! --syn --sport 1024:65535 --dport 1024:65535 -j ACCEPT

###-----------------------------------------------------###
# open 對外部主機的 HTTP port 80
###-----------------------------------------------------###
$IPTABLES -A FORWARD -o $FW_IFACE -p tcp --sport 1024:65535 --dport 80 -j ACCEPT
$IPTABLES -A FORWARD -i $FW_IFACE -p tcp ! --syn --sport 80 --dport 1024:65535 -j ACCEPT

# DHCP, DNS, FTP 比較不一樣,所以特別列出,其餘各 port 請依 port 80 的做法修改即可

###---------------------------------------------------------------###
# 以下是針對外面要存取 fw 本機的連線限制示例
###---------------------------------------------------------------###
# 只有本主機所屬網段才能連到這台主機的 ssh port 22
$IPTABLES -A INPUT -p tcp -s 163.26.182.0/24 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 203.68.102.0/24 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 127.0.0.1 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 22 -j DROP

# 只有本主機所屬網段才能連到這台主機的 ssh port 5900-5906
$IPTABLES -A INPUT -p tcp -s 163.26.182.0/24 --dport 5900:5906 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 127.0.0.1 --dport 5900:5906 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 5900:5906 -j DROP

# 本行必須移至檔尾
exit 0



不鎖埠之過濾政策設定

 在台南縣,各國中小已配發一台硬體式防火牆,因此可以不必鎖埠。此時這台主機就變成網管型集線器,可以架設流量檢查軟體,監視流量,也可以鎖 MAC 位址,把疑似中毒的網路設備斷線。


注意

  1. 底下仍是 /etc/rc.local 的內容,請沿續上面的設定繼續往下寫,但記得 exit 0 這一行必須要往下推至檔尾
  2. 下文所提供的過濾政策僅供參考,各人可依需求,自行增減。


 ......

###-----------------------------------------------------###
# 清除封包過濾規則列
###-----------------------------------------------------###
# 清除預設表 filter 中,所有規則鏈中的規則
$IPTABLES -F
# 清除預設表 filter 中,使用者自訂鏈中的規則
$IPTABLES -X

# 清除mangle表中,所有規則鏈中的規則
$IPTABLES -F -t mangle
# 清除mangle表中,使用者自訂鏈中的規則
$IPTABLES -t mangle -X

# 清除nat表中,所有規則鏈中的規則
$IPTABLES -F -t nat
# 清除nat表中,使用者自訂鏈中的規則
$IPTABLES -t nat -X


# 預設政策,全開
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT

###--------------------------------------------------------------###
# 鎖 mac address 使防火牆內部的電腦無法上網
# 註:一定要把鎖 MAC 的規則列寫在目前範例所示的位置, 否則會失效
###--------------------------------------------------------------###
# $IPTABLES -A FORWARD -o $FW_IFACE -p tcp -m mac --mac-source ##:##:##:D8:11:3C -j DROP

###---------------------------------------------------------------###
# 以下是針對外面要存取 fw 本機的連線限制示例
###---------------------------------------------------------------###
# 只有本主機所屬網段才能連到這台主機的 ssh port 22
$IPTABLES -A INPUT -p tcp -s 163.26.182.0/24 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 203.68.102.0/24 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 127.0.0.1 --dport 22 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 22 -j DROP

# 只有本主機所屬網段才能連到這台主機的 ssh port 5900-5906
$IPTABLES -A INPUT -p tcp -s 163.26.182.0/24 --dport 5900:5906 -j ACCEPT
$IPTABLES -A INPUT -p tcp -s 127.0.0.1 --dport 5900:5906 -j ACCEPT
$IPTABLES -A INPUT -p tcp --dport 5900:5906 -j DROP

# 本行必須移至檔尾
exit 0



使用 YHTools 快速設定

 了解了本文上述的原理後,只要您依本文之架構圖,準備一台 OB2D sqz/Ubuntu Linux ,再參照本站文件「YHTools#fw4br.pyw」一文的說明,便可快速架設起此功能。



其他注意事項

  • 記得要先把 rc.local 改成可執行模式,才可套用
    root@dns:~# chmod 755 /etc/rc.local
  • 套用新規則列
    root@dns:~# service rc.local start


  • 內部網路的檢查與控管,與架設 NAT 主機一樣,因此另起一篇專章介紹:【防火牆管制連線】,請自行點閱參考。




本文小檔案

__NORICHEDITOR__

題名: Title::OB2D 架設透通式防火牆
作者: Creator::itsmw作者群
主題/關鍵詞: Subject::firewall, iptables, ob2d
簡述: Description::以 OB2D Linux 架設透通式防火牆
出版者: Publisher::台南縣教網中心 itsmw 計畫
其他參與者: Contributor::itsmw作者群
日期: Date::2010-7-7
文件類型: Type::07網路相關
Type::09資訊安全
資料格式: Format::text/html
文件識別代號: Identifier::http://myip.tw/itsmw/index.php?title=OB2D_Firewall
來源: Source::http://myip.tw/b2ddoc/LinuxBase/
語言: Language::zh-TW
相關資源: Relation::http://news.ols3.net/techdoc/old/b2dfw_intro/
文件涵蓋範圍: Coverage::Linux平台
版權規範: Rights::GNU Free Documentation License 1.2