CentOS 5.x に OpenVPN をインストール

提供: SmileLogicWiki

Linuxメモに戻る。

目次

構築に関して

smileLogicのお問い合わせフォーム または、hamaguchi@smilelogic.jp でご相談を請け負います。お気軽にお問い合わせ下さい。

※注意!

サーバの時間が狂っていると、CAファイルの時間がおかしくなり、CAファイルが開始日前とかになる可能性があります。NTPコマンドで、時間を正しくしましょう!

ntpdate ntp.nict.jp

OpenSSL、PAMはCentOS 5.2の最小構成で入るので無視。次に、LZOをyumで入れようとするとデフォルトではナシ。仕方がないので、本家のrpmを拝借してくる。あと、OpenVPNも同時に入れちゃう。パッケージ名は各バージョンに合わせてください。

sudo rpm -ihv http://download.fedora.redhat.com/pub/epel/5/i386/epel-release-5-X.noarch.rpm
sudo yum install lzo
sudo yum install openvpn

SSL/TLS証明書を作ろう!

初期設定

OpenVPNをパッケージでインストールすると、/usr/share/openvpn/easy-rsa/ に、その関連ファイルがコピーされる。これを、/etc/openvpn/ にコピーしておく。パッケージアップデートで消されたら、たまらんし。

sudo cp -R /usr/share/openvpn/easy-rsa/ /etc/openvpn
pwd → /etc/openvpn
drwxr-xr-x  3 root root 4096  1月 26 20:53 .
drwxr-xr-x 76 root root 4096  1月 26 20:37 ..
drwxr-xr-x  4 root root 4096  1月 26 20:53 easy-rsa

CAを作ろう!

何故か、2.0と1.0というディレクトリが存在する。たぶん、2.0が正解だと思われ。次に、vars ファイルを編集する。

cd /etc/openvpn/easy-rsa/2.0
export KEY_COUNTRY="JP" ← 日本
export KEY_PROVINCE="TOKYO" ← 都道府県名
export KEY_CITY="Shibuya" ← 住所の一部
export KEY_ORG="hogehoge" ←会社名
export KEY_EMAIL=”hogehoge@hogehoge.co.jp” ←担当者メアド

vars に実行権限を与える。

sudo chmod +x vars

root権限になり、/etc/openvpn/easy-rsa/2.0 に移動。

sudo su –
cd /etc/openvpn/easy-rsa/2.0

CAを作成する。基本的にエンターだけでいけるはず。

source ./vars
./clean-all
./build-ca

Common Name (eg, your name or your server’s hostname) の所で、「OPEN_VPN」に書き換える。

サーバ証明書を作ろう!

root/今のPATHのまま、以下のコマンドを実行する。

./build-key-server server

Common Name (eg, your name or your server’s hostname) で、「VPN_SERVER」に書き換える。[y/n]の選択肢は、全て[y]で。

DH(Diffie Hellman)パラメータを作ろう!

OpenVPNサーバが、クライアントと鍵を交換する際に、暗号化用の乱数値が必要らしい。その乱数値を作る。DHとは、開発者にちなんでいるらしい。

./build-dh

本には、「時間がかかる」と書かれていたが、Celeron 2.53GHz / 1GBでは数秒で終わった。

クライアント証明書を作ろう!

