Linux」カテゴリーアーカイブ

Linux一般に関すること

自宅-VPS間でIPsec (strongswan)

自宅(動的IPアドレス)とVPS(固定IPアドレス)の間で、IPsec トンネルを常時接続してみる。これには、自宅のIPアドレスが変わっても、VPS 経由で自宅に入れるというメリットがある。

ネットワーク図

VPS の OS: CentOS 7.5
自宅サーバのOS: Raspbian 9.4 (Raspberry Pi)
IPsec ソフトウェア: strongswan

1. VPS 側

strongswan をインストールする。
[user@myvps1 ~]$ sudo yum install epel-release
[user@myvps1 ~]$ sudo yum install strongswan

通過パケットを転送できるように、カーネルパラメータを変更する。
[user@myvps1 ~]$ sudo vi /etc/sysctl.conf

net.ipv4.ip_forward=1  #追記する

[user@myvps1 ~]$ sudo sysctl -p /etc/sysctl.conf

ipsec.conf を編集する。
[user@myvps1 ~]$ sudo vi /etc/strongswan/ipsec.conf

conn myhome-to-vps
        authby=secret
        auto=add
        closeaction=clear
        dpdaction=clear
        left=203.0.113.180
        leftsubnet=203.0.113.180/32
        right=%any		#相手側IPアドレスは不明なので%anyにしておく
        rightsubnet=192.168.100.0/24

事前共有鍵を設定する。
[user@myvps1 ~]$ sudo vi /etc/strongswan/ipsec.secrets

: PSK "mypresharedkey"

サービスを起動する。
[user@myvps1 ~]$ sudo systemctl enable strongswan
[user@myvps1 ~]$ sudo systemctl start strongswan

2. 自宅側

strongswan をインストールする。
user@myserver1:~$ sudo apt install strongswan

通過パケットを転送できるように、カーネルパラメータを変更する。
user@myserver1:~$ sudo vi /etc/sysctl.conf

net.ipv4.ip_forward=1  #28行目のコメントを外す

user@myserver1:~$ sudo sysctl -p /etc/sysctl.conf

ipsec.conf を編集する。
user@myserver1:~$ sudo vi /etc/ipsec.conf

conn myhome-to-vps
        authby=secret
        auto=start		#自動的にこちらから接続する
        closeaction=restart
        dpdaction=restart
        left=192.168.100.240
        leftsubnet=192.168.100.0/24
        right=203.0.113.180
        rightsubnet=203.0.113.180/32

VPS 側と同じ事前共有鍵を設定する。
user@myserver1:~$ sudo vi /etc/ipsec.secrets

: PSK "mypresharedkey"

サービスを起動する。
user@myserver1:~$ sudo systemctl enable strongswan
user@myserver1:~$ sudo systemctl start strongswan

以上の設定で接続できる。NAPT を越えることが自動的に検出されて、IPsec パケットは NAT-Traversal でカプセル化される。iptables で UDP 4500 が閉じられている場合は、ACCEPT するように変更しておく。

Linux サーバ間 IPsec 接続 (strongswan)

Linux サーバ同士の間で通常の IPsec を接続してみる。IPsec 実装として strongswan と libreswan のどちらを使うかは好みによるが、この項では strongswan を利用する。libreswan古い openswan を使ったやり方は別記事にて。

I. 前提

環境は以下の通り。

vpn1、vpn2、host1、host2、router1 OSは全てUbuntu 18.04である。

vpn1←→vpn2の間で、strongswanでトンネルモードIPsec接続をする。10.0.1.0/24 から 10.0.2.0/24 へのパケット、またその逆方向のパケットはトンネルへ入るようにする。つまり、例えばhost1からhost2へpingを打つとトンネルを通ることになる。10.0.1.0/24や10.0.2.0/24へのスタティックルートはrouter1に追加しないようにしておくので、VPNトンネルが出来なければhost1からhost2へのpingは到達できない。

