在遠端登入時如果不小心把防火牆搞爛了,可是非常麻煩的事,因為你很有可能無法再次遠端登入來修復防火牆;所以前幾天用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。
噢,對了,Linux only。
2008/2/08 edited. Few code changed.
我覺得 ping Google 來判斷防火牆是否正常不太適當。
回覆刪除我建議讓程式再更新完防火牆設定以後,改使用者 15 秒時間來確定是否要保留新的防火牆設定值,如果 15 秒沒有回應則自動回覆上一次的設定。
我也覺得怪怪的
回覆刪除不過這台防火牆的設定方式並不適合這麼做
所以我才說這個方法很dirty
等我搬回機房附近再想想有沒有比較好的方式吧
我現在用的 pf 可以這樣做:
回覆刪除pf -e; sleep 10; pf -d
sleep 10 秒中間如果都沒有回應就會再將防火牆關掉,如果正常就自己 Ctrl+C 結束。