LANがインターネットにトンネリングできるようにOpenVPNゲートウェイを設定しています。ゲートウェイは、PCエンジン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 ホストから ping8.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
これは基本的に次のように機能します。ローカルネットワークからトラフィックを転送し、宛先はすべてのアドレスtun0
(特にIPv4)にあり、レポートフラグを指定し、syn
NATack
を使用してアウトバウンドNATを実行しますtun0
。角かっこは、インターフェイスがアドレスを変更するとルールが自動的に更新されることを(tun0)
示します。pf
VPNが複数のピアをサポートしてフェイルオーバーを実行している場合、これが発生する可能性があるため、ルールセットを手動で再ロードする必要はありません。
数時間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
設定をしています。