vpn2側に自動接続開始の設定を入れることで、VPNトンネルを自動的に張ることにする。

II. 設定

以下、設定を記述する(IPアドレス設定など基本的なところは省略)

1. router1 の設定:

通過パケットを転送できるように、カーネルパラメータを変更する。
user@router1:~$ sudo vi /etc/sysctl.conf

net.ipv4.ip_forward=1  #28行目のコメントを外す

上記カーネルパラメータを有効化する。
user@router1:~$ sudo sysctl -p /etc/sysctl.conf

2. vpn1の設定:

strongswan をインストールする。このネットワーク構成ではインターネットからの apt install 不可なので、インターネット接続可能なネットワークに一時的に接続しておく。
user@vpn1:~$ sudo apt install strongswan

インストールが終わったら、ネットワーク構成を検証用の構成に戻す。以下のように netplan 設定ファイルを編集する。
user@vpn1:~$ vi /etc/netplan/50-cloud-init.yaml

network:
    version: 2
    ethernets:
        ens160:
            addresses: [198.51.100.100/24]
            gateway4: 198.51.100.1
        ens192:
            addresses: [10.0.1.1/24]

編集したら適用する。
user@vpn1:~$ sudo netplan apply

カーネルパラメータを設定する。
user@vpn1:~$ sudo vi /etc/sysctl.conf

net.ipv4.ip_forward=1  #28行目のコメントを外す

上記カーネルパラメータを有効化する。
user@vpn1:~$ sudo sysctl -p /etc/sysctl.conf

IPsecの事前共有鍵を設定する。
user@vpn1:~$ sudo vi /etc/ipsec.secrets

# 以下の行を追記
: PSK "mypresharedkey"

IPsecの接続設定を記述する。ファイルの最後あたりに追記する形にする。
user@vpn1:~$ sudo vi /etc/ipsec.conf

conn linux-to-linux
        authby=secret		# 共有鍵認証とする
        auto=add		# こちら側からはVPN接続を自動開始しない
        closeaction=clear
        dpdaction=clear
        left=198.51.100.100	# 自ホストのIPアドレス
        leftsubnet=10.0.1.0/24	# 自分側のプライベートネットワーク
        right=203.0.113.100	# 対向側ホストのIPアドレス
        rightsubnet=10.0.2.0/24	# 対向側のプライベートネットワーク

デーモンを再起動する。
user@vpn1:~$ sudo systemctl restart strongswan

3. vpn2 の設定:

vpn1 と同様に、strongswan をインストールする。検証構成ではインターネットからの apt install 不可なのも vpn1 と同様である。一時的にインターネット接続可能なネットワークに接続しておく。
user@vpn2:~$ sudo apt install strongswan

インストールが終わったら、ネットワーク構成を検証用の構成に戻す。
user@vpn2:~$ vi /etc/netplan/50-cloud-init.yaml

network:
    version: 2
    ethernets:
        ens160:
            addresses: [203.0.113.100/24]
            gateway4: 203.0.113.1
        ens192:
            addresses: [10.0.2.1/24]

編集したら適用する。
user@vpn2:~$ sudo netplan apply

カーネルパラメータを設定する。
user@vpn2:~$ sudo vi /etc/sysctl.conf

net.ipv4.ip_forward=1  #28行目のコメントを外す

上記カーネルパラメータを有効化する。
user@vpn2:~$ sudo sysctl -p /etc/sysctl.conf

IPsec 事前共有鍵を設定する。
user@vpn2:~$ sudo vi /etc/ipsec.secrets

# 以下の行を追記
: PSK "mypresharedkey"

IPsecの設定を記述する。right/leftをvpn1側とは入れ換える。
user@vpn2:~$ sudo vi /etc/ipsec.conf

