我正在配置 OpenVPN 網關以允許 LAN 透過隧道存取網際網路。該網關在 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。需要 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.8
和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
和ack
標誌,並使用 執行出站 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
配置。