◆ 目的
● 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