2017年4月28日 星期五

Docker 改用 overlayFS 檔案系統

Docker 要改用 Overlay 檔案系統,系統的 kernel 必須是 kernel-3.18 以上,
kernel-3.10 不支援 Overlay 格式。

作業系統: CentOS 7

1.將 OverlayFS 加到 module 目錄下
echo "overlay" > /etc/modules-load.d/overlay.conf

2.載入 overlay module
modprobe overlay
或者
reboot

3.增加 docker repo
vi /etc/yum.repos.d/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/$releasever/
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg

4.安裝 Docker
yum install docker-engine

確認 selinux 狀態
sestatus -v

5.修改 Docker(v1.2...) Daemon 用 OverlayFS 啟動
vi /usr/lib/systemd/system/docker.service
[Service]
.....................
ExecStart=/usr/bin/dockerd --storage-driver=overlay
.....................

systemctl daemon-reload
systemctl start docker.service
systemctl enable docker.service

6.檢查是否使用 overlay
docker info | grep 'Storage Driver'

如果看到下列訊息表示己經使用 overlay:
Storage Driver: overlay

檢查 Container 和 OS 的磁碟空間,正常啟用 overlay 時,磁碟空間應該是一樣的。


2017年4月26日 星期三

Hbase 安裝、設定 (Cluster)

相關軟體安裝、設定:
hadoop 安裝配置: http://sc8log.blogspot.tw/2017/04/hadoop-cluster.html
zookeeper 安裝、設定: http://sc8log.blogspot.tw/2017/04/zookeeper-cluster.html


下載 Hbase 套件
tar -zf hbase-1.3.1-bin.tar.gz
sudo mv hbase-1.3.1 /usr/local/hbase

修改 bash.bashrc
export HBASE_HOME=/usr/local/hbase
export PATH=$PATH:$HBASE_HOME/bin

重新載入 bash.bashrc
source /etc/bash.bashrc

建立 Log 目錄
mkdir -p /usr/local/hbase/{logs,tmp,pids}

修改 conf/hbase-env.sh
export JAVA_HOME=${JAVA_HOME}
export HBASE_PID_DIR=/usr/local/hbase/pids
export HBASE_MANAGES_ZK=true    //由 hbase 負責啟動、停止 zookeeper

修改 regionservers
vi $HBASE_HOME/conf/regionservers
master
slave01
slave02
slave03

修改 backup-masters
vi $HBASE_HOME/conf/backup-masters
slave03

修改 hbase-site.xml
vi $HBASE_HOME/conf/hbase-site.xml
<configuration>
  <property>
    <name>hbase.cluster.distributed</name>
    <value>true</value>
  </property>
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://master:9000/hbase</value>
  </property>
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>master,slave01,slave02,slave03</value>
  </property>
  <property>
    <name>hbase.tmp.dir</name>
    <value>/usr/local/hbase/tmp</value>
  </property>
  <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/user/zookeeper</value>
  </property>
</configuration>

