LoginSignup
17
19

More than 3 years have passed since last update.

iptablesを使ってポートフォワードをする

Posted at
  • 環境
    • 設定するところ : CentOS release 6.9 (Final)
      • iptables v1.4.7
    • 転送先 : AWS上の他のLinuxインスタンス

何?iptablesって?

iptablesはファイアウォールとパケット転送ができる
NATはプライベートIPアドレスとパブリックIPアドレスを組合せで変換してくれる

CentOS7からはiptablesではなくてfirewalldになった

iptablesからfirewalldへ | CentOS7ではじめるサーバー構築入門

とはいえ今回はCentOS6なのでiptablesに設定する

準備

iptablesが有効になっていることを確認する

参考 : しがないプログラマーの備忘録: iptablesサービスの起動状態を確認する方法

# こんな感じに表示されると起動されているらしい
$ sudo /etc/rc.d/init.d/iptables status
Table: nat
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination

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

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

転送先が見えることを確認する

# Connectedになるか確認する
$ curl -v telnet://10.0.1.2:80
* About to connect() to 10.0.1.2 port 80 (#0)
*   Trying 10.0.1.2... connected
* Connected to 10.0.1.2 (10.0.1.2) port 80 (#0)

# ポート80は、Webサーバー経由でもアクセスしてみる
$ curl http://10.0.1.2
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
        "http://www.w3.org/TR/html4/loose.dtd">
#省略

# Webサーバー経由の場合は、転送先のaccess_logを見ることでも、アクセスが到達したことを確認出来る
$ sudo less +F /var/log/httpd/access_log

設定ファイルを書く

設定ファイル : /etc/sysconfig/iptables

iptables
*nat
:PREROUTING ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -p tcp -m tcp --dport 10080 -j DNAT --to-destination 10.0.1.2:80
-A POSTROUTING -d 10.0.1.2/32 -p tcp -m tcp --dport 80 -j SNAT --to-source 10.0.1.3
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
COMMIT

natテーブルのざっくり設定の意味

参考 : コピペから脱出!iptablesの仕組みを理解して環境に合わせた設定をしよう | OXY NOTES

設定項目 意味
-A(--append) 指定チェインに1つ以上の新しいルールを追加
PREROUTING 受信時にアドレスを変換するチェイン
POSTROUTING 送信時にアドレスを変換するチェイン
-p (--protocol) チェックされるパケットのプロトコル
-m 他の拡張を有効にする
--dport 受信側のポート番号を指定
-j (--jump) ターゲットを指定
DNAT 送信先のパブリックIPアドレスをプライベートIPアドレスに変換してくれる
SNAT 送信元のプライベートIPアドレスをパブリックIPアドレスに変換してくれる
--to-destination IPアドレスとポートの範囲を指定

-A PREROUTING -p tcp -m tcp --dport 54321 -j DNAT --to-destination 10.0.1.1:1521
-> 「自分(10.0.1.3)のポート54321」へ来たら「10.0.1.1:1521」へ変換する

-A POSTROUTING -d 10.0.1.1/32 -p tcp -m tcp --dport 1521 -j SNAT --to-source 10.0.1.3
-> 「10.0.1.1:1521」宛は「10.0.1.3(自分)」に変換する

設定ファイルを反映する

参考 : iptablesをいじってた - わすれっぽいきみえ

# 設定ファイルを反映する
$ sudo service iptables restart
iptables: Setting chains to policy ACCEPT: nat             [  OK  ]
iptables: Flushing firewall rules:                         [  OK  ]
iptables: Unloading modules:                               [  OK  ]
iptables: Applying firewall rules:                         [  OK  ]

# natテーブルのチェインルールを順序番号付きで一覧表示する
$ sudo iptables -t nat -L --line-numbers
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    DNAT       tcp  --  anywhere             anywhere            tcp dpt:54321 to:10.0.1.1:1521
2    DNAT       tcp  --  anywhere             anywhere            tcp dpt:10080 to:10.0.1.2:80

Chain POSTROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    SNAT       tcp  --  anywhere             ip-10-0-1-1.ap-northeast-1.compute.internal tcp dpt:ncube-lm to:10.0.1.3
2    SNAT       tcp  --  anywhere             ip-10-0-1-2.ap-northeast-1.compute.internal tcp dpt:http to:10.0.1.3

Chain OUTPUT (policy ACCEPT)
num  target     prot opt source               destination
iptablesコマンドのオプション 意味
-t テーブルを指定する
-L, --list [CHAIN] チェイン(省略した場合はすべて)のルールを一覧表示する
--line-numbers 各チェーンの規則の横にチェーン内の順序番号を出力する
項目 意味
num チェーン内の順序番号
target パケットをどう処理するか
prop プロトコルの種類
opt オプション
source どこから来たのか
destination 目的地、行き先、送り先

なんかエラーになったら

iptablesの書き方を間違えて怒られた時の原因集 - Qiita

17
19
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
19