Weblogというかメモ帳

Lotus-NetWork

topimg

「Linux」 カテゴリーの記事

windowsのコマンドプロンプトで、lsとかやってエラー・・・

よくやるとおもうのですが、lsだけじゃなく、100を超えるコマンドを一気に使えるようにするソフトの紹介です。

Cygwinの環境をいちいち構築しないで済む。

「Gow」というオープンソースのwindowsアプリケーション。

インストールすると自動的にPathが設定されるので、コマンドプロンプト上でコマンドが走る。パイプなども使えるので、便利。

※拡大できます

これらのコマンドが使えるみたいだ。

lsや、cp、lnやwc、wget、unzip、pwd、wget、tail・・・など、基本的なコマンドが使える。

ダウンロードはコチラのDownloadから。

lotusです、題名の通り。

Windowsの場合は調べてないですが、Linux環境でPython実行時に起動されるスクリプトを指定する方法。

PYTHONSTARTUPという環境変数にスクリプトを指定すると、動く。

export PYTHONSTARTUP=~/.pythonstartup.py

exportは昇格させるコマンド、というより

PYTHONSTARTUP=hoge

とか書いただけだとシェル変数になるので環境変数にするだけ。

ホームディレクトリの.pythonstartup.pyが起動時に実行されます。

おはこんばんちは、lotusです。

題名の通り、Pythonでプログラミングする際に、「あったら便利だなー」というものを紹介したいと思います。

なお、実際に動かしたのはLinux環境です。

Windowsをお使いの方では環境の違いなどから多少違った操作をおこなわなければいけない可能性が ありますが、ご了承ください。

記事に画像が使われておりますが、クリックすることで拡大可能です。

では、通常のインタラクティブシェルを拡張、改良したとも言える「IPython」を紹介したいと思います。

IPythonとは何か

上記にもある通り、インタラクティブシェル(対話コンソール)を拡張したものです。

通常のインタラクティブシェルでは、文字の補完などができませんが、この「IPython」では文字の補完の他にも、インタラクティブシェルには無かった機能が盛り込まれています。

IPythonは、WindowsでもLinuxでも動作しますので、是非インストールすることをオススメします。

自分のLinux環境(使用したのはDebian GNU/Linux)では、リポジトリにIPythonがあったので、apt-getコマンドで以下のように入手することが可能です。

sudo apt-get update

sudo apt-get upgrade

sudo apt-get -y install ipython

これでipythonコマンドが使える状態になります。

Windowsをお使いの方はコチラでファイルをダウンロードし、インストールしてください。

Macでも使用可能みたいですが、よく調べてないのでわかりません、すいません><

実際に使ってみた画面です。

これは、ipythonコマンドでIPythonを起動し、簡単なプログラムを書いた例です。

print (”HelloIPython”)※

HelloIPython