清除 Log、tmp
rm -rf $HBASE_HOME/logs/*
rm -rf $HBASE_HOME/tmp/*

將 hbase 目錄複製到每台 slave
scp -r $HBASE_HOME slave01:~
scp -r $HBASE_HOME slave02:~
scp -r $HBASE_HOME slave03:~

移動 hbase 目錄(每台 slave)
sudo mv ~/hbase /usr/local/
sudo chown -R hadoop:hadoop /usr/local/hbase
sudo chmod +x /usr/local/hbase

啟動 Hbase
$HBASE_HOME/bin/start-hbase.sh

進入測試 hbase
hbase shell


運用範例:
學號                姓名        國文    英文 數學
105111111       boss         50        60        70
105111112       tom         60        70         80
105111113       max         90        95        100

建立 Table
create 'result','name','score'

寫入資料
put 'result','105111111','name','boss'
put 'result','105111111','score:chinese','50'
put 'result','105111111','score:english','60'
put 'result','105111111','score:math','70'
put 'result','105111112','name','tom'
put 'result','105111112','score:chinese','60'
put 'result','105111112','score:english','70'
put 'result','105111112','score:math','80'
put 'result','105111113','name','max'
put 'result','105111113','score:chinese','80'
put 'result','105111113','score:english','90'
put 'result','105111113','score:math','100'

查詢個人成績
get 'result','105111112'

查詢相同科目
scan 'result',{COLUMNS => 'score:english'}

查詢 result table 全部資料
scan 'result'

計算(統計不重覆的 row key 值,此範例為 3 人)
count 'result'

查看 table 結構
describe 'result'

刪除一列
delete 'result','105111112','name'

刪除相同 key 值的資料
deleteall 'result','105111112'

刪除 result table 的結構及資料
truncate 'result'

刪除 result table
disable 'result'
drop 'result'



zookeeper 安裝、設定 (Cluster)

相關軟體安裝、設定:
hadoop 安裝配置: http://sc8log.blogspot.tw/2017/04/hadoop-cluster.html
hbase 安裝、設定: http://sc8log.blogspot.tw/2017/04/hbase-cluster.html


下載 zookeeper:
wget http://apache.stu.edu.tw/zookeeper/zookeeper-3.4.9/zookeeper-3.4.9.tar.gz
tar -zxf zookeeper-3.4.9.tar.gz
sudo mv zookeeper-3.4.9 /usr/local/zookeeper
sudo chown hadoop:hadoop /usr/local/zookeeper
sudo mkdir -p /usr/local/zookeeper/logs

修改 /etc/bash.bashrc
export ZOOKEEPER_HOME=/usr/local/zookeeper
export PATH=$PATH:$ZOOKEEPER_HOME/bin

重新載入 bash.bashrc
source /etc/bash.bashrc

修改 zoo.cfg
tickTime=2000
initLimit=10
syncLimit=5
dataDir=/usr/local/zookeeper
clientPort=2181
dataLogDir=/usr/local/zookeeper/logs
server.1=master:2888:3888
server.2=slave01:2888:3888
server.3=slave02:2888:3888
server.4=slave03:2888:3888
重要:1、2、3、4 對應 myid 中的編號

設定主機 myid 編號
master:
sudo echo "1" > /usr/local/zookeeper/myid
slave01:
sudo echo "2" > /usr/local/zookeeper/myid
slave02:
sudo echo "3" > /usr/local/zookeeper/myid
slave03:
sudo echo "4" > /usr/local/zookeeper/myid

啟動
/usr/local/zookeeper/bin/zkServer.sh start
重新啟動 Zookeeper
/usr/local/zookeeper/bin/zkServer.sh restart 
停止
/usr/local/zookeeper/bin/zkServer.sh stop
狀態
/usr/local/zookeeper/bin/zkServer.sh status

測試資料夾寫入 Zookeeper
進入 Zookeeper command 模式
/usr/local/hadoop/zookeeper/bin/zkCli.sh -server 127.0.0.1:2181

建立一個名為 mytest1 的資料夾進 File system
create /mytest test

查看 /mytest 資料夾檔案
ls /



2017年4月21日 星期五

MikroTik RouterOS RAW 設定

RouterOS 從 6.36 版後多了一個 RAW 功能,上網收集資料了解了解,順便整理起來。

(上圖是依網友的流程圖模仿重畫的)

firewall Raw 列表允許選擇性在 connection tracking 之前繞過或者丟棄封包,這樣能大大的降低 CPU 負載。
該功能非常有助於防御 DOS 攻擊,RAW 列表不能匹配連接狀態的追蹤,例如 connection-state 和 L7 協議。

Raw Policy 出現在 Prerouting chin 和 output chin,並在 connection-tracking 前執行。

Raw 目的是對指定的 IP 訪問可以不經過連接追蹤(connection-tracking),有助於減少 CPU 負載 ,
但對於私有網路做 NAT 轉換,connection-tracking 是必須的,Raw 又如何在實際網路應用中發揮作用。
例如遭到 DDoS 攻擊,可以通過 Raw 規則關閉掉攻擊來源 IP 的連接追蹤,不建立本地連接會話,不予回應,降低 CPU 負載 。

在 Raw 中有兩個連表,分別是 prerouting 和 output:
prerouting 用於處理任何進入路由器的封包
output 用於處理封包來自於路由器,並通過其中一個接口離開,即由路由器自身發出的封包

例如:
遭到 11.22.33.44 的 IP 通過 syn 的 DDoS 攻擊,可以拒絕對該 IP 做連接追蹤,減少 CPU 負載 :
/ip firewall raw
add chain=prerouting src-address=11.22.33.44 action=notrack


另一種情況, 如較大的網路環境,涉及內網和外網請求,在訪問外網時需要做 nat 轉換,而內網則不需要,
因此流量和對話增加的情況下,避免 CPU 負載過高,可以透過 Raw 關閉掉訪問內網的連接追蹤。

例如,在一個大型網絡,內網IP地址段是192.168.0.0/16,關閉掉內網的連接跟蹤,配置如下:
/ip firewall raw
add chain=prerouting dst-address=192.168.0.0/16 action=notrack

配置後,在 connection-tracking 列表將不會看到內網訪問 192.168.0.0/16 的連接訊息

其他 RAW policy:
/ip firewall raw
add action=drop chain=prerouting comment="Port scanners" protocol=tcp psd=21,3s,3,1
add action=drop chain=prerouting comment="Drop oversized unfragmented packets" packet-size=1492-65535 protocol=icmp
add action=drop chain=prerouting comment="SYN-FIN attack protection" protocol=tcp tcp-flags=fin,syn
add action=drop chain=prerouting comment="SYN-RST attack protection" protocol=tcp tcp-flags=syn,rst
add action=drop chain=prerouting comment="X-Mas attack protection" protocol=tcp tcp-flags=fin,psh,urg,!syn,!rst,!ack
add action=drop chain=prerouting comment="NMAP FIN attack protection" protocol=tcp tcp-flags=fin,!syn,!rst,!psh,!ack,!urg
add action=drop chain=prerouting comment="NMAP Push attack protection" protocol=tcp tcp-flags=fin,syn,rst,ack,urg,!psh
add action=drop chain=prerouting comment="NMAP FIN/PSH/URG attack protection" protocol=tcp tcp-flags=fin,psh,urg,!syn,!rst,!ack
add action=drop chain=prerouting comment="NULLflags attack protection" protocol=tcp tcp-flags=!fin,!syn,!rst,!psh,!ack,!urg
add action=drop chain=prerouting comment="ALLflags attack protection" protocol=tcp tcp-flags=fin,syn,rst,psh,ack,urg

add action=drop chain=prerouting comment="Drop udp DNS queries from WAN" dst-port=53 in-interface="WAN" protocol=udp
add action=drop chain=prerouting comment="Drop tcp DNS queries from WAN" dst-port=53 in-interface="WAN" protocol=tcp




資料來源:
http://www.rosjb.com/803.html
https://quchao.com/entry/basic-rules-of-raw-table-in-the-routeros-firewall/


2017年4月20日 星期四

Hadoop 安裝 & Cluster 配置

相關軟體安裝、設定:
zookeeper 安裝、設定: http://sc8log.blogspot.tw/2017/04/zookeeper-cluster.html
hbase 安裝、設定: http://sc8log.blogspot.tw/2017/04/hbase-cluster.html


系統平台: UBUNTU 16.04

選定一台機器作為 Master
1. 在 Master 節點上配置 hadoop 用戶、確認己安裝 SSH server、安裝 Java 環境
2. 在 Master 節點上安裝 Hadoop,並完成配置
3. 在其他 Slave 節點上配置 hadoop 用戶、確認己安裝 SSH server、安裝 Java 環境
4. 將 Master 節點上的 /usr/local/hadoop 目錄複製到其他 Slave 節點上
5. 在 Master 節點上開啟 Hadoop

環境:
master    192.168.60.185
slave01   192.168.60.186
slave02   192.168.60.187
slave03   192.168.60.188

建立 Hadoop 帳號:
sudo useradd -m hadoop -s /bin/bash
sudo passwd hadoop
sudo adduser hadoop sudo

備註:
1.新增完Hadoop帳號後,先登出,再用 hadoop 帳號登入很重要
2.每一台主機(master、slave01、slave02、slave03)的測試帳號皆為 hadoop

安裝 JAVA:
1.安裝Java環境:
sudo add-apt-repository -y ppa:webupd8team/java   //add-apt-repository 不是內建指令,需安裝下列套件
########################################################
如出現 add-apt-repository: command not found,執行下列動作:
sudo rm -fR /var/lib/apt/lists/*
sudo apt-get update
sudo apt-get install -y python-software-properties
sudo apt-get install -y software-properties-common    #Ubuntu 14.04 之後的版本還需多安裝左邊的套件
########################################################
sudo apt-get update
sudo apt-get install -y oracle-java8-installer
sudo apt-get install -y oracle-java8-set-default
java -version
PS:
出現要確認安裝 JAVA 的確認訊息,按 ENTER 或 YES

2.設定 Java 路徑:
在 hadoop 家目錄中,執行指令
vi ~/.bashrc

在文字檔案最上面插入文字
export PATH=$PATH:/usr/local/hadoop/bin:/usr/local/hadoop/sbin
export JAVA_HOME=/usr/lib/jvm/java-8-oracle
儲存並離開。

執行指令:
source ~/.bashrc
讓剛才加入文字的部分生效

下載Hadoop
1.master 主機下載流程:
cd ~
sudo wget http://www.us.apache.org/dist/hadoop/common/hadoop-2.7.1/hadoop-2.7.1.tar.gz
sudo tar -zxvf ./hadoop-2.7.1.tar.gz -C /usr/local
cd /usr/local/
sudo mv ./hadoop-2.7.1/ ./hadoop
sudo chown -R hadoop:hadoop ./hadoop

2.再確認每台主機的名稱為: master、slave01、slave02、slave03,且能互通

3.修改 /etc/hosts 檔加入 hadoop(master & slave)
192.168.60.185    master
192.168.60.186    slave01
192.168.60.187    slave02
192.168.60.188    slave03

SSH 利用金鑰登入
1.讓 master 不用密碼,直接登入 slave。在 master 主機生成 ssh key
mkdir ~/.ssh
cd ~/.ssh
ssh-keygen -t rsa
cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys
scp ~/.ssh/id_rsa.pub hadoop@slave01:/home/hadoop/
scp ~/.ssh/id_rsa.pub hadoop@slave02:/home/hadoop/
scp ~/.ssh/id_rsa.pub hadoop@slave03:/home/hadoop/

2.在 slave01、slave02、slave03 主機裡,將 ssh 公鑰保存到相對應的位置
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys

3.回 master 主機測試,是否能直接登入
ssh slave01
ssh slave02
ssh slave03


配置叢集/分散式環境
在 master 主機上修改下列五個配置檔
1.修改 /usr/local/hadoop/etc/hadoop 的五個配置檔案:
slaves、core-site.xml、hdfs-site.xml、mapred-site.xml、yarn-site.xml

cd /usr/local/hadoop/etc/hadoop

2.1 修改 slaves
原內容為:
localhost
刪除,改成:
slave01
slave02
slave03

2.2 修改 core-site.xml
原內容為:
<configuration>
</configuration>
改成下列設定:
<configuration>
  <property>
     <name>fs.defaultFS</name>
     <value>hdfs://master:9000</value>
  </property>
  <property>
     <name>hadoop.tmp.dir</name>
     <value>file:/usr/local/hadoop/tmp</value>
     <description>Abase for other temporary directories.</description>
  </property>
</configuration>

2.3 修改 hdfs-site.xml
原內容為:
<configuration>
</configuration>
改成下列設定:
<configuration>
  <property>
     <name>dfs.namenode.secondary.http-address</name>
     <value>master:50090</value>
  </property>
  <property>
     <name>dfs.namenode.name.dir</name>
     <value>file:/usr/local/hadoop/tmp/dfs/name</value>
  </property>
  <property>
     <name>dfs.datanode.data.dir</name>
     <value>file:/usr/local/hadoop/tmp/dfs/data</value>
  </property>
  <property>
     <name>dfs.replication</name>
     <value>3</value>
  </property>
</configuration>
備註:因為有 3 台 slave,所以 dfs.replicaton 值改成 3

2.4 修改 mapred-site.xml
cp mapred-site.xml.template mapred-site.xml
原內容為:
<configuration>
</configuration>
改成下列設定:
<configuration>
  <property>
     <name>mapreduce.framework.name</name>
     <value>yarn</value>
  </property>
</configuration>

2.5 修改 yarn-site.xml
原內容為:
<configuration>
</configuration>
改成下列設定:
<configuration>
  <property>
     <name>yarn.resourcemanager.hostname</name>
     <value>master</value>
  </property>
  <property>
     <name>yarn.nodemanager.aux-services</name>
     <value>mapreduce_shuffle</value>
  </property>
</configuration>

3.將 master 上面的 hadoop 資料夾打包,傳輸給所有 slave 主機
cd /usr/local
rm -r ./hadoop/tmp
rm -r ./hadoop/logs/*
sudo tar -zcf ./hadoop.tar.gz ./hadoop
scp ./hadoop.tar.gz slave01:/home/hadoop
scp ./hadoop.tar.gz slave02:/home/hadoop
scp ./hadoop.tar.gz slave03:/home/hadoop

4.到 slave01、slave02、slave03 主機裡操作下列動作
sudo tar -zxf ~/hadoop.tar.gz -C /usr/local
sudo chown -R hadoop:hadoop /usr/local/hadoop

5.完成後,回到 master 主機,準備啟動 Hadoop 軟體 (「bin/hdfs namenode -format」這個指令,只要初次啟動時設定就好,以後不會用到)
NameNode 格式化:
/usr/local/hadoop/bin/hdfs namenode -format

DFS 啟動&關閉(在master上下指令就好)
#啟動
/opt/hadoop/sbin/start-dfs.sh
#關閉
/opt/hadoop/sbin/stop-dfs.sh

#啟動
/opt/hadoop/sbin/start-yarn.sh
#關閉
/opt/hadoop/sbin/stop-yarn.sh

第一次啟動時會要求授權 SSH 的「自動認證機制」ECDSA 密鑰授權給 slaves 主機


檢查 Hadoop 伺服器狀態:
1.DataNode 是否正常啟動
hdfs dfsadmin -report

看到 Live datanodes (3) 表示三台 slave 都正常啟動。

2.透過「jps」指令,來查看各個主機啟動的程序
master 至少需啟動四個服務:
ResourceManager
SecondaryNameNode
NameNode
Jps

Slave 至少需啟動三個服務:
NodeManager
DataNode
Jps

利用 WEB UI 查看系統狀態:
http://192.168.60.185:50070



MapReduce 運作測試:
1.修改 mapred-site.xml (手動在master、slaves 增加 jobhistory 記錄功能)
<configuration>
        <property>
                <name>mapreduce.framework.name</name>
                <value>yarn</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.address</name>
                <value>Master:10020</value>
        </property>
        <property>
                <name>mapreduce.jobhistory.webapp.address</name>
                <value>Master:19888</value>
        </property>
</configuration>

2.在 master 啟動 history 服務
mr-jobhistory-daemon.sh start historyserver

3.建立 HDFS 用戶目錄
hadoop fs -mkdir -p /user/hadoop

3.建立分散式系統目錄並複製檔案到分散式系統目錄內,準備進行測試
hadoop fs -mkdir input
hadoop fs -put /usr/local/hadoop/etc/hadoop/*.xml input

4.執行 MapReduce 測試
hadoop jar /usr/local/hadoop/share/hadoop/mapreduce/hadoop-mapreduce-examples-*.jar grep input output 'dfs[a-z.]+'

5.顯示執行結果
hadoop fs -cat /user/hadoop/output/part-r-00000

6.透過 WEB UI 查看 MapReduce job history 狀態
http://192.168.60.185:8088/cluster


Apache Hadoop MapReduce 字數計算範例:
http://hadoop.apache.org/docs/current/hadoop-mapreduce-client/hadoop-mapreduce-client-core/MapReduceTutorial.html





使用 SSH 金鑰登入其他主機


1.讓 master 主機不用密碼,直接登入 slave主機
master 主機生成 ssh key:

mkdir ~/.ssh
cd ~/.ssh

ssh-keygen -t rsa

cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

scp ~/.ssh/id_rsa.pub root@slave01:/root/
scp ~/.ssh/id_rsa.pub root@slave02:/root/


2.在 slave01、slave02 主機裡,將 ssh 公鑰保存到相對應的位置

cat ~/id_rsa.pub >> ~/.ssh/authorized_keys


3.回 master 主機測試,是否能直接登入
登入的 user 帳號相同,可以省略不輸入

ssh slave01 (ssh root@slave01)

ssh slave02 (ssh root@slave02)



上面動作完成,如還不能登入,請檢查 /etc/ssh/sshd_config 設定:

AuthorizedKeysFile      .ssh/authorized_keys




2017年4月19日 星期三

GoAccess 分析 Apache、Nginx Log,監控 Server 狀態


系統平台: CentOS 7

所需的 compile 套件(環境差異有所不同):
# yum install -y gcc GeoIP-devel php-pear php-pecl-geoip ncurses-devel

下載 GoAccess 套件:
# wget http://tar.goaccess.io/goaccess-1.2.tar.gz
# tar -xzvf goaccess-1.2.tar.gz
# cd goaccess-1.2/

編譯安裝:
# ./configure --enable-utf8 --enable-geoip=legacy
# make
# make install

修改 goaccess.conf 設定檔:
vi /usr/local/etc/goaccess.conf

調整時間格式:
# The following time format works with any of the
# Apache/NGINX's log formats below.
#
time-format %H:%M:%S

調整日期格式:
# The following date format works with any of the
# Apache/NGINX's log formats below.
#
date-format %d/%b/%Y

Log 檔內容格式:
# NCSA Combined Log Format
log-format %h %^[%d:%t %^] "%r" %s %b "%R" "%u"

更改 UI 配色(SSH 連線 Console UI):
# Choose among color schemes
# 1 : Monochrome
# 2 : Green
# 3 : Monokai (if 256-colors supported)
#
color-scheme 2

排除 IP 位址:
# Exclude an IPv4 or IPv6 from being counted.
# Ranges can be included as well using a dash in between
# the IPs (start-end).
#
#exclude-ip 127.0.0.1
#exclude-ip 192.168.0.1-192.168.0.100
#exclude-ip ::1
#exclude-ip 0:0:0:0:0:ffff:808:804-0:0:0:0:0:ffff:808:808

調整 靜態檔案(static-file) 類型:
.................................等等


即時查看(沒有特別修改 Apache、Nginx 的 Log 格式沒有修改過 goaccess.conf 設定檔):
# /usr/local/bin/goaccess -f /var/log/nginx/access.log --log-format=COMBINED

沒修改 goaccess.conf、沒加 --log-format=COMBINED 啟動即時查看時,會先彈出要選擇 "Log Format Configuration"

Dashboard 欄位說明:
1.Unique visitors per day – Including spiders(分析每天多少不同的IP造訪)
2.Requested files (Pages-URL)(瀏覽的動態網頁)
3.Requested static files – (Static content: png,js,etc)(瀏覽的靜態檔案)
4.HTTP 404 Not Found response code (HTTP 404 錯誤的頁面)
5.Hosts (拜訪最多次數的IP,DDos常常看這裡)
6.Operating Systems (分析來客的系統,但這個參數可以偽裝)
7.Browsers (分析來客的瀏覽器,同樣可以偽裝)
8.Referrers URLs (最多請求的 URL)
9.Referring Sites (從哪裡URL來源鏈結過來的)
10.Top Keyphrases used on Google’s search engine (分析Google熱門關鍵字,似乎沒有辦法分析)
11.Geo Location (來源的地區)
12.HTTP Status Codes (HTTP狀態,可以拿來看網站的穩定度)
(Dashboard 欄位說明來源: Mr. 沙先生 https://shazi.info/)


動態更新 goaccess report.html 網頁(Console 下執行,執行後顯示持續執行中狀態):
# goaccess /var/log/nginx/access.log -o /var/www/html/report.html --real-time-html

WEB UI 重新整理(F5) 資訊即時更新。

crontab 排程產生網頁(每五分鐘更新一次):
*/5 * * * * /usr/local/bin/goaccess -f /var/log/nginx/access.log -a -o /var/www/html/web-report.html

