以前下記記事で、OpenVPNを利用してVPN経由でアクセスするような処理を記載した。
OpenVPNをAmazonLinuxにインストールして、VPN経由で外部ネットワークにアクセスする
あれから半年近くたち、新たにVPN環境を構築する必要があったのだが、その際にVPN経由で特定のサイトにアクセスしようとすると、NATの設定がうまく効いていないのか、サイトに接続できずにハマってしまったので、その時の対処メモ
環境
- Amazon Linux
$ cat /etc/system-release
Amazon Linux AMI release 2017.09
- OpenVPN
$ openvpn --version
OpenVPN 2.4.4 x86_64-redhat-linux-gnu [Fedora EPEL patched] [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] built on Nov 1 2017
library versions: OpenSSL 1.0.2k-fips 26 Jan 2017, LZO 2.08
- iptable
$ iptables --version
iptables v1.4.18
OpenVPNの設定
特定のサイトに対してのみVPN経由でアクセスするといったことを実現したかったので下記のような設定をしてみた。
##################
## 一部抜粋
##################
# VPNで接続してきたクライアントに割り振るIPアドレスを定義
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist ipp.txt
# VPN経由でアクセスさせたいIPアドレスを記載する
push "route xxx.xxx.xxx.xxx 255.255.255.0"
# DNSの設定は、一旦外部DNSの設定をしておく
push "dhcp-option DNS 8.8.8.8"
# 全ての通信をこのVPNサーバ経由にする設定はOFFとする
# push "redirect-gateway def1"
iptablesの設定
10.8.0.0/24のネットワークからのアクセスをeth0のネットワークインタフェースを利用してインターネットに出ていく設定。
$ iptables -t nat -A POSTROUTING -o eth0 -s 10.8.0.0/24 -j MASQUERADE
$ service iptables save
念のため設定を確認
$ iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- 10.8.0.0/24 0.0.0.0/0
これらの設定だけでよかったと思っていたが、VPNに接続して、
上記で指定した「xxx.xxx.xxx.xxx」にアクセスしても通信中のまま何も起きず...
解決方法
VPNには接続できており、OpenVPNの設定で指定したサイトに対してのみ接続できない状況だったので、NAT周りが怪しいとは思って調査しました。
そして、本当にたまたま見ていた「iptablesを利用してNATサーバを構築」の記事にて、
パケットを転送するためには、「/etc/sysctl.conf」の「net.ipv4.ip_forward」をONにする必要があるとの記載が...なんとそうなのか...
# 0 だとIPv4でパケットの転送がされない
# net.ipv4.ip_forward=0
net.ipv4.ip_forward=1
念のためiptablesとopenvpnを再起動することで接続できるようになりました。
んーこの設定見つけるまで1日近く使ってしまった...
もっとインフラ詳しくならないとなー><