vmnet8にIPマスカレード(Squeeze編)

■VMWarePlayerのゲストSqueezeにマスカレード
 ※全体が内部ネットワークなので。。。
 eth0のSqueezeホストはWAN側
 WinXPも同WANネットワーク
 vmnet8のSqueezeホスト(192.168.72.1)を通って、LAN内のeth0のSqueezeゲストに接続する。

WinXP⇒eth0⇒Squeeze(ホスト)⇒vmnet8⇒Squeeze(ゲスト)

■Squeeze(ホスト)の設定

$ su root -c 'echo 1 > /proc/sys/net/ipv4/ip_forward '
$ sudo iptables -t nat -A POSTROUTING -o vmnet8 -j MASQUERADE
$ sudo iptables -t nat -L | grep -A 2 POSTROUTING
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  anywhere             anywhere
$ sudo iptables -t nat -L -n | grep -A 2 POSTROUTING
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  0.0.0.0/0            0.0.0.0/0

■WinXPの設定
 pingの応答は普通なので載せない。

192.168.188.188 ⇒ Squeeze(ホストのeth0のIP)
192.168.72.0/24 ⇒ Squeeze(ホストのvmnet8のネットワーク)
192.168.72.188 ⇒ Squeeze(ゲストのeth0のIP)
192.168.72.199 ⇒ Squeeze(ゲストのeth0のIP)

> ipconfig | grep 192
        IP Address. . . . . . . . . . . . : 192.168.188.155
        Default Gateway . . . . . . . . . : 192.168.188.254
> route add 192.168.72.0 mask 255.255.255.0 192.168.188.188
> ping 192.168.72.188
> ping 192.168.72.199

■WinXPにはGowが入っているので、直接ファイルをscp転送してみる。

> scp -P 8822 test.txt labunix@192.168.72.188:/home/labunix
> scp -P 9922 test.txt labunix@192.168.72.199:/home/labunix

■WinXP側では再起動後も有効になるよう、ルーティング設定を保存する

