家に帰ったら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) |