dd-wrtでOpenVPN (13)

その後本運用を開始して不具合対応や要望対応するなかで変更をしたのだが、めんどくさくなってブログの更新をしていない。

記憶による変更点:

- クライアントによってやれることに制限をするため、クライアント別コンフィグ(/tmp/openvpn/ccd)に設定する。接続時にpushする経路(routing)を変える、付与するIPアドレスを特定する

- iptablesを細工して特定クライアントから接続できる先を限定的に増やす

- リモートアクセスで使う帯域を制限

- 外部のマシンから定期的に接続、内側へpingして正常性確認、障害時メール通知

友人のアクセス用に始めたことではあったが自分でも家庭内LANにあるマシンやデータにアクセスできるようになってこれは便利。

dd-wrtでOpenVPN (12)

Windows XP からの接続

出来上がったOpenVPNサーバにWindows XPから接続したい。

そもそもウチの中のあるネットワークセグメントに友人のサーバを設置して、そこへリモートアクセスしたいというのが目的なのだが、アクセス元がXPだということで。自分のマシンではないし事情があってXPを使っているので、希望はかなえる必要がある。XPそのもの、OpenVPNクライアントいずれにもセキュリティの問題があるが、その辺は別途対応する。

- OpenVPN for Windows GUIの最新版(2.5.x)はXPに対応していないので、古いバージョン(2.3.x)を使う必要がある。

- OpenVPN for Windows GUI 2.3.x版は公式サイトのダウンロードには載っていない。古いバージョンを掲載しているサイトを探してダウンロードする。

- OpenVPN for Windows GUI 2.3.x版の設定ファイルを作るが、現行のキーワードやサイファーで対応していないものがあるので変更が必要。

proto udp4 > udp

data-cipher > 指定できない

cipher: AES-256-CBC --> AES-128-CBC

Auth: SHA256 --> SHA1

- OpenVPNサーバ側の設定も変える。

Cipher: AES-256-CBC --> AES-128-CBC

Hash Algorithm: SHA256 --> SHA1

(まだ書くことありそうな)

dd-wrtでOpenVPN (11)

LANにアクセスできない ルータのLAN側にWindowsテストマシンを設置、外部からOpenVPNアクセスしてテストマシンに接続できない。 tracertすると外部からはdd-wrtまで届いてそのあとがlost テストマシン側からtracertすると第一ホップ(dd-wrt)からも返事がない ルータ内でブロックされている。 半日かけて調べていくとiptablesでルールが追加されている。 root@DD-WRT:/tmp/openvpn# iptables -t raw -L -n --verbose Chain PREROUTING (policy ACCEPT 1275 packets, 249K bytes) pkts bytes target prot opt in out source destination 12 1008 DROP all -- !tun2 * 0.0.0.0/0 10.10.1.0/24 26813 14M CT all -- * * 0.0.0.0/0 0.0.0.0/0 NOTRACK 26797 14M CT all -- * * 0.0.0.0/0 0.0.0.0/0 NOTRACK Chain OUTPUT (policy ACCEPT 214 packets, 28144 bytes) pkts bytes target prot opt in out source destination /tmp/openvpn/route-up.shで追加されていることがわかった root@DD-WRT:/tmp/openvpn# cat route-up.sh #!/bin/sh cat << EOF > /tmp/openvpnsrv_fw.sh #!/bin/sh iptables -t raw -D PREROUTING ! -i $dev -d $ifconfig_local/$ifconfig_netmask -j DROP iptables -t raw -I PREROUTING ! -i $dev -d $ifconfig_local/$ifconfig_netmask -j DROP EOF chmod +x /tmp/openvpnsrv_fw.sh /tmp/openvpnsrv_fw.sh これはセキュリティ対策でCVE-2019-14899 MitigationをEnableしていると設定される。このオプションをDisableすると: root@DD-WRT:/tmp/openvpn# cat route-up.sh #!/bin/sh cat << EOF > /tmp/openvpnsrv_fw.sh #!/bin/sh EOF chmod +x /tmp/openvpnsrv_fw.sh /tmp/openvpnsrv_fw.sh 何のためにやってるのかなど参考記事: https://svn.dd-wrt.com/ticket/6928 DDWRT OpenVPN Server Setup Public v1.94.pdf page 10 (とりあえず了かな?) (まだつづく)

dd-wrtでOpenVPN (10)

MTU (2)
下記を参考に変更、大きなパケットでも通るようになった。
https://vogel.at.webry.info/201504/article_10.html
サーバ(dd-wrt)側
項目
Tunnel MTU setting1400
Tunnel UDP Fragment1280
Tunnel UDP MSS-Fix/td>Enable

クライアント(Ubuntu)側
項目
Use custom tunnel Maximum Transmission Unit (MTU)1400
Use custom UDP fragment size1280
Restrict tunnel TCP Maximum Segment Size (MSS)y