瀏覽器連線:
http://host/web-report.html


其他用法:
goaccess 也附加了 GeoIP,用來分析 IP 的位置 :
# geoiplookup www.hinet.net

GeoIP Country Edition: TW, Taiwan


備註,以下設定都可在 goaccess.conf 裡設定:
排除 IP:
# /usr/local/bin/goaccess -f /var/log/nginx/access.log -e 192.168.1.1
# /usr/local/bin/goaccess -f /var/log/nginx/access.log -e 192.168.1.1-192.168.1.20

-e 的參數可以排除指定的 IP,也可以用範圍,但不支援 netmask

更改配色(SSH 連線 Console UI):
# /usr/local/bin/goaccess -f /var/log/nginx/access.log --color-scheme=(預設 1 灰色, 2 綠色)




2017年4月17日 星期一

ESXI 重啟動,還原自訂修改過的設定檔(個人備忘記錄)

ESXI 重開機都會還原系統的某些設定值,所以最好的做法是備份修改後的設定檔,
並於重啟後還原這些備份的設定檔,才不用每次重啟後還要再調整一次系統設定。

相關會還原或被清除的檔案:
1.root 的 crontab 設定: /var/spool/cron/crontabs/root
2.firewall 設定: /etc/vmware/firewall/service.xml
3.localtime 檔: /etc/localtime
4.ghettoVCB.conf 被清除: /opt/ghettovcb/ghettoVCB.conf,vmlist(指定備份的 guest os 列表)
我用 ghettoVCB 備份 Guest OS,新增獨立的 conf 檔......也會被清除所以也要備份
5........有遇到再繼續補充

