家に帰ったらCommon Lispのコードを書いてみた。
2009/11/08
2011/02/12
Shibuya.lisp Tech Talk #4 LT発表資料 「さあ家に帰ったらSchemeのコード書いてみよう」 – ひげぽん OSとか作っちゃうかMona-
higeponさんにインスパイアされて、何かを書くことにしました。
redhat系のiptablesは、/etc/sysconfig/iptables にルールを書いておいて、/etc/init.d/iptablesで制御できるようになっている。最近のubuntuでは、ちょっと流儀が違うらしいけど、redhat系のiptablesに慣れているので、redhat系の設定ファイルを読み込んでiptablesのルールを適応するようにしました。
redhat系のiptablesのルールファイルと同じ形式で、/etc/iptablesというファイルを置いて、それを解釈してiptablesを起動するものをclispで書いてみました。やったことは、redhat系の/etc/init.d/iptables start で行なわれる処理をclispに移植しただけです。
#!/usr/bin/clisp(defun get-chains ()(let ((out (ext:run-shell-command "cat /proc/net/ip_tables_names":output :stream)))(loop for line = (read-line out nil nil) while line collect line))) (defun apply-chains (command chains)(let ((option-arg (cond ((equal command "delete") "-X")((equal command "flash") "-F")(t (error 'illegal-arg)))))(loop for c in chains do (ext:run-shell-command(format nil "iptables -t ~a ~a" c option-arg))))) (defun clear-settings ()(let ((chains (get-chains)))(apply-chains "flash" chains)(apply-chains "delete" chains))) (defun get-legal-line (line)(let ((index (search "#" line)))(string-trim '(#\Space #\Tab #\Newline)(if index (subseq line 0 index) line)))) (defun get-iptables-rules ()(with-open-file (in "/etc/iptables")(loop for line = (read-line in nil) while line collect (get-legal-line line) into lines finally (return (remove "" lines :test 'equal))))) (defun apply-iptables-rules (rules)(let ((pipe (ext:make-pipe-output-stream "/sbin/iptables-restore -c")))(format pipe "~{~a~%~}" rules))) (defun main ()(clear-settings)(apply-iptables-rules (get-iptables-rules))) (main) |
/etc/iptables
*filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] :RH-Firewall-1-INPUT - [0:0] -A INPUT -j RH-Firewall-1-INPUT -A FORWARD -j RH-Firewall-1-INPUT -A RH-Firewall-1-INPUT -i lo -j ACCEPT -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT -A RH-Firewall-1-INPUT -p 50 -j ACCEPT -A RH-Firewall-1-INPUT -p 51 -j ACCEPT (snip) |