クライアントをどう管理するか? 名前ファイルか、client1とか付けて、Excelで管理するか。まあ、ちょっと悩んでくれ(汗

今回は、とりあえず client1 とかで作る事にする。

./build-key-pass client1
Generating a 1024 bit RSA private key
………………………++++++
…………………++++++
writing new private key to ‘client1.key’
Enter PEM pass phrase: [パスワード]
Verifying – Enter PEM pass phrase: [パスワード]
—–
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter ‘.’, the field will be left blank.
—–
Country Name (2 letter code) [JP]:
State or Province Name (full name) [TOKYO]:
Locality Name (eg, city) [Shibuya]:
Organization Name (eg, company) [hogehoge]:
Organizational Unit Name (eg, section) []:
Common Name (eg, your name or your server’s hostname) [client1]:
Name []: [担当者名]
Email Address [担当者メールアドレス]:

Please enter the following ‘extra’ attributes
to be sent with your certificate request
A challenge password []: [パスワード:クライアント起動時のパス]
An optional company name []:
Using configuration from /etc/openvpn/easy-rsa/2.0/openssl.cnf
Check that the request matches the signature
Signature ok
The Subject’s Distinguished Name is as follows
countryName           :P RINTABLE:’JP’
stateOrProvinceName   :P RINTABLE:’TOKYO’
localityName          :P RINTABLE:’Shibuya’
organizationName      :P RINTABLE:’hogehoge’
commonName            :P RINTABLE:’client1′
name                  :P RINTABLE:’[担当者名]‘
emailAddress          :IA5STRING:’[担当者メールアドレス]‘
Certificate is to be certified until Jan 24 12:29:53 2019 GMT (3650 days)
  • Sign the certificate? [y/n]:y ← 普通に[Yes]
  • 1 out of 1 certificate requests certified, commit? [y/n]y ← 普通に[Yes]
Write out database with 1 new entries
Data Base Updated

/etc/openvpn/easy-rsa/2.0/keys の配下にファイルがいっぱいできる。重要なのは「*.crt」と「*.key」です。

ネットワーク設定

本を読んでいると、ルーティング方式か、ブリッジ方式の2種類が存在するらしい。違いは以下の点。

  • ルーティング方式は、既存のネットワークを壊さなくて済む。ただ、サーバ側ネットワークの他サーバ(PC)に繋げるには苦労が必要!?
  • ブリッジ方式は、サーバ側ネットワークにジョインする感じ。DHCPが動いていると、動作が不安定になる!?

とりあえず、ルーティング方式を採用してみる。

/usr/share/doc/openvpn-2.1/sample-config-files
[root@localhost sample-config-files]# ls -la
合計 168
drwxr-xr-x 2 root root  4096  1月 26 20:37 .
drwxr-xr-x 6 root root  4096  1月 26 20:37 ..
-rw-r–r– 1 root root   131  9月 30 11:34 README
-rw-r–r– 1 root root  3426  9月 30 11:34 client.conf
-rw-r–r– 1 root root  3564  9月 30 11:34 firewall.sh
-rw-r–r– 1 root root    62  9月 30 11:34 home.up
-rw-r–r– 1 root root   639  9月 30 11:34 loopback-client
-rw-r–r– 1 root root   665  9月 30 11:34 loopback-server
-rw-r–r– 1 root root    62  9月 30 11:34 office.up
-rw-r–r– 1 root root    63  9月 30 11:34 openvpn-shutdown.sh
-rw-r–r– 1 root root   776  9月 30 11:34 openvpn-startup.sh
-rw-r–r– 1 root root   820 11月 30 23:40 roadwarrior-client.conf
-rw-r–r– 1 root root  1498 11月 30 23:40 roadwarrior-server.conf
-rw-r–r– 1 root root 10288  9月 30 11:34 server.conf
-rw-r–r– 1 root root  1742  9月 30 11:34 static-home.conf
-rw-r–r– 1 root root  1688  9月 30 11:34 static-office.conf
-rw-r–r– 1 root root  1937  9月 30 11:34 tls-home.conf
-rw-r–r– 1 root root  1948  9月 30 11:34 tls-office.conf
-rw-r–r– 1 root root   199  9月 30 11:34 xinetd-client-config
-rw-r–r– 1 root root   989  9月 30 11:34 xinetd-server-config

パッケージで、OpenVPNをインストールすると、/usr/share/doc/openvpn-2.1/sample-config-files 配下にサンプルファイルを置くので、この server.conf を利用する。

sudo cp /usr/share/doc/openvpn-2.1/sample-config-files/server.conf /etc/openvpn/

sudo vi /etc/openvpn/server.conf で、ファイルを編集。ca / cert / key / dh の項目を以下のように変更する。

ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/server.crt
key /etc/openvpn/easy-rsa/2.0/keys/server.key
dh /etc/openvpn/easy-rsa/2.0/keys/dh1024.pem
;user nobody ;group nobody のコメント[;]を外す。

CentOS(Linux)側の設定

ネットワークアダプタ転送を有効にする。 /etc/sysctl.conf の net.ipv4.ip_forward を 0→1 へ

net.ipv4.ip_forward = 1

リブートしたくない場合は、以下の通りに。

# echo 1 > /proc/sys/net/ipv4/ip_forward

とりあえず、動かしてみる!

openvpn /etc/openvpn/server.conf

だらだら、ログが出て「error」等が無ければ成功!

クライアント側(例: Windows Vista SP1)

OpenVPNのサイト から、OpenVPN 2.1_rc15 の Windows Installer 版を落としてくる。そして、インストール。UACがいろいろうるさいがガン無視。 デフォルトで、C:\Program Files\OpenVPN\ にインストールされる。クライアントのサンプルは、C:\Program Files\OpenVPN\sample-config にある。client.ovpn がそれ。

OpenVPN1

C:\Program Files\OpenVPN\config にコピー(何故か、C:\Program Files\OpenVPN\config は書込権限がないので、エラーが出るけど無視) サーバ側から、以下のファイルをコピーしてくる。方法は調べて(お

  1. ca.crt
  2. client1.crt
  3. client1.key

OpenVPN2

client.ovpn の中身を書き換える。

ca ca.crt
cert client1.crt
key client1.key
remote [OpenVPNサーバドメイン名] 1194
# TLS認証を利用
tls-client
# なんか、必要らしい。
script-security 2

忘れていたサーバ側の設定

sudo vi /etc/openvpn/server.conf にも script-security 2 が必要。追加しておく事。

Windows Vista での問題点

接続自体は完了するが、OpenVPN GUIから実行した場合、routeコマンドがUACの影響でエラーとなる。一番簡単な解決方法は「UACを切る」事だが、回避策を調べてみる。

どうも、OpenVPN GUIを立ち上げる際に、「管理者として実行」を選ぶと、問題がないらしい!?

OpenVPN3

OpenVPN4

で、良いのかな!?

接続確認します!

とりあえず、皆さん繋がりました? ルーティング方式の場合、OpenVPNのインストールされたサーバしかアクセスできません。言い換えれば、社内LANにぶら下がっている場合、被害がそのサーバだけで防げるとも考えられます。で、この場合、SSHは標準で繋がると思います。(CentOS 5.2は、デフォルトでSSHと数ポートしか開けてくれない) OpenVPNのサーバを踏み台にして、SSHで社内LANに繋がったサーバに接続しに行くのは簡単です。

で、たぶん繋がらないと思うので、CentOS 5.2に穴を開けましょう。

CentOS 5.xに穴を開けましょう!

CentOS では、root権限用に以下のコマンドを用意していますが、使いませんw

sudo system-config-securitylevel-tui

/etc/sysconfig/iptables をroot権限で直接書き換えましょう。

sudo vi /etc/sysconfig/iptables

CentOS 5.x のミニマムインストールでは、こんな感じです。

# Firewall configuration written by system-config-securitylevel
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT – [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp –icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp –dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp –dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp –dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state –state NEW -m tcp -p tcp –dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT –reject-with icmp-host-prohibited
COMMIT

まず、OpenVPN用の穴を開けます。–dport 22 の行の次に追加する感じで。

-A RH-Firewall-1-INPUT -m state –state NEW -m udp -p udp –dport 1194 -j ACCEPT

次に、iptables で上の行を有効・保存します。

sudo /etc/init.d/iptables restart
sudo /etc/init.d/iptables save

次に、Linux が万一リブートしても困らないように、自動起動するようにしましょう。/etc/init.d/openvpn はパッケージが自動的に作ってくれるので、起動はこんな感じで。

sudo /etc/init.d/openvpn start
openvpn を起動中:                                          [  OK  ]

なんか、NGと出たら、sudo tail –100 /var/log/message でエラーを確認。OK ならrc*.dに反映させましょう。

sudo chkconfig openvpn on

では、Windows(クライアント側)からアクセスしてみましょう。SSHクライアントで、10.8.0.1 に繋がればOKです。

CentOS 5.x の設定

たぶん、CentOSネタになるけど、今まではOpenVPNのサーバは、固定IPではなくDHCPでIPアドレスを取得していました。これを固定IPに変更します。

  • RH9で、固定IPを割り振る を参考にする。以下の2ファイルを変更しないといけないらしい。
/etc/sysconfig/network-scripts/ifcfg-eth0
/etc/sysconfig/networking/profiles/default/ifcfg-eth0

ネットワークが、eth0 の場合ね。2枚差しとか、eth0 じゃない場合は、頭脳内変換をお願いします(笑)

BOOTPROTO=none
PEERDNS=no
TYPE=Ethernet
HWADDR=**:**:**:**:**:**
DEVICE=eth0
NETMASK=255.255.255.0
BROADCAST=192.168.1.255
IPADDR=192.168.1.2 ← サーバのIPアドレス
NETWORK=192.168.1.0
GATEWAY=’192.168.1.1′ ← GATEWAY
ONBOOT=yes
USERCTL=no

設定したら、一度サーバをリブートさせると良いかも。

sudo shutdown –r now

で、あとは社内<->インターネットルータに、ポートフォワード(192.168.1.2: Port: 1194)を設定する。

イーモバイルを使って実験してみよう!

証明書関係を、WindowsXPに持ってきて、OpenVPNをインストール。動かしてみる・・・。重くて使えない。って、いうかでかいパケット落ちてないか!? LZOでの圧縮なのかもーと切ってみるもダメ。でかいパケットが落ちるのは、MTUかな?と、ググってみる。

OpenVPNの設定

サーバ側の設定に「link-mtu 1200」? MTUって、普通1500だよな。あーOpenVPNの場合、最初に暗号化パケットを付けるから、1200なのかも。 /etc/openvpn/server.conf に追加してみる。

link-mtu 1200

で、OpenVPNを再起動。クライアントも繋ぎ直す。おー今度は、ちょっと遅い程度になったぞ。パケット落ちも無くなった感じ。「link-mtu 1200」が正解なのかも!?

雑記

だんだん、本番モードになってきました。クライアント証明書の期間を、10年では長すぎるので、3年にします。また、発行済みクライアント証明書を、無効にする方法&サーバが無効リストを参照する方法を設定してみます。

クライアント証明書を10年→3年にしよう!

CentOS 5.2 に OpenVPN を突っ込むテスト[1] の□クライアント証明書を作ろう!の所で使った var ファイルを編集する。 /etc/openvpn/easy-rsa/2.0/var の export KEY_EXPIRE=3650 → 1095 に変更する。10年から3年になる。

証明書廃止リストを参照させるようにしよう!

/etc/openvpn/server.conf に、こんな感じで追加する。

ca /etc/openvpn/easy-rsa/2.0/keys/ca.crt
cert /etc/openvpn/easy-rsa/2.0/keys/server.crt
key /etc/openvpn/easy-rsa/2.0/keys/server.key
crl-verify /etc/openvpn/crl.pem

クライアント証明書を廃止してみよう!

では、その前に仮の証明書を作る。作り方は、上の方を参照。 今回は、面倒なのでclient1を廃止しちゃいますw root権限になり、/etc/openvpn/easy-rsa/2.0 に移動。

sudo su –
cd /etc/openvpn/easy-rsa/2.0
source ./vars
./revoke-full client1

生成された crl.pem は、何かnobody になった後に読みに行くらしく、/etc/openvpn/easy-rsa/2.0/keys が見れません。そこで、シンボリックリンクを張ります ではダメでコピーしてくるしかないらしい。

# pwd
/etc/openvpn/
# cp easy-rsa/2.0/keys/crl.pem .

これで、クライアント証明書が廃止されたので、繋がらなくなる「はず」 では、新しく証明書を作りましょう。

sudo su –
cd /etc/openvpn/easy-rsa/2.0
source ./vars
./build-key-pass client1

で、それをWindowsXP等のクライアントにコピーして、再度繋げてみる。お!繋がった。client1 では認証で止まる。良い感じ。

プロキシー

で、今回は CentOS 5.2 に 既存のネットワークを壊さないために、ルーティング方式を採用している。この場合、接続クライアント(10.8.0.x)は、 OpenVPNサーバ(10.8.0.1/192.168.1.x)にのみ接続が可能なので、社内LANに繋がる意味は結構薄い。(SSHで、 10.8.0.1にログインして、そのサーバを踏み台に、192.168.0.xに繋げるのは可能だけど)

そこで、OpenVPNサーバにサービス用プロキシーソフトをインストールする事に。最初の要望は、HTTPだけだったので、パッケージにある Squidをインストールしたが、社内IRCにも繋ぎたい!という要望があったので、別の手を考える。最初、IRCサーバ自体をOpenVPNサーバで動かす予定だったのだが、コンパイルは通らない上に、社内IRCサーバに繋がらないので断念。

そこで、思い出したのが Delegate! 簡易的なプロトコルであるIRCもリレー出来るだろうと実験してみたところ、ドンピシャで出来たので採用~

マニュアルとか: http://i-red.info/docs/Manual.htm

sudo yum install gcc
sudo yum install gcc-c++
sudo yum install openssl-devel
sudo yum install crypto-utils

tar xvfz delegate9.9.1.tar.gz で解凍。delegate9.9.1 ディレクトリで make

sudo su –
mkdir /usr/local/delegate
cd /home/hoge/src/delegate9.9.1/
cp src/delegated /usr/local/delegate/
cd /home/hoge/src/delegate9.9.1/subin
cp dgbind /usr/local/delegate/ ←いらないかも
cp dgchroot /usr/local/delegate/ ←いらないかも
cp dgcpnod /usr/local/delegate/ ←いらないかも
cp dgdate /usr/local/delegate/ ←いらないかも
cp dgpam /usr/local/delegate/ ←いらないかも
chown -R nobody:nobody /usr/local/delegate/
cd /usr/local/delegate/

IRCテスト

cd /usr/local/delegate/
./delegated -P6667 SERVER=tcprelay://[社内IRCサーバIP]:6667

HTTP/HTTPSテスト

cd /usr/local/delegate/
./delegated -P3128 SERVER=http

無事に動いたら、delegated -Fkill –P6667 / delegated -Fkill –P3128 で止める。 /etc/init.d/delegate を作る。(まあ、適当)

#!/bin/sh
#
# delegate      This shell script takes care of starting and stopping
#               delegate on RedHat or other chkconfig-based system.
#
# chkconfig: – 24 76
#
# processname: delegate
# description: delegate
#
# To install:
#   copy this file to /etc/rc.d/init.d/delegate
#   shell> chkconfig –add delegate
# To uninstall:
#   run: chkconfig –del delegate
# Location of delegate binary
delegate="/usr/local/delegate/delegated"
for location in $delegate
do
if [ -f "$location" ]
then
delegate=$location
fi
done
# Our working directory
work=/var/spool/delegate-${OWNER}
# Check that binary exists
if ! [ -f  $delegate ]
then
echo "delegate binary not found"
exit 0
fi
# See how we were called.
case "$1" in
 start)
 echo -n $"Starting delegate: "

 $delegate -P6667 SERVER=tcprelay://[社内IRCサーバIP]:6667
 $delegate -P3128 SERVER=http

 ;;
 stop)
 echo -n $"Shutting down delegate: "

 $delegate -Fkill -P6667
 $delegate -Fkill -P3128

 ;;
 restart)
 $0 stop
 sleep 2
 $0 start
 ;;
 *)
echo "Usage: delegate {start|stop|restart}"
exit 1
;;
esac
exit 0

自動実行させる方法

chkconfig -add delegate
chkconfig delegate on

あとは、リブートするなり、/etc/init.d/dalegate start するなりして下さい。

iptables にポートを追加し忘れた

sudo vi /etc/sysconfig/iptables

–dport 1194の下ぐらいに

-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 3128 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 6667 -j ACCEPT

80/443は、社内LANからApacheが見えるように。 次に、iptables で上の行を有効・保存します。

sudo /etc/init.d/iptables restart
sudo /etc/init.d/iptables save

アクセスを確認して、終了です。

Linuxメモに戻る。

個人用ツール