部屋を掃除したら漫画が沢山出てきたので書く日記

漫画とか合唱とかUNIXとかLinuxとかについて書く日記です。

iptablesとipfilterでパケットフィルタリング

iptables

先日、仕事で「あるサーバに送信される、特定のTCPポート番号向けのパケットを廃棄する」という動作をさせる必要がある事が判ったので、Linuxならiptablesというツールで実現できる、という事で色々調べてみました。

目的

Redhat EnterpriseLinux 5のサーバにて、hogeサーバ(192.168.0.1)のTCP 5002番向けパケットを全てREJECTする。

iptables設定
vi /etc/sysconfig/iptables

以下のように編集

*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -p tcp --dport 5002 -d 192.168.0.1 -j REJECT
-A FORWARD -p tcp --dport 5002 -d 192.168.0.1 -j REJECT
-A OUTPUT -p tcp --dport 5002 -d 192.168.0.1 -j REJECT
-A INPUT -j LOG --log-level info --log-prefix "[iptables] "
-A OUTPUT -j LOG --log-level info --log-prefix "[iptables] "
-A FORWARD -j LOG --log-level info --log-prefix "[iptables] "
COMMIT
iptablesを有効化
service iptables start
フィルタ設定の確認
# iptables-save

以下のように表示されていれば設定どおりに動いていることになります。

# Generated by iptables-save v1.3.5 on Fri Aug 26 14:14:53 2011
*filter
:INPUT ACCEPT [3921:507273]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [4106:413124]
-A INPUT -d 192.168.0.1 -p tcp -m tcp --dport 5002 -j REJECT --reject-with icmp-port-unreachable
-A INPUT -j LOG --log-prefix "[iptables] " --log-level 6
-A FORWARD -d 192.168.0.1 -p tcp -m tcp --dport 5002 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j LOG --log-prefix "[iptables] " --log-level 6
-A OUTPUT -d 192.168.0.1 -p tcp -m tcp --dport 5002 -j REJECT --reject-with icmp-port-unreachable
-A OUTPUT -j LOG --log-prefix "[iptables] " --log-level 6
COMMIT
# Completed on Fri Aug 26 14:14:53 2011 

これで、ポート5002番をLISTENしているhogeサーバ上のアプリケーションにアクセスしたところ、通信できないエラーとなりました。やりたい動作になったようです。

ipfilterでフィルタリング

その後、hogeサーバ上で、ポート5002番向けにやってくるパケットを廃棄させる必要が出てきたのですが、hogeサーバはSolaris10で動いているのでiptablesが使えません。代わりにipfilterというツールが用意されているので、これまた調べつつ以下のように設定してみました。

/etc/ipf/ipf.conf を編集して以下の行を追加:
block in log on e1000g0:2 proto tcp from any to 192.168.1.1 port = 5002
ipfilterの有効化
# svcadm enable ipfilter

これでいけました。
ではー。