以上的檔案都已備份到 /vmfs/volumes/datastore1/(這裡的檔案一定不會被還原)


/etc/rc.local.d/local.sh,讓系統重啟後執行還原自訂的設定檔(local.sh 檔案重啟 ESXI 不會被還原):
/etc/rc.local.d/local.sh 新增要執行的動作:
#backup crond
/vmfs/volumes/datastore1/crondtab.sh

#Open firewall SMTP (ghettovcb 備份後寄送 e-mail,所以要開通 firewall,裡面還包含後續新增開通的 rules)
/vmfs/volumes/datastore1/firewall.sh

#localtime(從 Ubuntu 16.04 拿來替代的檔案)
/vmfs/volumes/datastore1/re-localtime.sh

#ghettoVCB
/vmfs/volumes/datastore1/re-ghettovcb.sh


四個 Srcitp 檔案內容(檔案需可執行權限 755 OR 555):
crondtab.sh 內容:
#!/bin/sh
#add backup crond shell
/bin/kill $(cat /var/run/crond.pid)
cp /vmfs/volumes/datastore1/crontabsroot /var/spool/cron/crontabs/root
/usr/lib/vmware/busybox/bin/busybox crond

firewall.sh 內容:
#!/bin/sh
#Firwall rules
rm -rf /etc/vmware/firewall/service.xml
cp /vmfs/volumes/datastore1/service.xml /etc/vmware/firewall/
esxcli network firewall refresh

