苗栗縣大湖鄉大南國民小學全球資訊網路架站日誌
架設防火牆  使用 TCP_Wrappers
本文件持續編修中,若有發現謬誤或侵犯您的權益,敬請批評指教
94
如果您的 FreeBSD 版本是 3.5-RELEASE 以上(含),已內建tcp_wrapper及/etc/hosts.allow控制檔了,請先看這裡

  1. 變換成 root 身份操作:
    su - root
  2. 取得tcp_wrappers_7.6.tar.gz檔案:
    tcp_wrapper 原始站臺在這裡下載, 目前本校安裝的這個版本的檔案
    下載後放在 /usr/local/src 資料夾中。
    cd  /usr/local/src
    wget  ftp://ftp.lab.mlc.edu.tw/UNIX/security/tcp_wrappers_7.6.tar.gz

  3. 解壓縮:
    tar   zxvf   tcp_wrappers_7.6.tar.gz
    chown   -R   root.wheel   tcp_wrappers_7.6
    cd   tcp_wrappers_7.6
  4. 編譯前的修改:
    更改Makefile檔案部份內容:
    先更改檔案屬性才能更改內容,

    chmod   644   Makefile
    vi   Makefile
    第49行:
    # BSD 4.4
    # REAL_DAEMON_DIR=/usr/libexec
    請將 # REAL_DAEMON_DIR=/usr/libexec 這一行前面的註解符號刪除。

    第494行:
    # STYLE = -DPROCESS_OPTIONS
    這一行前面的註解符號也請刪除。
  5. 編譯 TCP_Wrapper 
    make   freebsd
  6. TCP_Wrapper的檔案拷貝到/usr/libexec資料夾中。
    cp  tcpd  /usr/libexec/
    cp  tcpdchk  /usr/libexec/
    cp  tcpdmatch  /usr/libexec/
    請您檢查一下檔案是否確實拷貝過去,要不然等一下無法登入的話,那會很淒慘的。
  7. 建立/etc/hosts.allow檔與/usr/local/sec/資料夾:
    建立/etc/hosts.allow檔:
    ALL:.mlc.edu.tw:spawn=(echo `date` Y %u@%h[%a] %d >> /usr/local/sec/access.log) &
    ALL:ALL:rfc931:spawn=(echo `date` - %u@%h[%a] %d >> /usr/local/sec/access.log) &:deny
    • 第一行是設定allow,意思是設定允許登入的網域(若限制越嚴謹,防火牆的功能就越能顯現出來。所以,請將您的完整網域寫入)。您可比照這一行,設定允許其他網域之登入,但最好是一個網域一行,而且以不使用IP為佳。
    • 第二行是設定deny,意思是未被設定為allow者的網域都不允許登入。
    • 將登入的訊息記錄在/usr/local/sec/access.log檔案中。
    建立/usr/local/sec/資料夾:
    mkdir   /usr/local/sec
  8. 修改/etc/inetd.conf部份內容:
    將原來設定telnet的這一行註解起來:
    telnet stream tcp nowait root /usr/libexec/telnetd telnetd
    而將內容改為這樣:
    telnet stream tcp nowait root /usr/libexec/tcpd telnetd
    其他的網路服務(例如FTP)請比照上述方式修改。
    kill   -HUP   `cat   /var/run/inetd.pid`
  9. 嘗試著從遠端(必須是已設定為allow網域者)登入這臺主機:
  10. 若是能成功登入,再查看有否寫入記錄檔:
    tail /usr/local/sec/access.log
    Win98中以NetTerm軟體登入主機的記錄:
    Sat Oct 14 14:14:03 CST 2000 Y unknown@dn083.dananes.mlc.edu.tw[163.19.224.83] tcpd
    Sat Oct 14 14:14:14 CST 2000 Y unknown@dn083.dananes.mlc.edu.tw[163.19.224.83] tcpd
    Sat Oct 14 14:18:09 CST 2000 Y unknown@dn083.dananes.mlc.edu.tw[163.19.224.83] telnetd
    Sat Oct 14 14:18:09 CST 2000 Y unknown@dn083.dananes.mlc.edu.tw[163.19.224.83] tcpd
    HiNet主機以telnet方式登入主機的記錄:
    Sat Oct 14 17:19:06 CST 2000 Y someone@ms32.hinet.net[168.95.4.32] tcpd
    Sat Oct 14 17:19:07 CST 2000 Y someone@ms32.hinet.net[168.95.4.32] telnetd
    Sat Oct 14 17:21:01 CST 2000 Y someone@ms32.hinet.net[168.95.4.32] tcpd
    Sat Oct 14 17:21:02 CST 2000 Y someone@ms32.hinet.net[168.95.4.32] ftpd
    登入主機失敗的記錄:(請特別注意無DNS反解設定的主機)
    Sat Oct 14 15:08:40 CST 2000 - unknown@proxy17.kiec.kh.edu.tw[163.18.250.17] ftpd
    Sat Oct 14 15:50:59 CST 2000 - unknown@203.69.248.210[203.69.248.210] ftpd
    Sat Oct 14 15:58:44 CST 2000 - unknown@210.70.57.2[210.70.57.2] ftpd
    記錄檔的大小會隨著時間的增加與日劇增,要做好維護的工作。
  11. 被拒絕登入時的醜態是長成這樣子的:
    #telnet dns.dananes.mlc.edu.tw
    Trying 163.19.224.120...
    Connected to dns.dananes.mlc.edu.tw.
    Escape character is '^]'.
    Connection closed by foreign host.
  12. 自本文件發表日起(89.10.14),無DNS反解設定之主機(含ftp&proxy)可能無法再獲得本站之各項服務。(Apache的存取服務限制正在研究中)
  13. 參考資料來源:
    1. 88學年度清華大學網路管理班授課講義:陳世明老師講授。
    2. 感謝網友:PmNeKo提供FreeBSD  4.0-RELEASE內建防火牆的設定方式,文件整理中,稍後推出。
    3. FreeBSD 3.5-RELEASE內建的TCP_WRAPPER的設定方式很雷同,設定過程也更簡單,因為不需要另外安裝tcp_wrappers_7.6.tar.gz了。首先須檢查有無/etc/hosts.allow檔案,如果有,表示FreeBSD已內建支援,您只要將下列設定加在其檔案前頭,即可發揮TELNET防火牆之阻絕作用。
      # 只允許自己校內網域之各主機遠端登入(telnet)本主機。
      telnetd : .dnes.mlc.edu.tw : allow
      # 如果還想開放其他主機或網域遠端登入時,請比照上面這一行來設定。
      #一個主機一行、一個網域一行。
      # 其他的來源網域及主機均被底下的設定予拒絕並記錄之。
      telnetd : ALL : spawn=(echo `date` - %u@%h[%a] %d >> /var/log/access.log) & : deny
      設定完成存檔後,TCP_WRAPPERS的防火牆功能就已立即啟動了。
      還不要關閉這個視窗,應新開一個視窗遠端登入您的主機,試試有沒有防火牆的感覺。
    4. 轉貼網友gsyan熱情提供的資料:
      • FreeBSD 3.2 Release 以後(不含)的版本,4.x 全系列即內建 tcpwrapper
      • 如果沒有特別去修改,預設就會啟動 tcpwrapper,觀察 /etc/defaults/rc.conf 是不是有 inetd_flags="-wW" ,那就是啟動的參數。
      • 要管制什麼服務,直接修改 /etc/hosts.allow,改完後立即生效,不用重新啟動 inetd ,任何受 inetd 監聽的服務啟動時都會重讀 hosts.allow 。
      • 任何 deny 的部份都會自動記錄到 /var/log/messages 和顯示在 consloe 。
      • 因為 tcpwrapper 的 rules 有 firstmatch 的特性,所以寫規則先寫開放的部份,最後把它全部 deny ,最好是用 IP ,不要用 DomainName ,不然有可能可以利用 DNS 欺騙的方式來取得非法的連線
        例如:
        telnetd: 192.168.1.0/255.255.255.0 192.168.3.10 : allow
        telnetd: All : deny
        相關的語法可以參考
        man 5 hosts_options
        man 5 hosts_access