TAG

首都機能移轉 (2) 歌詞 (2) 靠北文 (40) 戲言 (30) 糟糕 (7) ACG (23) Assembly (2) Boost (2) C (31) C++ (69) CMake (4) CSIE (67) Debian (34) Design_Pattern (2) Django (1) Eclipse (1) en_US (13) FFmpeg (3) FoolproofProject (26) FreeBSD (2) Git (4) GNU_Linux (65) IDE (5) Java (11) JavaScript (19) KDE (15) Khopper (16) KomiX (3) Kubuntu (18) Life (1) Lighttpd (2) Mac_OS_X (2) Opera (1) PHP (2) PicKing (2) Programing (21) Prolog (1) Python (7) QSnapshot (2) Qt (30) Qt_Jambi (1) Regular_Expression (1) Shell_Script (7) Talk (98) VirtualBox (7) Visual_Studio (13) Windows (18) zh_TW (36)

2008年1月31日 星期四

防火牆修復

在遠端登入時如果不小心把防火牆搞爛了,可是非常麻煩的事,因為你很有可能無法再次遠端登入來修復防火牆;所以前幾天用python寫了個程式,在伺服器完全斷線時可以先讓防火牆恢復正常。
#! /usr/bin/env python
# -*- encoding: utf-8 -*-

import os, time, sys

def connect_test( *sites ):
        for site in sites :
                if os.system( "wget --tries=2 --timeout=120 -O - %s >/dev/null 2>&1" % site ) == 0 :
                        return True
        return False

flog = open( '/var/log/firewall_fix.log', 'a' )
timestamp = time.strftime( '%Y/%m/%d %H:%M' )

if connect_test( 'http://www.google.com/' ):
        print >> flog, "%s\tSuccess and do nothing.\n" % timestamp
else:
        try:
                if os.system( 'iptables-restore <%s >/dev/null 2>&1' % sys.args[1] ) != 0 :
                        raise OSError
                else:
                        print >> flog, "%s\tFirewall fixed. ( Use `%s'. )\n" % ( timestamp, sys.args[1] )
        except ( IndexError, OSError ):
                os.system( 'iptables -F' )
                for chain in [ 'INPUT', 'OUTPUT', 'FORWARD' ] :
                        os.system( "iptables -P %s ACCEPT" % chain )
                print >> flog, "%s\tFirewall fixed. ( Flush all. )\n" % timestamp

flog.close()

中間的連線測試其實滿dirty的[?],不過目前想不到其他更好的辦法。
噢,對了,Linux only。
2008/2/08 edited. Few code changed.

3 則留言:

  1. 我覺得 ping Google 來判斷防火牆是否正常不太適當。

    我建議讓程式再更新完防火牆設定以後,改使用者 15 秒時間來確定是否要保留新的防火牆設定值,如果 15 秒沒有回應則自動回覆上一次的設定。

    回覆刪除
  2. 我也覺得怪怪的
    不過這台防火牆的設定方式並不適合這麼做
    所以我才說這個方法很dirty

    等我搬回機房附近再想想有沒有比較好的方式吧

    回覆刪除
  3. 我現在用的 pf 可以這樣做:

    pf -e; sleep 10; pf -d

    sleep 10 秒中間如果都沒有回應就會再將防火牆關掉,如果正常就自己 Ctrl+C 結束。

    回覆刪除