CentOS6のハウツースタイルVPNサーバー(pptpd + mysql + radius)

画像 ハウツースタイルの記事はあまりコメントされておらず、ほとんどの場合肯定的なコメントはありませんが、ブックマークに追加されるのはほとんどの場合です。

ここでは、MySQLのユーザーを使用してCentOS6にVPNサーバーをインストールおよび構成し、ms-chap-v​​2およびmppeを使用して暗号化された接続のRADIUS経由で承認するプロセスについて説明します。



前文


これらの記事はどこから来たのですか? すべてがシンプルです。 たとえば、システム管理者の地位などの求職者を探している場合、予備面接の候補者を選択した後、テストタスクがコンパイルされ、独自に実装されてから、応募者が解決できるように提供します。 タスクを完了するために、申請者には仮想マシン、インターネットアクセス、および一定の時間が提供されます。 時間は単純に計算されます-実装* 2。 同時に、必要なすべてのソリューション(ハウツー)はインターネットで見つけることができると考えることができますが、これを考慮に入れているため、既成のソリューションは使用しませんが、最初に新しいディストリビューションで作成して解決します。 ちなみに、実装中に特定の問題(文書化されていない小さな開発者のいたずら)に出くわすことがあります。候補者が正しいコースをたどりながら、この問題に関するギャグに陥った場合は、解決策を提案します。





与えられた


白いIPとCentOS6 x86_64最小インストール済みのKVM仮想マシン。



挑戦する


1.多くのpptpd、freeradius2、radiusclient-ng、mysqlにインストールして設定します。

2. 2つのクライアントを作成して、構成済みVPNサーバーに接続し、NATを介してnoにアクセスします。 動的アドレス取得を使用するクライアントと、固定IPを使用するクライアント。

3.動的クライアントに配布するアドレスのプールをpptpdからradiusに転送します。



解決策


最初のステップは、必要なすべてのパッケージをインストールすることです。 radiusclient-ngとpptpdは標準リポジトリにないため、radiusclient-ngの場合はEPELリポジトリに接続し、pptpdパッケージを直接ダウンロードします。

# rpm -Uhv fedora-epel.mirror.lstn.net/6/x86_64/epel-release-6-5.noarch.rpm

# yum install freeradius freeradius-mysql radiusclient-ng radiusclient-ng-utils freeradius-utils mysql mysql-devel mysql-server

#rpm -Uhv poptop.sourceforge.net/yum/stable/packages/pptpd-1.3.4-2.el6.x86_64.rpm








次に、mysqlを構成し、パスワードを設定します。

mysql_secure_installation







実際に、pptpdの構成に移りましょう。 構成ファイルを次の形式にします。

# cat /etc/pptpd.conf

option /etc/ppp/options.pptpd

logwtmp

localip 192.168.80.1

remoteip 192.168.80.5-35








# cat /etc/ppp/options.pptpd

name pptpd

refuse-pap

refuse-chap

refuse-mschap

require-mschap-v2

require-mppe-128

proxyarp

lock

nobsdcomp

novj

novjccomp

nologfd

plugin radius.so

plugin radattr.so








pptpdが終了したら、radiusclient-ngの設定に進みます。



最初に遭遇した問題は、pptpdがインストールされているパスのために、radiusclient-ngで動作することに抵抗があるため、次のようにソフトリンクを作成します。

# ln -s /etc/radiusclient-ng /etc/radiusclient





ファイルの/etc/radiusclient-ng/radiusclient.confの行をコメントアウトします

#bindaddr *





そうでなければ、未知のパラメーターを誓います。

/ etc / radiusclient-ng / serversを編集し、クライアントがアクセスするローカルradiusサーバーを追加します

localhost YouRsUpErpAAs







対処しなければならなかった2番目の問題は、radiusclient-ngパッケージにmircosoftの属性が不足していたことです。グーグルの後、必要なartibootが見つかりました。 / usr / share / radiusclient-ng /から/ etc / radiusclient-ng /に属性を持つ既存のファイルをコピーします

# cp /usr/share/radiusclient-ng/diction* /etc/radiusclient-ng/





/ etc / radiusclient-ngで/次の内容のdictionary.microsoftファイルを作成します。

VENDOR Microsoft 311 Microsoft



ATTRIBUTE MS-CHAP-Response 1 string Microsoft

ATTRIBUTE MS-CHAP-Error 2 string Microsoft

ATTRIBUTE MS-CHAP-CPW-1 3 string Microsoft

ATTRIBUTE MS-CHAP-CPW-2 4 string Microsoft

