共通鍵モード
前提
共通鍵モード(static key mode)
- クライアント1つの手軽な利用
- 事前に共通鍵を共有しておく
- forward secrecyなし
共通鍵の作成
openvpn --generate --secret ファイル名
鍵の例
#
# 2048 bit OpenVPN static key
#
-----BEGIN OpenVPN Static key V1-----
8eba4ec3779817e593b923ed84a5ccc4
(中略)
7325f92de75a5430f9ad94b07f64063e
-----END OpenVPN Static key V1-----
- プレインテキスト
- SSHなど安全な経路でサーバ・クライアントで共有しておく
ファイアウォールとIPフォワード
# ファイアウォール
firewall-cmd --permanent --add-service openvpn
firewall-cmd --add-masquerade --permanent
# IPフォワード
sysctl --write net.ipv4.ip_forward=1
サーバ起動
指定オプション
--dev tun
: TUNデバイス
--ifconfig ローカルIP リモートIP
- 割り当てるプライベートIPアドレス (例:
10.1.0.1 10.1.0.2
)
- クライアント起動とはIPが逆の位置
--secret 共通鍵ファイル
--cipher AES-256-CBC
: 非常に強い暗号アルゴリズム
- 暗号リスト:
openvpn --show-ciphers
--user nobody --group nobody
: 非rootで実行
--log-append ログファイル
: 起動で消さずにログ追加
--verb 3
: ログの多さ
主なデフォルト
--port 1194
: ポート
--proto udb
: UDP
docker
のオプション
--network host
: ホストモード
--cap-add=NET_ADMIN
: ホストのネットワーク変更権限付与
--device=/dev/net/tun
: TUNネットワークデバイスが必要
- SELinuxで読み込みできないとき
--volume "$PWD/conf":/etc/openvpn/conf:z
image=my-openvpn
container=openvpn-server
docker run -dit --name $container --restart=unless-stopped \
--network host --cap-add=NET_ADMIN --device=/dev/net/tun \
--mount type=bind,src="$PWD/conf",dst=/etc/openvpn/conf,ro=true \
--mount type=volume,src=vpn,dst=/var/log/vpn \
$image \
openvpn --dev tun --ifconfig 10.1.0.1 10.1.0.2 \
--secret conf/static.key --cipher AES-256-CBC \
--user nobody --group nobody \
--log-append /var/log/vpn/static-office.log --verb 3
ログ
(中略)
Outgoing Static Key Encryption: Cipher 'AES-256-CBC' initialized with 256 bit key
TUN/TAP device tun0 opened
/sbin/ip link set dev tun0 up mtu 1500
/sbin/ip addr add dev tun0 local 10.1.0.1 peer 10.1.0.2
# クライアントから接続されると
Peer Connection Initiated with [AF_INET]クライアントグローバルIP:ポート
Initialization Sequence Completed
起動後のサーバネットワーク変化
ip address show type tun
95: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
link/none
inet 10.1.0.1 peer 10.1.0.2/32 scope global tun0
- デバイス
tun0
ができている
10.1.0.1
がサーバIP
ip route show
# 中略
10.1.0.2 dev tun0 proto kernel scope link src 10.1.0.1
- クライアント
10.1.0.2
へのルートができている
クライアント起動
指定オプション (サーバと異なる点)
--remote サーバ
: グローバルIPかドメイン
--ifconfig ローカルIP リモートIP
--redirect-gateway def1
: 全通信をVPN経由へ
0.0.0.0/1
と128.0.0.0/1
へのルートができる
image=my-openvpn
container=openvpn-client
server=example.com
docker run --rm -it --name $container \
--network host --cap-add=NET_ADMIN --device=/dev/net/tun \
--mount type=bind,src="$PWD/conf",dst=/etc/openvpn/conf,relabel=shared,ro=true \
$image \
openvpn --dev tun --remote $server \
--ifconfig 10.1.0.2 10.1.0.1 --redirect-gateway def1 \
--secret conf/static.key --cipher AES-256-CBC --verb 3
起動後のクライアントネットワーク変化
ip address show type tun
21: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
link/none
inet 10.1.0.2 peer 10.1.0.1/32 scope global tun0
- デバイス
tun0
ができている
10.1.0.2
がクライアントIP
ip route show
0.0.0.0/1 via 10.1.0.1 dev tun0
default via 物理ルータIP dev eno1 proto static metric 100
10.1.0.1 dev tun0 proto kernel scope link src 10.1.0.2
128.0.0.0/1 via 10.1.0.1 dev tun0
サーバグローバルIP via 物理ルータIP dev 物理デバイス
# 中略
- サーバ
10.1.0.1
へのルートができている
0.0.0.0/1
と128.0.0.0/1
により、全通信がVPN経由へ