会社の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
ネットワーク
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
ネットワーク
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