iptables で苦しむ
今日は Linux カーネル標準のパケットフィルター/NAT 機能である、iptables で苦しみました。
やりたかったことは、家のLinux PC にインターネット越し、”IP アドレス指定” で接続許可をしたいということでした。 インターネット接続に使っている、いわゆるブロードバンドルータにもフィルター機能がありますが、家のはポートフィルターだけのようで IP アドレスは指定できません。
ということで、Linux の iptables を登場させました。 接続したい Linux 自体に iptables でフィルタールールを登録してみました。(ホントは違うマシンで動かした方がいいのですが、これ以上 PC 起(あ)げたらブレーカ落ちます 😛
何とか設定できたようなのですが、まだいまいち分かっていないので今後のために、メモ。
まずは基本的なコマンド。
iptables -nvxL : ACCEPT/DROP パケット統計をみる
iptables -F : 現在メモリに存在しているルールをフラッシュする
iptables -L : 現在メモリに存在しているルールを表示する
/etc/init.d/iptables save : メモリの内容をファイルに保存する
とりあえず上記があれば何とかなりそうです。 あとは iptable コマンドでひとつずつルールを追加していきます。 設定は即座に反映されますので、リモートから設定する場合は注意してください。 間違うとリモートから設定不能になり、モニタやらキーボードをつなぐはめになります。(←間違えたやつ
まずは、フィルターの INPUT / OUTPUT / FORWARD に対して全体ポリシーを決めます。 Apache .htaccess の deny from all とか accept from all みたいなもんです。
- /sbin/iptables -P INPUT DROP
- /sbin/iptables -P FORWARD DROP
- /sbin/iptables -P OUTPUT ACCEPT
INPUT に対して基本 DROP (接続ダメ)の設定をします。 これでこの Linux に対しての全てのネットワーク接続が不許可になります。 逆に OUTPUT は基本 ACCEPT (許可) にしています。 FORWARD は使わないので DROP。
次に INPUTに対して接続の許可をひとつずつ追加していきます。まずはローカルループバックと、接続済みセッションを許可する設定をします。
- /sbin/iptables -A INPUT -i lo -s 127.0.0.1
- -d 127.0.0.1 -j ACCEPT
- /sbin/iptables -A INPUT -i eth1
- -m state --state ESTABLISH,RELATED -j ACCEPT
1行目は Linux サーバ”内”でのローカル通信を許可しています。 2行目が既に接続が確立されているセッション(ESTABLISH) と、それに関連する通信(RELATED) の通信を許可しています。
実は2行目の記述がいまいち分からなく・・・、とりあえずこの記述がないとセッション開始時後の反応がものすごい悪くなりました。 なくてもいいような気がするのですが、技術力不足で謎のままです。 分かる方いましたら是非教えてください。 🙂
次で LAN 上の PC からのアクセスを許可する設定をしました。
- /sbin/iptables -A INPUT -i eth1
- -s 192.168.0.0/24 -p all -j ACCEPT
普通は eth1 じゃなくて eth0 だと思うので注意です。(LAN カード2枚さしているのです)
でもって、今回の目的の WAN の IP アドレスとポートフィルターの設定です。
- /sbin/iptables -A INPUT -i eth1
- -s [許可するIP Address]
- -d [自分のIP Address]
- -p tcp
- --dport [PORT番号] -j ACCEPT
こんな感じでしてみます。
最後に DROP ログを取得する設定をしてみました。
- /sbin/iptables -A INPUT -j LOG
- --log-prefix "iptables: " --log-level=3 -m limit
- --limit 1/s --limit-burst 10
これで、/var/log/messages とかに iptabels にたたきおとされたログが出ます。 あとは、save して restart しておしまいです。
一応自分でアタックした限りは大丈夫でしたが・・・。 あんまり知識がないので不安です。 詳しい方いらっしゃったら教えてください。