> route --help 2>&1 | grep -A 1 "\-p"
ROUTE [-f] [-p] [command [destination]
                  [MASK netmask]  [gateway] [METRIC metric]  [IF interface]
--
  -p           When used with the ADD command, makes a route persistent across
               boots of the system. By default, routes are not preserved

> route -p add 192.168.72.0 mask 255.255.255.0 192.168.188.188
> route print | grep -A 3 Persistent
Persistent Routes:
  Network Address          Netmask  Gateway Address  Metric
     192.168.72.0    255.255.255.0     192.168.188.188       1

■私の環境はSqueezeホストも内部LANなのでとりあえず制限はゲスト側でかければ良いが、
 SRCを制限。

$ sudo iptables -t nat -F
$ sudo iptables -t nat -A POSTROUTING -o vmnet8 -s 192.168.188.0/24 -j MASQUERADE
$ sudo iptables -t nat -L -n | grep -A 2 POSTROUTING
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  192.168.188.0/24       0.0.0.0/0

■DSTも同様に制限

$ sudo iptables -F -t nat
$ sudo iptables -t nat -A POSTROUTING -o vmnet8 -s 192.168.188.0/24 -d 192.168.72.0/24 -j MASQUERADE
$ sudo iptables -t nat -L -n | grep -A 2 POSTROUTING
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  192.168.188.0/24       192.168.72.0/24

■ポートも制限

$ sudo iptables -t nat -A POSTROUTING -o vmnet8 -s 192.168.188.0/24 -d 192.168.72.0/24 -p 9922 -j MASQUERADE
$ sudo iptables -t nat -A POSTROUTING -o vmnet8 -s 192.168.188.0/24 -d 192.168.72.0/24 -p 8822 -j MASQUERADE
$ sudo iptables -t nat -L -n | grep -A 3 POSTROUTING
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  9922   --  192.168.188.0/24       192.168.72.0/24
MASQUERADE  8822   --  192.168.188.0/24       192.168.72.0/24

■私の環境の場合、sshポートはIPに紐付いているので、DSTも固定に出来る。
 各ゲストIPの役割(サービス)だけを通す事も出来る。

$ sudo iptables -t nat -A POSTROUTING -o vmnet8 -s 192.168.188.0/24 -d 192.168.72.199 -p 9922 -j MASQUERADE
$ sudo iptables -t nat -A POSTROUTING -o vmnet8 -s 192.168.188.0/24 -d 192.168.72.188 -p 8822 -j MASQUERADE
$ sudo iptables -t nat -L -n | grep -A 3 POSTROUTING
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  9922   --  192.168.188.0/24       192.168.72.199
MASQUERADE  8822   --  192.168.188.0/24       192.168.72.188

■IPv4の有効にする方法は2種類
 システム全体でIP転送を有効にする
 iptablesのサービス起動時のみ有効にする(iptablesサービス停止時には無効にする)

■「sysctl.conf」を変更する

$ grep ip_forward /etc/sysctl.conf
#net.ipv4.ip_forward=1

■iptablesのinitスクリプトで制御する
 ※gitから持ってきても良いし、コピペしても良い。

 sfw(http/smallfirewall_20120408.tar.gz)
 http://sourceforge.jp/users/labunix/pf/smallfirewall/files/?action=simple_list
 
 git(git/smallfirewall)
 git://git.pf.sourceforge.jp/gitroot/l/la/labunix/smallfirewall.git

■パッケージとの差異
 ※iptablesへの変換スクリプトがサポートしているのはfilterのみ。
  initスクリプトでnatテーブルは削除されるので、nat用のスクリプトを別途用意する必要がある。

$ diff /etc/init.d/iptables /etc/init.d/iptables.20120408_220733
35a36
>   echo 0 > /proc/sys/net/ipv4/ip_forward
44a46
>   echo 1 > /proc/sys/net/ipv4/ip_forward
53a56
>   echo 0 > /proc/sys/net/ipv4/ip_forward

■debian用のinitスクリプト

$ sudo cat /etc/init.d/iptables
#!/bin/bash
# Start/stop the iptables script.
#
### BEGIN INIT INFO
# Provides:          iptables
# Required-Start:    $remote_fs $syslog $time
# Required-Stop:     $remote_fs $syslog $time
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Custom background script
# Description:       iptables v1.4.2 for Squeeze
#                    Last Update:2012/02/23
#                    Author     :labunix@linux.jp
#                    filter [input|forward|output] table only
### END INIT INFO
#
# environment
#export PATH=/sbin:/usr/sbin:/bin:/usr/bin
set -e

if [ `id -u` -ne "0" ];then
  echo "Sorry,Not Permit User!"
  exit 1
fi

iptables -V > /dev/null || exit 1

function sfwerr() {
  echo $@
  iptables -F
  iptables -F -t nat
  iptables -X
  iptables -P INPUT ACCEPT
  iptables -P FORWARD ACCEPT
  iptables -P OUTPUT ACCEPT
  echo 0 > /proc/sys/net/ipv4/ip_forward
  exit 1
}

# for save and restore
test -f /etc/iptables-save || touch /etc/iptables-save
test -f /etc/iptables-save || sfwerr "ERROR:Please Check /etc/iptables-save"

case $1 in
start)
  echo 1 > /proc/sys/net/ipv4/ip_forward
  iptables-restore -c /etc/iptables-save || sfwerr "ERROR:Resotre error"
  ;;
stop)
  iptables -F
  iptables -F -t nat
  iptables -X
  iptables -P INPUT ACCEPT
  iptables -P FORWARD ACCEPT
  iptables -P OUTPUT ACCEPT
  echo 0 > /proc/sys/net/ipv4/ip_forward
  ;;
reload|restart)
  iptables-save -c > /etc/iptables-save ||  sfwerr "ERROR:Save error"
  iptables -F
  iptables -F t nat
  iptables -X
  iptables -P INPUT ACCEPT
  iptables -P FORWARD ACCEPT
  iptables -P OUTPUT ACCEPT
  iptables-restore -c /etc/iptables-save || sfwerr "ERROR:Resotre error"
  ;;
status)
  iptables -L -v -n | grep "^Chain"
  ;;
*)
  echo "Usage: $0 {start|stop|reload|restart|status}"
  exit 2
  ;;
esac
exit 0

■IPフォワードの設定の確認(filter設定)

$ sudo /etc/init.d/iptables stop
$ cat /proc/sys/net/ipv4/ip_forward
0
$ sudo /etc/init.d/iptables start
$ sudo cat /proc/sys/net/ipv4/ip_forward
1
$ sudo /bin/bash nat_iptables.sh

■nat設定
 filterでICMPブロックしていると通らないのは当然だけど、
 切り分けが大変だから、結局smallfirewallがNATに対応しないとダメか〜w。

$ cat nat_iptables.sh
#!/bin/bash
set -e
if [ `id -u` -ne 0 ];then
  echo "Not Permit User!"
  exit 1
fi
iptables -F -t nat
iptables -t nat -A POSTROUTING -o vmnet8 -s 192.168.188.0/24 -d 192.168.72.0/24 -j MASQUERADE

$ sudo /bin/bash nat_iptables.sh
 sudo iptables -L -t nat | grep POSTROUTING -A 2
Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  192.168.188.0/24       192.168.72.0/24