menu
書いてる野郎
orebike@gmail.com
この記録はDebian Sargeでやったもの。かなり古い。
Linuxのファイアーウォールは Netfilter
という機能で実装されている。
コレを制御するために iptables
というコマンドが使われる
まず iptables の設定を保存するための環境を作る
スクリプトのサンプルが
/usr/share/doc/iptables/examples/oldinitdscript.gz
っであるのでこいつを改造する
こいつを解凍して起動のスクリプトの場所に設置する。
$ gunzip oldinitdscript.gz $ cp oldinitdscript /etc/init.d/iptables
このスクリプトに実行権限を与える
$ chmod 755 iptables
さらにこいつの iptables の設定ファイルの保存先を作る 場所は
/var/lib/iptables
なぜこんな場所なのかは知らん
一覧を見ると・・・
$ ls apt canna dictionaries-common dpkg exim4 misc urandom aptitude dhcp discover emacsen-common logrotate nfs usbutils
なのでたぶんデーモン系の設定ファイルとかはここらしいね
とりあえず作る 作った
ファイアーウォールに用いられるルールのテーブルは主に二つ filter
と nat
だ。
filter
はパケットを制限し nat
はルーティングに用いる
ここから iptable コマンドによりルールを登録していく
まずルールを全部破棄する。入力パケット出力パケットすべてを拒否する
$ iptables -P INPUT DROP $ iptables -P OUTPUT DROP
入力パケットを拒否設定にしたらネットワーク越しのsshのログインが跳ねられた。 それも設定した瞬間・・・当たり前である。
ローカルから作業する
今のところ全部拒否になってるのでルールを追加して穴ぼこを空けていく
自分自身に対しての許可をする ループバックの許可ってやつらしいね
$ iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
コマンドのオプションは
つまりこのコマンドならローカル発信のローカル受信の場合の入力は許可することになる
再び通信可能なように ssh の穴ぼこを空ける
$ iptables -A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT $ iptables -A OUTPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT
22番ポートでの新規セッション確立を許可したのでセッション確立後の通信は全部許可することにする
$ iptables -A INPUT -m state --state ESTABLISHED, RELATED -j ACCEPT $ iptables -A OUTPUT -m state --state ESTABLISHED, RELATED -j ACCEPT
ってことで許可されたっポイんでリモート接続してみる
できたOKOKO
そうしたらこの設定を何回も打ち込むのは面倒なんで 保存する ちなみに全部拒否でsshだけ穴が開いている状態なんで当然webなんかもできない
自動更新のシステムapt-getにはftpを利用しているのでftpのリクエストが出て行く穴を開けておかないと 何かと不便なんで空けておく
FTP
$ iptables -A OUTPUT -p tcp -m state --state NEW --dport 20 -j ACCEPT $ iptables -A OUTPUT -p udp -m state --state NEW --dport 20 -j ACCEPT $ iptables -A OUTPUT -p tcp -m state --state NEW --dport 21 -j ACCEPT $ iptables -A OUTPUT -p udp -m state --state NEW --dport 21 -j ACCEPT
http
$ iptables -A OUTPUT -p tcp -m state --state NEW --dport 80 -j ACCEPT $ iptables -A OUTPUT -p udp -m state --state NEW --dport 80 -j ACCEPT
dns
$ iptables -A OUTPUT -p tcp -m state --state NEW --dport 53 -j ACCEPT $ iptables -A OUTPUT -p udp -m state --state NEW --dport 53 -j ACCEPT
OK全部許可したので セーブする
$ /etc/init.d/iptables save active
と打ちこむと、さっきの var/lib/iptables
のところに保存されるらしい
保存されてた! なんかコマンドを打ち込んだ順番がきになるが
iptable の起動スクリプトを Linux 起動時に起動するようにする
とりあえず今の標準の runlevel が何か調べてみる
/etc/inittab
現在の標準はレベル2だった だからレベル2のところにショートカットをつくりゃいいわけ
$ cd /etc/rc2.d $ ls S10sysklogd S18portmap S20inetd S20ssh S89cron S11klogd S20canna S20lpd S21nfs-common S99rmnologin S14ppp S20exim4 S20makedev S89atd S99stop-bootlogd
本では18番でポートマップが始まって20で各種サービスって言っているので
19あたりでサービスに関するフィルタをしておけばいいだろってことで S19iptables
のシンボリックリンクを作っておく
ちなみに portmap は NFS とか NIS とかちょっとヤバメの古いプログラムの番号をTCPにマッピングする仕組みらしい 必要ないような・・・
$ ln /etc/init.d/iptables ./S19iptables
で完了。これで開始時にさっきのルールが適用される
って調子ぶっこいてたらapt-getコマンドが使えなくなった・・・ 正確に言うと更新情報はゲットできるけど更新のデータそのものがダウンロードできない ドコにも情報が載ってないんだよね・・・・
っでググりまくったらなんかファイアーウォール設定した上でFTPを使うには ip_conntrack_ftp
とかいうモジュールがカーネルに組み込まれている必要があるっぽく
ってことで
$ modprobe ip_conntrack_ftp
を実行すると・・・
$ apt-get install vim
が成功しました!ってことねあとで起動時に読み込む設定にしておかねば
ルーティングもしてる場合は ip_nat_ftp
もいるらしい・・・
ftpは古いからな こういうところでネジレが出てるのかな