re-localtime.sh 內容:
#!/bin/sh
#Restore localtime file
rm -rf /etc/localtime
cp /vmfs/volumes/datastore1/localtime /etc/

re-ghettovcb.sh 內容:
rm -rf /opt/ghettovcb/bin/ghettoVCB.sh /opt/ghettovcb/bin/ghettoVCB-restore.sh
cp /vmfs/volumesdatastore1/ghettoVCB.sh /opt/ghettovcb/bin/
cp /vmfs/volumesdatastore1/ghettoVCB-restore.sh /opt/ghettovcb/bin/
cp /vmfs/volumesdatastore1/ghettoVCB.conf /opt/ghettovcb/
cp /vmfs/volumesdatastore1/vmlist /opt/ghettovcb/

系統 /var/spool/cron/crontabs/root 檔案內容:
30 1 * * 2,4,6 /opt/ghettovcb/bin/ghettoVCB.sh -g /opt/ghettovcb/ghettoVCB.conf -f /opt/ghettovcb/vmlist -l /tmp/vmbackup_$(date +%F_%H-%M).log > /dev/null
40 3 * * * /etc/init.d/snmpd restart > /dev/null 2>&1    
##發現 snmp 有時候會停掉,所以加入每天 03:40 重啟服務

/etc/vmware/firewall/service.xml 新增的內容:
  <service id='0044'>
    <id>VIC Outgoing</id>
    <rule id='0000'>
      <direction>outbound</direction>
      <protocol>tcp</protocol>
      <port type='dst'>2377</port>
    </rule>
    <enabled>true</enabled>
    <required>true</required>
  </service>

  <service id='0045'>
    <id>SMTP client</id>
      <rule id='0000'>
        <direction>outbound</direction>
        <protocol>tcp</protocol>
        <porttype>dst</porttype>
        <port>25</port>
      </rule>
    <enabled>true</enabled>
    <required>true</required>
  </service>





2017年4月14日 星期五

Docker Swarm Cluster 及 WEB Load Balance 應用

操作主機 (CentOS 7):
docker1    192.168.60.201    #master + node 及 swarm management
docker2    192.168.60.202
docker3    192.168.60.203

