海馬のかわり

最近記憶力に難がある、地方在住サーバエンジニアの備忘録です。

NATモードのKVM(+libvirt)にて、ゲストOSへSSHログインする

良く忘れるので、メモ。

KVM(+libvirt)をNATモードにて使用する際に、ゲストOSを外部公開する(ポートマッピング)する為の設定。

・環境
ホストOS: CentOS5.8
仮想NW : 192.168.122.0/24
ゲストIP: 192.168.122.101

・概要
ホストの10022/tcp宛通信をゲストOSの22/tcpへマッピング

・現在のiptables設定確認

# iptables -nvL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0           udp dpt:53
2        0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0           tcp dpt:53
3        0     0 ACCEPT     udp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0           udp dpt:67
4        0     0 ACCEPT     tcp  --  virbr0 *       0.0.0.0/0            0.0.0.0/0           tcp dpt:67
5       46  7646 RH-Firewall-1-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     all  --  *      virbr0  0.0.0.0/0            192.168.122.0/24    state RELATED,ESTABLISHED
2        0     0 ACCEPT     all  --  virbr0 *       192.168.122.0/24     0.0.0.0/0
3        0     0 ACCEPT     all  --  virbr0 virbr0  0.0.0.0/0            0.0.0.0/0
4        0     0 REJECT     all  --  *      virbr0  0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
5        0     0 REJECT     all  --  virbr0 *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-port-unreachable
6        0     0 RH-Firewall-1-INPUT  all  --  *      *       0.0.0.0/0            0.0.0.0/0

Chain OUTPUT (policy ACCEPT 47 packets, 8284 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain RH-Firewall-1-INPUT (2 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
2        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           icmp type 255
3        0     0 ACCEPT     esp  --  *      *       0.0.0.0/0            0.0.0.0/0
4        0     0 ACCEPT     ah   --  *      *       0.0.0.0/0            0.0.0.0/0
5        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            224.0.0.251         udp dpt:5353
6        0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp dpt:631
7        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:631
8       39  2856 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
9        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:443
10       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80
11       7  4790 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited


・仮想ブリッジ(virbr0)<->外部NW間のFORWARD許可(Chain FORWARDのルール1番を上書き)(以下一行)

# iptables -R FORWARD 1 -o virbr0 -s 0.0.0.0/0 -d 192.168.122.0/255.255.255.0 -j ACCEPT


・10022/tcpへの新規接続許可(Chain RH-Firewall-1-INPUTのルール11番に挿入)(以下一行)

# iptables -I RH-Firewall-1-INPUT 11 -m state --state NEW -m tcp -p tcp --dport 10022 -j ACCEPT


・10022/tcp宛通信を、ゲストOS 22/tcpへポートマッピング(新規追加)(以下一行)

# iptables -t nat -A PREROUTING -p tcp -m tcp --dport 10022 -j DNAT --to 192.168.122.101:22


・確認

# iptables -nvL --line-numbers
# iptables -nvL -t nat --line-numbers


設定永続化の仕組みは適宜作成。
ただしlibvirtdの再起動時、FORWARD,PREROUTING,POSTROUTING Chain等が毎回上書きされるので一工夫が必要。
(今回は、とりあえずrc.localに書きこむ事とした)

以上