OpenVPNで会社のLANと自宅のLANを繋いでみた

会社のLANと自宅のLANをOpenVPNを使って繋いでみた。
こんな感じ。

192.168.1.0/24(会社) <=> 10.8.0.0/24(VPN) <=> 192.168.0.0/24(自宅)

 
今回の登場人物は、
・インターネット上にポート開放された自宅のLinuxサーバ。
・社内のLANに引きこもってるLinuxサーバ。
・社内のLANに引きこもってるWindowsクライアント。
 
自宅のサーバと社内のサーバをVPN接続する。
社内のクライアントマシンは、社内サーバをゲートウェイに指定する。
パケットを受け取った社内サーバは、IPマスカレードして自宅サーバへ転送する。

社内クライアント(192.168.1.X) <=> (192.168.1.10)社内サーバ(10.8.0.X) <=> (10.8.0.1)自宅VPNサーバ(192.168.0.41) <=> (192.168.0.X)自宅サーバ群

 
久々にネットワーク図でも描いてみようかと思ったけどVisioが入ってないからやめた。
 
ここで書いてある事の全てのベースは、VPNサーバー構築(OpenVPN) - CentOSで自宅サーバー構築で書かれてるもの。
 

自宅 VPNサーバ

XenServerの仮想マシン
メインサーバでiptablesの設定を弄りたくなかったから、VPN専用として新たに作成。
ルータで1194/udpへのアクセスはここに来るように設定。
静的ルーティングで10.8.0.0/24をこのマシン宛に。
 

OS

CentOS 5.4
 

OpenVPN

openvpn-2.0.9-1.el5.rf
 

ネットワーク

eth0 => 192.168.0.41
tun0 => 10.8.0.1
 

/etc/openvpn/server.conf
[root@vpn ~]# cat /etc/openvpn/server.conf | grep -v "^[#;]" | grep -v "^$"
port 1194
proto udp
dev tun
ca ca.crt
cert server.crt
key server.key  # This file should be kept secret
dh dh1024.pem
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
push "route 192.168.0.0 255.255.255.0"
push "dhcp-option DNS 192.168.0.40"
client-to-client
duplicate-cn
keepalive 10 120
tls-auth ta.key 0 # This file is secret
comp-lzo
user nobody
group nobody
persist-key
persist-tun
status /var/log/openvpn-status.log
log-append  /var/log/openvpn.log
verb 3
management localhost 7505
crl-verify crl.pem

 

iptables

ベースはファイアウォール構築(iptables) - CentOSで自宅サーバー構築を使う。

iptables -A INPUT -p tcp --dport 22 -j ACCEPT_COUNTRY
iptables -A INPUT -p udp --dport 1194 -j ACCEPT_COUNTRY

 

/etc/openvpn/openvpn-startup
#!/bin/bash

# VPNインタフェースiptablesルール削除スクリプト実行※必須
/etc/openvpn/openvpn-shutdown

# VPNサーバーからの送信を許可※必須
iptables -I OUTPUT -o tun+ -j ACCEPT
iptables -I FORWARD -o tun+ -j ACCEPT

# VPNクライアントからVPNサーバーへのアクセスを許可する場合
iptables -I INPUT -i tun+ -j ACCEPT

# VPNクライアントからLANへのアクセスを許可する場合
iptables -I FORWARD -i tun+ -d 192.168.0.0/24 -j ACCEPT

 

/etc/openvpn/openvpn-shutdown

VPNサーバー構築(OpenVPN) - CentOSで自宅サーバー構築と一緒。

#!/bin/bash

# VPNインタフェース(tun+)用iptablesルール削除関数
delete() {
    rule_number=`iptables -L $target --line-numbers -n -v|grep tun.|awk '{print $1}'|sort -r`
    for num in $rule_number
    do
        iptables -D $target $num
    done
}

# VPNインタフェース(tun+)用iptables受信ルール削除
target='INPUT'
delete

# VPNインタフェース(tun+)用iptables転送ルール削除
target='FORWARD'
delete

# VPNインタフェース(tun+)用iptables送信ルール削除
target='OUTPUT'
delete

 

社内サーバ(VPNクライアント)

社内のLANに引きこもってるXen仮想マシン
自宅のVPNサーバに接続して、VPNと社内クライアント間を中継する。
eth0からtun0への転送は、IPマスカレードする。
自宅にも192.168.1.0/24のネットワークがあるから、静的にルーティングの設定が出来なかった。
 

OS

CentOS 5.4
 

OpenVPN

openvpn-2.0.9-1.el5.rf
 

ネットワーク

eth0 => 192.168.1.10
tun0 => 10.8.0.X (DHCP)
 

/etc/openvpn/client.conf
[root@new-host-7 ~]# cat /etc/openvpn/client.conf | grep -v '^[#;]' | grep -v '^$'
client
dev tun
proto udp
remote eth0.jp 1194
resolv-retry infinite
nobind
user nobody
group nobody
persist-key
persist-tun
ca ca.crt
cert client1.crt
key client1.key
ns-cert-type server
tls-auth ta.key 1
comp-lzo
verb 3

 

iptables

流石にこれはまずいかも知れないけど、公開してないからとりあえずいいって事にしとく。
NATが絡むと途端に解らなくなる。
今度調べる。

#!/bin/bash

/etc/rc.d/init.d/iptables stop

iptables -P INPUT   ACCEPT
iptables -P OUTPUT  ACCEPT
iptables -P FORWARD ACCEPT

iptables -t nat -A POSTROUTING -o tun0 -j MASQUERADE

/etc/rc.d/init.d/iptables save
/etc/rc.d/init.d/iptables start

 

社内クライアント(Windowsマシン)

普通のWindowsマシン。(別にWindowsじゃなくてもいい)
使うものはcmd.exeだけ。
192.168.0.0/24へのゲートウェイを設定するだけ。
 

OS

Windows XP
 

ネットワーク

192.168.1.X (DHCP)
 

route設定
route add 192.168.0.0 mask 255.255.255.0 192.168.1.10 metric 1

 

会社のWindowsマシンから自宅のゲートウェイにtracert

届いた!
192.168.0.0/24のサーバ群には10.8.0.Xから来たように見えてる。

C:\>tracert 192.168.0.1

Tracing route to 192.168.0.1 over a maximum of 30 hops

  1    <1 ms    <1 ms    <1 ms  192.168.1.10
  2    12 ms    11 ms    12 ms  10.8.0.1
  3    16 ms    12 ms    12 ms  192.168.0.1

Trace complete.