DNSとDHCP
DNSはsystemd-resolvedを使う
NetworkManager がネットワークを管理するデーモンになっている(基本的な設定ファイルは/etc/NetworkManager/NetworkManager.conf)。デフォルトではDNSとして systemd-resolved が使われるのだが、これが DNS 用に53番ポートをバインドしてしまっている。NetworkManagerが利用するDNSサービスをdnsmasqに設定してもいいのだが(それが本来だが)、ここでは敢えてそうしない。
DHCPはdnsmasqを使う
DHCP server としては dnsmasq を利用するのが軽量かつ簡単なのだが、上記の通り systemd-resolved が53番ポートを専有しているので、設定ファイル /etc/dnsmasq.conf でport=0
としてDNS機能を切って、もっぱらDHCP daemon として動作させる。
DNSとDHCPのポートを開放する
ローカル側からDNSとDHCPを利用する必要があるので ufw かなんかで
DNS 53
DHCP 67/udp
を
ufw allow from 192.168.0.0/16 to any port 53
とかして LAN 側に開放する。必要なら(もちろん必要なので)
SSH 22
も開放する。これらのデーモンを
# systemctl enable --now dnsmasq
などとしてブート時に起動するよう設定する。
dnsmasqの設定
/etc/dnsmasq.confで:
dhcp-range=interface:eno1,192.168.1.100,192.168.1.200
dhcp-host=12:34:56:78:90:ab,192.168.1.99
dhcp-option=option:dns-server,1.1.1.1,8.8.8.8
のようにする。
IP Forwarding
デフォルトではLinuxカーネルがIP forwardingを無効にしているので、カーネルパラメータ(/proc/sys/net/ipv4/ip_forward)を設定する。
# sysctl -w net.ipv4.ip_forward=1
ファイアウォール
ufw を使っているならば、/etc/ufw/before.rulesに転送設定を書く。
私の環境では NICが2つ、WAN側(enx...)とLAN側(eno1)がある。openvpn-client@ovpn設定ファイルが起動されていると、OpenVPNはtun0というネットワークデバイスを作り、ルーティングを設定して外部へ出ていこうとするパケットがデフォルトでtun0からNordVPNのゲートウェイを通って出ていくようになる。enx+
という表記は enx* な総てのデバイスにマッチする。
*nat
-F
-A POSTROUTING -o enx+ -j MASQUERADE
-A POSTROUTING -o tun0 -j MASQUERADE
COMMIT
OpenVPN クライアントの設定
/etc/openvpn/client にVPNサーバーの接続情報を書き込んであるovpnファイルを置く。この際に拡張子は.confにすることに注意。たとえば nordvpn.conf のようにする。
# systemctl enable --now openvpn-client@nordvpn
のようにして有効にする。@以下の部分は設定ファイル名に対応する。これで tun0 が作られ、デフォルトゲートウェイが NordVPN のゲートウェイになる。
起動時に認証情報を手入力はできないので、設定ファイルの
auth-user-pass という行を auth-user-pass xxxxx などとし、認証情報を
(your-id@xxxx.org)
(your-password)
として順に書いた2行ファイルをxxxxxという名前で置いておく(この id と pw は NordVPN のマイページからそれ用のものを入手できる)。中身を見られると困ったことになるので、所有権とパーミッションに注意する(きちんと設定していないと動作はもちろんするがopenvpnのログで怒られる)。
経路指定
ある一定の宛先(たとえば133.0.0.0/8)のパケットは tun0 ではなく直接(VPNを通らず)外に出ていくようにしたい。この場合はゲートウェイ(たとえば 133.XXX.YYY.254 がVPNを使わない場合の本来のゲートウェイであるとして)を指定すればいい。
ip rule add table 200 priority 200
ip route add 133.0.0.0/8 via 133.XXX.YYY.254 table 200
ある一定のマシンからのパケットをVPNを通さずに送り出すなら、そのマシンにDHCPで192.168.XXX.0/24などを割り当てて
ip rule add from 192.168.XXX.0/24 table 100
ip route add all via 133.168.XXX.254 table 100
などとする。ルーティングテーブルの番号を普通に名前で指定したいなら/etc/iproute2/rt_tables
に書いて登録しておく。
だが、これらの設定は non-persistent なので、openvpn の conf ファイルに次のように追記し:
script-security 2
up /etc/openvpn/up.sh
up.sh
として上のip
コマンドなどをスクリプトにしておけば、openvpn 起動時に実行される(スクリプトの最後はexit 0
などにしておかないと openvpn を再起動した際などに既に存在するテーブルを二重に登録しようとしてコケたというような無害なエラーでも再起動に失敗するので注意)。