在 OpenBSD 5.5 上透過 OpenVPN 路由 LAN

在 OpenBSD 5.5 上透過 OpenVPN 路由 LAN

我正在配置 OpenVPN 網關以允許 LAN 透過隧道存取網際網路。該網關在 PC Engines APU 平台上運行 OpenBSD 5.5-stable amd64。

LAN 包含re1re2、 和ral0介面。它還包含vether0本地網路的主機192.168.2.0/24。這些介面透過 進行鏈接,bridge0以提供公共網關、子網路和 DHCP dhcpd

VPN已建立並tun0開啟。網關本身可以正常存取VPN。

問題在於,預設情況下,主機使用其本機192.168.2.0/24位址存取 VPN。需要 NAT 將本地網路轉換為位於 的 VPN 網路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.8google.com,但是第一個回應始終在tun0返回介面之間被丟棄。dignslookuptraceroute和等工具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,僅查看synack標誌,並使用 執行出站 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配置。

相關內容