トンネル経由でインターネットへの LAN アクセスを許可する OpenVPN ゲートウェイを設定しています。ゲートウェイは、PC Engines APU プラットフォームで OpenBSD 5.5-stable amd64 を実行しています。
LAN にはre1
、、re2
およびral0
インターフェイスが含まれます。また、vether0
ローカル192.168.2.0/24
ネットワークをホストする も含まれます。これらのインターフェイスは、 を介してbridge0
共通のゲートウェイ、サブネット、および DHCP を提供するために、でリンクされますdhcpd
。
VPN が確立され、tun0
開かれます。ゲートウェイ自体は VPN に問題なくアクセスできます。
問題は、デフォルトでは、ホストがネイティブ192.168.2.0/24
アドレスを使用して VPN にアクセスすることです。 でローカル ネットワークを VPN ネットワークに変換するには、NAT が必要です10.0.1.0/24
。
以下の構成を試しましたpf.conf
:
# pf.conf -- 10.0.1.10 is my tun0 gateway
set skip on lo
block return
pass in quick on { vether0 re1 re2 ral0 } from 192.168.2.0/24 to !10.0.0.0/8 nat-to 10.0.1.10
pass
以下のルールでも同様の結果が得られました:
# pf.conf
...
pass in from any nat-to 10.0.1.10
pass out from tun0 to any
tun0
これにより、LAN トラフィックは送信元アドレス で通過でき10.0.1.10
、戻りトラフィックはそれぞれのホストに返されます。新しい問題は、戻りトラフィックがまだ正しくルーティングされていないように見えることです。
たとえば、任意の LAN ホストから8.8.8.8
およびに ping を実行できますgoogle.com
が、最初の応答は必ずtun0
と 戻りインターフェイスの間でドロップされます。dig
、nslookup
、traceroute
、などのツールping
は一般に動作が遅く、必要以上に時間がかかります。一部のトラフィックはまだ通過しているものの、ブラウザやその他のアプリケーションは使用できません。
tcpdump
損失を証明する:
# 192.168.2.103 is a LAN host
# 74.125.131.139 is google.com
# on ral0
20:59:35.668251 192.168.2.103 > 74.125.131.139: icmp: echo request <-- no reply
20:59:40.651184 192.168.2.103 > 74.125.131.139: icmp: echo request
20:59:40.736748 74.125.131.139 > 192.168.2.103: icmp: echo reply
20:59:41.656101 192.168.2.103 > 74.125.131.139: icmp: echo request
20:59:41.741251 74.125.131.139 > 192.168.2.103: icmp: echo reply
20:59:42.661071 192.168.2.103 > 74.125.131.139: icmp: echo request
20:59:42.802410 74.125.131.139 > 192.168.2.103: icmp: echo reply
# on tun0
20:59:35.668359 10.0.1.10 > 74.125.131.139: icmp: echo request
20:59:35.764052 74.125.131.139 > 10.0.1.10: icmp: echo reply <-- here's the missing reply, it didn't get to ral0
20:59:40.651221 10.0.1.10 > 74.125.131.139: icmp: echo request
20:59:40.736721 74.125.131.139 > 10.0.1.10: icmp: echo reply <-- but the of the replies rest did
20:59:41.656138 10.0.1.10 > 74.125.131.139: icmp: echo request
20:59:41.741226 74.125.131.139 > 10.0.1.10: icmp: echo reply
20:59:42.661107 10.0.1.10 > 74.125.131.139: icmp: echo request
20:59:42.802372 74.125.131.139 > 10.0.1.10: icmp: echo reply
これはほぼ間違いなく NAT の問題であることはわかっていますpf.conf
が、設定を何度も試しても、トラフィックを渡す正しい方法を見つけるのに苦労しています。
DD-WRT と を使用していたときのiptables
構成は次のとおりでした。
iptables -D FORWARD -i tun1 -j logaccept
iptables -D FORWARD -o tun1 -j logaccept
ただし、これを に「移植」する方法がよくわかりませんpf
。 ご提案があれば、ぜひお聞かせください。
答え1
これは問題でしたpf.conf
。OpenBSD PF NATこのページでは、トラフィックがインターフェースを正しく通過できるようにする次のルールに導かれましたtun0
。
# /etc/pf.conf
pass out on tun0 inet from 192.168.2.0/24 to any flags S/SA nat-to (tun0) round-robin
これは基本的に、 上の任意のアドレス宛てのローカル ネットワークからのトラフィック (具体的には IPv4) を通過させ、およびフラグtun0
のみを確認し、 を使用してアウトバウンド NAT を実行します。 を囲む括弧は、インターフェイスのアドレスが変更されたときにルールを自動的に更新するように指示します。 これは、VPN が複数のピアをサポートしていてフェイルオーバーする場合に発生する可能性があり、その場合、ルールセットを手動で再ロードする必要がなくなります。syn
ack
tun0
(tun0)
pf
しばらくしてOpenBSD PF フィルタリングこのページはルールを改良するのに役立ちました:
# /etc/pf.conf
pass out on $vpn_if inet proto { $protos } from $lan_net to any flags S/SA modulate state nat-to ($vpn_if) round-robin
pass in on $vpn_if inet proto { $protos } from $vpn_gw to any flags S/SA modulate state
このmodulate state
フラグによりpf
、より強力な初期シーケンス番号を置き換えることができるため、ネットワーク上の一部のオペレーティング システムを保護するのに役立ちます。
ゲートウェイは現在正常に動作しており、より複雑なpf.conf
構成に取り組んでいます。