2014年12月20日土曜日

iptablesでhttp, ssh通信をNAPTしてフォワーディング




目的
● 10.0.0.0/24のネットワークにあるサーバ(10.0.0.254)から、転送サーバを経由させて、
192.168.0.0/24のネットワークにあるサーバ(192.168.0.254)へSSH接続させる。

● 10.10.255.0/24のネットワークにある端末群のブラウザからはHTTP接続を許可する。



構成図
      10.0.0.0/24   192.168.0.0/24  
    +------------------------------+
    |             |                |
接続元サーバ     転送サーバ       接続先サーバ(ssh, http)
10.0.0.254   (eth0)10.0.0.1   192.168.0.254
              196.168.0.1(eth1)
ブラウジング
端末群
10.10.255.0/24



条件
転送サーバ側でNAPTさせる。
つまり、接続先サーバ側へ到達するIPアドレスは転送サーバのeth1のIPアドレスにする。

192.168.0.0/24発の通信は許可しない。
転送サーバのeth1からのNATされていない通信は許可しない。


その他考慮すべきこととして、転送サーバ自体へは、
保守のためアクセスができなければならないだろう。
そこでeth0側で保守用のサーバからのみsshとsnmpを許可する。



実現手段
転送サーバ上のiptablesを利用する。

※その他転送手段として、sshを使ったフォワーディングでも同様のことができるだろう。
(参考) sshで多段接続をしてweb閲覧、scpを実現



転送サーバ iptablesのフィルタ概念図
(転送サーバ)
eth0                                   eth1
 → prerouting  → forward  → postrouting → 
        ↓                        ↑
      input   ↘            ↗  output
                  filter 
      output  ↙            ↖  input
        ↓                        ↑
 ← postrouting ← forward ←  prerouting ←
eth0                                  eth1



アクセス方法
● SSH(10.0.0.254の接続元サーバで実施)
$ ssh 10.0.0.1 10022

● HTTP(10.10.255.0/24のブラウジング端末群で実施)
http://10.0.0.1:8080/~を指定



iptables コンフィグ
少しややこしく見えるが
natとfilterのテーブルを切り離して見ると理解が早いだろう。

また、nat部分の処理では以下を頭に入れておくと分かりやすい。
PREROUTINGは受信時に変換するチェインである。
転送サーバのeth0でトラフィックを受け取った処理である。

POSTROUTINGは送信時に変換するチェインである。
転送サーバのeth1でトラフィックを受け取った処理である。

MASQUERADEは複数の通信をeth1の1つの外部アドレスで共有する、
IPマスカレードを行うアクション指定である。


# vi /etc/sysconfig/iptables
### NAT
*nat

# SSH
-A PREROUTING -i eth0 -d 10.0.0.1 -p tcp -m tcp --dport 10022 -j DNAT --to-destination 192.168.0.254:22
-A POSTROUTING -o eth1 -s 10.0.0.254 -p tcp -m tcp --dport 22 -j MASQUERADE

# HTTP
-A PREROUTING -i eth0 -d 10.0.0.1 -p tcp -m tcp --dport 8080 -j DNAT --to-destination 192.168.0.254:8080
-A POSTROUTING -o eth1 -s 10.10.255.0/24 -p tcp -m tcp --dport 80 -j MASQUERADE

COMMIT


### FILTER
*filter
:INPUT ACCEPT [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [0:0]
:INPUT-SNMP - [0:0]
:INPUT-SSH - [0:0]

-A INPUT -i eth1 -j DROP
-A OUTPUT -o eth1 -j DROP

-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -m state --state INVALID -j DROP
-A INPUT -i lo -j ACCEPT

# SSH(転送サーバの保守用の許可設定)
-A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -j INPUT-SSH

# SNMP(転送サーバの保守用の許可設定)
-A INPUT -i eth0 -p tcp -m tcp --dport 161 -m state --state NEW -j INPUT-SNMP

# ICMP
-A INPUT -p icmp --icmp-type echo-request -j ACCEPT

-A INPUT -j DROP


# JUMP先(保守系サーバからのみ許可)
-A INPUT-SSH -s x.x.x.x -j ACCEPT
-A INPUT-SSH -j DROP

-A INPUT-SNMP -s x.x.x.x -j ACCEPT
-A INPUT-SNMP -j DROP


# FORWARD
-A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
-A FORWARD -m state --state INVALID -j DROP

-A FORWARD -p tcp -m tcp --dport 22 -j LOG --log-prefix "FWD(ssh): "
-A FORWARD -s 10.0.0.254 -p tcp -m tcp --dport 22 -j ACCEPT

-A FORWARD -p tcp -m tcp --dport 8080 -j LOG --log-prefix "FWD(http): "
-A FORWARD -s 10.10.255.0/24 -p tcp -m tcp --dport 80 -j ACCEPT

-A FORWARD -j DROP

COMMIT

# service iptables restart



カーネル側の設定
ディフォルトではカーネルが転送を許可していない。
転送を有効にする。

# cat /proc/sys/net/ipv4/ip_forward
0

# echo 1 > /proc/sys/net/ipv4/ip_forward

# cat /proc/sys/net/ipv4/ip_forward
1

再起動していいように設定を永続化させておく。
# vi /etc/sysctl.conf
net.ipv4.ip_forward = 1