三台全裝
yum install -y docker

master 執行
docker run --rm swarm create

會出現一串 Cluster ID 記下來,因為每次執行都會再產生不同的 cluster id。

node 執行
docker run -d swarm join --addr=192.168.60.201:2375 token://07956fde8d6cd1363d5ca0e3a403b136
docker run -d swarm join --addr=192.168.60.202:2375 token://07956fde8d6cd1363d5ca0e3a403b136
docker run -d swarm join --addr=192.168.60.203:2375 token://07956fde8d6cd1363d5ca0e3a403b136

node 執行
vi /etc/sysconfig/docker
OPTIONS='-H 0.0.0.0:2375 -H unix:///var/run/docker.sock'
systemctl restart docker.service

master 執行
2375 port 己經被 docker 使用,所以必須使用其他的 port 來管理 docker:

docker run -t -p 2376:2375 -t swarm manage token://07956fde8d6cd1363d5ca0e3a403b136

正常應出現三台 join 主機的訊息,按 Ctrl + C 跳脫

確認 join 主機
docker run --rm swarm list token://07956fde8d6cd1363d5ca0e3a403b136
docker -H 192.168.60.201:2376 info


主機重開機時,如果沒有設定讓 Container 隨主機開機啟動,都要手動啟動它。
利用下列指令 update 讓 Container 隨主機啟動:
查看 Container ID:
docker ps -a

update container:
docker update --restart=always Container_ID


測試:
1.master 本機執行(不是在 master 的 docker container 裡)
安裝 Nginx 套件:
yum install -y epel-release
yum install -y nginx

將下列程式碼加入 /etc/nginx/nginx.conf 中:

upstream nodes {
    server 192.168.60.203:8080 weight=1; #權重 = 1
    server 192.168.60.202:8080 weight=2; #權重 = 2
    server 192.168.60.201:8080 weight=3; #權重 = 3
}

server {
    listen 80;

    location / {
        proxy_pass http://nodes;
    }
}

2.master 從 docker.io PULL 測試網頁 image 裝到 node 上(有幾台 node 就執行幾次。我也不確定要這麼做嗎!!!!! 但我執行兩次只有兩台有 PULL。發現後再執行一次,三台 node 就都有 PULL 測試網頁了)

docker -H :2375 run -d -p 8080:80 cijie/haproxy-web-example:1.0.0

3.打開瀏覽器,輸入 master IP,就可看到 Container 的 ID 切換
http://192.168.60.201





2017年4月12日 星期三

Windows 10 Hyper-v 與 VMWare 共存



整理一下網路上大家分享的方法,當作自己的備忘錄,避免之後又找一次。


1.打開具有 系統管理員 權限的 命令提示字元 視窗

2.新增一個開機選項,並會顯示一串機碼
bcdedit /copy {current} /d "Windows 10 關閉 Hyper-V"

出現:
已順利將項目複製到 {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}。

3.設定開機時關閉 Hyper-V
bcdedit /set {貼上剛才顯示的機碼} hypervisorlaunchtype OFF

重新開機後就多出一個 "Windows 10 關閉 Hyper-V" 的開機選項。



之後,測試完要怎麼刪除不要的開機選項咧???

使用 bcdedit 指令:
1.先查詢開機項目的機碼,開啟有 系統管理員 權限的 命令提示字元 視窗,輸入:
bcdedit

找到要刪除開機選項,複製 identifier 後面的機碼:

2.刪除開機選項
bcdedit /delete {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}

3.再查詢看是否刪掉了
bcdedit


2017年4月10日 星期一

CISCO Switch port security

設定 switch port security:

SW#configure terminal

SW(config)#interface fa0/24

SW(config-if)#switchport mode access (一定要access mode)

SW(config-if)#switchport port-security

SW(config-if)#switchport port-security maximum 1

SW(config-if)#switchport port-security mac-address xxxx.xxxx.xxxx

SW(config-if)#switchport port-security violation protect  #允許的 mac address 通過,其他 drop

SW(config-if)#switchport port-security violation restrict  #允許的 mac address 通過,其他 drop 及 LOG 記錄

SW(config-if)#switchport port-security violation shutdown  #違反所設定的規則,fa0/24 shutdown

SW(config-if)#end

SW#show port-security int fa0/24


當設定違反規則時的動作是 shutdown 時,fa0/24 接上其他電腦時 fa0/24 port 會自動 shutdown

查看該介面會顯示:
SW#sh interfaces fastEthernet 0/24
FastEthernet0/24 is down, line protocol is down (err-disabled)

Note:
shutdown 後需要由管理員手動將port, shutdown & no shutdown  (因為err-disabled 訊息)


清除 port-security mac address 指令:
SW#clear port-security stick address  xxxx.xxxx.xxxx



2017年4月6日 星期四

Shell script 安裝、設定 PPTP VPN

另一篇 Shell script 安裝、設定 L2TP VPN

#!/bin/bash
# Author:  yeho <lj2007331 AT gmail.com>

# Check if user is root
[ $(id -u) != "0" ] && echo "Error: You must be root to run this script" && exit 1

export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
clear

printf "
#######################################################################
#                                                 For CentOS/RadHat 6+                                                   #
#######################################################################
"

while :
do
echo
read -p "Please input private IP-Range(Default Range: 192.168.40): " iprange
[ -z "$iprange" ] && iprange="192.168.40"
if [ -z "`echo $iprange | grep -E "^10\.|^192\.168\.|^172\." | grep -o '^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$'`" ];then
echo -e "\033[31minput error! Input format: xxx.xxx.xxx\033[0m"
else
break
fi
done

while :
do
echo
        read -p "Please input username: " Username
        [ -n "$Username" ] && break
done

while :
do
echo
        read -p "Please input password: " Password
        [ -n "$Password" ] && break
done
clear

get_char()
{
SAVEDSTTY=`stty -g`
stty -echo
stty cbreak
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -raw
stty echo
stty $SAVEDSTTY
}