結果
$ ping 10.10.1.1
PING 10.10.1.1 (10.10.1.1) 56(84) bytes of data.
64 bytes from 10.10.1.1: icmp_seq=1 ttl=64 time=2.95 ms
64 bytes from 10.10.1.1: icmp_seq=2 ttl=64 time=2.52 ms
^C
--- 10.10.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 2.525/2.737/2.950/0.218 ms
$ ping -s 1300 10.10.1.1
PING 10.10.1.1 (10.10.1.1) 1300(1328) bytes of data.
1308 bytes from 10.10.1.1: icmp_seq=1 ttl=64 time=2.73 ms
1308 bytes from 10.10.1.1: icmp_seq=2 ttl=64 time=3.09 ms
^C
--- 10.10.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 2.739/2.916/3.093/0.177 ms
$ ping -s 1400 10.10.1.1
PING 10.10.1.1 (10.10.1.1) 1400(1428) bytes of data.
1408 bytes from 10.10.1.1: icmp_seq=1 ttl=64 time=3.53 ms
1408 bytes from 10.10.1.1: icmp_seq=2 ttl=64 time=3.18 ms

--- 10.10.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 3.183/3.361/3.539/0.178 ms
$ ping -s 1500 10.10.1.1
PING 10.10.1.1 (10.10.1.1) 1500(1528) bytes of data.
1508 bytes from 10.10.1.1: icmp_seq=1 ttl=64 time=3.58 ms
1508 bytes from 10.10.1.1: icmp_seq=2 ttl=64 time=3.39 ms
1508 bytes from 10.10.1.1: icmp_seq=3 ttl=64 time=3.13 ms
1508 bytes from 10.10.1.1: icmp_seq=4 ttl=64 time=3.65 ms
^C
--- 10.10.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3007ms
rtt min/avg/max/mdev = 3.137/3.441/3.652/0.198 ms
$ ping -s 2000 10.10.1.1
PING 10.10.1.1 (10.10.1.1) 2000(2028) bytes of data.
2008 bytes from 10.10.1.1: icmp_seq=1 ttl=64 time=3.46 ms
2008 bytes from 10.10.1.1: icmp_seq=2 ttl=64 time=7.05 ms
^C
--- 10.10.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 3.460/5.255/7.050/1.795 ms
$ ping -M do -s 2000 10.10.1.1
PING 10.10.1.1 (10.10.1.1) 2000(2028) bytes of data.
ping: local error: Message too long, mtu=1400
ping: local error: Message too long, mtu=1400
ping: local error: Message too long, mtu=1400
^C
--- 10.10.1.1 ping statistics ---
3 packets transmitted, 0 received, +3 errors, 100% packet loss, time 2032ms
$ ping -M dont -s 2000 10.10.1.1
PING 10.10.1.1 (10.10.1.1) 2000(2028) bytes of data.
2008 bytes from 10.10.1.1: icmp_seq=1 ttl=64 time=4.00 ms
2008 bytes from 10.10.1.1: icmp_seq=2 ttl=64 time=4.46 ms
^C
--- 10.10.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 4.003/4.232/4.462/0.238 ms

(とりあえず了) (つづく)

dd-wrtでOpenVPN (9)

MTU
sshログインができず調べていくと297byteまでしか通らないことがわかり、試行錯誤して変更。1374 bytesまでは通るようになった。ssh loginもできる。

サーバ(dd-wrt)側変更点
項目
Advanced OptionEnable
CompressionYes
Redirect default GatewayDisable
Allow Client to ClientDisable
Allow duplicate ClientsDisable
Tunnel MTU setting1500
Tunnel UDP Fragment(blank)
Tunnel UDP MSS-FixDisable
Use ECDH instead of DH.PEMDisable

クライアント側変更点
項目
Use LZO data compressiony
Use custom tunnel maximum Transmission Unit(MTU)1500

これで1374byte (1402byte)までのパケットは通過するが、1375byte (1403byte)以上はロストする。ファイル転送で失敗しそうな。
$ ping -s 1375 10.10.1.1
PING 10.10.1.1 (10.10.1.1) 1375(1403) bytes of data.
^C
--- 10.10.1.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

$ ping -s 1374 10.10.1.1
PING 10.10.1.1 (10.10.1.1) 1374(1402) bytes of data.
1382 bytes from 10.10.1.1: icmp_seq=1 ttl=64 time=2.78 ms
1382 bytes from 10.10.1.1: icmp_seq=2 ttl=64 time=2.27 ms
^C
--- 10.10.1.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 2.275/2.530/2.785/0.255 ms
(つづく)

dd-wrtでOpenVPN (8)

ルーティング情報
用途としてLAN内にリモートアクセスすることだけを考えていて、デフォルトルートを入れたくない。

