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 がそれ。
C:\Program Files\OpenVPN\config にコピー(何故か、C:\Program Files\OpenVPN\config は書込権限がないので、エラーが出るけど無視) サーバ側から、以下のファイルをコピーしてくる。方法は調べて(お
- ca.crt
- client1.crt
- client1.key
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を立ち上げる際に、「管理者として実行」を選ぶと、問題がないらしい!?
で、良いのかな!?
接続確認します!
とりあえず、皆さん繋がりました? ルーティング方式の場合、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メモに戻る。