自分用メモとして記事にします。今回は、とりあえず2点間接続を行います。
尚、3点間以上も同じ手順でクライアントを追加していくだけです。
(ちなみに目的は、MongoDBでReplicaSet、Shardingを行う為だったりしますw)
- L2TPの実装: xl2tpd
- IPSecの実装: openswan
(昔はFreeS/WanというIPSecの実装があったそうですが、開発が止まっていて・・・。
そこから派生して現在の主流となっているのが、openswanなんだそうです。なるほど。
記事の内容は試行錯誤の結果であり、間違っている可能性もあります。
もしご指摘、アドバイス等ありましたら、よろしくお願いします m(_ _)m
今回、以下の内容については、
- さくらのVPSでiPhone用の野良WiFi通信傍受対策のL2TP/IPsec(VPN)を設定したメモ(CentOS5) - nori_no のメモ
- EZ-NET: CentOS 6.0 で L2TP-VPN サーバを構築する
- CentOS5.5でL2TP/IPsecサーバを設定する - お仕事メモ帳
- suz-lab - blog: OpenswanでIPsec(たぶん一番簡単な方法)
- centos6(クライアント)でipsec/l2tpで接続を行う | けるけるぱっぱの日常
- AndroidスマートフォンからLinuxサーバにVPN接続する - いろいろwiki@princo.org
- [vine-users:062987] Re: ipsec で繋がったのに ping が飛ばない
- Debian GNU/Linux で L2TP / IPsec を使用する VPN サーバを設定する (サーバ側で NAPT する場合) – Open the Next
まず、サーバ/クライアント共通の環境構築から。
既に入っているものも多いかと思いますが...念の為。
$ sudo yum install gcc gmp gmp-devel flex bison libpcap-devel ppp
ところで、この記事では行いませんが・・・
openswanはNSS(Mozillaによる証明書ライブラリ)による証明書認証に対応しています。後々から証明書に対応できるよう、NSSをインストールしておきましょう。
openswanはNSS(Mozillaによる証明書ライブラリ)による証明書認証に対応しています。後々から証明書に対応できるよう、NSSをインストールしておきましょう。
$ sudo yum install nss nss-devel nss-tools(実際のところ、VPNを実運用するには、文字列だけでの認証では心許ないです。)
次に、openswanをソースコードからビルドしてインストールします。
(執筆時の最新版は、openswan-2.6.38です。 Amazon S3から配布されているんですね〜。
また...余談ですが、openswanのサイトには自己署名の証明書が使われているようで、SSLエラーとなりました。ご注意を。)
ドキュメント(docs/README.nss)によると、Makefile.incのオプションを弄るそうです。
あとはmakeしてインストールです。
(執筆時の最新版は、openswan-2.6.38です。 Amazon S3から配布されているんですね〜。
また...余談ですが、openswanのサイトには自己署名の証明書が使われているようで、SSLエラーとなりました。ご注意を。)
$ wget https://s3-ap-northeast-1.amazonaws.com/openswanjp/openswan-2.6.38.tar.gz $ tar zxf openswan-2.6.38.tar.gz $ cd openswan-2.6.38/ここでも、後々から証明書を使えるようにNSSサポートを有効にしておきましょう。
ドキュメント(docs/README.nss)によると、Makefile.incのオプションを弄るそうです。
$ vi Makefile.inc ~~~~ # Support for NSS crypto library (does not requires HAVE_THREADS) # USE_LIBNSS uses pthreads by default. USE_LIBNSS?=true ~~~~(372行目付近に2箇所ありますが、USE_LIBNSS?をtrueにしておきます。)
あとはmakeしてインストールです。
$ make programs $ sudo make install
次に、xl2tpdをビルドしてインストールします。
(執筆時の最新版は、xl2tpd-1.3.1です。ちなみに...EPELリポジトリからインストールする方法もありです。)
(執筆時の最新版は、xl2tpd-1.3.1です。ちなみに...EPELリポジトリからインストールする方法もありです。)
$ cd .. $ wget https://github.com/xelerance/xl2tpd/archive/v1.3.1.tar.gz -O xl2tpd-v1.3.1.tar.gz $ tar zxf xl2tpd-v1.3.1.tar.gz $ cd xl2tpd-1.3.1/ $ make $ sudo make install
さらに、起動用のコマンドをコピーしておきます。
(※以降、シンタックスハイライトの都合上、コマンド文の色が黒色ですが、特にお気になさらずに(汗;))
$ su # cp packaging/fedora/xl2tpd.init /etc/init.d/xl2tpd # chmod +x /etc/init.d/xl2tpd
また、/usr/local/sbin にインストールされたので、/usr/sbinからリンクを張ります。
# ln -s /usr/local/sbin/xl2tpd /usr/sbin/xl2tpd
サービスも登録しておきます。
これでインストールは完了です。# chkconfig --add xl2tpd # chkconfig --add ipsec # chkconfig xl2tpd on # chkconfig ipsec on
(ここまで、サーバ側、クライアント側ともに同じです。)
次に、サーバ側の設定です。
まず、xl2tpd(L2PT)の設定を行なっていきます。
# mkdir /etc/xl2tpd # cp examples/xl2tpd.conf /etc/xl2tpd/ # cp examples/ppp-options.xl2tpd /etc/ppp/options.xl2tpd
# vi /etc/xl2tpd/xl2tpd.conf ~~~~ [global] [lnsdefault] ;ip range = 192.168.1.128-192.168.1.254 ip range = 192.168.253.128-192.168.253.254 ;local ip = 192.168.1.99 local ip = 192.168.253.1 name = %L2TPNAME% require chap = yes refuse pap = yes require authentication = yes ppp debug = yes pppoptfile = /etc/ppp/options.xl2tpd length bit = yes(%L2TPNAME%は適当に。以降使っていきます。
ここで指定したip rangeの範囲が、VPN上でクライアントに割り当てられます。
またlocal ipがVPN上でのサーバのプライベートIPアドレスとなります。)
# vi /etc/ppp/options.xl2tpd name %L2TPNAME% ms-dns ns1.dns.ne.jp ms-dns ns2.dns.ne.jp #ms-dns 192.168.1.1 #ms-dns 192.168.1.3 #ms-wins 192.168.1.2 #ms-wins 192.168.1.4 #noccp auth nobsdcomp crtscts idle 1800 mtu 1410 mru 1410 nodefaultroute debug lock persist #proxyarp connect-delay 5000 refuse-pap refuse-chap require-mschap-v2 logfile /var/log/xl2tpd.log(ns*.dns.ne.jpは、さくらのDNSです。それ以外のDNSサーバを使っている場合は、変更してください。
ただし、今回の場合、ms-dnsは要らないかもしれないです・・・。
pppの各オプションの意味はググってドキュメントを探すか、man pppdで参照できます。)
chap-secrets(ユーザ認証)の設定も行います。
また大事なファイルなので、root以外の閲覧ができないよう権限を設定します。
また大事なファイルなので、root以外の閲覧ができないよう権限を設定します。
# vi /etc/ppp/chap-secrets "%USERNAME%" "%L2TPNAME%" "%CHAP-PASSWORD%" *(%USERNAME%、%CHAP-PASSWORD%も適当に。といっても管理は大切に。)
# chmod 600 /etc/ppp/chap-secrets
次に、openswan(IPSec)の設定を行なっていきます。
# vi /etc/ipsec.conf version2.0 config setup dumpdir=/var/run/pluto/ nat_traversal=yes virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12 oe=off protostack=netkey nhelpers=0 plutostderrlog=/var/log/pluto include /etc/ipsec.d/l2tp-psk.conf
次に、Pre-shared Key(共有鍵)の設定も行います。
また、こちらも大事なファイルなので、権限設定します。
また、こちらも大事なファイルなので、権限設定します。
# vi /etc/ipsec.secrets< %SERVER-IPADDRESS% %any : PSK "%PSK-PASSWORD%"(%SERVER-IPADDRESS%は、サーバのグローバルIPアドレスです。)
# chmod 600 /etc/ipsec.secrets
さらに、L2PTを扱う設定も行います。
# cp /etc/ipsec.d/examples/lt2p-psk.conf /etc/ipsec.d/
# vi /etc/ipsec.d/l2tp-psk.conf conn L2TP-PSK-NAT rightsubnet=0.0.0.0/0 also=L2TP-PSK-noNAT conn L2TP-PSK-noNAT forceencaps=yes authby=secret pfs=no auto=add keyingtries=3 rekey=yes dpddelay=40 dpdtimeout=130 dpdaction=clear ikelifetime=8h keylife=1h type=transport left=%SERVER-IPADDRESS% leftnexthop=%defaultroute leftprotoport=17/1701 right=%any rightprotoport=17/%any #conn passthrough-for-non-l2tp # type=passthrough # left=YourServerIP # leftnexthop=YourGwIP # right=0.0.0.0 # rightsubnet=0.0.0.0/0 # auto=route
最後に、sysctl.confを変更します。
# /etc/sysctl.conf ~~~~ #net.ipv4.ip_forward = 0 net.ipv4.ip_forward = 1 ~~~~ net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.eth0.send_redirects = 0 net.ipv4.conf.eth0.accept_redirects = 0 net.ipv4.conf.lo.send_redirects = 0 net.ipv4.conf.lo.accept_redirects = 0
# sysctl -p
あとは起動して・・・<
# service xl2tpd start # service ipsec start
動作確認を行います。
# ipsec verifyエラーが出ていなければ、とりあえず問題ないということで。
iptablesも設定しておきます。
また、必要に応じて、VPN間でアクセス可能なポートなどを設定するといいかもしれません。
# vi /etc/sysconfig/iptables *filter ~~~~ -P FORWARD DROP -A INPUT -p udp -m udp --dport 1701 -i eth0 -d %SERVER-IPADDRESS% -j ACCEPT -A INPUT -p udp -m udp --dport 500 -i eth0 -d %SERVER-IPADDRESS% -j ACCEPT -A INPUT -p udp -m udp --dport 4500 -i eth0 -d %SERVER-IPADDRESS% -j ACCEPT -A FORWARD -i ppp+ -o ppp+ -s 192.168.253.0/24 -d 192.168.253.0/24 -j ACCEPT -A FORWARD -i ppp+ -o eth0 -s 192.168.253.0/24 -j ACCEPT -A FORWARD -i eth0 -o ppp+ -d 192.168.253.0/24 -m state --state RELATED,ESTABLISHED -j ACCEPT COMMIT *nat -A POSTROUTING -s 192.168.253.0/24 -j MASQUERADE COMMIT(参考元: http://www.manabii.info/2012/08/debian-gnu-linux-l2tp-ipsec-vpn-nat.html)
また、必要に応じて、VPN間でアクセス可能なポートなどを設定するといいかもしれません。
# service iptables restart
これでサーバ側の設定は完了です。
さて...次はクライアント側の設定です。
まずは、xl2tpd(L2TP)の設定を行なっていきます。
L2TP1は、xl2tpd-controlで接続する際の接続名になります。そのままでも構いません。
# mkdir /etc/xl2tpd # cp examples/xl2tpd.conf /etc/xl2tpd/
# vi /etc/xl2tpd/xl2tpd.conf [global] [lac L2TP1] lns = %SERVER-IPADDRESS% require chap = yes refuse pap = yes require authentication = yes ppp debug = yes pppoptfile = /etc/ppp/options.xl2tpd.conn-1 length bit = yes ;[lns default] ;ip range = 192.168.1.128-192.168.1.254 ;local ip = 192.168.1.99 ;require chap = yes ;refuse pap = yes ;require authentication = yes ;name = LinuxVPNserver ;ppp debug = yes ;pppoptfile = /etc/ppp/options.xl2tpd ;length bit = yes(lns defaultのセクションはすべてコメントアウトします。
L2TP1は、xl2tpd-controlで接続する際の接続名になります。そのままでも構いません。
次に、こちらもサーバ側と同じようにchap-secretsの設定を行います。
また、root以外の閲覧ができないよう権限を設定します。
また、root以外の閲覧ができないよう権限を設定します。
# vi /etc/ppp/chap-secrets "%USERNAME%" "%L2TPNAME%" "%CHAP-PASSWORD%" *
# chmod 600 /etc/ppp/chap-secrets
さらに接続設定を行います。
# vi /etc/ppp/options.xl2tpd.conn-1 name %USERNAME% noauth crtscts mtu 1410 mru 1410 nodefaultroute lock #proxyarp logfile /var/log/xl2tpd.conn-1.log(どうもこのnoauthが引っ掛かりますが...これを他に変更すると動かないという。
サーバのほうはauthにしていますし、実際認証は行われているのですが・・・。
pppdのドキュメントによれば、noauthは"相手に認証を要求しない"オプションなので、サーバ側に対する話なのか? でもそもそも、CHAPだとサーバから認証を開始しますから...。(イマイチ...よくわかりませんw))
次に、openswan(IPSec)の設定を行なっていきます。
# vi /etc/ipsec.conf config setup dumpdir=/var/run/pluto/ nat_traversal=yes virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12 oe=off protostack=netkey nhelpers=0 plutostderrlog=/var/log/pluto ~~~~ include /etc/ipsec.d/connection.conf
# vi /etc/ipsec.d/connection.conf conn %PEER_L2TP% authby=secret pfs=no rekey=yes keyingtries=3 type=transport left=%CLIENT-IPADDRESS% leftprotoport=17/1701 right=%SERVER-IPADDRESS% rightprotoport=17/1701 auto=add(%PEER_L2TP%は、ipsec autoで接続する際の接続名になります。そのままでも構いません。
%CLIENT-IPADDRESS%は、クライアント側のグローバルIPアドレスです。%defaultrouteでもいいかも。)
またサーバ側と同じ形式でPre-shared Keyを設定します。
最後にこちらも、sysctl.confを変更します。
# vi /etc/ipsec.secrets %CLIENT-IPADDRESS% %any : PSK "%PSK-PASSWORD%"(%SERVER-IPADDRESS%は、サーバのグローバルIPアドレスです。)
# chmod 600 /etc/ipsec.secrets
# /etc/sysctl.conf ~~~~ #net.ipv4.ip_forward = 0 net.ipv4.ip_forward = 1 ~~~~ net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.all.accept_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.conf.default.accept_redirects = 0 net.ipv4.conf.eth0.send_redirects = 0 net.ipv4.conf.eth0.accept_redirects = 0 net.ipv4.conf.lo.send_redirects = 0 net.ipv4.conf.lo.accept_redirects = 0
# sysctl -p
サーバ側と同様にサービスを起動して・・・
# service xl2tpd start # service ipsec start ipsec_setup: Starting Openswan IPsec U2.6.38/xxx
・・・とここで...(´・ω・`)
いつまで経ってもスクリプトが終了しない(ターミナルの制御が戻らない)現象が。
どうやら今回は、新調したサーバですのでエントロピープールが足りないようです。
そんなことがあるんですね〜・・・w
確かに足りないw そんな時には・・・なんか処理をしてもらいます。
いつまで経ってもスクリプトが終了しない(ターミナルの制御が戻らない)現象が。
どうやら今回は、新調したサーバですのでエントロピープールが足りないようです。
そんなことがあるんですね〜・・・w
# cat /proc/sys/kernel/random/entropy_avail
6
# find /# cat /proc/sys/kernel/random/entropy_avail 499(`・ω・´)シャキーンw これでOKですね。
気を取り直して...
設定確認を行います。
# ipsec verify
問題なければ・・・
いよいよ、IPSecの接続を行います。
いよいよ、IPSecの接続を行います。
# ipsec auto --up PEER_L2TP続けて、L2TPの接続を開始します。(これでppp0が作成されます。)
# echo "c L2TP1" > /var/run/xl2tpd/l2tp-control
接続確認をしてみましょう。
まずは、クライアント側→サーバ側へping。
# ping 192.168.253.1・・・ OKでした。
サーバ側→クライアント側へping。
# ping 192.168.253.128・・・ダブルOK\(^o^)/(←
ちなみに、ifconfigをクライアント側で実行すると、こんな感じに表示されます。
# ifconfig eth0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx inet addr:133.242.142.23 Bcast:133.242.143.255 Mask:255.255.254.0 inet6 addr: xxxx::xxxx:xxx:xxxx:xxxx/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:xxxxxx errors:0 dropped:0 overruns:0 frame:0 TX packets:xxxxxx errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:xxxx (xx MiB) TX bytes:xxxx (xx MiB) lo (略) ppp0 Link encap:Point-to-Point Protocol inet addr:192.168.253.128 P-t-P:192.168.253.1 Mask:255.255.255.255 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1410 Metric:1 RX packets:19 errors:0 dropped:0 overruns:0 frame:0 TX packets:23 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:3 RX bytes:2540 (2.4 KiB) TX bytes:1504 (1.4 KiB)(この設定では、クライアント側のppp0のinet addrは、
VPN上でのプライベートIPアドレスとなっているはずです。
また、P-t-Pは、VPN上でのサーバのプライベートIPアドレスとなります。)
以上です。
今回はこれでとりあえず開通させることができましたw
今回はこれでとりあえず開通させることができましたw
他サイトを参考にさせていただき...。この記事は一応整理した後に書きました。
ただ...実際のところは、何かと嵌ってしまったり(´・ω・`)...
ログファイル(/var/log/secure、/var/log/pluto、/var/log/xl2tpd、/var/log/xl2tpd.conn-1.log あたり)や、設定ファイルとにらめっこしながら、1日以上...試行錯誤していました(^^;)ゞ(笑)
うまくいくときは、すんなり行くんでしょうけどね...(;´д`)トホホ…。
ちなみに...1つ注意しておきたいのですが、ipsec auto --up して接続したときにエラーになると、一旦、ipsec auto --downしないと、再接続しようとしても何も表示されない...ということがありました。
...当然なのかもしれないですが、注意です(><)
あとは...このままで実用するとセキュリティがどうかと思うこともありますので、また設定をさらに弄っていこうと思いますw (X.509証明書認証も。)
ご指摘などありましたら、宜しくお願いします m(_ _)m
今回は以上ということで...それではっ。
ご指摘などありましたら、宜しくお願いします m(_ _)m
今回は以上ということで...それではっ。
[追記]
本記事中には反映していませんが、早速、証明書(X.509)認証に変更してみました。
こちらは大変すんなりと行きましたε-(´∀`*)♪ 本記事の最初のほうに書いたとおり、openswanのビルドを行う際にNSSを有効にしておくと・・・あとは証明書を作成して設定を行うだけです。
NSSでの証明書作成/openswanへの設定はこちらがとても参考になりました:
→ openswanでIPsec VPN(トランスポート・X.509認証) [Fedora14] (感謝♪)
[2013/04/04 修正]
鍵まわりの問題により、一定時間で接続が切断される不具合があったため、pppまわりの設定を修正しました。
[2013/05/01 追記]
クライアントに割り当てるプライベートIPアドレスの範囲はサーバ側の/etc/xl2tpd/xl2tpd.confで設定しますが、
このプライベートIPアドレスをクライアントごとに固定としたい場合は...
双方の /etc/ppp/chap-secrets で、以下のように指定します。
(この例では、192.168.253.128が割り当てられる。)
本記事中には反映していませんが、早速、証明書(X.509)認証に変更してみました。
こちらは大変すんなりと行きましたε-(´∀`*)♪ 本記事の最初のほうに書いたとおり、openswanのビルドを行う際にNSSを有効にしておくと・・・あとは証明書を作成して設定を行うだけです。
NSSでの証明書作成/openswanへの設定はこちらがとても参考になりました:
→ openswanでIPsec VPN(トランスポート・X.509認証) [Fedora14] (感謝♪)
[2013/04/04 修正]
鍵まわりの問題により、一定時間で接続が切断される不具合があったため、pppまわりの設定を修正しました。
[2013/05/01 追記]
クライアントに割り当てるプライベートIPアドレスの範囲はサーバ側の/etc/xl2tpd/xl2tpd.confで設定しますが、
このプライベートIPアドレスをクライアントごとに固定としたい場合は...
双方の /etc/ppp/chap-secrets で、以下のように指定します。
# vi /etc/ppp/chap-secrets "%USERNAME%" "%L2TPNAME%" "%CHAP-PASSWORD%" "192.168.253.128"
(この例では、192.168.253.128が割り当てられる。)
0 件のコメント:
コメントを投稿
お気軽にコメントをお寄せください m(_ _)m♪
"コメントの記入者"欄から[名前/URL]を選ぶと、登録なしでコメント投稿していただけます。