由於有鎖網卡, 請選擇支援自己筆電型號的網卡
直接將原無線網卡取代. 使用旁邊的卡槽無法正常找到網路卡.
在 /boot/loader.conf 加上下列設定在開機時載入核心模組
if_iwn_load="YES"
在 /etc/rc.conf 加入下列設定啟動無線網卡
wlans_iwn0="wlan0"
ifconfig_wlan0="WPA DHCP"
#!/usr/local/bin/bash
##
## FreeBSD ipfw log analyzer
##
PATH="/bin:/usr/bin:/sbin:/usr/sbin:/usr/local/sbin:$PATH"
TS=`date +"%s"`
TMPFILE="/tmp/ana_ipfw-$TS"
TMPFILEsort="/tmp/ana_ipfw_sort-$TS"
LC_ALL=C
LANG=C
### Default options
datelimit=no
portlimit=no
iplimit=no
verbose=no
sorted=no
onlydata=no
datestr=""
logfile="/var/log/ipfw.log"
### Help
usage () {
echo "Usage: $0 [-p] [-i] [-v] [-s] [-o] [-d date_limit] [filename]"
echo " -p port analysis"
echo " -i IP address analysis"
echo " -d date format"
echo " +DDAY from DDAY to today"
echo " +-DDAY DDAY days ago"
echo " YYYYMMDD-YYYYMMDD from first YYYYMMDD to last YYYYMMDD"
echo " total all data records in the log file"
echo " -s sorted by count"
echo " -o only data and disable verbose"
echo " -v enable verbose messages"
echo " filename default : /var/log/ipfw.log"
}
if [ $# -eq 0 ]; then
usage
exit 1
fi
### Get arguments
args=`getopt dpivso $*`
if [ $? != 0 ]; then
echo "$0:ERROR"
exit 2
fi
set -- $args
for arg
do
case "$arg" in
-d ) datelimit=yes; shift ;;
-p ) portlimit=yes; shift ;;
-i ) iplimit=yes; shift ;;
-v ) verbose=yes; shift ;;
-s ) sorted=yes; shift ;;
-o ) onlydata=yes; shift ;;
-- ) datestr=$2; shift; shift ;;
esac
done
if [ $datelimit == "no" ]; then
if [ ! -z $datestr ]&&[ -f $datestr ]; then
logfile=$datestr
fi
else
if [ ! -z $datestr ]&&[ ! -z $1 ]; then
logfile=$1
fi
fi
if [ ! -f $logfile ]; then
echo "Error : Log file $logfile does not existed."
exit 1
fi
if [ $onlydata == "yes" ]; then
verbose=no
fi
### For debug
if [ $verbose == "yes" ]; then
echo "Parameters"
echo $args
echo "Date $datelimit($datestr) Port $portlimit IP $iplimit Verbose $verbose Sort $sorted Logfile $logfile"
echo ""
fi
### Generate date limitation
if [ $datelimit == "no" ]; then
dtmp="0"
datearray=($dtmp)
else
if [ ! -z `echo $datestr | awk 'BEGIN { FS = "+" } ; { print $2 }'` ]; then
if [ ! -z `echo $datestr | awk 'BEGIN { FS = "+" } ; { print $2 }' | awk 'BEGIN { FS = "-" } ; { print $2 }'` ]; then
datearray=(`echo $datestr | awk 'BEGIN { FS = "+" } ; { print $2 }' | awk 'BEGIN { FS = "-" } ; { print $2 }'`)
else
i=`echo $datestr | awk 'BEGIN { FS = "+" } ; { print $2 }'`
dtmp=""
for((; i >= 0; i--))
do
dtmp="$dtmp $i"
done
datearray=($dtmp)
fi
elif [ "$datestr" == "total" ]; then
datestr="total"
elif [ -z $datestr ]; then
dtmp="0"
datearray=($dtmp)
else
if [[ $datestr != *[!0-9\-]* ]]; then
bdate=`echo $datestr | awk 'BEGIN { FS = "-" } ; { print $1 }'`
edate=`echo $datestr | awk 'BEGIN { FS = "-" } ; { print $2 }'`
else
bdate=`date +"%Y%m%d"`
edate=`date +"%Y%m%d"`
fi
todayts=`date -j "+%s"`
bdatets=`date -j -f "%Y%m%d" "$bdate" "+%s"`
edatets=`date -j -f "%Y%m%d" "$edate" "+%s"`
if [ $bdatets -gt $todayts ]; then
echo "Error : $bdate is future. I can not analyze it."
exit 1
else
ib=`expr \( $todayts - $bdatets \) / 86400`
fi
if [ $edatets -gt $todayts ]; then
if [ $verbose == "yes" ]; then
echo "Warning : $edate is future. But I can replace it with today("`date +"%Y%m%d"`")."
echo ""
fi
ie=0
else
ie=`expr \( $todayts - $edatets \) / 86400`
fi
dtmp=""
for((i = $ib; i >= $ie; i--))
do
dtmp="$dtmp $i"
done
datearray=($dtmp)
fi
fi
### Create tmp file
if [ $verbose == "yes" ]; then
echo "Create $TMPFILE"
echo ""
fi
touch $TMPFILE
### Get log
if [ $verbose == "yes" ]; then
echo "Get log from $logfile"
fi
if [ $datelimit == "no" ]; then
if [ $verbose == "yes" ]; then
date +"%b %e"
fi
keyfilter=`date +"%b %e"`
grep "$keyfilter" $logfile >> $TMPFILE
elif [ "$datestr" == "total" ]; then
cat $logfile > $TMPFILE
else
for dnum in ${datearray[@]}
do
if [ $verbose == "yes" ]; then
date -v-${dnum}d +"%b %e"
fi
keyfilter=`date -v-${dnum}d +"%b %e"`
grep "$keyfilter" $logfile >> $TMPFILE
done
fi
if [ $verbose == "yes" ]; then
echo ""
fi
if [ $verbose == "yes" ]; then
echo "Count lines in $TMPFILE"
wc -l $TMPFILE
echo ""
fi
### Port Analysis
if [ $portlimit == "yes" ]; then
if [ $sorted == "yes" ]; then
rm -f $TMPFILEsort
touch $TMPFILEsort
fi
if [ $onlydata == "no" ]; then
echo "[[[ Port Analysis ]]]"
printf "%12s\t%12s\n" "Port Number" "Count"
printf "%12s\t%12s\n" "------------" "--------"
fi
for portnum in `cat $TMPFILE | awk 'BEGIN { FS = " " } ; { if( $11=="\-\>" ){ split($12, p, ","); print p[1] } else { print $11 } }' | grep ":" | awk 'BEGIN { FS = ":" } ; { print $2 }' | sort -u -n`
do
if [ $sorted == "yes" ]; then
printf "%12s\t%12s\n" "$portnum" `cat $TMPFILE | awk 'BEGIN { FS = " " } ; { if( $11=="\-\>" ){ split($12, p, ","); print p[1] } else { print $11 } }' | grep ":" | awk 'BEGIN { FS = ":" } ; { print $2 }' | grep $portnum | wc -l` >> $TMPFILEsort
else
printf "%12s\t%12s\n" "$portnum" `cat $TMPFILE | awk 'BEGIN { FS = " " } ; { if( $11=="\-\>" ){ split($12, p, ","); print p[1] } else { print $11 } }' | grep ":" | awk 'BEGIN { FS = ":" } ; { print $2 }' | grep $portnum | wc -l`
fi
done
if [ $sorted == "yes" ]; then
cat $TMPFILEsort | awk 'BEGIN { FS = " " } ; { printf ( "%12s\t%12s\n", $1, $2) }' | sort -rgk2 > /tmp/ttt-$TS
cat /tmp/ttt-$TS > $TMPFILEsort
rm -f /tmp/ttt-$TS
cat $TMPFILEsort
fi
fi
### Client IP Analysis
if [ $iplimit == "yes" ]; then
if [ $sorted == "yes" ]; then
rm -f $TMPFILEsort
touch $TMPFILEsort
fi
if [ $onlydata == "no" ]; then
echo "[[[ Client IP Analysis ]]]"
printf "%16s\t%12s\n" "IP Address" "Count"
printf "%16s\t%12s\n" "----------------" "--------"
fi
for ipaddr in `cat $TMPFILE | awk 'BEGIN { FS = " " } ; { print $10 }' | grep ":" | awk 'BEGIN { FS = ":" } ; { print $1 }' | sort -u -n`
do
if [ $sorted == "yes" ]; then
printf "%16s\t%12s\n" "$ipaddr" `cat $TMPFILE | awk 'BEGIN { FS = " " } ; { print $10 }' | grep ":" | awk 'BEGIN { FS = ":" } ; { print $1 }' | grep $ipaddr | wc -l` >> $TMPFILEsort
else
printf "%16s\t%12s\n" "$ipaddr" `cat $TMPFILE | awk 'BEGIN { FS = " " } ; { print $10 }' | grep ":" | awk 'BEGIN { FS = ":" } ; { print $1 }' | grep $ipaddr | wc -l`
fi
done
if [ $sorted == "yes" ]; then
cat $TMPFILEsort | awk 'BEGIN { FS = " " } ; { printf ( "%16s\t%12s\n", $1, $2) }' | sort -rgk2 > /tmp/ttt-$TS
cat /tmp/ttt-$TS > $TMPFILEsort
rm -f /tmp/ttt-$TS
cat $TMPFILEsort
fi
fi
### Remove tmp file
if [ $verbose == "yes" ]; then
echo ""
echo "Remove $TMPFILE"
fi
rm -f $TMPFILE
if [ $sorted == "yes" ]; then
if [ $verbose == "yes" ]; then
echo "Remove $TMPFILEsort"
fi
rm -f $TMPFILEsort
fi
Usage: /Path/to/ana_ipfw.sh [-p] [-i] [-v] [-s] [-o] [-d date_limit] [filename]
-p port analysis
-i IP address analysis
-d date format
+DDAY from DDAY to today
+-DDAY DDAY days ago
YYYYMMDD-YYYYMMDD from first YYYYMMDD to last YYYYMMDD
total all data records in the log file
-s sorted by count
-o only data and disable verbose
-v enable verbose messages
filename default : /var/log/ipfw.log
# ./ana_ipfw.sh -p
[[[ Port Analysis ]]]
Port Number Count
------------ --------
21 4
22 14
25 13
80 30
111 2
199 2
389 2
443 8
873 2
2049 2
3000 36
3306 11
5800 2
5900 5
6000 2
6001 2
# ./ana_ipfw.sh -ps
[[[ Port Analysis ]]]
Port Number Count
------------ --------
3000 36
80 30
22 14
25 13
3306 12
443 8
5900 5
21 4
6001 2
6000 2
5800 2
2049 2
873 2
389 2
199 2
111 2
# ./ana_ipfw.sh -p -d +3
[[[ Port Analysis ]]]
Port Number Count
------------ --------
21 7
22 20
25 41
80 72
111 2
199 2
389 2
443 14
873 2
2049 2
3000 72
3306 57
5800 2
5900 12
5901 3
6000 7
6001 2
# ./ana_ipfw.sh -p -d +3 -s
[[[ Port Analysis ]]]
Port Number Count
------------ --------
3000 72
80 72
3306 57
25 41
22 20
443 14
5900 12
6000 7
21 7
5901 3
6001 2
5800 2
2049 2
873 2
389 2
199 2
111 2
# ./ana_ipfw.sh -pv
Parameters
-p -v --
Date no() Port yes IP no Verbose yes Sort no Logfile /var/log/ipfw.log
Create /tmp/ana_ipfw-1347716436
Get log from /var/log/ipfw.log
Sep 15
Count lines in /tmp/ana_ipfw-1347716436
495 /tmp/ana_ipfw-1347716436
[[[ Port Analysis ]]]
Port Number Count
------------ --------
21 4
22 14
25 13
80 30
111 2
199 2
389 2
443 8
873 2
2049 2
3000 36
3306 12
5800 2
5900 5
6000 2
6001 2
Remove /tmp/ana_ipfw-1347716436
...
usbus1: EHCI version 1.0
usbus1: on ehci0
...
usbus1: 480Mbps High Speed USB v2.0
...
ugen1.1: at usbus1
uhub1: on usbus1
...
ugen1.2: at usbus1
umass0: on usbus1
umass0: SCSI over Bulk-Only; quirks = 0x4000
umass0:13:0:-1: Attached to scbus13
da0 at umass-sim0 bus 0 scbus13 target 0 lun 0
da0: Fixed Direct Access SCSI-2 device
da0: 40.000MB/s transfers
da0: 1907729MB (3907029168 512 byte sectors: 255H 63S/T 243201C)
# mdconfig -a -t swap -s 66m
# zpool create test /dev/md0
# zfs create -o copies=1 test/1
# zfs create -o copies=2 test/2
# vi /test/1/test1.txt
# vi /test/2/test2.txt
# zpool export test
# dd if=/dev/md0 of=/root/md0
# cp -a /root/md0 /root/md0-edit
# hexedit md0
# dd if=/root/md0-edit of=/dev/md0 bs=1m
# zpool import -d /dev test
# zfs scrub test
gpart show ada0
gpart destroy ada0
gpart create -s GPT ada0
gpart add -b 34 -s 128 -t freebsd-boot ada0
gpart add -t freebsd-zfs -l disk0 ada0
gpart bootcode -b /boot/pmbr -p /boot/gptzfsboot -i 1 ada0
gnop create -S 4096 /dev/gpt/disk0
zpool create -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot /dev/gpt/disk0.nop
zpool export zroot
gnop destroy /dev/gpt/disk0.nop
zpool import -o altroot=/mnt -o cachefile=/var/tmp/zpool.cache zroot
zpool set bootfs=zroot zroot
zfs set checksum=fletcher4 zroot
3. 建立子目錄zfs create zroot/usr
zfs create zroot/usr/home
zfs create zroot/var
zfs create -o compression=on -o exec=on -o setuid=off zroot/tmp
zfs create -o compression=lzjb -o setuid=off zroot/usr/ports
zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/distfiles
zfs create -o compression=off -o exec=off -o setuid=off zroot/usr/ports/packages
zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/usr/src
zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/crash
zfs create -o exec=off -o setuid=off -o copies=2 zroot/var/db
zfs create -o exec=off -o setuid=off zroot/var/empty
zfs create -o exec=off -o setuid=off zroot/var/run
zfs create -o compression=lzjb -o exec=on -o setuid=off -o copies=2 zroot/var/db/pkg
zfs create -o compression=lzjb -o exec=off -o setuid=off zroot/var/log
zfs create -o compression=gzip -o exec=off -o setuid=off -o copies=2 zroot/var/mail
zfs create -o compression=lzjb -o exec=on -o setuid=off zroot/var/tmp
4. 建立 swapzfs create -V 4G zroot/swap
zfs set org.freebsd:swap=on zroot/swap
zfs set checksum=off zroot/swap
5. 處理暫存目錄及home目錄chmod 1777 /mnt/tmp
cd /mnt; ln -s usr/home home
chmod 1777 /mnt/var/tmp
6. 複製系統檔案sh
cd /usr/freebsd-dist
export DESTDIR=/mnt
for file in base.txz lib32.txz kernel.txz doc.txz ports.txz src.txz; do(cat $file | tar --unlink -xpJf - -C ${DESTDIR:-/}); done
cp /var/tmp/zpool.cache /mnt/boot/zfs/zpool.cache
7. 處理開機設定echo 'zfs_enable="YES"' >> /mnt/etc/rc.conf
echo 'zfs_load="YES"' >> /mnt/boot/loader.conf
echo 'vfs.root.mountfrom="zfs:zroot"' >> /mnt/boot/loader.conf
touch /mnt/etc/fstab
8. /tmp 改用 TMPFSmount -u /
swapon -a
zfs mount -a
zfs rename zroot/tmp zroot/tmpold
mkdir -p /tmp
chmod 1777 /tmp
8.2. 在 /etc/fstab 加上# Device Mountpoint FStype Options Dump Pass#
tmpfs /tmp tmpfs rw 0 0
zpool export POOL_NAME
zpool import POOL1
zpool import POOL2
This email was generated by the smartd daemon running on:
host name: XXXXXX.daemonland.org
DNS domain: daemonland.org
NIS domain:
The following warning/error was logged by the smartd daemon:
Device: /dev/ad10, 3 Currently unreadable (pending) sectors
For details see host's SYSLOG.
You can also use the smartctl utility for further investigation.
No additional email messages about this problem will be sent.
# zpool offline POOL_NAME DISKID
關機後, 更換故障硬碟.
# zpool online POOL_NAME DISKID
# zpool replace POOL_NAME DISKID
ataahci_load="YES"
很訝異重新開機後磁碟機代號竟然沒有改變(沒有從 adX 變成 adaX).### UFS snapshot
0 1 * * * root /usr/local/sbin/snapshot make -g7 /SRCPATH:Daily
0 2 * * 1 root /usr/local/sbin/snapshot make -g4 /SRCPATH:Weekly
#!/usr/local/bin/bash
PATH=$PATH
CHKPARA=0
if [ -n "$1" ]; then
SSSRCPATH="$1"
shift
else
CHKPARA=1
fi
if [ -n "$1" ]; then
SnapshotName="$1"
shift
else
CHKPARA=1
fi
if [ -n "$1" ]; then
MountPath="$1"
shift
else
CHKPARA=1
fi
if [ $CHKPARA -eq 1 ]; then
echo "Usage: $0 Snapshot_Src_Path SnapshotName MountPath"
echo "Example: $0 /:Weekly.0 /mnt"
exit 1
else
echo "Try to mount $SSSRCPATH:$SnapshotName to $MountPath now."
fi
MC=`df -h |grep $MountPath |wc -l`
if [ -d $SSSRCPATH ]; then
if [ -f $SSSRCPATH/.snap/$SnapshotName ]; then
if [ -d $MountPath ]; then
if [ $MC -gt 0 ]; then
echo "MountPath $MountPath had been mounted!"
else
snapshot mount $SSSRCPATH:$SnapshotName $MountPath
df -h |grep $MountPath
echo "MountPath $MountPath was mounted."
fi
else
echo "MountPath $MountPath does not existed!"
fi
else
echo "Snapshot $SSSRCPATH/.snap/$SnapshotName does not existed!"
fi
else
echo "Snapshot source path $SSSRCPATH does not existed!"
fi
# mkdir -p /SNAPSHOT/Mount/Path/Weekly0
/PATH/TO/mount_UFS_snapshot.sh /SRCPATH Weekly.0 /SNAPSHOT/Mount/Path/Weekly0
#!/usr/local/bin/bash
PATH=$PATH
CHKPARA=0
if [ -n "$1" ]; then
MountPath="$1"
shift
else
CHKPARA=1
fi
if [ $CHKPARA -eq 1 ]; then
echo "Usage: $0 MountPath"
echo "Example: $0 /mnt"
exit 1
else
echo "Try to umount $MountPath now."
fi
MC=`df -h |grep $MountPath |wc -l`
if [ -d $MountPath ]; then
if [ $MC -gt 0 ]; then
snapshot umount $MountPath
df -h |grep $MountPath
echo "MountPath $MountPath had been umounted!"
else
echo "MountPath $MountPath had not been mounted!"
fi
else
echo "MountPath $MountPath does not existed!"
fi
/PATH/TO/umount_UFS_snapshot.sh /SNAPSHOT/Mount/Path/Weekly0
HHHHH(XXXXXX)/root# tunefs -p /dev/adXsXX tunefs: POSIX.1e ACLs: (-a) disabled tunefs: NFSv4 ACLs: (-N) disabled tunefs: MAC multilabel: (-l) disabled tunefs: soft updates: (-n) disabled tunefs: gjournal: (-J) disabled tunefs: trim: (-t) enabled tunefs: maximum blocks per file in a cylinder group: (-e) 2048 tunefs: average file size: (-f) 16384 tunefs: average number of files in a directory: (-s) 64 tunefs: minimum percentage of free space: (-m) 8% tunefs: optimization preference: (-o) time tunefs: volume label: (-L)
root@HOSTNAME:~# diff /etc/fstab.bak /etc/fstab 10c10 < UUID=dXXXdXXX-5899-XXXX-XXXd-XXXXcXXX8XXX / ext4 errors=remount-ro 0 1 --- > UUID=dXXXdXXX-5899-XXXX-XXXd-XXXXcXXX8XXX / ext4 discard,noatime,nodiratime,errors=remount-ro 0 1
### For tweak SSD echo noop > /sys/block/sda/queue/scheduler echo 1 > /sys/block/sda/queue/iosched/fifo_batch
tmpfs /tmp tmpfs rw 0 0
#!/bin/sh
# RamDisk tmp
PATH=/sbin:/bin:/usr/bin:/usr/sbin
mkdir /dev/shm/tmp
chmod 1777 /dev/shm/tmp
mount --bind /dev/shm/tmp /tmp
#!/bin/bash
# chkconfig: 35 80 70
# description: RAMDisk4Tmp
#
# History:
### 2012/02/25 RamDisk tmp
PATH=/sbin:/bin:/usr/bin:/usr/sbin
mkdir /dev/shm/tmp
chmod 1777 /dev/shm/tmp
mount --bind /dev/shm/tmp /tmp
tmpfs /tmp tmpfs defaults 0 0
none /tmp tmpfs defaults 0 0
tmpfs /tmp tmpfs nodev,nosuid 0 0
tmpfs /tmp tmpfs defaults,nodev,nosuid 0 0
#!/usr/local/bin/bash
PKGLISTPATH="/PATH/TO/STORE/PKGLIST"
if [ -n "$1" ]; then
keyword="$1"
shift
else
echo "Usage: $0 keyword"
echo "Example: $0 lib"
exit 1
fi
echo $keyword
if [ -f $PKGLISTPATH/pkgversion_`date +"%Y%m%d"`.txt ]
then
echo "Had $PKGLISTPATH/pkgversion_`date +"%Y%m%d"`.txt"
else
echo "Generating $PKGLISTPATH/pkgversion_`date +"%Y%m%d"`.txt"
portversion -l '<' > $PKGLISTPATH/pkgversion_`date +"%Y%m%d"`.txt
fi
for i in $(cat $PKGLISTPATH/pkgversion_`date +"%Y%m%d"`.txt | grep $keyword | awk '{ print $1 }'); do portmaster -D $i; done
#!/usr/local/bin/bash
BasePath="/PATH/TO/BACKUP/DIRECTORY"
PATH=$PATH
BackupConfig(){
if [ -z $1 ]
# Checks if any params.
then
echo "No parameters passed to function."
return 0
else
ProgName=$1
fi
if [ $2 ]
then
BackupFolder=$2
fi
case $ProgName in
postfix) CMD="postconf -n"
;;
sysctl) CMD="sysctl -a"
;;
pkglist) CMD="ls /var/db/pkg"
;;
*) echo "Do not support this program $ProgName"
;;
esac
mkdir -p $BasePath/$BackupFolder
rm -f $BasePath/$BackupFolder/${ProgName}_old.txt
echo "Check if had OLD data : "
if [ -f $BasePath/$BackupFolder/${ProgName}_now.txt ]; then
echo " Had OLD data! Rename it to ${ProgName}_old.txt"
mv $BasePath/$BackupFolder/${ProgName}_now.txt $BasePath/$BackupFolder/${ProgName}_old.txt
else
echo " Do not have OLD data."
fi
echo "Backup configuration of ${ProgName} now."
$CMD > $BasePath/$BackupFolder/${ProgName}_now.txt
echo "Generate diff log : "
if [ -f $BasePath/$BackupFolder/${ProgName}_old.txt ]; then
echo " Generate diff log between ${ProgName}_new.txt and ${ProgName}_old.txt."
diff $BasePath/$BackupFolder/${ProgName}_now.txt $BasePath/$BackupFolder/${ProgName}_old.txt > $BasePath/$BackupFolder/diff-`date +"%Y%m%d"`.txt
find $BasePath/$BackupFolder/ -type f -size 0 | xargs rm -f
else
echo " Do not have OLD data."
fi
}
### Backup postfix setting
BackupConfig postfix postfix_config_backup
### Backup sysctl setting
BackupConfig sysctl sysctl_config_backup
### Backup /var/db/pkg
BackupConfig pkglist installed-pkglist
#!/usr/local/bin/bash
LOGFILE="/PATH/TO/auth.log"
PROCFOLDER="/PATH/TO/auth_sshd_banip"
TOTALBANLOGFILE="/PATH/TO/auth_sshd_banip.log"
TOTALBANLOGFILESORTED="/PATH/TO/auth_sshd_banip_sorted.log"
TOTALBANLOGFILEFROMPROCFOLDERSORTED="/PATH/TO/auth_sshd_banip_from_procfolder_sorted.log"
TOTALRESCUELIST="/PATH/TO/auth_sshd_rescue_list.log"
CRONJOBDATE="crontjobdate.log"
TODAYLOGFM=`date +"%b %e"`
DefaultCheckPeriod="30"
MVFilePeriod="90"
TODAY=`date +"%Y%m%d"`
OLDDAY=`date -v-${DefaultCheckPeriod}d +"%Y%m%d"`
OLDYEAR=`date -v-${DefaultCheckPeriod}d +"%Y"`
fwcmd="/sbin/ipfw"
echo "Prepare folder and file"
mkdir -p $PROCFOLDER
touch $TOTALBANLOGFILE
touch $TOTALRESCUELIST
touch $PROCFOLDER/$CRONJOBDATE
touch $TOTALBANLOGFILEFROMPROCFOLDERSORTED
SSHDErrorCounter1=`cat $LOGFILE | grep "$TODAYLOGFM" | grep sshd | grep "Invalid user" | awk '{ print $10 }' | wc -l`
SSHDErrorCounter2=`cat $LOGFILE | grep "$TODAYLOGFM" | grep sshd | grep "Did not receive identification string from" | awk '{ print $12 }' | wc -l`
SSHDErrorCounter3=`cat $LOGFILE | grep "$TODAYLOGFM" | grep sshd | grep "not allowed because none of user" | awk '{ print $9 }' | wc -l`
if [ $SSHDErrorCounter1 -ne 0 ]||[ $SSHDErrorCounter2 -ne 0 ]||[ $SSHDErrorCounter3 -ne 0 ]||[ -f $PROCFOLDER/sshdpre-$TODAY.log ]; then
echo "Write pre-process file"
touch $PROCFOLDER/sshdpre-$TODAY.log
cat $LOGFILE | grep "$TODAYLOGFM" | grep sshd | grep "Invalid user" | awk '{ print $10 }' | sort -n | sort -u >> $PROCFOLDER/sshdpre-$TODAY.log
cat $LOGFILE | grep "$TODAYLOGFM" | grep sshd | grep "Did not receive identification string from" | awk '{ print $12 }' | sort -n | sort -u >> $PROCFOLDER/sshdpre-$TODAY.log
cat $LOGFILE | grep "$TODAYLOGFM" | grep sshd | grep "not allowed because none of user" | awk '{ print $9 }' | sort -n | sort -u >> $PROCFOLDER/sshdpre-$TODAY.log
cp -a $PROCFOLDER/sshdpre-$TODAY.log /tmp
cat /tmp/sshdpre-$TODAY.log | sort -n | sort -u > $PROCFOLDER/sshdpre-$TODAY.log
rm -f /tmp/sshdpre-$TODAY.log
echo "Collect new ban IP"
for ip in $(awk '{ print }' $PROCFOLDER/sshdpre-$TODAY.log)
do
if [ `grep $ip $PROCFOLDER/sshd-*.log | wc -l` -gt 0 ]; then
echo $ip "Old bad boy"
else
echo $ip
touch $PROCFOLDER/sshd-$TODAY.log
echo $ip >> $PROCFOLDER/sshd-$TODAY.log
echo $ip >> $TOTALBANLOGFILE
fi
done
echo "Ban bad boy"
if [ -f $PROCFOLDER/sshd-$TODAY.log ]; then
for banip in $(awk '{ print }' $PROCFOLDER/sshd-$TODAY.log)
do
#Ban IP
echo "Check $banip"
if [ `ipfw table 3 list | grep $banip | wc -l` -gt 0 ]; then
echo "Had ban bad boy($banip)."
else
echo "Ban bad boy($banip) now."
${fwcmd} table 3 add $banip/32
${fwcmd} table 4 add $banip/32
fi
done
else
echo "No bad boy"
fi
echo "Rescue good boy"
if [ -f $PROCFOLDER/sshd-$OLDDAY.log ]; then
for rescueip in $(awk '{ print }' $PROCFOLDER/sshd-$OLDDAY.log)
do
#Rescue IP
echo "Check $rescueip"
BadBoyDCPCounter=`find $PROCFOLDER -d 1 -ctime +${DefaultCheckPeriod} -type f -name 'sshd*.log' -exec grep $rescueip {} \; | wc -l`
BadBoyMVFCounter=`find $PROCFOLDER -d 1 -ctime +${MVFilePeriod} -type f -name 'sshd*.log' -exec grep $rescueip {} \; | wc -l`
if [ $BadBoyDCPCounter -lt 1 ]; then
if [ $BadBoyMVFCounter -le 2 ]; then
echo "Rescue $rescueip"
${fwcmd} table 3 delete $rescueip/32
${fwcmd} table 4 delete $rescueip/32
grep -v $rescueip $TOTALBANLOGFILE > /tmp/stillbanip-$TODAY
cp -f /tmp/stillbanip-$TODAY $TOTALBANLOGFILE
rm -f /tmp/stillbanip-$TODAY
echo $rescueip >> $TOTALRESCUELIST
echo "Rescued"
else
echo "Not bad boy in ${DefaultCheckPeriod} days, but had bad boy record in ${MVFilePeriod} days."
fi
else
echo "Still bad boy in ${DefaultCheckPeriod} days"
fi
done
#Move to old folder
echo "Move old file to storage folder"
mkdir -p $PROCFOLDER/$OLDYEAR
mv $PROCFOLDER/sshd*-$OLDDAY.log $PROCFOLDER/$OLDYEAR
else
echo "No candidate file"
fi
cat $TOTALBANLOGFILE | sort -n | sort -u > $TOTALBANLOGFILESORTED
else
echo "No bad boy"
fi
### Move old files to backup folder
find $PROCFOLDER -d 1 -ctime +${MVFilePeriod} -type f -name 'sshd*.log' -exec mv {} $PROCFOLDER/$OLDYEAR \;
cat $PROCFOLDER/sshd-*.log | sort -n | sort -u > $TOTALBANLOGFILEFROMPROCFOLDERSORTED
### Additional rescure goodboy
for rescueip in `diff $TOTALBANLOGFILEFROMPROCFOLDERSORTED $TOTALBANLOGFILESORTED | grep -v a | awk '{ print $2 }' | sort -r -n`
do
echo "Additional rescure goodboy from diff $TOTALBANLOGFILEFROMPROCFOLDERSORTED and $TOTALBANLOGFILESORTED"
echo "Rescue $rescueip"
${fwcmd} table 3 delete $rescueip/32
${fwcmd} table 4 delete $rescueip/32
grep -v $rescueip $TOTALBANLOGFILE > /tmp/stillbanip-$TODAY
cp -f /tmp/stillbanip-$TODAY $TOTALBANLOGFILE
rm -f /tmp/stillbanip-$TODAY
echo $rescueip >> $TOTALRESCUELIST
echo "Rescued"
done
cat $TOTALBANLOGFILE | sort -n | sort -u > $TOTALBANLOGFILESORTED
echo $TODAY > $PROCFOLDER/$CRONJOBDATE
### For backup and administration
/PATH/TO/BACKUP_SCRIPT
#!/usr/local/bin/bash
PATH=$PATH
LOGFILE="/PATH/TO/maillog"
DOVECOTERRORLOGFILE="/PATH/TO/dovecot/error.log"
DOVECOTINFOLOGFILE="/PATH/TO/dovecot/info.log"
PROCFOLDER="/PATH/TO/mail_banip"
DAILYLOG="mail_banip"`date +"%Y%m%d"`".log"
TMPFILE="/tmp/mailban-"`date +"%s"`
TODAYLOGFM=`date +"%b %e"`
fwcmd="/sbin/ipfw"
DefaultCheckPeriod="30"
MVFilePeriod="30"
OLDDAILYLOG="mail_banip"`date -v-${DefaultCheckPeriod}d +"%Y%m%d"`".log"
OLDYEAR=`date -v-${MVFilePeriod}d +"%Y"`
mkdir -p $PROCFOLDER
MAILErrorString1="NOQUEUE: reject"
MAILErrorCounter1=`cat $LOGFILE | grep "$TODAYLOGFM" | grep postfix | grep "$MAILErrorString1" | wc -l`
MAILErrorString2="auth-worker(default): Error: pam"
MAILErrorCounter2=`cat $DOVECOTERRORLOGFILE | grep "$TODAYLOGFM" | grep "$MAILErrorString2" | awk 'BEGIN { FS = ": " } ; { print $3 }' | awk 'BEGIN { FS = "," } ; { print $2 }' | sort -n | sort -u | sed -Ee 's/)//' | wc -l`
MAILErrorString3="pop3-login: Info: Aborted login (auth failed"
MAILErrorCounter3=`cat $DOVECOTINFOLOGFILE | grep "$TODAYLOGFM" | grep "$MAILErrorString3" | awk 'BEGIN { FS = ", " } ; { print $4 }' | awk 'BEGIN { FS = "=" } ; { print $2 }' | sort -n | sort -u | wc -l`
if [ $MAILErrorCounter1 -ne 0 ]||[ $MAILErrorCounter2 -ne 0 ]||[ $MAILErrorCounter3 -ne 0 ]||[ -f $PROCFOLDER/$DAILYLOG ]; then
if [ ! -f $PROCFOLDER/$DAILYLOG ]; then
touch $PROCFOLDER/$DAILYLOG
fi
echo "Collect Bad boy"
touch $TMPFILE
cat $LOGFILE | grep "$TODAYLOGFM" | grep postfix | grep "NOQUEUE: reject" | awk 'BEGIN { FS = "[" } ; { print $3 }' | awk 'BEGIN { FS = "]" } ; { print $1 }' | sort -n | sort -u >> $PROCFOLDER/$DAILYLOG
cat $DOVECOTERRORLOGFILE | grep "$TODAYLOGFM" | grep "$MAILErrorString2" | awk 'BEGIN { FS = ": " } ; { print $3 }' | awk 'BEGIN { FS = "," } ; { print $2 }' | sort -n | sort -u | sed -Ee 's/)//' >> $PROCFOLDER/$DAILYLOG
cat $DOVECOTINFOLOGFILE | grep "$TODAYLOGFM" | grep "$MAILErrorString3" | awk 'BEGIN { FS = ", " } ; { print $4 }' | awk 'BEGIN { FS = "=" } ; { print $2 }' | sort -n | sort -u >> $PROCFOLDER/$DAILYLOG
cat $PROCFOLDER/$DAILYLOG | sort -n | sort -u | grep -v "192.168.58" | grep -v "192.168.68" | grep -v "192.168.8" | grep -v "60.248.16.64" | grep -v "60.248.16.65" | grep -v "60.248.16.66" > $TMPFILE
cp -f $TMPFILE $PROCFOLDER/$DAILYLOG
echo "Ban Bad Boy"
for banip in $(awk '{ print }' $PROCFOLDER/$DAILYLOG)
do
if [ `ipfw table 3 list | grep $banip | wc -l` -gt 0 ]; then
echo "Had ban bad boy($banip)."
else
echo "Ban bad boy($banip) now."
${fwcmd} table 3 add $banip/32
${fwcmd} table 4 add $banip/32
fi
done
rm -f $TMPFILE
fi
if [ -f $PROCFOLDER/$OLDDAILYLOG ]; then
for rescueip in $(awk '{ print }' $PROCFOLDER/$OLDDAILYLOG)
do
echo "Rescue $rescueip"
${fwcmd} table 3 delete $rescueip/32
${fwcmd} table 4 delete $rescueip/32
done
else
echo "No candidate file"
fi
#Move to old folder
echo "Move old file to storage folder"
mkdir -p $PROCFOLDER/$OLDYEAR
find $PROCFOLDER -d 1 -ctime +${MVFilePeriod} -type f -name 'mail_banip*.log' -exec mv {} $PROCFOLDER/$OLDYEAR \;
#!/usr/local/bin/bash
PATH=$PATH
LOGFILE="/PATH/TO/httpd-access.log"
PROCFOLDER="/PATH/TO/httpd_banip"
DAILYLOG="httpd_banip"`date +"%Y%m%d"`".log"
TMPFILE="/tmp/httpdban-"`date +"%s"`
TODAYLOGFM=`date +"%d/%b/%Y"`
fwcmd="/sbin/ipfw"
DefaultCheckPeriod="30"
MVFilePeriod="30"
OLDDAILYLOG="httpd_banip"`date -v-${DefaultCheckPeriod}d +"%Y%m%d"`".log"
OLDYEAR=`date -v-${MVFilePeriod}d +"%Y"`
mkdir -p $PROCFOLDER
ErrorString1="xmlrpc.php"
ErrorCounter1=`cat $LOGFILE | grep "$TODAYLOGFM" | grep "$ErrorString1" | grep 404 | awk 'BEGIN { FS = " " } ; { print $1 }' | grep -v "192.168.58" | grep -v "192.168.68" | grep -v "192.168.8" | grep -v "60.248.16.64" | grep -v "60.248.16.65" | grep -v "60.248.16.66" | wc -l`
if [ $ErrorCounter1 -ne 0 ]||[ -f $PROCFOLDER/$DAILYLOG ]; then
if [ ! -f $PROCFOLDER/$DAILYLOG ]; then
touch $PROCFOLDER/$DAILYLOG
fi
echo "Collect Bad boy"
touch $TMPFILE
cat $LOGFILE | grep "$TODAYLOGFM" | grep "$ErrorString1" | grep 404 | awk 'BEGIN { FS = " " } ; { print $1 }' | sort -n | sort -u >> $PROCFOLDER/$DAILYLOG
cat $PROCFOLDER/$DAILYLOG | sort -n | sort -u | grep -v "192.168.58" | grep -v "192.168.68" | grep -v "192.168.8" | grep -v "60.248.16.64" | grep -v "60.248.16.65" | grep -v "60.248.16.66" > $TMPFILE
cp -f $TMPFILE $PROCFOLDER/$DAILYLOG
echo "Ban Bad Boy"
for banip in $(awk '{ print }' $PROCFOLDER/$DAILYLOG)
do
if [ `ipfw table 3 list | grep $banip | wc -l` -gt 0 ]; then
echo "Had ban bad boy($banip)."
else
echo "Ban bad boy($banip) now."
${fwcmd} table 3 add $banip/32
${fwcmd} table 4 add $banip/32
fi
done
rm -f $TMPFILE
fi
if [ -f $PROCFOLDER/$OLDDAILYLOG ]; then
for rescueip in $(awk '{ print }' $PROCFOLDER/$OLDDAILYLOG)
do
echo "Rescue $rescueip"
${fwcmd} table 3 delete $rescueip/32
${fwcmd} table 4 delete $rescueip/32
done
else
echo "No candidate file"
fi
#Move to old folder
echo "Move old file to storage folder"
mkdir -p $PROCFOLDER/$OLDYEAR
find $PROCFOLDER -d 1 -ctime +${MVFilePeriod} -type f -name 'httpd_banip*.log' -exec mv {} $PROCFOLDER/$OLDYEAR \;
mail(xxx)# more mount_FreeBSDDVD.sh
#!/bin/sh
mkdir -p /FreeBSD-RELEASEDVD
mdconfig -a -t vnode -f /PATH/TO/FreeBSD-IMAGE.iso -u 1
mount -t cd9660 /dev/md1 /FreeBSD-RELEASEDVD
mail(xxx)# more umount_FreeBSDDVD.sh
#!/bin/sh
umount /FreeBSD-RELEASEDVD
mdconfig -d -u 1