2012年5月19日土曜日

iptables による ポートのリダイレクト

あるポートから違うポートへリダイレクトさせたい時があります。

例えば、下記ページの例のように「8080 ポートで待ち受けをしている Tomcat に対して、http://anyhost.com:8080 ではなく http://anyhost.com でアクセスさせたい」などです。

Firewalls-local-port-redirection

色々な方法がありますが、その1つとして iptables の REDIRECT ターゲット を使用する方法があります。この場合、リダイレクトする対象として、以下のパターンが考えられます。

1. 外から入ってきたパケットをリダイレクトする
2. ローカルで生成したパケットをリダイレクトする

サーバーに設定するのであれば、1 のパターンがメインになりますね。2 のパターンはテストをする時などでしょうか。

1 のパターンの場合の設定は以下になります。
(-dst の値は環境にあわせて変更)
# iptables -t nat -I PREROUTING --src 0/0 --dst 127.0.0.1 \
-p tcp --dport 80 -j REDIRECT --to-ports 8080
設定の意味が理解しやすいルールですね。ただ、2のパターンのルールを見たとき、ピンときませんでした。
# iptables -t nat -I OUTPUT --src 0/0 --dst 127.0.0.1 \
-p tcp --dport 80 -j REDIRECT --to-ports 8080

理由は、OUTPUT チェインが外に出て行く時に適用されると勘違いしていたから。あらためて man の TABLES の部分を見てみると「ローカルで生成したパケットをルーティング前に変更する」とハッキリ書いてますね!
nat: This table is consulted when a packet that creates a 
new connection is encountered. 〜 OUTPUT (for altering 
locally-generated packets before routing)
下記のページの図も参考になります。
NAT(Network Address Translation) の概要

設定を削除する場合は以下。(テーブルを指定しない場合のデフォルトは "filter" なので、"nat" テーブルを削除する場合には、明示的に指定する必要がある)
# iptables -t nat -F
また、個別にルールを削除したい場合は、以下のようにします。
# iptables -t nat -n -L --line-numbers
-------------------------------------------------
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination      
1    REDIRECT   tcp  --  0.0.0.0/0            127.0.0.1 ...

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination      


Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination      
1    REDIRECT   tcp  --  0.0.0.0/0            127.0.0.1 ...
-------------------------------------------------

削除したいルールのチェインと行番号を指定する
# iptables -t nat -D PREROUTING 1

2012年5月4日金曜日

Amazon Linux の yum リポジトリ

Amazon Linux AMI のインスタンスで Python をソースからコンパイルしたかったのですが、いつもコンパイル時にインストールしていた tk-devel パッケージが見つからない。

Amazon Linux では、amzn-main という独自のリポジトリが設定されている模様。
$ ls /etc/yum.repos.d/
---------------------------------
amzn-nosrc.repo    amzn-updates.repo  epel.repo
amzn-main.repo     amzn-preview.repo  epel-testing.repo
---------------------------------

Amazon Linux に含まれている EPEL リポジトリのバージョンが 6 に設定されていたので、AWSのフォーラムを参考に、CentOS 6 のリポジトリを追加してインストールを試みた。
$ cd /etc/yum.repos.d
$ sudo vim CentOS-Base.repo
--------------------------------------------
[base]
name=CentOS-6 - Base
mirrorlist=http://mirrorlist.centos.org/?release=6&arch=x86_64&repo=os
enabled=0
gpgcheck=1
gpgkey=http://mirror.centos.org/centos/RPM-GPG-KEY-CentOS-6
--------------------------------------------
$ sudo yum install --enablerepo=base tk-devel

$ rpm -qa | grep tk-devel
tk-devel-8.5.7-5.el6.x86_64

うまくインストールされ、Python のコンパイルも成功。