IPythonでも、通常のインタラクティブシェルでも同じ構文で正しく動作しているのがわかります(当たり前

※printの()は無くても動作します

エラーもわかりやすく、カラーをつけて出力してくれますね。

画像編集ミスって肝心な所を消してしまったのですが(上記の拡大してある画像には書いてあるが)

これは文字列と数字を足そうとしているためにTypeErrorとなってしまっています。

print (“Hello IPython “+str(i))

range(5)、つまり0,1,2,3,4がiのなかに入っているわけですが、それを数値ではなく、文字列とすることでこのTypeErrorを解決しています。

なお、このIPythonには通常のインタラクティブシェルとは違い、In[1]とかIn[2]とか行ごとにInのなかが変わっていきます。

普通のインタラクティブシェルと同じ表示にすることも可能です。

IPythonを起動する、ipythonコマンドに、オプションをつけることで可能です。

ipython -cl

と、-clオプションをつけると、通常の表示になります。

起動させてみた画面はこちらです。

行ごとにあったIn[1]などが消え、見覚えのある「>>>」になっています。

IPythonでは文字の補完ができる

LinuxやUNIXのシェルでは、文字の補完がTabキーでできますよね。

そのようにIPythonでは文字の補完をすることが可能です。

この例は、キーボードから「i」という文字だけを入力し、Tabキーを押した例です。

このような感じで補完することができますので、長いモジュール名をいちいち入力しなくてもTabキーを押して補完なんてことができます。

IPythonでは簡単なUNIXコマンドが使える

通常のインタラクティブシェルではPythonとの対話ができるわけですが、UNIXコマンドは使えません。

上の画像のように、「ls」や「mkdir」をインタラクティブシェルで入力すると、NameError、そんなものはないと言われ、エラーが発生します。

しかし、IPythonでは「簡単」なUNIXコマンドなら使う事ができます。

たとえば「今カレントディレクトリどうなってたっけ?」「あのディレクトリもうつくったっけ?」などなど。

通常ですと、窓を他に立ち上げるか、一回インタラクティブシェルを閉じるかなどの処理おこなわないと、こういったことはできません。

インタラクティブシェルを一旦閉じるなどすると、インタラクティブシェル内でつかっていた変数などは全てリセットされてしまいます。

実際にIPythonでUNIXコマンドを使ってみた画面が以下です。

このように、「ls」や「pwd」、「cd」、「pwd」などのUNIXの基本的なコマンドを使う事が可能です。

なので、たとえば「テキストファイルをあるディレクトリ出力する際、ディレクトリを作ってなく、エラーがでる」

なんて時はmkdirでIPython上で作成してあげれば言い訳です。

他にもログモードなど、便利な機能がありますので、是非調べてみてください。

便利なIPython、使ってみてはどうでしょうか?

次に、PythonVimを使ってプログラミングする際に便利なプラグインを紹介したいと思います。

VimとはWindowsでいう「メモ帳」のようなエディタです。

LinuxやUNIX系では、VimやEmacsのようなエディタを使ってプログラミングする事が多いと思います。

Vimでは、プラグインと呼ばれる拡張プログラムを追加することにより、Vimの機能を便利にしたりすることができます。

今回はPydictionというVimプラグインを紹介します。

以下が実際に動作している画面です。

ピンクの場所に補完項目がでているのが確認できます。

Pydictionとは

Pydictionは、vimでpythonのプログラムをする際に、モジュールなどを補完してくれる機能をもったプラグインです。

Pythonをvimで書く!という人は、是非導入すべきプラグインです。

ダウンロードはコチラのページからzip形式でダウンロードすることが可能です。

現在(2010/4/6)では、1.2が最新版のようです。

Windowsでの動作は確認していないのでわかりません、すいません。。。

Linuxではwgetコマンドをつかい、DLしたのですが、なぜかうまくいきませんでしたので(自分の環境では)ブラウザから先ほどのダウンロードページにいき、ダウンロードしました。

zip形式なので、unzipコマンドによって解凍することが可能です。

解凍し、ディレクトリに移動すると

  pydiction.vim
  pydiction.py
  complete-dict
  README.txt

以上の四つのファイルが出力されます。
README.txtは良いとして、各ファイルの説明です。
pydiction.vim
はvimのプラグインの本体になります。
pydiction.py
は拡張子の通り、pythonのスクリプトであり、このスクリプトで辞書(補完にでてくる項目)をカスタマイズすることが可能です。
complete-dic
tは、補完の項目が記されています。

ではディレクトリに配置していきます。

プラグインの本体である、pydiction.vimはユーザのホームディレクトリに位置する、「.vim」という.からはじまる隠しフォルダ?のなかに入れておけばOKです。

mkdir ~/.vim/plugin

mv pydiction.vim ~/.vim/plugin

これでpydiction.vimをディレクトリの.vimディレクトリに移動しました。

次にcomplete-dicですが、辞書ファイルなので、どこのディレクトリに配置してもかまわないのですが、わかりやすさなどの面をみて、.vimに配置しましょう。

mkdir ~/.vim/pydiction

mv complete-dic ~/.vim/pydiction

これで辞書ファイルを配置しました。

最後にpydictionですが、これもcomplete-dicと同じ場所に配置しましょう。

mv pydiction.py ~/.vim/pydiction

これでディレクトリに配置する作業は終了です。

このpydictionをvimで正しく使える状態にするためにホームディレクトリ直下に位置する.vimrcを編集します。

autocmd FileType python let g:pydiction_location = ‘~/.vim/pydiction/complete-dict’

上位のコードをvimrcのなかに追加することで、pydictionが正しく動作します。これは辞書ファイルの位置を指定しています。

使い方としては直感的に使えると思います。

ある程度文字を打った後に、Tabキーで補完することが可能です。

とても便利なプラグインです。

pydiction、つかってみてはどうでしょう。

そして最後の紹介になりますが、vimrcに追加するとpythonプログラミングが楽になるコードを紹介します。

それはvim上で、pythonを実行するという物。というより見せかけるだけなのですが。

インタラクティブシェルでやればそのまま実行できますが、vimでソースを書いて実行するには、

普通は:wqなどで保存、終了してから実際にプログラムをたたくということになります。

ですが、以下のコードを.vimrcに追加することでvim上でpythonのソースを実行させることができます。

” Execute python script C-P
function! s:ExecPy()
exe “!” . &ft . ” %”
:endfunction
command! Exec call <SID>ExecPy()
autocmd FileType python map <silent> <C-P> :call <SID>ExecPy()<CR>

これでpythonがvimで実行できるようになります。

C-Pなので、CtrlとPを押すことによって実行できます。

実際に実行してみた画面がこちら。

ソースは

print “Hello Python”

これしか書いていません。

[最後の変更が保存されていません]とあります。

これは一旦ファイルを保存しないと動きませんので、注意です。

開いた状態でCtrl+Pを押すことにより上の画像のような出力を得られます。

ENTERを押すことによりvimに戻れるので、ソースを確認するにはかなり便利なコードですね。

是非使ってみてください。

「Pythonでプログラミング時に便利なツール&プラグイン」でした。

以上lotusでした、長文かなり疲れました。脱字とかありそうです。

あったらコメントなりよろしくおねがいします。

ろーたすです。

pythonでメール送信するプログラムは結構前につくって、使用してたのですが、簡単に送信するプログラム書いてみた。

作った理由は、

携帯でメールするのだるい

簡単なメールなのにwebからいちいちするのだるい

結果:CUI、てか端末で送信できるようにしちまえば楽ちん

とまぁこのような感じです。

Linuxなら動くと思います。Windowsでは確認してない

実際にソースさらします。汚いですゴミです。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
import os
import time
import smtplib
from progressbar import *
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate
 
def bar():
 
    print "-"*30
    widgets = ["Send: ", Percentage(), Bar()]
    maxval = 250
    pbar = ProgressBar(maxval=maxval, widgets=widgets).start()
    for i in range(maxval):
        time.sleep(0.001)
        pbar.update(pbar.currval + 1)
        pass
    pbar.finish()
 
def choice():
    print "*"*30
    print "Please choice number!"
    print "1: hoge@docomo.ne.jp"
    print "2: hoge@gmail.com"
    print "3: other"
    print "*"*30
    to=raw_input("")
    if(to=="1"):
        to="hoge@docomo.ne.jp"
        mail_send(to)
    elif(to=="2"):
        to="hoge@gmail.com"
        mail_send(to)
    elif(to=="3"):
        to=raw_input("Please input mail address==")
        mail_send(to)
    else:
        os.system("python /home/lotus/python/mail.py")
 
def mail_send(to):
    from_addr = 'myaddress@gmail.com'
    to_addr = to
 
#Raw_input
    subject=raw_input("Subject?==")
    subject=subject.decode("utf-8")
    body=raw_input("Body?==")
    body=body.decode("utf-8")
    bar()
 
#mail settings
    encoding="utf-8"
    msg = MIMEText(body.encode("utf-8"),'plain',encoding)
    msg['Subject'] = Header(subject, encoding)
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()
    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.ehlo()
    s.starttls()
    s.ehlo()
    s.login('myaddress@gmail.com', 'passwd')
    s.sendmail(from_addr, to_addr, msg.as_string())
    s.close()
    print "-"*30
 
choice()

実行結果は

この場合、件名がtesutoになり、本文が「日本語も使えますよ」というメールがhoge@docomo.ne.jpに送信されます。

モジュールを色々importしているので、はいってなかったら入れれば動きます。

えー、なにをしているかですが、おおざっぱに

import os
import time
import smtplib
from progressbar import *
from email.MIMEText import MIMEText
from email.Header import Header
from email.Utils import formatdate

このあたりはいいですよね、必要なモジュール類をimportしています。はい

def bar():
 
    print "-"*30
    widgets = ["Send: ", Percentage(), Bar()]
    maxval = 250
    pbar = ProgressBar(maxval=maxval, widgets=widgets).start()
    for i in range(maxval):
        time.sleep(0.001)
        pbar.update(pbar.currval + 1)
        pass
    pbar.finish()

defでbar()関数というものを作っております。

これは単なる演出なのですが、プログレスバーを出す処理。

progressbarモジュールというものがあり、それをimportすることにより実装可能です。

def choice():
    print "*"*30
    print "Please choice number!"
    print "1: hoge@docomo.ne.jp"
    print "2: hoge@gmail.com"
    print "3: other"
    print "*"*30
    to=raw_input("")
    if(to=="1"):
        to="hoge@docomo.ne.jp"
        mail_send(to)
    elif(to=="2"):
        to="hoge@gmail.com"
        mail_send(to)
    elif(to=="3"):
        to=raw_input("Please input mail address==")
        mail_send(to)
    else:
        os.system("python /home/lotus/python/mail.py")

choice関数をつくりました。

これも単純すぎる関数(笑

printはどうでも良いとし、if分でtoにはいっている文字列を・・・という処理をし、選択にあったメールアドレスをtoに代入しています。

このなかで注目すべき点といっては何ですが、elseで例外処理をしています。

この場合、os.systemというOSのコマンドが実行できるもので、python 略 /mail.pyという自分自身のコードを指定することにより、1,2,3でもなければもう一回起動するという形になります。

最後の関数ですが

def mail_send(to):
    from_addr = 'myaddress@gmail.com'
    to_addr = to
 
#Raw_input
    subject=raw_input("Subject?==")
    subject=subject.decode("utf-8")
    body=raw_input("Body?==")
    body=body.decode("utf-8")
    bar()
 
#mail settings
    encoding="utf-8"
    msg = MIMEText(body.encode("utf-8"),'plain',encoding)
    msg['Subject'] = Header(subject, encoding)
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()
    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.ehlo()
    s.starttls()
    s.ehlo()
    s.login('myaddress@gmail.com', 'passwd')
    s.sendmail(from_addr, to_addr, msg.as_string())
    s.close()
    print "-"*30
 
choice()

mail_send、具体的にメール送信する関数です。

引数として、choice関数からのtoをもらいます。選択されたメールアドレスをもらうわけです。

#Raw_input
    subject=raw_input("Subject?==")
    subject=subject.decode("utf-8")
    body=raw_input("Body?==")
    body=body.decode("utf-8")
    bar()

このあたりで、件名と本文の入力を受け付け、decodeします。(日本語だとエラーがでるために)

そしてbar()で先ほどのプログレスバーを表示させます。(実際には意味がまったくなく、飾り(笑

  s = smtplib.SMTP('smtp.gmail.com', 587)
    s.ehlo()
    s.starttls()
    s.ehlo()
    s.login('myaddress@gmail.com', 'passwd')
    s.sendmail(from_addr, to_addr, msg.as_string())
    s.close()

このあたりで、SMTPによる認証をします。SMTPとは簡単に言えばメールを送信するためのプロトコルです。

この場合、myaddress@gmail.com、パスワードがpasswdでgmailにログインし、sendmailします。

そして最後に接続をclose。

しかし、これらは関数を定義しただけですので、実行されません。

なので、インデントから抜けchoice()を実行することによりメールが送信されます。

choice関数にはsend_mail()を引数ありで呼び出しているので、単体?でsend_mail()を呼び出す必要がありませんし、単体で呼び出すとエラーがでます(メールアドレスの指定)

解説とは言えないほどのものでしたが、このような感じで簡単に端末からメールを送信することが可能です。自分専用に書いた物なので必要性ないとおもいますが、w


Lotusです。メモに過ぎないこと書きます。

UbuntuなどのLiveCDをドライブにいれると、Windowsならwubiで簡単にインストールすることができます。

Linuxでもwindowsでもふつーにマウントすると、wubi.exeとかisolinuxなどのファイルやディレクトリがのぞけます。

疑問に思うかもしれませんが、通常Linuxとなるとルートディレクトリ直下にetcとかprocとかvarとかtmpとかあるとおもうのですが、このLiveCDからはこのままでは見ることは不可能です。

実際には普通にマウントした時のLiveCD直下にある、casper/filesystem.squashfs、これを正しい形でマウントすることにより、ルートディレクトリ、つまりファイルシステムを見ることが可能になります。

拡張子の通り、squashファイルシステムなので、mountコマンドのオプションで、-t squashとすることにより、ただしくマウントすることができます。

ちなみにsquashfsとはLinux用の高圧縮ファイルシステムの事で非常に安定していることで知られています。

たとえば、hoge.isoというLiveCDのイメージファイルがあり、これを/cdromにマウントします。

mount -o loop hoge.iso  /cdrom

できるだけ構造を保持しながらカレントディレクトリにある作業ディレクトリである、testisoにコピーします

cp -a /cdrom ./testiso

そしてtestiso内のfilesystem.squashfsをさらに-tオプションでタイプを指定し、hogehogeにマウントします。

mount -t squash ./testiso/casper/filesystem.squashfs ./hogehoge

こうすると、実際のファイルシステムが見ることが可能です。

Lotusです。

このプログラムは自分がほしい!とおもったので作ってみました。

なにをするかといいますと、題名の通りです。

RSSがないため毎日毎日チェックしなければいけなかったのですが、今回このプログラムを作ったのでいちいちブラウザでみなくてもメールを見ることができます。

ソースは↓

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
import feedparser
 
#RSS parse
d=feedparser.parse("http://page2rss.com/rss/hogehoge")
 
e=d.entries
 
#date logfile is open&amp;write
fo=open("date.txt","r")
old=fo.read()
old=old.split()
 
new=e[0].date
new=new.split()
fo.close()
 
#write
fo=open("date.txt","w")
fo.write(e[1].date)
fo.close()
 
#mail send
 
def mail_send():
 
    import smtplib
    from email.MIMEText import MIMEText
    from email.Header import Header
    from email.Utils import formatdate
 
    from_addr = 'lotus.ner@gmail.com'
    to_addr = 'n@googlegroups.com'
    subject = u'更新のおしらせ。'
 
    body = e[0].date+u"""に更新しました
"""+e[0].title
 
    encoding = 'utf-8'
 
    msg = MIMEText(body.encode("utf-8"),'plain',encoding)
    msg['Subject'] = Header(subject, encoding)
    msg['From'] = from_addr
    msg['To'] = to_addr
    msg['Date'] = formatdate()
 
    s = smtplib.SMTP('smtp.gmail.com', 587)
    s.ehlo()
    s.starttls()
    s.ehlo()
    s.login('lotus.ner@gmail.com', 'hogehoge')
    s.sendmail(from_addr, to_addr, msg.as_string())
    s.close()
 
#day different
if new[1] != old[1]:
    mail_send()
#day same
elif new[1]==old[1]:
#time different
    if new[4] != old[4]:
        mail_send()

70行くらいですかね。pythonです。
feedparseでhttp://page2rss.comのものをいじってます。
んで、gmailにログインし、メーリングリストに送信します。
流れはパースしてから、その更新した日にちをまずdate.txtとしてテキストに保存します。
そして、新しく更新されたかチェック(厳密に言うと違うが)し、date.txtと比較します。
もしも同じ日にちだった場合、そこで切り捨てずに時間をみくらべて、違うならメール送信。
違う日にちならそっこうメール送信です。
3.4時間かかったのは内緒
実際に運用してますがなんのメーリングリストかは秘密です。しらべまくればわかるかも。w

#!/usr/bin/env python
# -*- coding:utf-8 -*-

Lotusです。
今回はMagicPacketをつかって寝ているPCを起こします。

環境はDebianですが、「wakeonlan」コマンドをインストールしている前提のスクリプトです。

簡単に言えばWakeOnLanは不思議なパケットをおくって起こすってことです。

ただし、BIOS、NICなどが対応している必要あり。

ある一部ではOS上から設定しないとうまく動かない場合ってのもあります。

BIOSではPCIの電源供給のまわりを許可しておけば何とかなる見込み。

#!/usr/bin/env python
#-*- coding:utf-8 -*-

import os

def wake(input):
if (input==”server”):
os.system(“sudo wakeonlan 00:11:22:33:44:55″)
elif(input==”main”):
os.system(“sudo wakeonlan 55:44:33:22:11:00″)
elif(input==”all”):
os.system(“sudo wakeonlan 00:11:22:33:44:55″)
os.system(“sudo wakeonlan 55:44:33:22:11:00 “)

input=raw_input(“Please input [main] or [server] [all] => “)
wake(input)

これだけ
基本スクリプトっていうくらいなので短いプログラムしかブログには載せないつもり。
このスクリプトを実行するPCを含め三大三台の構成として。
起動してmainと引数を指定するとメインPCが起動。
serverだとサーバーが起動。
allだとどちらも起動。
セキュリティ上というか常識的にMACアドレスは隠れていますが環境によって変更すればよろし

中間テストがおわって早速プログラミングしているLotusです。

10分くらいで作った物なのであれなのですが。

aircrackというツールはご存じだろうか。

簡単にいうと、無線LANのアクセスポイントのパスワードを解析してくれ るツールです。

自分の無線LANのセキュリティが心配な場合などに使います。むしろその 目的だけで使ってください。

自分の無線LANをhackするさいにsudo airodump-ng -channel 7 –bssid …

とか結構面倒になってきたので、スクリプト化しただけです。つくったので せっかくなので公開しますが、犯罪を促進する機はいっさらないです。

※個人でのペネトレーションテストにのみで、他人の 無線LANアクセスポイントに使わないでください。犯罪に問われる可能性があります。てか犯罪です。

ペネトレーションテストと は、コン ピュータネット ワークセキュ リティ上の弱点を発見するテスト手法の一つで、シ ステムを実際に攻撃して侵入を試みる手法。

特に、ネット ワーク接続された情報シ ステムが外部からの攻撃に対して安全かどうか、実際に攻撃手法を試しながら安全性の検証を行なう。不正に侵入できるかどうかだけでなく、DoS(サー ビス拒否)攻撃にどれくらい耐えられるかを調べたり、侵入された際にそこを踏み台にして他のネット ワークを攻撃できるかどうかなどを調べる場合もある。e-words引用

以下のスクリプトは、wlan0をairmon-ng でstartし、mon0というモニタリング用のインターフェースが使えることを前提としたスクリプトです。基本対WEP。

debian上でpythonの2.64で作成しました。

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
import os
 
def monitor():
    mon0=os.system("sudo ifconfig | grep mon0")  #mon0があるか判別します、とても原始的
 
    if (mon0==0):    #もしmon0がある場合、passします
        pass
    else :
        os.system("sudo airmon-ng start wlan0")  #なかったらwlan0をstartし、mon0を起動します
 
    os.system("sudo airodump-ng mon0")  #近隣の無線LANアクセスポイントをmon0で探します。
 
def lotuscrack(ch,bssid,name):    
 
    os.system("sudo airodump-ng --channel "+ch+" --bssid "+bssid+" -w "+name+" mon0")    
 
monitor()
 
ch=raw_input("Please input target channel= ")  #ターゲットのchannelを入力
bssid=raw_input("Please Input target bssid= ")  #ターゲットのBSSIDを入力
name=raw_input("Please input the preserved file name.=")  #保存する際のファイル名を入力
 
lotuscrack(ch,bssid,name)    #そして実行

ubuntuの日本語環境のデスクトップを入れると、ディレクトリまで日本語になります。

ピクチャ、ビデオ、ミュージックなど。

これは不便じゃないですか、端末からファイルの移動などするときいちいち日本語入力にしなければならない。

なので以下のコマンドを入力します。

LANG=C xdg-user-dirs-gtk-update

このコマンドを端末でたたくと一発でピクチャなどがpictureなどになります。

メモメモ

iptables

2010/1/25 月 3:27:36 by Lotus

コメントはまだありません。

サーバ構築してるにも関わらずまだ入れてなかったので遅いとは思うがいれてみた。

SSHクライアントから操作していたので一番最初に

% sudo iptables -P INPUT DROP

とし、デフォルトがfilterテーブル(だったので)filterテーブルのINPUTチェーンがDROP(受け入れ拒否)となり、SSHへ 接続できなくなる、あたりまえだが・・・

えっと、自分のサーバはWeb、FTPなどが、なんらかの障害によってダウンするとメールが来るようになってます。

なので、一時サービスを停止し、iptables作業へ取りかかることに。

まずはwebから。

% sudo iptables -t filter -A INPUT -i eth0 -p tcp –dport 80 -j ACCEPT
として、filterテーブルにINPUTチェーンを追加、そしてTCP、80 ポートへの通信をACCEPTします。

同じこと、ポート番号はもちろんかえてSSH,FTPも同様に追加。

しかしFTPでは21番と20番を解放しただけではPASVモードで通信ができないので6010と6100番を追加。

ですが、システムを再起動してしまうと、今まで設定してきたものは消えてしまいます。

ここでシェルスクリプトを適当に作成しました。

#!/bin/sh

# 初期化
iptables -t filter -P INPUT ACCEPT

iptables -t filter -X

iptables -t filter -F

#メイン
iptables -t filter -P INPUT DROP
iptables -t filter -A INPUT -i lo -j ACCEPT

iptables -t filter -A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT

#ping

iptables -I INPUT -p icmp –icmp-type 0 -j ACCEPT
iptables -I INPUT -p icmp –icmp-type 8 -j ACCEPT

#DNS
iptables -t filter -A INPUT -i eth0 -p udp –dport 53 -j ACCEPT
iptables -t filter -A INPUT -i eth0 -p tcp –dport 53 -j ACCEPT

#web
iptables -t filter -A INPUT -i eth0 -p tcp –dport 80 -j ACCEPT

#SSH
iptables -t filter -A INPUT -i eth0 -p tcp –dport 22 -j ACCEPT

#FTP
iptables  -A INPUT  -p tcp -m state –state NEW –dport 21 -j ACCEPT
iptables  -A OUTPUT -p tcp -m state –state NEW –sport 20 -j ACCEPT

iptables  -A INPUT -p tcp –dport 6010:6100 -m state –state NEW -j ACCEPT

#samba

iptables -A INPUT -p tcp –dport 139 -j ACCEPT

iptables -A INPUT -p udp –dport 137 -j ACCEPT

iptables -A INPUT -p udp –dport 138 -j ACCEPT

まあ適当なスクリプトなんですが・・・

% sudo chmod +x iptable

みたいな感じでスクリプトに実行権限を与えます。

実行するときには

% sudo sh iptable

みたいな感じでおkだと思います・・・たぶん

間違ってても知らな(ry

uO