echo ""
echo "Server Local IP:$iprange.1"
echo ""
echo "Client Remote IP Range:$iprange.2-$iprange.254"
echo ""
echo "Press any key to start..."
char=`get_char`
clear

if [ -n "`grep 'CentOS Linux release 7' /etc/redhat-release`" ];then
        CentOS_REL=7
        for Package in wget net-tools ppp iptables iptables-services make gcc gmp-devel xmlto bison flex xmlto libpcap-devel lsof vim-enhanced
        do
                yum -y install $Package
        done
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/p/pptpd-1.4.0-2.el7.x86_64.rpm
rpm -Uvh pptpd-1.4.0-2.el7.x86_64.rpm
        echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
elif [ -n "`grep 'CentOS release 6' /etc/redhat-release`" ];then
        CentOS_REL=6
        for Package in wget net-tools ppp iptables make gcc gmp-devel xmlto bison flex xmlto libpcap-devel lsof vim-enhanced
        do
                yum -y install $Package
        done
wget wget http://poptop.sourceforge.net/yum/stable/rhel6/x86_64/pptpd-1.4.0-1.el6.x86_64.rpm
rpm -Uvh pptpd-1.3.4-2.el6.x86_64.rpm
        sed -i 's@net.ipv4.ip_forward.*@net.ipv4.ip_forward = 1@g' /etc/sysctl.conf
else
        echo -e "\033[31mDoes not support this OS, Please contact the author! \033[0m"
        exit 1
fi

sysctl -p

cat >/etc/ppp/options.pptpd<<EOF
name pptpd
#refuse-pap
#refuse-chap
#refuse-mschap
require-mschap-v2
require-mppe-128
proxyarp
lock
nobsdcomp
novj
novjccomp
nologfd
ms-dns 8.8.8.8
ms-dns 8.8.4.4
EOF

cat >/etc/pptpd.conf<<EOF
connections 100
localip 192.168.40.1
remoteip 192.168.40.100-200
EOF

cat >> /etc/ppp/chap-secrets<<EOF
$Username pptpd $Password *
EOF

if [ -n "`grep 'CentOS Linux release 7' /etc/redhat-release`" ];then
        CentOS_REL=7
        NETWORK_INT=`ip route | grep default | awk '{print $5}'`
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 1723 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT
iptables -A OUTPUT -p gre -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.40.0/24 -o $NETWORK_INT -j MASQUERADE
#Forwarding rules for VPN
iptables -A FORWARD -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
elif [ -n "`grep 'CentOS release 6' /etc/redhat-release`" ];then
        CentOS_REL=6
NETWORK_INT=`route | grep default | awk '{print $NF}'`
iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
        iptables -A OUTPUT -p tcp --sport 1723 -j ACCEPT
        iptables -A INPUT -p gre -j ACCEPT
        iptables -A OUTPUT -p gre -j ACCEPT
        iptables -t nat -A POSTROUTING -s 192.168.40.0/24 -o $NETWORK_INT -j MASQUERADE
#Forwarding rules for VPN
iptables -A FORWARD -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
else
        echo -e "\033[31mDoes not support this OS, Please contact the author! \033[0m"
        exit 1
fi

service pptpd restart-kill
service pptpd start
chkconfig pptpd on
clear
printf "
Serverip:$public_IP
username:$Username
password:$Password
"



Shell script 安裝、設定 L2TP VPN

另一篇 Shell script 安裝、設定 PPTP VPN

很久以前在網路上有看到一篇使用 Shell script 安裝及設定一次搞定 L2TP VPN,
稍微修改一下符合自己的需求。

#!/bin/bash
# Author:  yeho <lj2007331 AT gmail.com>

# Check if user is root
[ $(id -u) != "0" ] && echo "Error: You must be root to run this script" && exit 1

export PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
clear

printf "
#######################################################################
#                        For CentOS/RadHat 6+                                                                            #
#######################################################################
"

while :
do
echo
read -p "Please input private IP-Range(Default Range: 192.168.50): " iprange
[ -z "$iprange" ] && iprange="192.168.50"
if [ -z "`echo $iprange | grep -E "^10\.|^192\.168\.|^172\." | grep -o '^[0-9]\{1,3\}\.[0-9]\{1,3\}\.[0-9]\{1,3\}$'`" ];then
echo -e "\033[31minput error! Input format: xxx.xxx.xxx\033[0m"
else
break
fi
done

echo
read -p "Please input PSK(Default PSK: psk): " MYPSK
[ -z "$MYPSK" ] && MYPSK="psk"

while :
do
echo
        read -p "Please input username: " Username 
        [ -n "$Username" ] && break 
done

while :
do
echo
        read -p "Please input password: " Password 
        [ -n "$Password" ] && break 
done

while :
do
echo
        read -p "Please input public ip: " public_IP 
        [ -n "$public_IP" ] && break 
done
clear

get_char()
{
SAVEDSTTY=`stty -g`
stty -echo
stty cbreak
dd if=/dev/tty bs=1 count=1 2> /dev/null
stty -raw
stty echo
stty $SAVEDSTTY
}

echo ""
echo "ServerIP:$public_IP"
echo ""
echo "Server Local IP:$iprange.1"
echo ""
echo "Client Remote IP Range:$iprange.2-$iprange.254"
echo ""
echo "PSK:$MYPSK"
echo ""
echo "Press any key to start..."
char=`get_char`
clear

if [ -n "`grep 'CentOS Linux release 7' /etc/redhat-release`" ];then
        CentOS_REL=7
        for Package in wget net-tools ppp iptables iptables-services make gcc gmp-devel xmlto bison flex xmlto libpcap-devel lsof vim-enhanced
        do
                yum -y install $Package
        done
        echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
elif [ -n "`grep 'CentOS release 6' /etc/redhat-release`" ];then
        CentOS_REL=6
        for Package in wget net-tools ppp iptables make gcc gmp-devel xmlto bison flex xmlto libpcap-devel lsof vim-enhanced
        do
                yum -y install $Package
        done
        sed -i 's@net.ipv4.ip_forward.*@net.ipv4.ip_forward = 1@g' /etc/sysctl.conf