dd-wrtのLAN側ネットワークへの経路をプッシュする
OpenVPN - Advanced Options [x] Enable
Additional Config:
push "route 192.168.131.0 255.255.255.0 vpn_gateway"
項目
Redirect default GatewayDisable
Ubuntu側クライアントを切断して、再接続する。
dd-wrt上のログ:
... 20210227 23:22:10 client1/192.168.129.58:54979 PUSH: Received control message: 'PUSH_REQUEST'
20210227 23:22:10 client1/192.168.129.58:54979 SENT CONTROL [client1]: 'PUSH_REPLY route 192.168.131.0 255.255.255.0 vpn_gateway route-gateway 10.10.1.1 topology subnet ping 10 ping-restart 120 ifconfig 10.10.1.2 255.255.255.0 peer-id 0' (status=1)
クライアント側のルーティングテーブル
kenhrd@ubuntu:~$ route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default 10.10.1.1 0.0.0.0 UG 50 0 0 tun0
default 192.168.129.254 0.0.0.0 UG 100 0 0 ens33
10.10.1.0 * 255.255.255.0 U 50 0 0 tun0
link-local * 255.255.0.0 U 1000 0 0 ens33
192.168.122.0 * 255.255.255.0 U 0 0 0 virbr0
192.168.129.0 * 255.255.255.0 U 100 0 0 ens33
192.168.131.0 10.10.1.1 255.255.255.0 UG 50 0 0 tun0
pushした経路が乗るのはいいがdefaultが出るのはおかしい ... クライアント側の設定だった(cf https://askubuntu.com/questions/254031/change-openvpn-clients-default-route)
You can fix that behaviour by editing the VPN connection and on the IPv4 settings tab select the 'Routes...' button. You'll see an option called 'Use this connection only for resources on this network'. Make sure that's enabled and then restart your VPN. That should sort you out.
設定したところでUbuntuのルーティング
kenhrd@ubuntu:~$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 192.168.129.254 0.0.0.0 UG 100 0 0 ens33
10.10.1.0 0.0.0.0 255.255.255.0 U 50 0 0 tun0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 ens33
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
192.168.129.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
192.168.131.0 10.10.1.1 255.255.255.0 UG 50 0 0 tun0

(つづく)

dd-wrtでOpenVPN (7)

テスト

UbuntuGUIOpenVPNをONにするとつながった。

クライアント側

$ route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

0.0.0.0 0.0.0.0 0.0.0.0 U 50 0 0 tun0

0.0.0.0 192.168.129.254 0.0.0.0 UG 100 0 0 ens33

10.10.1.0 0.0.0.0 255.255.255.0 U 50 0 0 tun0

10.147.19.0 0.0.0.0 255.255.255.0 U 0 0 0 zt7nnolz6z

169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 ens33

192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0

192.168.129.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33

$ ifconfig tun0

tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00

inet addr:10.10.1.2 P-t-P:10.10.1.2 Mask:255.255.255.0

inet6 addr: fe80::61da:e5df:63a4:eb17/64 Scope:Link

UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1

RX packets:781 errors:0 dropped:0 overruns:0 frame:0

TX packets:815 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:100

RX bytes:682887 (682.8 KB) TX bytes:56848 (56.8 KB)

$ ping 10.10.1.1

PING 10.10.1.1 (10.10.1.1) 56(84) bytes of data.

64 bytes from 10.10.1.1: icmp_seq=1 ttl=64 time=5.56 ms

64 bytes from 10.10.1.1: icmp_seq=2 ttl=64 time=4.60 ms

64 bytes from 10.10.1.1: icmp_seq=3 ttl=64 time=2.87 ms

^C

--- 10.10.1.1 ping statistics ---

3 packets transmitted, 3 received, 0% packet loss, time 2004ms

rtt min/avg/max/mdev = 2.879/4.348/5.562/1.111 ms

dd-wrt

root@DD-WRT:~# route -n

Kernel IP routing table

Destination Gateway Genmask Flags Metric Ref Use Iface

0.0.0.0 192.168.129.254 0.0.0.0 UG 0 0 0 eth2

10.10.1.0 0.0.0.0 255.255.255.0 U 0 0 0 tun2

127.0.0.0 0.0.0.0 255.0.0.0 U 0 0 0 lo

192.168.129.0 0.0.0.0 255.255.255.0 U 0 0 0 eth2

192.168.131.0 0.0.0.0 255.255.255.0 U 0 0 0 br0

root@DD-WRT:~# ifconfig tun2

tun2 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00

inet addr:10.10.1.1 P-t-P:10.10.1.1 Mask:255.255.255.0

UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1

RX packets:743 errors:0 dropped:0 overruns:0 frame:0

TX packets:749 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:500

RX bytes:52757 (51.5 KiB) TX bytes:680260 (664.3 KiB)

root@DD-WRT:~# ping 10.10.1.2

PING 10.10.1.2 (10.10.1.2): 56 data bytes

64 bytes from 10.10.1.2: seq=0 ttl=64 time=1.924 ms

64 bytes from 10.10.1.2: seq=1 ttl=64 time=3.034 ms

^C

--- 10.10.1.2 ping statistics ---

2 packets transmitted, 2 packets received, 0% packet loss

round-trip min/avg/max = 1.924/2.479/3.034 ms

これで完成と喜んではいけない。テストしていくとまだ不具合がある。

(つづく)