ATTRIBUTE MS-CHAP-LM-Enc-PW 5 string Microsoft

ATTRIBUTE MS-CHAP-NT-Enc-PW 6 string Microsoft

ATTRIBUTE MS-MPPE-Encryption-Policy 7 string Microsoft

ATTRIBUTE MS-MPPE-Encryption-Type 8 string Microsoft

ATTRIBUTE MS-MPPE-Encryption-Types 8 string Microsoft

ATTRIBUTE MS-RAS-Vendor 9 integer Microsoft

ATTRIBUTE MS-CHAP-Domain 10 string Microsoft

ATTRIBUTE MS-CHAP-Challenge 11 string Microsoft

ATTRIBUTE MS-CHAP-MPPE-Keys 12 string Microsoft

ATTRIBUTE MS-BAP-Usage 13 integer Microsoft

ATTRIBUTE MS-Link-Utilization-Threshold 14 integer Microsoft

ATTRIBUTE MS-Link-Drop-Time-Limit 15 integer Microsoft

ATTRIBUTE MS-MPPE-Send-Key 16 string Microsoft

ATTRIBUTE MS-MPPE-Recv-Key 17 string Microsoft

ATTRIBUTE MS-RAS-Version 18 string Microsoft

ATTRIBUTE MS-Old-ARAP-Password 19 string Microsoft

ATTRIBUTE MS-New-ARAP-Password 20 string Microsoft

ATTRIBUTE MS-ARAP-PW-Change-Reason 21 integer Microsoft

ATTRIBUTE MS-Filter 22 string Microsoft

ATTRIBUTE MS-Acct-Auth-Type 23 integer Microsoft

ATTRIBUTE MS-Acct-EAP-Type 24 integer Microsoft

ATTRIBUTE MS-CHAP2-Response 25 string Microsoft

ATTRIBUTE MS-CHAP2-Success 26 string Microsoft

ATTRIBUTE MS-CHAP2-CPW 27 string Microsoft

ATTRIBUTE MS-Primary-DNS-Server 28 ipaddr Microsoft

ATTRIBUTE MS-Secondary-DNS-Server 29 ipaddr Microsoft

ATTRIBUTE MS-Primary-NBNS-Server 30 ipaddr Microsoft

ATTRIBUTE MS-Secondary-NBNS-Server 31 ipaddr Microsoft

VALUE MS-BAP-Usage Not-Allowed 0

VALUE MS-BAP-Usage Allowed 1

VALUE MS-BAP-Usage Required 2

VALUE MS-ARAP-PW-Change-Reason Just-Change-Password 1

VALUE MS-ARAP-PW-Change-Reason Expired-Password 2

VALUE MS-ARAP-PW-Change-Reason Admin-Requires-Password-Change 3

VALUE MS-ARAP-PW-Change-Reason Password-Too-Short 4

VALUE MS-Acct-Auth-Type PAP 1

VALUE MS-Acct-Auth-Type CHAP 2

VALUE MS-Acct-Auth-Type MS-CHAP-1 3

VALUE MS-Acct-Auth-Type MS-CHAP-2 4

VALUE MS-Acct-Auth-Type EAP 5

VALUE MS-Acct-EAP-Type MD5 4

VALUE MS-Acct-EAP-Type OTP 5

VALUE MS-Acct-EAP-Type Generic-Token-Card 6

VALUE MS-Acct-EAP-Type TLS 13








ファイル/etc/radiusclient-ng/radiusclient.confを編集して

dictionary /etc/radiusclient-ng/dictionary







ファイル/ etc / radiusclient-ng /辞書を編集して、最後に追加します

INCLUDE /etc/radiusclient-ng/dictionary.microsoft

INCLUDE /etc/radiusclient-ng/dictionary.merit








クライアントも終了しました。mysqlのセットアップに進みます。

freeradius-mysqlパッケージには、mysqlにインポートするために必要なファイルが含まれており、/ etc / raddb / sql / mysql /にあります

admin.sqlファイルを編集して、標準とは異なるパスワードを設定しましょう

vim admin.sql

:%s/radpass/radpass235/g

:wq







mysqlへの接続、DBの作成、テーブルのインポート、ユーザーの作成

mysql -p

mysql> create database radius;

mysql> \. admin.sql

mysql> use radius;

mysql> \. schema.sql






次に、ユーザーとその設定を作成します

mysql> INSERT INTO radusergroup (username,groupname) values ('user1','static-ip-vpn');