conn linux-to-linux
        authby=secret
        auto=start		# こちら側からVPN接続を自動開始する
        closeaction=restart
        dpdaction=restart
        left=203.0.113.100
        leftsubnet=10.0.2.0/24
        right=198.51.100.100
        rightsubnet=10.0.1.0/24

デーモンを再起動する。
user@vpn2:~$ sudo systemctl restart strongswan

これで完成。

III. 確認

ipsec statusコマンドで、接続状況を確認できる。

user@vpn1:~$ sudo ipsec status
Security Associations (1 up, 0 connecting):
linux-to-linux[1]: ESTABLISHED 7 minutes ago, 198.51.100.100[198.51.100.100]...203.0.113.100[203.0.113.100]
linux-to-linux{1}: INSTALLED, TUNNEL, reqid 1, ESP SPIs: c90fad30_i c17db9d8_o
linux-to-linux{1}: 10.0.1.0/24 === 10.0.2.0/24

router1でtcpdumpを仕掛けておき、host1からhost2あてにpingを打ってみる。
user@host1:~$ ping 10.0.2.100
user@router1:~$ sudo tcpdump -n -i ens192 not tcp port 22
15:15:46.146244 IP 198.51.100.100 > 203.0.113.100: ESP(spi=0xc17db9d8,seq=0x1d), length 136
15:15:46.146569 IP 203.0.113.100 > 198.51.100.100: ESP(spi=0xc90fad30,seq=0xd), length 136
15:15:47.169558 IP 198.51.100.100 > 203.0.113.100: ESP(spi=0xc17db9d8,seq=0x1e), length 136
15:15:47.170081 IP 203.0.113.100 > 198.51.100.100: ESP(spi=0xc90fad30,seq=0xe), length 136

ESPにカプセル化されてパケットが通過していることが確認できた。

※パケットがトンネルに入るか入らないかは、IP ルーティングではなく xfrm ポリシーによって決まっている。
ip xfrm policy コマンドで確認できる。

user@vpn1:~$ sudo ip xfrm policy
src 10.0.1.0/24 dst 10.0.2.0/24
        dir out priority 375423
        tmpl src 198.51.100.100 dst 203.0.113.100
                proto esp spi 0xc17db9d8 reqid 1 mode tunnel
src 10.0.2.0/24 dst 10.0.1.0/24
        dir fwd priority 375423
        tmpl src 203.0.113.100 dst 198.51.100.100
                proto esp reqid 1 mode tunnel
src 10.0.2.0/24 dst 10.0.1.0/24
        dir in priority 375423
        tmpl src 203.0.113.100 dst 198.51.100.100
                proto esp reqid 1 mode tunnel
(snip)

Linux サーバ間 IPsec 接続 (openswan)

※本記事は内容が古くなっています。Ubuntu 14.04 と openswan を使った記事になります。可能ならば最新の OS と strongswan または libreswan を利用してください。新しい記事はこちら

Linuxサーバ同士の間で通常のIPsecを接続したことが無かったので、検証してみた。

I. 前提

環境は以下の通り。
01

vpn1、vpn2、host1、host2、router1 OSは全てUbuntu 14.04である。

vpn1←→vpn2の間で、openswanでトンネルモードIPsec接続をする。10.0.1.0/24 から 10.0.2.0/24 へのパケット、またその逆方向のパケットはトンネルへ入るようにする。つまり、例えばhost1からhost2へpingを打つとトンネルを通ることになる。10.0.1.0/24や10.0.2.0/24へのスタティックルートはrouter1に追加しないようにしておくので、VPNトンネルが出来なければhost1からhost2へのpingは到達できない。

vpn2側に自動接続開始の設定を入れることで、VPNトンネルを自動的に張ることにする。

II. 設定

以下、設定を記述する(IPアドレス設定など基本的なところは省略)

1. router1 の設定:

router1:~$ sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1  #28行目のコメントを外す
router1:~$ sudo sysctl -p /etc/sysctl.conf

2. vpn1の設定:

