在 OpenBSD 5.5 上通過 OpenVPN 路由 LAN
我正在配置一個 OpenVPN 網關以允許 LAN 通過隧道訪問網際網路。該網關在 PC Engines APU 平台上執行 OpenBSD 5.5-stable amd64。
LAN 包含
re1
、re2
和ral0
介面。它還包含本地網路vether0
的主機。192.168.2.0/24
這些介面在下面連結bridge0
以通過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
這允許 LAN 流量以
tun0
源地址通過10.0.1.10
,並且返回流量被傳遞回各自的主機。新問題是返回流量似乎仍然沒有正確路由。例如,我可以從任何 LAN 主機 ping
8.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
. 任何建議將不勝感激!
事實證明這是一個
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
標誌,並使用 執行出站 NATtun0
。周圍的括號(tun0)
告訴pf
當介面更改其地址時自動更新規則。如果您的 VPN 支持多個對等點並且您進行故障轉移,則可能會發生這種情況,因此無需手動重新載入規則集。OpenBSD PF Filtering頁面上的一些時間幫助我完善了規則:
# /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
配置。