顯示具有 server 標籤的文章。 顯示所有文章
顯示具有 server 標籤的文章。 顯示所有文章

2021年1月19日 星期二

hping網路測試工具

如果防火牆或運營商屏蔽ICMP的話,hping可以對指定目標端口發起TCP探測,常用的參數:
  • -p 端口號
  • -S 發送TCP的SYN封包
  • -A 發送TCP的ACK封包
  • -a 偽造源IP
  • --flood盡可能快的發送,慎用
  • -c 100000 發送的數據包的數量。
  • -d 120 發送到目標機器的每個數據包的大小。
  • -w 64 TCP窗口大小。
  • --rand-source 使用隨機性的源頭IP地址。還可以使用-a或–spoof來隱藏主機名。

輸入示例:
hping 192.168.3.13 -p 80 -S
hping 192.168.3.13 -p 80 -A
hping 192.168.3.13 -p 80 -S -a 192.168.3.13
hping -c 100000 -d 120 -S -w 64 -p 80 --flood --rand-source 192.168.3.13

2020年12月31日 星期四

ubuntu server備忘

  1. cat /etc/lsb-release 查詢ubuntu版本;uname -r查詢內核版本
  2. timedatectl set-timezone Asia/Taipei 更改時區
  3. 更改主機名稱
    1. sudo hostnamectl set-hostname newNameHere
    2. sudo vim /etc/hosts
    3. sudo reboot
  4. apt-get install net-tools
  5. Debian/Ubuntu 新增開機自動執行程式
    1. runlevel 定義:
      • 0:關機 (Halt)
      • 1:單一使用者模式 (single user mode)
      • 2-5: 多使用者模式 (multi user mode)
      • 6: 系統重啟 (reboot)
    2. service --status-all 開機時預設啟動哪些service (+啟用 -未啟用)
      • systemctl enable service 開機時預設啟動該服務
      • systemctl disable service 開機時預設關閉該服務
      • systemctl start service 開啟服務
      • systemctl stop service 關閉服務
      • systemctl restart service 重新開啟服務
      • systemctl status service 服務狀況
  6. lsof 可以列出系統上每一個行程所開啟的檔案列表
    • -a 列出打開文件存在的行程
    • -c<command> 列出指定command所打開的文件
      • lsof -c vim
    • -g 列出GID行程詳情
    • -d<文件號> 列出占用該文件號的行程
    • +d<目錄> 列出目錄下被打開的文件
    • +D<目錄> 遞歸列出目錄下被打開的文件
    • -n<目錄> 列出使用NFS的文件
    • -i<條件> 列出符合條件的行程。(4、6、協議、:port、 @ip )
      • lsof -i :53
      • lsof -i tcp
      • lsof -i :1-1024
    • -p<行程號> 列出指定行程號所打開的文件
    • -u 列出uid帳號行程詳情
      • lsof -u bj,test,cat 列出多人之行程
  7. apt-get install traceroute
  8. ubuntu20.04的DNS由systemd-resolved管理,伺服器啟動即開啟53port,可更方式
    • vim /etc/systemd/resolved.conf
      將DNSStubListener=yes改為no(#拿掉)
    • mv /etc/resolv.conf /etc/resolv.conf.bak(將舊resolv.con備份)
    • ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
  9. 透過 netplan 設定網路卡 IP
    • /etc/network/interfaces裡面的設定(空的)已轉至/etc/netplan/00-installer-config.yaml
      # This is the network config written by 'subiquity'
      network:
        ethernets:
          enp0s3:
            addresses:
            - 192.168.1.5/24
            gateway4: 192.168.1.1
            nameservers:
              addresses:
              - 8.8.8.8
              search:
              - wles.chc.edu.tw
        version: 2
    • 改完設定後執行:netplan try測試,無誤後執行:netplan apply
  10. ip link show 顯示目前網路執行狀況
    • ip link set 網卡 up / down 啟用網卡或停用網卡
  11. samba成為PDC(參閱samba使用文件)(samba調校)
    1. smbstatus 指令查詢資源連線狀況
    2. 掛載網路硬碟
      smbclient -L ip //IP -U username 列出分享資料夾
      smbmount //IP/資料夾 /掛載點 -o username=帳號 掛載網路硬碟
    3. vim /etc/samba/smb.conf
      [global]
      security = USER
      domain master = Yes
      preferred master = Yes
      os level = 65
      wins support = Yes (搭配DHCP派送wins server為此伺服器)
      server min protocol = NT1
      client min protocol = NT1
      #map to guest = bad user (mark掉,強迫帳號密碼驗證)
      #usershare allow guests = yes (mark掉或no,分享檔案guest不可使用)
      - - 以下可啟用samba符號連結(捷徑)功能 --
      follow symlinks = yes
      unix extensions = no
      wide links = yes
      [homes]
      comment = Home Directories
      read only = No
      create mask = 0664
      directory mask = 0755
      valid users = %S
      browseable = No
  12. chmod g+s 資料夾(參閱
  13. vim /etc/default/useradd
    將SHELL=/bin/sh 改為 /usr/sbin/nologin
  14. 掛載usb硬碟
    • fdisk -l
    • cd /mnt
    • mkdir usb
    • mount -v -t auto -o iocharset=utf8 /dev/sdb1 /mnt/usb
        • -v 顯示資訊
          • -t (auto讓系統自動分辯檔案系統,ext4,vfat,msdos)
            • -o(iocharset=    設定字元編碼,如 big5,utf8)
        • useradd指令只增加帳號不會自動新增home目錄(建議使用useradd -m 帳號)
        • 批次新增使用者(無密碼,csv檔第3欄為帳號、第4欄為密碼,| sh執行)
          awk -F, '{print "useradd -m " $3}' users.csv | sh
        • systemctl status cloud-init-local.service 偵測開機後cloud-init執行情形為active (exited),systemctl用法參見
          • systemctl stop cloud-init-local.service可停止服務,開機後還後再執行
          • touch /etc/cloud/cloud-init.disabled(在/etc/cloud/下增加cloud-init.disabled指令開機不再執行)

        samba4在全局部分的 smb.conf 中添加了以下內容:

        # Socket buffers should be huge:
          socket options = IPTOS_LOWDELAY TCP_NODELAY SO_RCVBUF=65536 SO_SNDBUF=65536
        # Use sendfile for reading files efficiently:
          use sendfile = yes
        # Cache data before flushing to disk:
          write cache size = 2097152
          min receivefile size = 16384
          getwd cache = true

        2020年8月4日 星期二

        wget使用方法

        啟動:
          -V,  --version           顯示 Wget 版本並離開
          -h,  --help              印出這段說明文字
          -b,  --background        啟動後進入背景作業
          -e,  --execute=指令      執行 ‘.wgetrc’ 形式的指令

        紀錄訊息及輸入檔案:
          -o,  --output-file=檔案    將紀錄訊息寫入<檔案>中
          -a,  --append-output=檔案  將紀錄訊息加入<檔案>末端
          -d,  --debug               印出偵錯訊息
          -q,  --quiet               安靜模式 (不輸出訊息)
          -v,  --verbose             詳細輸出模式 (預設使用這個模式)
          -nv, --non-verbose         關閉詳細輸出模式,但不啟用安靜模式
          -i,  --input-file=FILE     download URLs found in local or external FILE.
          -F,  --force-html          以 HTML 方式處理輸入檔
          -B,  --base=URL            resolves HTML input-file links (-i -F)
                                     relative to URL.

        下載:
          -t,  --tries=次數              設定重試次數 (0 表示無限)
               --retry-connrefused       即使連線被拒仍然會不斷嘗試
          -O   --output-document=檔案    將資料寫入指定檔案中
          -nc, --no-clobber              不覆寫已經存在的檔案
          -c,  --continue                繼續下載已下載了一部份的檔案
               --progress=方式           選擇下載進度的表示方式
          -N,  --timestamping           除非遠端檔案比較新,否則不下載遠端檔案
          -S,  --server-response         顯示伺服器回應訊息
               --spider                  不下載任何資料
          -T,  --timeout=秒數            指定所有時限為同一數值
               --dns-timeout=秒數        指定 DNS 查找主機的時限
               --connect-timeout=秒數    指定連線時限
               --read-timeout=秒數       指定讀取資料的時限
          -w,  --wait=秒數               每次下載檔案之前等待指定秒數
               --waitretry=秒數          每次重覆嘗試前稍等一段時間 (由 1 秒至指
                                         定秒數不等)
               --random-wait             每次下載之前隨機地指定等待的時間
               --no-proxy                禁止使用代理伺服器
          -Q,  --quota=大小              設定下載資料的限額大小
               --bind-address=位址       使用本機的指定位址 (主機名稱或 IP) 進行連線
               --limit-rate=速率         限制下載速率
               --no-dns-cache            不記憶 DNS 查找主機的資料
               --restrict-file-names=OS  只使用作業系統能夠接受的字元作為檔案字元
               --ignore-case             ignore case when matching files/directories.
          -4,  --inet4-only              只會連接 IPv4 地址
          -6,  --inet6-only              只會連接 IPv6 地址
               --prefer-family=FAMILY    優先採用指定的位址格式,可以是 IPv6、IPv4
                                         或者 none
               --user=用戶               指定 ftp 和 http 用戶名稱
               --password=PASS           指定 ftp 和 http 密碼
               --ask-password            prompt for passwords.
               --no-iri                  turn off IRI support.
               --local-encoding=ENC      use ENC as the local encoding for IRIs.
               --remote-encoding=ENC     use ENC as the default remote encoding.
        目錄:
          -nd  --no-directories           不建立目錄
          -x,  --force-directories        強制建立目錄
          -nH, --no-host-directories      不建立含有遠端主機名稱的目錄
               --protocol-directories     在目錄中加上通訊協定名稱
          -P,  --directory-prefix=名稱    儲存檔案前先建立指定名稱的目錄
               --cut-dirs=數目            忽略遠端目錄中指定<數目>的目錄層
        HTTP 選項:
               --http-user=用戶        指定 HTTP 用戶名稱
               --http-passwd=密碼      指定 HTTP 密碼
               --no-cache              不使用伺服器中的快取記憶資料
               --default-page=NAME     Change the default page name (normally
                                       this is `index.html'.).
          -E,  --adjust-extension      save HTML/CSS documents with proper extensions.
               --ignore-length         忽略 ‘Content-Length’ 標頭欄位
               --header=字串           在連線資料標頭中加入指定字串
               --max-redirect          maximum redirections allowed per page.
               --proxy-user=用戶       設定代理伺服器用戶名稱
               --proxy-password=密碼   設定代理伺服器密碼
               --referer=URL           在 HTTP 請求中包括 ‘Referer: URL’ 標頭
               --save-headers          將 HTTP 連線資料標頭存檔
          -U,  --user-agent=AGENT      宣稱為 AGENT 而不是 Wget/VERSION
               --no-http-keep-alive    不使用 HTTP keep-alive (持久性連線)
               --no-cookies            不使用 cookie
               --load-cookies=檔案     程式啟動時由指定檔案載入 cookie
               --save-cookies=檔案     程式結束後將 cookie 儲存至指定檔案
               --keep-session-cookies  會載入和儲存暫時性的 cookie
               --post-data=字串        使用 POST 方式送出字串
               --post-file=檔案        使用 POST 方式送出檔案內容
               --content-disposition   honor the Content-Disposition header when
                                       choosing local file names (EXPERIMENTAL).
               --auth-no-challenge     send Basic HTTP authentication information
                                       without first waiting for the server's
                                       challenge.

        HTTPS (SSL/TLS) 選項:
               --secure-protocol=PR     選擇安全通訊協定,可以使用 auto, SSLv2,
                                        SSLv3 或 TLSv1
               --no-check-certificate   不檢驗伺服器的憑證
               --certificate=檔案       指定用戶端的憑證檔案名稱
               --certificate-type=類型  用戶端憑證的類型,可以是 PEM 或 DER
               --private-key=檔案       指定私鑰檔案
               --private-key-type=類型  私鑰的類型,可以是 PEM 或 DER
               --ca-certificate=檔案    載有憑證管理中心 (CA) 簽章的檔案
               --ca-directory=目錄      載有憑證管理中心 (CA) 簽章的目錄
               --random-file=檔案       作為 SSL 隨機數產生程序 (PRNG) 的來源數據檔案
               --egd-file=檔案          產生隨機數據的 EGD socket 檔案名稱

        FTP 選項:
               --ftp-user=用戶         指定 FTP 用戶名稱
               --ftp-password=密碼     設定 FTP 密碼
               --no-remove-listing     不刪除 ‘.listing’ 檔案
               --no-glob               不展開有萬用字元的 FTP 檔名
               --no-passive-ftp        不使用「被動」傳輸模式
               --retr-symlinks         在遞迴模式中,下載鏈結指示的目標檔案
                                       (不包括目錄)

        遞迴下載:
          -r,  --recursive          遞迴下載
          -l,  --level=數字         最大搜尋深度 (inf 或 0 表示無限)
               --delete-after       刪除下載後的檔案
          -k,  --convert-links      make links in downloaded HTML or CSS point to
                                    local files.
          -K,  --backup-converted   將檔案 X 轉換前先備份為 X.orig
          -m,  --mirror             相等於 -N -r -l inf --no-remove-listing 選項
          -p,  --page-requisites    下載所有顯示網頁所需的檔案,例如圖片等
               --strict-comments    用嚴格方式 (SGML) 處理 HTML 注釋。

        遞迴下載時有關接受/拒絕的選項:
          -A,  --accept=清單               接受的檔案樣式,以逗號分隔
          -R,  --reject=清單               排除的檔案樣式,以逗號分隔
          -D,  --domains=清單              接受的網域,以逗號分隔
               --exclude-domains=清單      排除的網域,以逗號分隔
               --follow-ftp                跟隨 HTML 文件中的 FTP 鏈結
               --follow-tags=清單          會跟隨的 HTML 標籤,以逗號分隔
          -G,  --ignore-tags=清單          會忽略的 HTML 標籤,以逗號分隔
          -H,  --span-hosts                遞迴模式中可進入其它主機
          -L,  --relative                  只跟隨相對鏈結
          -I,  --include-directories=清單  準備下載的目錄
          -X,  --exclude-directories=清單  準備排除的目錄
          -np, --no-parent                 不進入上層的目錄

        2018年7月11日 星期三

        Debian 9.4 安裝配置 MariaDB (MySQL)

        本文參考https://ralf.ren/1717國立白河商工日誌
        Debian 9 使用 MariaDB 徹底代替了 MySQL。相較於 mariadb-server,使用 mysql-server 能夠保證對 MySQL 的兼容性。
        1. 安裝MariaDB (MySQL)
          apt-get install mysql-server
        2. 如果允許遠端連線資料庫(非必須)
          vim /etc/mysql/mariadb.conf.d/50-server.cnf 將bind-address=127.0.0.1改成可連線的網段或0.0.0.0全部開放(mark起來也可)
        3. 使用原生 MySQL 認證
          因為默認使用了 UNIX SOCKET 認證,有些 phpMyAdmin 在登入時會發生 「Access Denied」 錯誤。我們可以更改 UNIX SOCKET 認證為原生 MySQL 認證。
          • update mysql.user set plugin = 'mysql_native_password' where User='root';
          • flush privileges;
        4. 修改root密碼
          • 方式一:
            mysqladmin -u root password 'new_password'
          • 方式二
            mysql直接進入資料庫
            Grant All Privileges On *.* To root@localhost Identified By 'password' With Grant Option;
            • Grant All Privileges : 代表將所有權限授權給
            • On *.* : 代表在那裡,第一個*為資料庫名稱,第二個星為資料表名稱,*.*為全部授權的意思
            • To root@localhost : 代表給 localhost 上的 root 這個人
            • Identified By ‘password’ : 在此輸入密碼
            • With Grant Option; : 表示這個使用者可以再 Grant 權限給其它使用者
            • 在使用 Grant 指令時,每個指令的第一個字要大寫
            • 這樣就完成權限設定的動作了
        5. 重新啟用資料庫
        備註:
        1. 考量當初資料庫預設字元為Latin1,新系統已將之改為utf8mb4,若要沿用:
          • 將/etc/mysql/mariadb.conf.d/50-server.cnf
            • #character-set-server  = utf8mb4
            • #collation-server      = utf8mb4_general_ci
          • 將/etc/mysql/mariadb.conf.d/50-client.cnf
            • #default-character-set = utf8mb4
        2. 若要使用新版moodle或SFS3U,有必要將原系統innodb-base的文件格式Antelope改為Barracude(Antelope是innodb-base的文件格式,Barracude是innodb-plugin引入的文件格式,同時Barracude也支持Antelope文件格式。),可在50-server.cnf設定當中設定:(參考杜子的網管筆記
          • max_allowed_packet = 100M   (加入這行,可以讓轉碼時每次處理 5000筆以上,加快速度)
          •  innodb_file_format = Barracuda
          •  innodb_file_format_max = Barracuda
          •  innodb_file_per_table = 1
          •  innodb_large_prefix

        2017年2月20日 星期一

        Apache Proxy 模組實作

        Apache 經由 Virtual Host 設定,可將單一網頁伺服器建置為多重網域名稱站台。如果需求相反呢?讓來自校外不同的網頁連結到學校主機的指定路徑…當然也行,用的是「Proxy 模組」!
        一、啟用 Proxy 模組
        ~# a2enmod proxy
        ~# a2enmod proxy_http
        二、設定 proxy
        ~# vi /etc/apache2/apache2.conf
        設定檔路徑因版本或有不同,另行編輯新增 conf 檔亦可。
        ~# vi /etc/apache2/sites-enabled/proxy.conf
        三、設定內容例如:
        將某網站連結至網頁伺服器根目錄中「chcg」資料夾下…
        ProxyRequests Off
        ProxyPass "/chcg" "http://www.chcg.gov.tw"
        四、重新啟動 Apache,
        ~# service apache2 restart
        成功!

        2016年11月10日 星期四

        利用 arp-scan 來查詢區域網路的 IP 和 Mac address

        安裝
        # apt-get install arp-scan

        查詢區域網路的IP和Mac
        # arp-scan --localnet

        其他查詢範例
        # arp-scan 192.168.0.0/24
        # arp-scan 192.168.0.1-192.168.0.254

        nmap -
        # nmap -sP 192.168.199.0/24
        # nmap -sP 192.168.199.1-254

        配合nmap使用可以得到較完整的資訊

        2016年10月14日 星期五

        debian 8.5版之mysql5.5優調

        登入mysql介面後,執行 show variables; 查看相關參數。
        相關參數範例,可至 /usr/share/doc/mysql-server-5.5/examples/ 查詢,裡頭包括:
        my-huge.cnf、my-innodb-heavy-4G.cnf、my-large.cnf、my-medium.cnf、my-small.cnf
        my.cnf設定備忘
        1. back_log: 要求 MySQL 能有的連接數量。當主要MySQL線程在一個很短時間內得到非常多的連接請求,這就起作用,然後主線程花些時間(儘管很短)檢查連接並且啟動一個新線程。 back_log值指出在MySQL暫時停止回答新請求之前的短時間內多少個請求可以被存在堆棧中。只有如果期望在一個短時間內有很多連接,你需要增加它,換句話說,這值對到來的TCP/IP連接的偵聽隊列的大小。默認數值是50,改為500。注意,這個值不可以大於系统参数tcp_max_syn_backlog的值,必要時更改 /etc/sysctl.conf之net.ipv4.tcp_max_syn_backlog = 1024,並執行sysctl -p,才可以。
        2. max_connections預設100,改為500
        3. interactive_timeout、wait_timeout在伺服器關閉交互式、非交互式連接前等待活動的秒數預設為28800秒(8小時),改為3600
        4. 其餘設定,則參考相關範例。

        2016年9月12日 星期一

        debian 8.5版之apache2.4優調(避免流量暴增時掛點)

        1. vim /etc/apache2/apache2.conf
          • Timeout 60 預設值300
            不論接收或傳送,當持續連線等待超過 60 秒則該次連線就中斷。
          • KeepAlive On 預設
            如果你的網頁內含很多圖檔,那麼一次連線就會將所有的資料送完。
          • MaxKeepAliveRequests 500 預設值100
            該次連線能夠傳輸的最大傳輸數量,0 代表不限制。
          • KeepAliveTimeout 5 預設值5
            該次連線在最後一次傳輸後等待延遲的秒數,如設太高則在較忙碌的系統上將會有較多的 Apache 程序佔用資源。
        2. MPM (Mutil-Processing Module)設定(重要,連接數設定)
          1. MPM 有兩種:prefork 和 worker。debian 8.5預設啟動prefork
          2. 可執行apachectl -V 做確認,prefork設定
            • vim /etc/apache2/mods-available/mpm_prefork.conf
              • ServerLimit 500 伺服器限制,預設無,如果想將MaxRequestWorkers設超過256,必須設定,且放在MaxRequestWorkers上面。
              • StartServers 5 預設,啟動 apache2 時,喚醒幾個 PID 來處理服務。
              • MinSpareServers 5 預設,最小的預備使用的 PID 數量
              • MaxSpareServers 10 預設,最大的預備使用的 PID 數量
              • MaxRequestWorkers 500 預設150,最大連線數到 apache2
              • MaxConnectionsPerChild 0 預設0,每個程序所能夠提供的最大傳輸次數要求,0代表無限制。
            • 執行 apachectl configtest 測試參數是否正確
        3. 關閉apache後,再開啟。不可使用restart的方式
        4. 本文參考
        減少不必要的等待(參考廖子儀文件
        vim /etc/apache2/apache2.conf
        為了效能,建議關閉 DNS 的查尋和提高 MaxKeepAliveRequests 的選項、把 Timeout 值調低。
        Timeout 值要縮短,在一個大流量的網路服務(良好的硬體設備,高頻寬的網路速度),在同一時間是需要能夠服務更多的使用者,如果 Timeout 太高,那麼在連線佔滿時下一個連線請求就要等到有連線結束掉才能夠被服務;相反的若設定太低那麼就要常常重新連線。
        當一個連線被建立之後,使用者很有可能會在短時間之內又提出新的請求,所以為了避免再次
        的連線,就會在本次要求結束後,保持連線 KeepAliveTimeout 秒,若是超過了keepAliveTimeout秒,其 Timeout 就會轉交給連線逾時,也就是 Timeout 秒之後,會自動斷掉連線。
        1. Timeout 60 連線超過 60 秒失敗就重試
        2. KeepAlive On
        3. MaxKeepAliveRequests 5000
        4. KeepAliveTimeout 3 KeepAlive 多久要自動 Timeout 掉
        5. HostnameLookups Off 關掉那費時的 DNS 查尋
        減少TIME_WAIT避免造成伺服器無法訪問
        linux指令:netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

        說明:
        SYN_RECV表示正在等待處理的請求數
        ESTABLISHED表示正常數據傳輸狀態
        TIME_WAIT表示處理完畢,等待超時結束的請求數。

        改變系統內核
        sysctl -a 查詢系統目前狀態(設定值)

        改變系統內核設定
        vim /etc/sysctl.conf
        1. net.ipv4.tcp_syncookies=1 表示開啟SYN Cookies。當出現SYN等待隊列溢出時,啟用cookies來處理,可防範少量SYN攻擊,默認為0
        2. net.ipv4.tcp_tw_reuse=1 允許將TIME-WAIT sockets重新用於新的TCP連接,默認為0
        3. net.ipv4.tcp_tw_recycle=1 表示開啟TCP連接中TIME-WAIT sockets的快速回收,默認為0
        4. net.ipv4.tcp_keepalive_time = 1200  預設7200秒
        5. net.ipv4.tcp_keepalive_intvl = 30  預設75秒
        6. net.ipv4.tcp_keepalive_probes = 3 預設9次
        如果TCP連接1200秒後,內核發起probe,如果probe3次(每次30秒)不成功,內核才徹底放棄,認為該連接已失效。
        sysctl -p 執行

        2016年3月21日 星期一

        sfs3伺服器研習備忘

        1. 安裝片base on ubuntu 14.04.3
          1. 網咯卡設定 /etc/network/interfaces
          2. DNS查詢 /etc/resolv.conf (不用重開機)
            nameserver 127.0.1.1
            nameserver 168.95.1.1
            nameserver 8.8.8.8
            nameserver 168.95.192.1
        2. 校時工作
          sudo /usr/sbin/ntpdate time.stdtime.gov.tw
          sudo ntpdate time.windows.com
        3. 網站目錄設定
          1. 預設網站設定檔 /etc/apache2/sites-enabled/000-default.conf
          2. 預設 SSL 網站的設定檔 /etc/apache2/sites-enabled/default-ssl.conf
          3. ACFS設定檔 /etc/apache2/sites-enabled/acfs_sfs.1404.conf
        4. 新版mysql資料庫使用InnoDB為預設引擎,造成使用tar備份時的錯誤。因此必須對舊資料庫檢查與修護。
          1. mysqlcheck -uroot -p -r sfs3(進行檢查與修護),若為新建資料表InnoDB格式,會發生錯誤訊息。
          2. mysqlcheck -uroot -p sfs3(修護完畢後,再檢測一次是否正確)
        5. 若正確進行資料庫備份(順便用gzip壓縮)
          mysqldump -uroot -p sfs3 --default-character-set=latin1 | gzip > sfs3_DB.sql.gz
          待日後使用gunzip sfs3_DB.sql.gz解壓縮。
        6. 還原備份資料庫
          mysqladmin -uroot -p create sfs3 ==>1.建好空資料庫
          mysql -uroot -p sfs3 < sfs3_DB.sql ==>2.倒入資料
        7. 遠端ftp備份,預設以163.23.200.28縣網主機,日後會開放申請放置大家的異地備份檔。
        8. 下載最新版本學籍系統程式
          wget http://sfscvs.tc.edu.tw/sfs_stable5.tar.gz
        9. 資料庫加密
          1. 安裝「aespipe」加解密工具
          2. 在/home/webadmin下,增加一個「AespipeKey.txt」,裡頭寫入20個位元以上自訂的密語
            加密 $ aespipe -P 字典檔.txt < 原始檔案 > 加密後檔案.enc
            解密 $ aespipe -d -P 字典檔.txt < 加密後檔案.enc > 解開後檔案
          3. 日後要還原,必先解密備份檔,再解壓,再dump進資料庫
        10. 修改「ACFSsfsBKv2.txt」放置在/bin,及改crontab

        加裝denyhosts防止ssh暴力破解

        本文參考自 站長評測網
        1. 清除SSH登錄記錄,防止裝完屏蔽自己。
          echo "" > /var/log/auth.log
        2. 安裝denyhosts
          apt-get install denyhosts
        3. vim /etc/denyhosts.conf
          SECURE_LOG = /var/log/auth.log
          PURGE_DENY = 30m #過多久清除已阻止IP
          HOSTS_DENY = /etc/hosts.deny #將阻止IP寫入到hosts.deny
          BLOCK_SERVICE = sshd
          DENY_THRESHOLD_INVALID = 3 #允許無效用戶登錄失敗的次數
          DENY_THRESHOLD_VALID = 5 #允許普通用戶登錄失敗的次數
          DENY_THRESHOLD_ROOT = 3 #允許root登錄失敗的次數
          DENY_THRESHOLD_RESTRICTED = 1 #設定 deny host 寫入到該資料夾
          WORK_DIR = /var/lib/denyhosts #將deny的host或ip紀錄到Work_dir中
          SUSPICIOUS_LOGIN_REPORT_ALLOWED_HOSTS=YES
          #如果為YES,所有在$WORK_DIR/allowed-host時面的IP地址將會被認為是可疑的,如果設置為NO,所有在allowd-hosts試圖登陸的結果,將不會發送警告郵件!所有不在$WORK_DIR/allowed-host時面的IP地址將會發送警告!
          HOSTNAME_LOOKUP=NO #是否將IP地址解析為主機名。
          LOCK_FILE = /var/run/denyhosts.pid #定義PID文件的位置,確保同時只有一個Denyhost進程在運行
          ADMIN_EMAIL = root@localhost
          SMTP_HOST = localhost
          SMTP_PORT = 25
          SMTP_FROM = DenyHosts
          SMTP_SUBJECT = DenyHosts Report
          AGE_RESET_VALID=5d #多長時間后,用戶登錄失敗的次數被置為0,這里是指在/etc/passwd里面定義的用戶,如果不設置,永遠都不會置0
          AGE_RESET_ROOT=25d #多長時間后,root用戶登錄失敗的次數置為0,如果不設置,永遠都不會置0
          AGE_RESET_RESTRICTED=25d #在$WORK_DIR/hosts-restricted時面定義的用戶,多長時間失敗次數計數器被置為0
          AGE_RESET_INVALID=10d #無效用戶(不在/etc/passwd里面的用戶)的失敗次數計數器,多長時間被置為0
          RESET_ON_SUCCESS = yes #當某個IP使用某個用戶登錄成功后,該IP對應的用戶失敗次數將會被置為0
          DAEMON_LOG = /var/log/denyhosts #當denyhost運行在守護進程模式的時候,日志文件存儲的位置
          DAEMON_SLEEP = 30s #輪詢查看SSHD日志的間隔
          DAEMON_PURGE = 1h #多長時間清空$HOSTS_DENY中的IP地址,如果PURGE_DENY為空,這個設置將無效
        4. 重啟/etc/init.d/denyhosts restart
        5. 設定白名單(出現不小心打錯密碼被列入黑名單後, 雖然手動去 /etc/hosts.deny 移除, 但不久又被 denyhosts 自動加回時, 需要處理的程序)
          vim /etc/hosts.allow

        apache網頁瀏覽限制ip並隱藏apache和php的版本訊息

        一、apache網頁瀏覽限制ip
        1. 修改httpd.conf內的設定, 針對"/var/www/html/abc"這個目錄做設定
          <Directory /var//www/abc/>
          Options MultiViews
          AllowOverride Limit
          Order allow,deny
          Allow from all
          </Directory>
        2. 在"/var/www/abc"目錄內加上".htaccess"這個檔案, 內容如下
          order deny,allow
          allow from 163.23.115.64/26
          deny from all
        ps.目錄下的子目錄也行
        二、防火牆限制ip(此方法會將該伺服器內的網站全部封鎖) 
        iptables -X
        iptables -Z
        iptables -A INPUT -i eth0 -s 163.23.115.64/26 -p tcp --dport 80 -j ACCEPT
        iptables -A INPUT -i eth0 -p tcp --dport 80 -j DROP
        iptables-save(儲存iptables設定)
        三、隱藏apache和php的版本訊息
        1. vim /etc/apache2/conf.d/security
          ServerTokens ProductOnly
          ServerSignature Off
        2. vim /etc/php5/apache2/php.ini
          expose_php Off
        3. 重新啟動apache2

        sfs3研習筆記

        1. 檢查版本:lsb_release -acat /etc/issue
          檢查linux核心版本:ll /boot/vmlinuz-*
        2. php 7 與現行sfs3程式不相容
        3. linux系統使用的網卡名稱可能是em1、p4p1、p2p1...等名稱,不一定是eth0,可使用
          ls /proc/net/dev_snmp6 查詢
          查看網路介面 (/proc是核心模擬出來的軟體檔案系統,它是核心對於外界的資訊窗口)
        4. DNS查詢設定,更改後立即生效 vim /etc/resolv.conf
          nameserver 168.95.1.1
          nameserver 8.8.8.8
          nameserver 8.8.4.4
        5. echo $PATH 系統預設搜尋路徑
          crontab 使用絕對路徑
        6. 改變ipv6、ipv4網路使用優先權。vim /etc/gai.conf,增加以下指令:
        7. precedence ::ffff:0:0/96  100
        8. 手動安裝某個套件
          sudo dpkg -i XXXX.deb
        9. 清除套件
          sudo apt-get clean
        10. 移除已安裝的套件(連相依套件一併清除)
          sudo apt-get autoremove --purge 套件
        11. 將相依且無用的套件移除
          sudo apt-get autoremove
        12. 清除舊核心
          1. dpkg --get-selections linux-image*
          2. 查目前使用核心:uname -r
          3. 查看全部核心
            dpkg -l | grep linux-image
          4. 移除舊核心:apt-get autoremove --purge linux-image-XXXX
        13. 執行更新指令
          sudo apt-get dist-upgrade -y
        14. 移除套件含設定檔
          sudo apt-get remove --purge 套件
        15. 安裝unzip套件(Debian預設沒有裝,上傳格式檔會出錯)
          apt-get install p7zip p7zip-full unzip
        16. 修改SSH可連線區域 (可參考 denyhosts套件進行防護)
          • sudo vim /etc/hosts.allow
            sshd:163.23. ,172.16. ,192.168.1.
            mysqld: 163.23.200.2
          • sudo vim /etc/hosts.deny
            ALL:ALL
        17. 學務系統資料庫備份與重建
          • 利用學務系統之問題工具箱 / 備註清除 (將上述InnoDB資料表改為MyISAM傳統格式)
            參考語法:mysqldump  -uroot -p --default-character-set=latin1 sfs3 > sfs_DB.sql
          • 新版mysql資料庫使用InnoDB為預設引擎,造成使用tar備份時的錯誤。因此必須對舊資料庫檢查與修護。
          • 檢查與修護
            mysqlcheck -uroot -p sfs3 (有InnoDB資料表要加-r,自動修復之意)
          • 備份並壓縮mysqldump -uroot -p sfs3 --default-character-set=latin1 | gzip > sfs3_DB.sql.gz
          • 資料庫重建
            • gunzip sfs3_DB.sql.gz (gunzip -k 可保留原gzip檔案)
            • mysqladmin -u root -p create sfs3
            • mysql -u root -p sfs3 < sfs3_DB.sql
        18. 將資料庫之資料表InnoDB格式改為MyISAM
          ALTER TABLE `scholarship_plan` ENGINE = MyISAM;
        19. 學務系統新學期建立之資料表預設格式為InnoDB,可進入學務系統 / 系統管理 / 問題工具箱 / 備註清除(找到InnoDB格式然後轉換成MyISAM)
        20. 學務系統移機(重建)完成後,須進入 系統管理/系統維護與管理/連結列修正
        21. 在virtualbox啟用剪貼簿(雙向)功能
        22. 指令
          • 預設服務 sysv-rc-conf
          • 查詢主機排程 crontab -l
        23. 相關資源:
          1. 最新sfs3下載:http://sfscvs.tc.edu.tw/sfs_stable5.tar.gz
          2. 自動備份:http://163.23.89.100/pub/sfs_tool/ACFSsfsBKv3.txt
          3. 彰化縣學籍系統
        24. 學務系統網頁安全預設(置於/etc/apache2/sites-enabled)
          1. 網站根目錄設定(不開放目錄)
            • Options FollowSymLinks
            • AllowOverride none (是否允許額外設定檔 .htaccess 的某些參數覆寫,none表示讓.htaccess失效)
            • Require all granted (全部允許)# Require all denied     #全部拒絕# Require host  chc.edu.tw #允許的網域
          2. 學籍系統data目錄設定
            • Options MultiViews FollowSymLinks (MultiViews 多國語言的支援)
            • AllowOverride none
            • php_flag engine off (禁止執行php)
          3. 網站工具目錄設定(較危險,限制IP)
            • Options Indexes MultiViews FollowSymLinks (Indexes沒出現首頁,就顯示目錄)
            • AllowOverride none
            • Require ip 127.0.0.1 172.16 163.23
        25. 修改SSH可連線區域
          1. vim /etc/hosts.allow
            sshd:163.23. ,172.16. ,192.168.1.
            mysqld:163.23.200.2
          2. vim /etc/hosts.deny
            ALL:ALL

        工作控制的技巧

        本文取自 H's手札,亦可參考鳥哥
        1. 如果需長時間執行指令工作,可以
          1. 指令後加&
            例如:cp file1 file2 &
          2. 指令執行後,用 Ctrl-Z ,終止這個程序,然後可以看到系統提示:
            [1]+ Stopped /root/bin/rsync.sh
            bg1
        2. jobs 查看背景工作狀況(bg、fg後面的數字為作業號)
          1. fg 1
          2. bg 1

        firefox17不支援fckeditor2.6線上編輯器與升級至php5相關議題

        1. 可在 fckeditor\fckeditor_php5.php將return ($iVersion >= 20030210) ; 置換成 return true ;
          (約在58行)
        2. php升級到5以後,大部分套件會以UTF-8為準,是故在fckeditor資料夾下找到fckeditor_php5.php第159行
          原$HtmlValue = htmlspecialchars( $this->Value) ;
          改成$HtmlValue = htmlspecialchars( $this->Value, ENT_COMPAT, 'BIG5' ) ;

        常見繁簡文互換或中文編碼問題

        編碼轉換(不轉換繁、簡文)
        • 改變將路徑下的目錄與檔案名稱的編碼方式
        *  需安裝 convmv
        * 先測試看看:從 big5 編碼轉成 utf8
        convmv -f big5 -t utf8 -r --nosmart folder_name
        * 強制轉換
        convmv -f big5 -t utf8 -r --nosmart --notest folder_name

        繁、簡體轉換
        • 轉換檔案內容:利用 iconv 進行繁、簡互轉
        * 先考慮簡單的情況:
        將 gb2312 編碼的簡體轉為 big5 編碼的繁體
        iconv sc-gb2312.txt -f gb2312 -t big5 -o output.txt
        若需要再把編碼轉為 utf8 則再換一次
        iconv sc-gb2312.txt -f gb2312 -t big5 | iconv -f big5 -t utf8   -o output.txt
        big5 繁體中文要轉成 utf8 編碼的繁體中文
        cat tc-big5.txt | iconv -f big5 -t utf8 > output.txt
        但比較麻煩的不知道編碼的格式為何。如此,可以用 autob5, autogb (需要安裝 zh-autoconvert ) 來協助,需要再轉換 utf8 編碼再 pipe 給 iconv 做,如下:
        cat sc-unknow.txt | autob5 | iconv -f big5 -t utf8 >  output.txt
        反之亦然,如:
        cat tc-big5.txt | autogb | iconv -f gbk -t utf8 > output.txt

        * 複雜的情況:
        文件內容為 utf8 編碼之簡體,要轉換成 utf8 繁體,則需要中介編碼,如下
        cat sc-utf8.txt | iconv -f utf8 -t gb2312  | iconv -f gb2312 -t big5 | iconv -f big5 -t utf8 output.txt

        下面則是轉換都是 utf8 的方式繁、簡檔名
        • utf8簡體檔名轉成utf8繁體檔名
        * 需安裝 zh-autoconvert
        * 先轉換目錄名稱
        for i in $(find . -type d)  ;  do mv $i $(echo $i | autob5 --input utf8 | iconv -f big5 -t utf8) ; done
        * 再轉換檔案名稱
        for i in $(find . -type f)  ;  do mv $i $(echo $i | autob5 --input utf8 | iconv -f big5 -t utf8) ; done

        查詢硬體資訊 - dmidecode 終端機指令

        sudo dmidecode -t 硬體類型
        硬體類型可以是索引值或英文名稱,包括:
        0 bios
        1 system
        2 baseboard
        3 chassis
        4 processor
        16, 17 memory
        7 cache
        8 connector
        9 slot

        awk的使用

        1. 取得欄位值
          awk 指令在讀取檔案或資料流時,以一行為單位,一次單以一行進行處理,預設的欄位以空白或Tab(\t)進行分隔,分隔完的欄位值從左邊第一欄為 $1 開始,往右遞增累加。在使用 awk 時,除了直接讀取檔案之外,也可以利用管線(pipe, |)將資料流導向給 awk 進行處理。
          p.s. $0 代表未經分隔的完整一行, NF(保留字, 無$)代表全部欄位數
          例如:將 ls -al 結果簡化成檔案名稱對應檔案擁有者
          ls -al | awk '{print $9"\t=>\t"$3}'
        2. if-else
          例如:Salary.txt
          A 19000
          B 22000
          C 10500
          D 65000
          awk '{if($2 > 22000) {print $1" is rich!"} else {print $1" is poor..."}}' Salary.txt
          // output
          A is poor...
          B is poor...
          C is poor...
          D is rich!
        3. 更改欄位分隔依據
          例如分隔 csv 檔案時,所需用到的分隔依據就不再是空白或Tab(\t)了,此時可以使用參數 -F 更改欄位分隔符號。例如:
          awk -F ',' '{print $1}' csv_file.txt
        本文參考Jedi Linuxer

        netstat用法

        windows的netstat功能較弱
        netstat -tn 目前連線
        netstat -ano | find /I "listening" 目前本機listen的情況(netstat -o顯示pid,find類似unix的grep,find /I忽略大小寫)
        ===========================================================

        查看本地端連結遠端的IP
        netstat -na|grep ESTABLISHED|awk '{print $5}'|sort|uniq -c|sort -r -n
        netstat -an --inet --inet6 (ipv4或ipv6)

        uniq重覆資料只算一筆;uniq -c 重覆資料只算一筆並計算次數
        sort [-fbMnrtuk] [file or stdin]
        選項與參數:
        -f  :忽略大小寫的差異,例如 A 與 a 視為編碼相同;
        -b  :忽略最前面的空白字元部分;
        -M  :以月份的名字來排序,例如 JAN, DEC 等等的排序方法;
        -n  :使用『純數字』進行排序(預設是以文字型態來排序的);
        -r  :反向排序
        -u  :就是 uniq ,相同的資料中,僅出現一行代表;
        -t  :分隔符號,預設是用 [tab] 鍵來分隔;
        -k  :以那個區間 (field) 來進行排序的意思

        一些實用的 netstat 語法,可以檢查主機的連線數量:
        • netstat -na
          顯示主機上所有已建立的連線。
        • netstat -an | grep :80 | sort
          顯示所有 port 80 的連線,並把結果排序。
        • netstat -n -p|grep SYN_REC | wc -l
          列出主機上有多少個 SYNC_REC,一般上這個數字應該相當低。
        • netstat -n -p | grep SYN_REC | sort -u
          同樣是列出 SYNC_REC,但不只列出數字,而是將每個 SYNC_REC 的連線列出。
        • netstat -n -p | grep SYN_REC | awk '{print $5}' | awk -F: '{print $1}'
          列出發送 SYNC_REC 的所有 ip 地址。
        • netstat -ntu | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
          計算每一個 ip 在主機上建立的連線數量。
        • netstat -anp |grep 'tcp\|udp' | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -n
          列出從 TCP 或 UDP 連線到主機的 ip 的數量。
        • netstat -ntu | grep ESTAB | awk '{print $5}' | cut -d: -f1 | sort | uniq -c | sort -nr
          列出每個 ip 建立的 ESTABLISHED 連線數量。
        • netstat -plan|grep :80|awk {'print $5'}|cut -d: -f 1|sort|uniq -c|sort -nk 1
          列出每個 ip 建立的 port 80 連線數量。
        netstat參數說明
        -a或–all 示所有連線中的Socket
        -A<網絡類>或–<網絡類> 列出該網絡類連線中的相地址。
        -c或–continuous 列出網絡狀態
        -C或–cache 示路由器配置的快取信息。
        -e或–extend 網絡其他相信息。
        -F或–fib FIB
        -g或–groups 示多重播功能群組組員
        -h或–help 線幫助。
        -i或–interfaces 網絡界面信息表
        -l或–listening 控中的服器的Socket
        -M或–masquerade 偽裝網絡連線
        -n或–numeric 直接使用IP地址,而不通域名服器。
        -N或–netlink或–symbolic 網絡硬件外圍設備的符號連接名
        -o或–timers 計時器。
        -p或–programs 示正在使用Socket的程序識別碼和程序名
        -r或–route Routing Table
        -s或–statistice 網絡工作信息統計表。
        -t或–tcp TCP傳輸協議連線狀況
        -u或–udp UDP傳輸協議連線狀況
        -v或–verbose 示指令程。
        -V或–version 示版本信息。
        -w或–raw RAW傳輸協議連線狀況

        使用sysv-rc-conf關閉更多系統服務(Service)

        本文取自 宇若彎彎
        安裝:
        sudo apt-get install sysv-rc-conf
        在我們開始搞亂它們之前,我要在這裡引入一些運行等級知識 ....全部開機進程執行順序如下:
        • 運行等級 S:開機進程中的第一個運行等級。/etc/init.d/rcS腳本將被調用到開啟並且/etc/rcS.d目錄下的所有進程將被執行。 
        • 運行等級 1:單用戶模式。/etc/rc1.d目錄下的所有進程將被執行。
        • 運行等級 2,3,4,5:在debian系統裡是多用戶環境,可能不包含圖形用戶界面。同樣的,在相應目錄下的進程將被運行。 
        • 運行等級 0:關閉計算機
        • 運行等級 6:重起計算機 
        服務:
        • acpi-support 這個是關於電源支持的默認是1,2,3,4,5下啟動,我認為你可以把它調整到s級別。
        • acpid acpi的守護程序,默認是2-5開啟,我認為可以不用管。
        • alsa alsa聲音子系統,應該不用開啟它。
        • alsa-utils 這個服務似乎取代了alsa,所以開啟這個就可以了,我在S級別開啟它。
        • anacron 這是一個用於執行到時間沒有執行的程序的服務,我認為它無所謂,所以關了它,這個可以隨便。
        • apmd 也是一種電源管理,我認為電腦如果不是很老,它就沒有開啟的必要了。
        • atd 和anacron類似,我把它關了。
        • bluez-utiles 傳說中的藍牙服務,然後遺憾我沒有,所以關了。
        • bootlogd 似乎使用來寫log的,安全期間開著他也許比較好。
        • cron 指定時間運行程序的服務,所以開著比較好的。
        • cupsys 打印機服務,所以如果你有,就開啟吧。
        • dbus 消息總線系統,非常重要,一定要開。
        • dns-clean 撥號連接用的,如果不用,就關了它。
        • evms 企業卷管理系統,由於我並不明白什麼叫做企業卷,所以我關了它。
        • fetchmail 用於郵件守護,我關了它。
        • gdm gnome桌面管理器,我關了它,然後用startx啟動gnome。
        • halt 關機用的,不要更改
        • hdparm 這個我剛才有講,如果沒有ide硬盤也就不用開啟它了。
        • hotkey-setup 這個是給某些品牌筆記本設計的熱鍵映射,台式機用戶請關了它
        • hotplug 這個是用於熱插拔的,我已經測試過了,在某些電腦上關閉它會使聲卡無效,請在S級別開啟它。
        • hplip hp打印機專用的,應該可以關了它。
        • ifrename 網絡接口重命名,好像沒用,關了。
        • ifupdown 這個使用來打開網絡的,開著它。
        • ifupdown-clean 同上。
        • klogd linux守護程序,接受來自內核和發送信息到syslogd的記錄,並記錄為一個文件,所以請開著它。
        • linux-restricted-modules-common 這個使用來使用受限制的模塊的,你可以從/lib/linux-restricted-modules下查看,如果沒有什麼,你可以關掉它。
        • lvm 邏輯卷管理器,如果你沒有請關了它。
        • makedev 用來創建設備到/dev/請不要動他。
        • mdamd 管理raid用,如果你沒有請關閉它。
        • module-init-tools 從/etc/modules 加在擴展模塊的,這個一般開著。
        • networking 增加網絡接口和配置dns用,將它開啟。
        • ntp-server 與ubuntu時間服務器進行同步的,關了。
        • pcmcia 激活pcmica設備,遺憾我有生以來都沒有見過這樣的設備,關了它。
        • powernowd 用於管理cpu的客戶端程序,如果有變頻功能,比如amd的quite' cool 那麼就開啟它吧。
        • ppp 撥號用的,我關了它。
        • ppp-dns 一樣,也關了。
        • readahead 預加載服務,讓我想起了win的預讀,當然他們不同,它會使啟動變慢3-4妙,所以我關了它。
        • reboot 重啟用的,不要動。 sync; sync; sync; reboot (配合寫入緩衝資料的 sync 指令動作)
        • rmnologin 如果發現nologin,就去除它,在筆記本上不用開啟。
        • rsync rsync協議守護,請視情況而定。
        • screen-cleanup 一個清除開機屏幕的腳本,隨便。
        • sendsigs 重啟和關機時向所有進程發送消息。所以不要管它。
        • single 激活但用戶模式,不用管它。
        • stop-bootlogd 從2,3,4,5級別停止bootlogd,不用管它。
        • sudo 這個不用說吧,不用管它。
        • sysklogd 用於記錄系統日誌信息,不用管它。
        • udev 用戶空間dev文件系統,不用管它。
        • udev-mab 同上。
        • umountfs 用來卸載文件卷的,不用管它。
        • urandom 生成隨即數的,不知道怎麼用,不用管它。
        • usplash 那個漂亮的啟動畫面,但是我關了它,它也存在,所以想關他需要把內核起動參數中的splash一句刪掉。
        • vbesave 顯卡bios配置工具,不用管它。
        • xorg-common 設置x服務ice socket。不用管它。
        • redhat下常用的一些服務
        • anacron 不考慮系統downtime期間的cron服務
        • amd 自動安裝NFS守候進程
        • apmd 高級電源管理
        • arpwatch 記錄日誌並構建一個在LAN接口上看到的以太網地址和IP地址對數據庫
        • atd 用於at和batch的服務
        • autofs 自動安裝管理進程automount,與NFS相關,依賴於NIS
        • crond 為Linux下自動安排的進程提供運行服務.
        • Gpm 提供字符模式下對鼠標的支持.
        • Keytable 用於裝載鍵盤鏡像
        • Kudzu 硬件探測器
        • Netfs 安裝和卸載NFS、SAMBA和NETWARE網絡文件系統
        • Network 激活已配置網絡接口的腳本程序
        • Nfslock NFS鎖定
        • Pcmcia 安裝pcmcia卡(一般用於筆記本電腦)
        • Sshd OpenSSH服務器
        • Syslog 一個讓系統引導時啟動syslog和klogd系統日誌守候里程的腳本
        • Xfs Xwindow字型服務器,為本地和遠程X服務器提供字型集
        • Xinetd 支持多種網絡服務的核心守候程序

        2016年3月15日 星期二

        SYN攻擊原理以及檢測防範技術

        據 統計,在所有駭客攻擊事件中,SYN攻擊是最常見又最容易被利用的一種攻擊手法。相信很多人還記得2000年YAHOO網站遭受的攻擊事例,當時駭客利用 的就是簡單而有效的SYN攻擊,有些網路蠕蟲病毒配合SYN攻擊造成更大的破壞。本文介紹SYN攻擊的基本原理、工具及檢測方法,並全面探討SYN攻擊防 範技術。
          一、TCP握手協議
          在TCP/IP協定中,TCP協定提供可靠的連接服務,採用三次握手建立一個連接。
          第一次握手:建立連接時,用戶端發送syn包(syn=j)到伺服器,並進入SYN_SEND狀態,等待伺服器確認;
        第二次握手:伺服器收到syn包,必須確認客戶的SYN(ack=j+1),同時自己也發送一個SYN包(syn=k),即SYN+ACK包,此時伺服器進入SYN_RECV狀態;
          第三次握手:用戶端收到伺服器的SYN+ACK包,向伺服器發送確認包ACK(ack=k+1),此包發送完畢,用戶端和伺服器進入ESTABLISHED狀態,完成三次握手。
          完成三次握手,用戶端與伺服器開始傳送資料,在上述過程中,還有一些重要的概念:
        未連接佇列:在三次握手協議中,伺服器 維護一個未連接佇列,該佇列為每個用戶端的SYN包(syn=j)開設一個條目,該條目表明伺服器已收到SYN包,並向客戶發出確認,正在等待客戶的確認 包。這些條目所標識的連接在伺服器處於Syn_RECV狀態,當伺服器收到客戶的確認包時,刪除該條目,伺服器進入ESTABLISHED狀態。
        Backlog參數:表示未連接佇列的最大容納數目。
          SYN-ACK 重傳次數 伺服器發送完SYN-ACK包,如果未收到客戶確認包,伺服器進行首次重傳,等待一段時間仍未收到客戶確認包,進行第二次重傳,如果重傳次數超 過系統規定的最大重傳次數,系統將該連接資訊從半連接佇列中刪除。注意,每次重傳等待的時間不一定相同。
          半連接存活時間:是指半連接佇列的條目存活的最長時間,也即服務從收到SYN包到確認這個報文無效的最長時間,該時間值是所有重傳請求包的最長等待時間總和。有時我們也稱半連接存活時間為Timeout時間、SYN_RECV存活時間。
          二、SYN攻擊原理
          SYN攻擊屬於DOS攻擊的一種, 它利用TCP協議缺陷,通過發送大量的半連接請求,耗費CPU和記憶體資源。SYN攻擊除了能影響主機外,還可以危害路由器、防火牆等網路系統,事實上 SYN攻擊並不管目標是什麼系統,只要這些系統打開TCP服務就可以實施。從上圖可看到,伺服器接收到連接請求(syn=j),將此資訊加入未連接佇列, 並發送請求包給客戶(syn=k,ack=j+1),此時進入SYN_RECV狀態。當伺服器未收到用戶端的確認包時,重發請求包,一直到超時,才將此條 目從未連接佇列刪除。配合IP欺騙,SYN攻擊能達到很好的效果,通常,用戶端在短時間內偽造大量不存在的IP位址,向伺服器不斷地發送syn包,伺服器 回復確認包,並等待客戶的確認,由於源位址是不存在的,伺服器需要不斷的重發直至超時,這些偽造的SYN包將長時間佔用未連接佇列,正常的SYN請求被丟 棄,目標系統執行緩慢,嚴重者引起網路堵塞甚至系統癱瘓。
        三、SYN攻擊工具
          SYN攻擊實現起來非常的簡單,互聯網上有大量現成的SYN攻擊工具。
          1、windows系統下的SYN工具
          以synkill.exe為例,執 行工具,選擇隨機的源位址和源端囗,並填寫目的機器位址和TCP端囗,啟動執行,很快就會發現目標系統執行緩慢。如果攻擊效果不明顯,可能是目的機器並未 開啟所填寫的TCP端囗或者防火牆拒絕訪問該端囗,此時可選擇允許訪問的TCP端囗,通常,windows系統開放tcp139端囗,UNIX系統開放 tcp7、21、23等端囗。
          四、檢測SYN攻擊
          檢測SYN攻擊非常的方便,當你在伺服器上看到大量的半連接狀態時,特別是源IP位址是隨機的,基本上可以斷定這是一次SYN攻擊。我們使用系統自帶的netstat 工具來檢測SYN攻擊:
          # netstat -n -p TCP
        tcp 0  0 10.11.11.11:23  124.173.152.8:25882  SYN_RECV -
        tcp 0  0 10.11.11.11:23  236.15.133.204:2577  SYN_RECV -
        tcp 0  0 10.11.11.11:23  127.160.6.129:51748  SYN_RECV -
        tcp 0  0 10.11.11.11:23  222.220.13.25:47393  SYN_RECV -
        tcp 0  0 10.11.11.11:23  212.200.204.182:60427 SYN_RECV -
        tcp 0  0 10.11.11.11:23  232.115.18.38:278   SYN_RECV -
        tcp 0  0 10.11.11.11:23  239.116.95.96:5122  SYN_RECV -
        tcp 0  0 10.11.11.11:23  236.219.139.207:49162 SYN_RECV -
        ...
          上面是在LINUX系統中看到的,很多連接處於SYN_RECV狀態(在WINDOWS系統中是SYN_RECEIVED狀態),源IP位址都是隨機的,表明這是一種帶有IP欺騙的SYN攻擊。
          我們也可以通過下面的命令直接查看在LINUX環境下某個端囗的未連接佇列的條目數:
          #netstat -n -p TCP   grep SYN_RECV   grep :22   wc -l
        324
          顯示TCP端囗22的未連接數有324個,雖然還遠達不到系統極限,但應該引起管理員的注意。
        五、SYN攻擊防範技術 
          關於SYN攻擊防範技術,人們研究 得比較早。歸納起來,主要有兩大類,一類是通過防火牆、路由器等過濾閘道防護,另一類是通過加固TCP/IP協議棧防範.但必須清楚的是,SYN攻擊不能 完全被阻止,我們所做的是盡可能的減輕SYN攻擊的危害,除非將TCP協議重新設計。
          1、過濾閘道防護
          這裏,過濾閘道主要指明防火牆,當然路由器也能成為過濾閘道。防火牆部署在不同網路之間,防範外來非法攻擊和防止保密資訊外泄,它處於用戶端和伺服器之間,利用它來防護SYN攻擊能起到很好的效果。過濾閘道防護主要包括超時設定,SYN閘道和SYN代理三種。
          ■閘道超時設定:防火牆設定SYN 轉發超時參數(狀態檢測的防火牆可在狀態表裏面設定),該參數遠小於伺服器的timeout時間。當用戶端發送完SYN包,服務端發送確認包後 (SYN+ACK),防火牆如果在計數器到期時還未收到用戶端的確認包(ACK),則往伺服器發送RST包,以使伺服器從佇列中刪去該半連接。值得注意的 是,閘道超時參數設定不宜過小也不宜過大,超時參數設定過小會影響正常的通訊,設定太大,又會影響防範SYN攻擊的效果,必須根據所處的網路應用環境來設 定此參數。
          ■SYN閘道:SYN閘道收到用戶 端的SYN包時,直接轉發給伺服器;SYN閘道收到伺服器的SYN/ACK包後,將該包轉發給用戶端,同時以用戶端的名義給伺服器發ACK確認包。此時伺 服器由半連接狀態進入連接狀態。當用戶端確認包到達時,如果有資料則轉發,否則丟棄。事實上,伺服器除了維持半連接佇列外,還要有一個連接佇列,如果發生 SYN攻擊時,將使連接佇列數目增加,但一般伺服器所能承受的連接數量比半連接數量大得多,所以這種方法能有效地減輕對伺服器的攻擊。
          ■SYN代理:當用戶端SYN包到 達過濾閘道時,SYN代理並不轉發SYN包,而是以伺服器的名義主動回復SYN/ACK包給客戶,如果收到客戶的ACK包,表明這是正常的訪問,此時防火 牆向伺服器發送ACK包並完成三次握手。SYN代理事實上代替了伺服器去處理SYN攻擊,此時要求過濾閘道自身具有很強的防範SYN攻擊能力。
        2、加固tcp/ip協議棧
          防範SYN攻擊的另一項主要技術是 調整tcp/ip協定棧,修改tcp協定實現。主要方法有SynAttackProtect保護機制、SYN cookies技術、增加最大半連接和縮短超時時間等。tcp/ip協議棧的調整可能會引起某些功能的受限,管理員應該在進行充分瞭解和測試的前提下進行 此項工作。
          ■SynAttackProtect機制
          為防範SYN攻擊,win2000 系統的tcp/ip協定棧內嵌了SynAttackProtect機制,Win2003系統也採用此機制。SynAttackProtect機制是通過關 閉某些socket選項,增加額外的連接指示和減少超時時間,使系統能處理更多的SYN連接,以達到防範SYN攻擊的目的。預設情況下,Win2000作 業系統並不支援SynAttackProtect保護機制,需要在登錄檔以下位置增加SynAttackProtect鍵值:
          HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
          當SynAttackProtect值(如無特別說明,本文提到的登錄檔鍵值都為十六進位)為0或不設定時,系統不受SynAttackProtect保護。
          當SynAttackProtect值為1時,系統通過減少重傳次數和延遲未連接時路由緩衝項(route cache entry)防範SYN攻擊。
        當SynAttackProtect值 為2時(Microsoft推薦使用此值),系統不僅使用backlog佇列,還使用附加的半連接指示,以此來處理更多的SYN連接,使用此鍵值 時,tcp/ip的TCPInitialRTT、window size和可滑動窗囗將被禁止。

          我們應該知道,平時,系統 是不啟用SynAttackProtect機制的,僅在檢測到SYN攻擊時,才啟用,並調整tcp/ip協議棧。那麼系統是如何檢測SYN攻擊發生的呢? 事實上,系統根據TcpMaxHalfOpen,TcpMaxHalfOpenRetried 和TcpMaxPortsExhausted三個參數判斷是否遭受SYN攻擊。
          TcpMaxHalfOpen 表示能同時處理的最大半連接數,如果超過此值,系統認為正處於SYN攻擊中。Win2000 server預設值為100,Win2000 Advanced server為500。
           TcpMaxHalfOpenRetried定義了保存在backlog佇列且重傳過的半連接數,如果超過此值,系統自動啟動 SynAttackProtect機制。Win2000 server預設值為80,Win2000 Advanced server為400。
          TcpMaxPortsExhausted 是指系統拒絕的SYN請求包的數量,預設是5。
          如果想調整以上參數的預設值,可以在登錄檔裏修改(位置與SynAttackProtect相同)
          ■ SYN cookies技術
          我們知道,TCP協議開闢了一個比較大的記憶體空間backlog佇列來存儲半連接條目,當SYN請求不斷增加,並這個空間,致使系統丟棄SYN連接。為使半連接佇列被塞滿的情況下,伺服器仍能處理新到的SYN請求,SYN cookies技術被設計出來。
          SYN cookies應用於linux、FreeBSD等作業系統,當半連接佇列滿時,SYN cookies並不丟棄SYN請求,而是通過加密技術來標識半連接狀態。
        在TCP實現中,當收到用戶端的SYN 請求時,伺服器需要回復SYN+ACK包給用戶端,用戶端也要發送確認包給伺服器。通常,伺服器的初始序列號由伺服器按照一定的規律計算得到或採用亂數, 但在SYN cookies中,伺服器的初始序列號是通過對用戶端IP地址、用戶端端囗、伺服器IP地址和伺服器端囗以及其他一些安全數值等要素進行hash運算,加 密得到的,稱之為cookie。當伺服器遭受SYN攻擊使得backlog佇列滿時,伺服器並不拒絕新的SYN請求,而是回復cookie(回復包的 SYN序列號)給用戶端, 如果收到用戶端的ACK包,伺服器將用戶端的ACK序列號減去1得到cookie比較值,並將上述要素進行一次hash運算,看看是否等於此 cookie。如果相等,直接完成三次握手(注意:此時並不用查看此連接是否屬於backlog佇列)。
          在RedHat linux中,啟用SYN cookies是通過在啟動環境中設定以下命令來完成:
          # echo 1 > /proc/sys/net/ipv4/tcp_syncookies
          ■ 增加最大半連接數
          大量的SYN請求導致未連接佇列被塞滿,使正常的TCP連接無法順利完成三次握手,通過增大未連接佇列空間可以緩解這種壓力。當然backlog佇列需要佔用大量的記憶體資源,不能被無限的擴大。
          WIN2000:除了上面介紹的 TcpMaxHalfOpen, TcpMaxHalfOpenRetried參數外,WIN2000作業系統可以通過設定動態backlog(dynamic backlog)來增大系統所能容納的最大半連接數,配置動態backlog由AFD.SYS驅動完成,AFD.SYS是一種內核級的驅動,用於支援基於 window socket的應用程式,比如ftp、telnet等。AFD.SYS在登錄檔的位置:
        HKLM\System\CurrentControlSet\Services\AFD\ParametersEnableDynamicBacklog值為1時,表示啟用動態backlog,可以修改最大半連接數。 
        MinimumDynamicBacklog 表示半連接佇列為單個TCP端囗分配的最小空閒連接數,當該TCP端囗在backlog佇列的空閒連接小於此臨界值時,系統為此端囗自動啟用擴展的空閒連 接(DynamicBacklogGrowthDelta),Microsoft推薦該值為20。

          MaximumDynamicBacklog是當前活動的半連接和空閒連接的和,當此和超過某個臨界值時,系統拒絕SYN包,Microsoft推薦MaximumDynamicBacklog值不得超過2000。
           DynamicBacklogGrowthDelta值是指擴展的空閒連接數,此連接數並不計算在MaximumDynamicBacklog內,當半連 接佇列為某個TCP端囗分配的空閒連接小於MinimumDynamicBacklog時,系統自動分配 DynamicBacklogGrowthDelta所定義的空閒連接空間,以使該TCP端囗能處理更多的半連接。Microsoft推薦該值為10。
          LINUX:Linux用變數 tcp_max_syn_backlog定義backlog佇列容納的最大半連接數。在Redhat 7.3中,該變數的值預設為256,這個值是遠遠不夠的,一次強度不大的SYN攻擊就能使半連接佇列占滿。我們可以通過以下命令修改此變數的值:
          # sysctl -w net.ipv4.tcp_max_syn_backlog="2048"
          Sun Solaris Sun Solaris用變數tcp_conn_req_max_q0來定義最大半連接數,在Sun Solaris 8中,該值預設為1024,可以通過add命令改變這個值:
          # ndd -set /dev/tcp tcp_conn_req_max_q0 2048
          HP-UX:HP-UX用變數tcp_syn_rcvd_max來定義最大半連接數,在HP-UX 11.00中,該值預設為500,可以通過ndd命令改變預設值:
          #ndd -set /dev/tcp tcp_syn_rcvd_max 2048
          ■縮短超時時間
          上文提到,通過增大backlog 佇列能防範SYN攻擊;另外減少超時時間也使系統能處理更多的SYN請求。我們知道,timeout超時時間,也即半連接存活時間,是系統所有重傳次數等 待的超時時間總和,這個值越大,半連接數佔用backlog佇列的時間就越長,系統能處理的SYN請求就越少。為縮短超時時間,可以通過縮短重傳超時時間 (一般是第一次重傳超時時間)和減少重傳次數來實現。
          Win2000第一次重傳之前等待 時間預設為3秒,為改變此預設值,可以通過修改網路接囗在登錄檔裏的TcpInitialRtt註冊值來完成。重傳次數由 TcpMaxConnectResponseRetransmissions 來定義,登錄檔的位置是:HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters registry key。
          當然我們也可以把重傳次數設定為0次,這樣伺服器如果在3秒內還未收到ack確認包就自動從backlog佇列中刪除該連接條目。
          LINUX:Redhat使用變數tcp_synack_retries定義重傳次數,其預設值是5次,總超時時間需要3分鐘。
          Sun Solaris Solaris 預設的重傳次數是3次,總超時時間為3分鐘,可以通過ndd命令修改這些預設值。