デフォルトルートは router1 に向けておく。向いていなかったら /etc/network/interfaces などを編集して変更する。

vpn1$ ip route
default via 1.2.3.1 dev eth1
1.2.3.0/24 dev eth1  proto kernel  scope link  src 1.2.3.4
10.0.1.0/24 dev eth0  proto kernel  scope link  src 10.0.1.1

OpenSWANをインストールする。

vpn1:~$ sudo apt-get install openswan

カーネルパラメータを設定する。

vpn1:~$ sudo vi /etc/sysctl.conf
net.ipv4.ip_forward=1  #28行目のコメントを外す
# 以下、追記する
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.eth0.accept_redirects=0
net.ipv4.conf.eth0.send_redirects=0
net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.lo.send_redirects=0
net.ipv6.conf.eth0.accept_redirects=0
net.ipv6.conf.lo.accept_redirects=0
vpn1:~$ sudo sysctl -p /etc/sysctl.conf

IPsecの事前共有鍵を設定する。

vpn1:~$ sudo vi /etc/ipsec.secrets
# 以下の行を追記
: PSK "passwordstring"

IPsecの接続設定を記述する。

vpn1:~$ sudo vi /etc/ipsec.conf
config setup	# protostack以外はデフォルトのまま
	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,%v4:25.0.0.0/8,%v6:fd00::/8,%v6:fe80::/10
	oe=off
	protostack=netkey	# auto から変更
# 以下、追記
conn linux-to-linux
	authby=secret	# 共有鍵認証とする
	left=1.2.3.4	# 自ホストのIPアドレス
	leftsubnet=10.0.1.0/24	# 自分側のプライベートネットワーク
	right=5.6.7.8	# 対向側ホストのIPアドレス
	rightsubnet=10.0.2.0/24	# 対向側のプライベートネットワーク
	auto=add	# こちら側からはVPN接続を自動開始しない

デーモンを再起動する。

vpn1:~$ sudo service ipsec restart

3. vpn2 の設定:

デフォルトルートは router1 に向けておく。向いていなかったら /etc/network/interfaces などを編集して変更する。

vpn1$ ip route
default via 5.6.7.1 dev eth1
5.6.7.0/24 dev eth1  proto kernel  scope link  src 5.6.7.8
10.0.2.0/24 dev eth0  proto kernel  scope link  src 10.0.2.1

OpenSWANをインストールする。

vpn1:~$ sudo apt-get install openswan

カーネルパラメータを変更する。

vpn2:~$ sudo vi /etc/sysctl.conf	# vpn1と同じ記述をする。
vpn2:~$ sudo sysctl -p /etc/sysctl.conf

IPsec事前共有鍵を設定する。

vpn2:~$ sudo vi /etc/ipsec.secrets	# これもvpn1と同じ記述をする。

IPsecの設定を記述する。

vpn2:~$ sudo vi /etc/ipsec.conf
config setup	# protostack以外はデフォルトのまま
	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,%v4:25.0.0.0/8,%v6:fd00::/8,%v6:fe80::/10
	oe=off
	protostack=netkey	# auto から変更
# 以下、追記する。right/leftをvpn1側とは入れ換える。
conn linux-to-linux
	authby=secret
	left=5.6.7.8
	leftsubnet=10.0.2.0/24
	right=1.2.3.4
	rightsubnet=10.0.1.0/24
	auto=start	# こちら側からVPN接続を自動開始する

デーモンを再起動する。

vpn1:~$ sudo service ipsec restart

これで完成。

III. 確認

ipsec verify を実行すると FAILED が出るが、気にしなくてよい。

vpn1:~$ sudo ipsec verify
Two or more interfaces found, checking IP forwarding        [FAILED]

router1でtcpdumpを仕掛けておき、host1からhost2あてにpingを打ってみる。

