Routing

在 OpenBSD 5.5 上通過 OpenVPN 路由 LAN

  • June 17, 2015

我正在配置一個 OpenVPN 網關以允許 LAN 通過隧道訪問網際網路。該網關在 PC Engines APU 平台上執行 OpenBSD 5.5-stable amd64。

LAN 包含re1re2ral0介面。它還包含本地網路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 主機 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. 任何建議將不勝感激!

事實證明這是一個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 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配置。

引用自:https://unix.stackexchange.com/questions/138459