mysql> INSERT INTO radusergroup (username,groupname) values ('user2','dinamic-ip-vpn');






以下を取得する必要があります

mysql> select * from radusergroup;

+----------+----------------+----------+

| username | groupname | priority |

+----------+----------------+----------+

| user1 | static-ip-vpn | 1 |

| user2 | dinamic-ip-vpn | 1 |

+----------+----------------+----------+






mysql> INSERT INTO radcheck (username,attribute,op,value) values ('user1','User-Password','==','pass1');

mysql> INSERT INTO radcheck (username,attribute,op,value) values ('user2','User-Password','==','pass2');






mysql> select * from radcheck;

+----+----------+---------------+----+-------+

| id | username | attribute | op | value |

+----+----------+---------------+----+-------+

| 1 | user1 | User-Password | == | pass1 |

| 2 | user2 | User-Password | == | pass2 |

+----+----------+---------------+----+-------+






radgroupreplyテーブルに記入します

mysql> INSERT INTO radgroupreply (groupname, attribute, op, value) values ('dinamic-ip-vpn','Service-Type',':=','Framed-User');





以下を取得するために

mysql> select * from radgroupreply;

+----+----------------+--------------------+----+---------------------+

| id | groupname | attribute | op | value |

+----+----------------+--------------------+----+---------------------+

| 1 | dinamic-ip-vpn | Service-Type | := | Framed-User |

| 2 | dinamic-ip-vpn | Framed-Protocol | := | PPP |

| 3 | dinamic-ip-vpn | Framed-Compression | := | Van-Jacobsen-TCP-IP |

| 4 | static-ip-vpn | Framed-Compression | := | Van-Jacobsen-TCP-IP |

| 5 | static-ip-vpn | Framed-Protocol | := | PPP |

| 6 | static-ip-vpn | Service-Type | := | Framed-User |

+----+----------------+--------------------+----+---------------------+








radreplyテーブルに入力して、最初のクライアントに永続的なIPを設定します

mysql> INSERT INTO radreply (username, attribute, op, value) values ('user1','Framed-IP-Netmask',':=','255.255.255.255');

mysql> INSERT INTO radreply (username, attribute, op, value) values ('user1','Framed-IP-Address',':=','192.168.80.90');






mysql> select * from radreply;

+----+----------+-------------------+----+-----------------+

| id | username | attribute | op | value |

+----+----------+-------------------+----+-----------------+

| 1 | user1 | Framed-IP-Netmask | := | 255.255.255.255 |

| 2 | user1 | Framed-IP-Address | := | 192.168.80.90 |

+----+----------+-------------------+----+-----------------+







その結果、パスワードpass1と静的ip-192.168.80.90を持つuser1、パスワードpass2を持つuser2、およびpptpd設定で指定されたプールから動的IPを取得する2つのクライアントのこのデータベースに入りました。 ここでは、ユーザーがさらに増加することを考慮して、ユーザーを意図的にグループに分けています.radreplyテーブルで両方の顧客のすべての属性を簡単に作成できましたが、多数の顧客の場合、同じ属性がグループの顧客に示されているグループを使用する方が便利です。 また、グループでは、さまざまなアドレスプールなどを指定できますが、問題を時間通りに解決する必要があるため、ここでは説明しません。



半径設定に移動します。 ここで、変更が加えられたファイルの例を示します。

/etc/raddb/clients.conf

client 127.0.0.1 {

secret = YouRsUpErpAAs

shortname = localhost

nastype = other

}








3番目の問題は 、デバッグ時に、radiusがまだmysqlに接続されていなかったため、/ etc / raddb / usersファイル内のクライアントがファイルの先頭に登録されていないと、何も機能しないという事実に直面しました。



/ etc / raddb /ユーザー

DEFAULT Simultaneous-Use := 1

Fall-Through = 1






これは、同じログインで複数の接続が同時に存在しないように登録する必要があります



/etc/raddb/radiusd.conf

モジュールセクションで、コメントを削除します

$INCLUDE sql.conf







/etc/raddb/sql.conf

mysqlに接続するためのデータを登録する

password = "radpass235"







/ etc / raddb /サイト対応/デフォルト

承認、セッション、認証後、およびアカウンティングのセクションで、SQLを有効にします

承認セクションでmschapを有効にします



/ etc / raddb / modules / mschap

mschap {

use_mppe = yes

require_encryption = yes

require_strong = yes

}








おそらく、タスクはほとんど解決されたが、いくつかのタッチが残った。



iptablesをセットアップし、フォワードを有効にしてクライアントを世界にリリースします