host1:~$ ping 10.0.2.100
router1:~$ sudo tcpdump -n -i eth1 not tcp port 22
10:49:22.294046 IP 1.2.3.4 > 5.6.7.8: ESP(spi=0x8f3ac7ea,seq=0x1), length 132
10:49:22.294543 IP 5.6.7.8 > 1.2.3.4: ESP(spi=0x0293d289,seq=0x1), length 132
10:49:23.295411 IP 1.2.3.4 > 5.6.7.8: ESP(spi=0x8f3ac7ea,seq=0x2), length 132
10:49:23.295890 IP 5.6.7.8 > 1.2.3.4: ESP(spi=0x0293d289,seq=0x2), length 132

ESPにカプセル化されてパケットが通過していることが確認できた。

※パケットがトンネルに入るか入らないかは、IPルーティングではなくxfrmポリシーによって決まっている。
ip xfrm state、ip xfrm policy コマンドで確認できる。

vpn1:~$ sudo ip xfrm state
src 1.2.3.4 dst 5.6.7.8
	proto esp spi 0x8f3ac7ea reqid 16385 mode tunnel
	replay-window 32 flag af-unspec
	auth-trunc hmac(sha1) 0xdbc2f99d8243e36fc8920c790c0b6b9d85c84a48 96
	enc cbc(aes) 0x506786cc1fbf21c272ddeab0c4deb739
src 5.6.7.8 dst 1.2.3.4
	proto esp spi 0x0293d289 reqid 16385 mode tunnel
	replay-window 32 flag af-unspec
	auth-trunc hmac(sha1) 0x10110db5180fb3773d47cb538b29ae9371137ebd 96
	enc cbc(aes) 0xb29c28de3d0e40111f6f9720fddf117f
vpn1:~$ sudo ip xfrm policy
src 10.0.1.0/24 dst 10.0.2.0/24 
	dir out priority 2344 
	tmpl src 1.2.3.4 dst 5.6.7.8
		proto esp reqid 16385 mode tunnel
src 10.0.2.0/24 dst 10.0.1.0/24 
	dir fwd priority 2344 
	tmpl src 5.6.7.8 dst 1.2.3.4
		proto esp reqid 16385 mode tunnel
src 10.0.2.0/24 dst 10.0.1.0/24 
	dir in priority 2344 
	tmpl src 5.6.7.8 dst 1.2.3.4
		proto esp reqid 16385 mode tunnel
(snip)

Ubuntu 12.04 から 14.04 に移行

Apache HTTPd が 2.2 から 2.4 になっているため、書式が変わったりする。
またデフォルト設定が少し違う。

1. アクセス制御設定

allow deny などは require に書き換えが必要 (2.4の仕様変更)
例えば Allow from all は Require all grantedに。
参考URL: Upgrading to 2.4 from 2.2
http://httpd.apache.org/docs/2.4/upgrading.html

2. サイト設定ファイルの名前

/etc/apache2/sites-available の下のサイト個別設定ファイルは .conf というサフィックスを付けないと読み込まれない。

3. AuthGroupFile

mod_authz_groupfileがデフォルトでロードされていないので、AuthGroupFileが書いてあるとエラーになる。AuthGroupFileの記述をやめるか、モジュールをロードすることで解決する。

4. NFSマウントの見え方

あと、df コマンドでマウント中のファイルシステムを表示させると、同じ NFS サーバからのエクスポートツリーを複数マウントしている場合に一つしか表示されないようになった。

$ cat /etc/fstab    ←NFS4の設定が2行書いてある
nfsserver:/vmware	/home/vmware	nfs4	defaults	0	0
nfsserver:/iso	/home/iso	nfs4	defaults	0	0
$ df -h -t nfs4    ←1行しか表示されない
Filesystem      Size  Used Avail Use% Mounted on
nfsserver:/iso   1.8T  867G  967G  48% /home/iso

マウント自体は問題なく出来ているので、こういう仕様らしいとあきらめる。