家に帰ったらCommon Lispのコードを書いてみた。

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)

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください