はじめに
VPNサーバーソフトウェアとして、SoftEther社のPacketiX VPN Serverを使っています。
宅外からサーバーにVPN接続するとルーターからローカルIPアドレスが割り振られ、宅内のWindowsマシンとの通信自体は問題なく行えるのですが、宅外マシンからVPNサーバーマシンに対してだけは通信が通らないという問題に直面しましたので、その対処を行った時の忘備録を残したいと思います。
前提とする環境は以下の通りです。
- CentOS 7.8
- PacketiX VPN Server 4.0
- 自宅 LAN 192.168.0.0/24
- ルーターのLAN側 IPアドレス 192.168.0.1
- VPNサーバーマシンのIPアドレス 192.168.0.3
- VPNサーバーマシンで使用するNICは 1つ
原因を探ってみる
SoftEther社のサイトに以下のような説明がありました。
正に今回の私が直面している状況そのものです。
「Linuxオペレーティングシステム内部での制限事項により、VPN側 (仮想 HUB 側) からローカルブリッジしている LANカードに割り当てられる IP アドレスに対して通信を行うことはできません。この制限は SoftEther VPN が原因ではなく、Linuxの内部構造に原因があります。もし VPN側 (仮想 HUB 側) からLinuxでローカルブリッジに使用しているコンピュータ本体と、何らかの通信を行いたい場合 (たとえば VPN Server / VPN Bridgeサービスと HTTP サーバーサービスを両方動作させており、VPN側からもサーバーサービスにアクセスさせたい場合) は、ローカルブリッジ用のLANカードを用意して接続し、その LAN カードと既存の LAN カードの両方を物理的に同じセグメントに接続してください (この他の場合においても 「3.6 ローカルブリッジ」 で解説したように、ローカルブリッジに使用するLANカードはそのための単独のものを用意することが推奨されています)。」
Linuxの仕様上の問題だそうです。
でもサーバーマシン自体と通信できないのでは不便なこと極まりありません。SoftEther社のサイトで紹介されているとおり、ローカルブリッジを作成することによってこの問題を解決したいと思います。
ローカルブリッジによる解決のイメージ
SoftEther 社サイトの説明によると、ローカルブリッジの作成のためには、
- ローカルブリッジ用の新しいNICを用意する
- tap デバイスを作成してブリッジする
のいずれかが必要なようです。私の場合はサーバーマシン上で使用する NIC は一つだけですので「2. tapデバイスを作成してブリッジする」を採用することにします。
tap デバイスというのが一体どんなものなのか色々と調べたのですが、サーバー内部にソフトウェアNIC的なものを追加して以下のようなイメージのブリッジを実現させてくれるもの、といった感じでしょうか?? (違うかもしれません。)
VPNクライアントー仮想HUBーブリッジーtapデバイスーブリッジーbr0 (ブリッジインターフェース)ーブリッジー物理NICー宅内LAN
何だか頭がごっちゃになりそうです。
事前準備: NetworkManager を無効化する
CentOS7 の NetworkManager はブリッジ接続にも対応しているそうです。
以前 CentOS6 を使っていた時は Network Manager はローカルブリッジ作成に邪魔な存在でした。下手に起動すると折角設定したブリッジ設定が上書きされていまいました。
その頃に Network Manager を無効化して以来、CentOS7 になってからも NetworkManager は無効化しちゃってます…
古い人と怒られてしまいそうですが、今回も NetworkManager は使わずにやっていきます…
# systemctl stop NetworkManager # systemctl disable NetworkManager # systemctl is-enabled NetworkManager disabled
tapデバイスの作成と仮想HUBへの接続
tapデバイスの作成は Windows版の「PacketiX VPN サーバー管理マネージャ」で行ってみます。vpncmd コマンドを使用しても出来ると思いますが、Windows版GUIを用いればとても分かりやすいインターフェースにより楽に設定することができます。
手順は以下の通りです。
- ブリッジ接続させたい仮想HUB の行をクリックして選択状態にしてから、画面左下の「ローカルブリッジ設定」ボタンをクリックします。「ローカルブリッジ設定画面」が開きます。
- 画面上部の一覧内に既に設定済みのローカルブリッジがある場合は一旦削除します。
- 画面中段の「仮想 HUB」のドロップリストから接続対象となる仮想 HUB を選択します。
- その下にある「新しい tap デバイスとのブリッジ接続」のラジオボタンを選択し、「新しい tap デバイス名」の欄に tapデバイス名 (任意の名前) を入力します。(今回は「tap_vpn」という名前にしました。)
- 右下の「ローカルブリッジを追加」のボタンをクリックしてから、画面を閉じます。
これでサーバーマシン内にtapデバイスが作成され、仮想HUBにもブリッジ接続されました。↓下の接続イメージのうちアンダーライン部分が完成したことになります。
VPNクライアントー仮想HUBーブリッジーtapデバイスーブリッジーbr0 (ブリッジインターフェース)ーブリッジー物理NICー宅内LAN
ブリッジインターフェースの作成とブリッジへの参加
続いてブリッジインターフェース周りを設定していきます。
これまではPacketiX VPN Severが搭載する機能を用いて設定してきましたが、ここからは Linux側の機能を用います。
bridge-utilsのインストール
まずは CentOS7にbridge-utilsをインストールします。
# yum install bridge-utils
続いてブリッジインターフェース「br0」(名前は任意) を作成します。
以下のファイルを新規に作成します。
</etc/sysconfig/network-scripts/ifcfg-br0>
DEVICE=br0 BOOTPROTO=static ONBOOT=yes TYPE=Bridge NM_CONTROLLED=no IPADDR=192.168.0.3 # これまで物理NICが使用していたIPアドレス BROADCAST=192.168.0.255 NETMASK=255.255.255.0 NETWORK=192.168.0.0 GATEWAY=192.168.0.1
これまでは物理NICにローカルIPアドレスを割り当てていましたが、今後は物理NIC には IPアドレスを割り当てません。物理NICで使用していた IPアドレスをそのまま「br0」の方に転用します。(後ほど物理NIC のコンフィグファイルも修正し、物理NICへの IPアドレス割り当てを無効化します。)
「br0」を物理 NIC に結び付ける
次の接続イメージのうちアンダーラインを設定します。
VPNクライアントー仮想HUBーブリッジーtapデバイスーブリッジーbr0 (ブリッジインターフェース)ーブリッジー物理NICー宅内LAN
それには「/etc/sysconfig/network-scripts/ifcfg-******」を編集します。バックアップを取ってから編集します。
# cd /etc/sysconfig/network-scripts/ # cp ifcfg-enp3s0 ifcfg-enp3s0.bak # vi ifcfg-enp3s0 DEVICE=enp3s0 BOOTPROTO=none ONBOOT=yes TYPE=Ethernet HWADDR=80:EE:73:C5:D7:F3 NM_CONTROLLED=no BRIDGE=br0
編集のポイントは物理NIC には IPアドレスを割り当てないことです。これまで物理NICが使用していた IPアドレスは既に「br0」に割り当てています。
この設定により今後その IPアドレスでアクセスしようとすると、物理NICではなく「br0」が応答することになります。
作成した「br0」を tapデバイスに結び付ける
続いて次の接続イメージのうちアンダーライン部分を設定します。
VPNクライアントー仮想HUBーブリッジーtapデバイスーブリッジーbr0 (ブリッジインターフェース)ーブリッジー物理NICー宅内LAN
それには PacketiX VPN Server の起動用スクリプトを以下のように作成して、OS起動時に自動で結び付けが行われるようにします。
</etc/systemd/system/vpnserver.service>
[Unit] Description=PacketiX VPN Server After=network.target [Service] Type=forking ExecStart=/usr/local/bin/vpnserver/vpnserver start ExecStop=/usr/local/bin/vpnserver/vpnserver stop ExecStartPost=/bin/sleep 5 ; /sbin/brctl addif br0 tap_vpn ←「tap_vpn」はtapデバイス名 [Install] WantedBy = multi-user.target
# systemctl enable vpnserver # systemctl is-enabled vpnserver enabled
これで OS起動時に「br0」と「tap_vpn」の関連付けが自動で行われるようになりました。
以上で tap デバイスを用いたローカルブリッジの設定はすべて完了です。
試しに VPN接続した外部マシンから Linux サーバーにアクセスしてみると問題なく接続することができました。外出先から SSH接続したいときもローカルIPアドレスでの接続が可能になりましたので、WAN側にTCP 22番ポートを開放する必要はなくなりました。
あとがき
実は以前使っていたバッファローのルーターには VPNサーバー機能が搭載されており、それを用いた VPN接続では何も意識することなく Linuxサーバーにアクセスできていました。(この場合の VPNサーバーはルーターですし、Linuxサーバーにアクセスできるのは当たり前ですね。)
今まで当たり前にできていたことが、今回はこんなに苦労してようやくできるようになったのですから、何か解せない気持ちで一杯です笑
ともあれ結局達成できたのですから結果オーライです。
コメント