else
        echo -e "\033[31mDoes not support this OS, Please contact the author! \033[0m"
        exit 1
fi

sysctl -p
mknod /dev/random c 1 9

wget http://pkgs.fedoraproject.org/repo/pkgs/openswan/openswan-2.6.38.tar.gz/13073eb5314b83a31be88e4117e8bbcd/openswan-2.6.38.tar.gz
tar -xzf openswan-2.6.38.tar.gz
cd openswan-2.6.38
make programs install
cd ..

cat >/etc/ipsec.conf<<EOF
config setup
    nat_traversal=yes
    virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12
    oe=off
    protostack=netkey
    plutostderrlog=/var/log/ipsec.log

conn L2TP-PSK-NAT
    rightsubnet=vhost:%priv
    also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
    authby=secret
    type=tunnel
    pfs=no
    auto=add
    keyingtries=3
    rekey=no
    ikelifetime=8h
    keylife=1h
    left=$public_IP
    leftprotoport=17/1701
    right=%any
    rightprotoport=17/%any
    rightsubnetwithin=0.0.0.0/0
    dpddelay=30
    dpdtimeout=120
    dpdaction=clear
EOF

cat >/etc/ipsec.secrets<<EOF
$public_IP %any: PSK "$MYPSK"
EOF

cat > /usr/bin/zl2tpset << EOF
#!/bin/bash
for each in /proc/sys/net/ipv4/conf/*
do
echo 0 > \$each/accept_redirects
echo 0 > \$each/send_redirects
echo 0 > \$each/rp_filter
done
EOF

chmod +x /usr/bin/zl2tpset
/usr/bin/zl2tpset

[ -z "`grep zl2tpset /etc/rc.local`" ] &&  echo '/usr/bin/zl2tpset' >> /etc/rc.local
service ipsec restart
#wget http://pkgs.fedoraproject.org/repo/pkgs/xl2tpd/xl2tpd-1.3.8.tar.gz/d244fdcd88f64601b64b7302870afca8/xl2tpd-1.3.8.tar.gz
#tar xzf xl2tpd-1.3.8.tar.gz
#cd xl2tpd-1.3.8
#make install
if [ -n "`grep 'CentOS Linux release 7' /etc/redhat-release`" ];then
        CentOS_REL=7
wget http://dl.fedoraproject.org/pub/epel/7/x86_64/x/xl2tpd-1.3.8-2.el7.x86_64.rpm
rpm -Uvh xl2tpd-1.3.8-2.el7.x86_64.rpm
elif [ -n "`grep 'CentOS release 6' /etc/redhat-release`" ];then
        CentOS_REL=6
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/xl2tpd-1.3.8-1.el6.x86_64.rpm
        rpm -Uvh xl2tpd-1.3.8-1.el6.x86_64.rpm
else
        echo -e "\033[31mDoes not support this OS, Please contact the author! \033[0m"
        exit 1
fi

[ ! -e "/var/run/xl2tpd" ] && mkdir /var/run/xl2tpd
[ ! -e "/etc/xl2tpd" ] && mkdir /etc/xl2tpd
#cd ..

cat >/etc/xl2tpd/xl2tpd.conf<<EOF
[global]
listen-addr = $public_IP
ipsec saref = yes
auth file = /etc/ppp/chap-secrets
port = 1701

[lns default]
ip range = $iprange.2-$iprange.254
local ip = $iprange.1
assign ip = yes
refuse chap = yes
refuse pap = yes
require authentication = yes
name = L2TPVPN
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
EOF

cat >/etc/ppp/options.xl2tpd<<EOF
ipcp-accept-local
ipcp-accept-remote
require-mschap-v2
ms-dns 8.8.8.8
ms-dns 8.8.4.4
noccp
asyncmap 0
auth
crtscts
lock
hide-password
modem
debug
name l2tpd
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
idle 1800
mtu 1410
mru 1410
nodefaultroute
connect-delay 5000
logfd 2
logfile /var/log/l2tpd.log
EOF

cat > /etc/ppp/chap-secrets<<EOF
$Username l2tpd $Password *
EOF

if [ -n "`grep 'CentOS Linux release 7' /etc/redhat-release`" ];then
        CentOS_REL=7
        NETWORK_INT=`ip route | grep default | awk '{print $5}'`
iptables -I INPUT -p udp --dport 1701 -j ACCEPT
iptables -I INPUT -p udp --dport 500 -j ACCEPT
iptables -I INPUT -p udp --dport 4500 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -o $NETWORK_INT -j MASQUERADE
#Forwarding rules for VPN
iptables -A FORWARD -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
elif [ -n "`grep 'CentOS release 6' /etc/redhat-release`" ];then
        CentOS_REL=6
NETWORK_INT=`route | grep default | awk '{print $NF}'`
iptables -I INPUT -p udp --dport 1701 -j ACCEPT
iptables -I INPUT -p udp --dport 500 -j ACCEPT
iptables -I INPUT -p udp --dport 4500 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.50.0/24 -o $NETWORK_INT -j MASQUERADE
#Forwarding rules for VPN
iptables -A FORWARD -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
else
        echo -e "\033[31mDoes not support this OS, Please contact the author! \033[0m"
        exit 1
fi

service ipsec restart
service xl2tpd restart
chkconfig ipsec on
chkconfig xl2tpd on
clear
ipsec verify
printf "
Serverip:$public_IP
PSK:$MYPSK
username:$Username
password:$Password
"



OCS Inventory 匯出資料到 Google 試算表(依電腦設備類型)

OCS Inventory 匯出到 Google 試算表的程式是從網路上其他高手分享出來( 參考資料出處 ),並依個人需求調整。 如要取用請注意,因程式是用 python 寫的,程式段落可能會移位導致無法正常運作。 下列程式調整SELECT電腦 設備類型 為Noteboo...