カテゴリー : Linux

アクセス制限(特定国)

postfix mailやブログに対し、特定国からのアクセス増加に伴い、iptablesで特定国の通信をブロック。

iptablesのバックアップ

 #cd /etc/sysconfig
 #iptables-save > iptables.bak
 #iptables-restore < iptables.bak    ##戻す場合
 #iptables -L   ##内容確認

 

中国、韓国をIPdenyのリストを参照し、iptablesで遮断(シェルファイルの実行権注意)

export PATH=$PATH:/sbin/
ZONE_FILE_URL="http://www.ipdeny.com/ipblocks/data/countries"
 for IP in $(wget -O - ${ZONE_FILE_URL}/{cn,kr}.zone | grep -v "^#|^$" )
 do
 iptables -A INPUT -s $IP -j DROP
 done

 

crontabで自動実行、シェルのログをiptables.logへ出力

 35 1 * * * /home/iptables_scripts/iptables.sh > /tmp/iptables.log 2>&1

 

crontabのログ

 tail -n 10 -f /var/log/cron

zabbix DB crashed

zabbix関連のエラーメールが届いていたので確認すると、
zabbix_server.logに「query failed: [2006] MySQL server has gone away [select hostid,status ・・・」
わからない。googleで同様の対処方法を載せているページを参考にさせていただきました。

DBへ接続

mysql> show databases;
 +--------------------+
 | Database |
 +--------------------+
 | information_schema |
 | mysql |
 | test |
 | wordpress |
 | zabbix |
 +--------------------+
 5 rows in set (0.00 sec)

zabbix table確認

mysql> use zabbix;
 Reading table information for completion of table and column names
 You can turn off this feature to get a quicker startup with -A
Database changed
 mysql>
 mysql> check table history extended;
 +----------------+-------+----------+-------------------------------------------------------+
 | Table | Op | Msg_type | Msg_text |
 +----------------+-------+----------+-------------------------------------------------------+
 | zabbix.history | check | warning | Table is marked as crashed |
 | zabbix.history | check | warning | 1 client is using or hasn't closed the table properly |
 | zabbix.history | check | error | record delete-link-chain corrupted |
 | zabbix.history | check | error | Corrupt |
 +----------------+-------+----------+-------------------------------------------------------+
 4 rows in set (0.00 sec)

壊れているようです
バックアップを取り、tableのrepair

 # service mysqld stop
 Stopping mysqld: [ OK ]
 # cp -rp /var/lib/mysql /tmp/mysqlback
 # service mysqld start
 Starting mysqld: [ OK ]
mysql> repair table zabbix.history;
 +----------------+--------+----------+------------------------------------------------+
 | Table | Op | Msg_type | Msg_text |
 +----------------+--------+----------+------------------------------------------------+
 | zabbix.history | repair | warning | Number of rows changed from 2644011 to 2644016 |
 | zabbix.history | repair | status | OK |
 +----------------+--------+----------+------------------------------------------------+
 2 rows in set (12.72 sec)
mysql> check table history extended;
 +----------------+-------+----------+----------+
 | Table | Op | Msg_type | Msg_text |
 +----------------+-------+----------+----------+
 | zabbix.history | check | status | OK |
 +----------------+-------+----------+----------+
 1 row in set (25.87 sec)

特定のIPを拒否

同一IPから不正アタックが続いたため、iptables でブロック

messagesに多数の「do_auth : auth failure」ログ

# iptables -L
 Chain INPUT (policy ACCEPT)
 target prot opt source destination
 Chain FORWARD (policy ACCEPT)
 target prot opt source destination
 Chain OUTPUT (policy ACCEPT)
 target prot opt source destination
# iptables -I INPUT -s 95.211.100.141 -j DROP

# /etc/init.d/iptables save
# /etc/init.d/iptables restart

Mac Book Airのhostsをコマンドで変更

自環境でMacBookAirを外出先と自宅で使用する際、hostsに自鯖を書いているため、

外出環境でメールや自鯖Webが見られなくなる、よってhostsを変更する。

ターミナルからコマンドでhostsを切り替えて使う

【例】2つの切り替えコマンドファイルを作成(実行権限に注意)

外用(out.sh)

$cd /etc

$cp /etc/hosts.out hosts

家用(room.sh)

$cd /etc

$cp /etc/hosts.room hosts

実行コマンド作成

$sudo vi hosts.sh

#!/bin/bash

date

case $1 in

     room) /Users/MD231J/tools/room.sh | echo 'Room Set OK' ;;
     out) /Users/MD231J/tools/out.sh | echo 'Out Set OK' ;;

     *) echo 'コマンド指定エラー' ;;

esac

 

$./hosts.sh room

2014年 01月31日 金曜日 01時32分33秒 JST

Room Set OK

$

 

実行パスを通す

ホームにディレクトリを作成し、そこへ実行コマンドを移動する。

$mkdir tools
$mv hosts.sh ./tools/hosts.sh
$mv out.sh ./tools/out.sh
$mv room.sh ./tools/room.sh
$export PATH=~/tools:$PATH

$which hosts.sh
/Users/MD231J/tools/hosts.sh

どの場所からもコマンド実行可能

$hosts.sh

 

ターミナルを終了するとリセットされてしまうため、

「.bash_profile」に書き込む

「sed」「 grep」 「awk」でテキスト処理

sed

textファイルの「文字列」がある行を削除し、text.1ファイルへ出力

(シングルクオテでくくる)

sed '/文字列/d' text > text.1

textファイルの「文字列」がある行を抽出し、text.1ファイルへ出力

(ダブルクオテ)

sed -n "/文字列/p" text > text.1

 

grep

grepで上記と同じパターン

grep -v 文字列 text > text.1
grep 文字列 text > text.1

 

awk

awkの例

cat 文字列 | awk '! /文字列/ { print }' > text.1
cat 文字列 | awk '/文字列/{ print }' > text.1