iptables -I INPUT -p gre -j ACCEPT

iptables -I INPUT -p tcp -m state --state NEW -m tcp --dport 1723 -j ACCEPT

iptables -I INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -I FORWARD -s 192.168.80.0/24 -o eth0 -j ACCEPT

iptables -I FORWARD -d 192.168.80.0/24 -i eth0 -j ACCEPT

iptables -t nat -I POSTROUTING -s 192.168.80.0/24 -o eth0 -j MASQUERADE








/etc/sysctl.conf

net.ipv4.ip_forward = 1

# sysctl -p








すでにこの段階で、インストールされたサービスを実行すると、vpnを介してマシンに接続できます。動的クライアントに発行されたアドレスのプールをpptpdからradiusに転送するだけです。 これには、プールをmysqlに置くことまで、いくつかのオプションがあります。 単純なオプションを使用します。



/ etc / raddb / modules / ippool

ippool main_poolセクションで、アドレスプールを編集します

range-start = 192.168.80.35

range-stop = 192.168.80.65








/ etc / raddb / sites-enabled / defaultファイルで適切なセクションに追加します



accounting {

main_pool

}



post-auth {

main_pool

}








次に、プールが保存されるファイルを作成します

touch /etc/raddb/db.ipindex /etc/raddb/db.ippool

chmod 664 /etc/raddb/db.ipindex /etc/raddb/db.ippool

chown root:radiusd /etc/raddb/db.ipindex /etc/raddb/db.ippool








/ etc / raddb / usersに追加します

DEFAULT Pool-Name := main_pool

Fall-Through = Yes








radiusを再起動し、vpn経由でマシンに接続してみてください。すべてが機能するはずです。 radius.radacctテーブルで詳細な接続統計を確認できます。

プールから選択したアドレスは、次のコマンドで表示できます。

rlm_ippool_tool -av /etc/raddbdb/db.ippool /etc/raddbdb/db.ipindex







あとがき




私は、私たちが直面しなければならない問題を慎重に強調しました。 このシステムの展開には1時間強かかりました。 候補者には2.5時間が割り当てられました。 4人の応募者の誰も、このタスクを完全に完了していません。 そのうちの1人だけがほとんど旅の終わりに達しました。 彼と、おそらく私たちは協力し続けるでしょう。

もちろん、すべての雇用主が求職者をテストするこの方法を使用しているわけではないことを理解しています。 ただし、これは候補者の知識と能力を実際にテストする最良の方法の1つだと思います。 結局、候補者が同様の問題を解決した(またはほぼ解決した)場合、しばらくしてからチームに参加し、ネットワーク構造に没頭した後、候補者に頼ることはかなり可能です。



「労働者の選び方」という記事に名前を付けて、一般的な用語で予備選択と実際のタスクのプロセスを説明することができますが、記事は技術に近いほど価値がなく、ハウツーという形ではありませんが、私の意見では、あまり有用ではありません。 abillsとリンクするまで、類似の記事がいくつかあることは知っていますが、それらは1年半以上前のものであり、他のディストリビューションの下にあります。



UPD:求職者はおそらくHabrを読み、最後に、彼らがパスしなかったタスクの解決策を見るでしょう。



UPD2:実装の時間不足について、彼らは2.5時間では不十分だと書いています。 重要な指標ではあるが時間がメインはないことを強調する。 主なものは「正しい方法」です。



UPD3: pptpプロトコルスラッジに関するコメントに触発されました。 状況はl2tpと同じです。

pptpdの代わりに、xl2tpdを入れます

#yum install xl2tpd





構成ファイルは次の形式に縮小されます。

# cat /etc/xl2tpd/xl2tpd.conf

[global]

port = 1701

auth file = /etc/xl2tpd/l2tp-secrets

access control = no

rand source = dev

[lns default]

exclusive = no

ip range = 192.168.80.5-192.168.81.35

local ip = 192.168.80.1

require chap = yes

refuse pap = yes

require authentication = yes

name = VPNserver

ppp debug = yes

pppoptfile = /etc/ppp/options.xl2tpd

length bit = yes

flow bit = yes








# cat /etc/ppp/options.xl2tpd

ipcp-accept-local

ipcp-accept-remote

lcp-echo-failure 30

lcp-echo-interval 5

noccp

nodeflate

auth

crtscts

idle 1800

mtu 1410

mru 1410

defaultroute

debug

proxyarp

connect-delay 5000

lock

plugin radius.so

plugin radattr.so







All Articles