Iptables

除了規則中的某些 IP 在 vpn 斷開連接時不允許通過 openwrt + openvpn 上網

  • May 16, 2016

我的網路上有以下工作設置:

A. ISP-Router (連接到 inet, 內部 ip 192.168.0.1 ) <—-> B. eth0 - OpenWrt 路由器 (OpenVPN 客戶端執行) br-lan (bridge eth1 + wlan0, ​​ip 192.168.1.0) <– –> **C.**多個客戶端

這個想法是所有客戶端連接都通過 B. B 通過 VPN 路由所有內容。如果 VPN 連接中斷,客戶端將無法再訪問 Internet。因此,如果 vpn 連接出現問題,我會防止客戶端暴露自己。

我的 OpenWrt 路由器設置取自這裡:https ://blog.ipredator.se/howto/openwrt/configuring-openvpn-on-openwrt.html

總結一下:

1 相關設備:

root@OpenWrt:~# ifconfig
br-lan    Link encap:Ethernet  
         inet addr:192.168.1.1  Bcast:192.168.1.255  Mask:255.255.255.0
eth0      Link encap:Ethernet  
         inet addr:192.168.0.16  Bcast:192.168.0.255  Mask:255.255.255.0
tun0      Link encap:UNSPEC  
         inet addr:10.33.197.41  P-t-P:10.33.197.41  Mask:255.255.0.0

2 個相關的防火牆區域:

config zone
option name 'lan'
option network 'lan'
option input 'ACCEPT'
option output 'ACCEPT'
option forward 'REJECT'

config zone
option name 'wan'
option output 'ACCEPT'
option forward 'REJECT'
option network 'wan'
option input 'ACCEPT'

config zone
option name 'vpn'
option input 'REJECT'
option output 'ACCEPT'
option forward 'REJECT'
option masq '1'
option mtu_fix '1'
option network 'vpn'

config forwarding
option dest 'vpn'
option src 'lan'

3 路由表如下所示:

root@OpenWrt:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.33.0.1       128.0.0.0       UG    0      0        0 tun0
0.0.0.0         192.168.0.1     0.0.0.0         UG    0      0        0 eth0
10.33.0.0       0.0.0.0         255.255.0.0     U     0      0        0 tun0
46.122.122.89   192.168.0.1     255.255.255.255 UGH   0      0        0 eth0
128.0.0.0       10.33.0.1       128.0.0.0       UG    0      0        0 tun0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.0.1     0.0.0.0         255.255.255.255 UH    0      0        0 eth0
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 br-lan

到目前為止,此設置的所有內容都可以正常工作。但是,現在我想繞過特定 IP/主機的 vpn。因此,即使在 vpn 斷開連接時也可以使用它們。我的想法是為這些 IP 添加直接通過 A (ip rule add …) 的路由。這不起作用,因為我似乎還必須調整我的防火牆設置。不幸的是,閱讀 iptables 的基礎知識並沒有讓我明白要進行哪些更改。

/edit:嘗試並進一步研究,我認為理論上有兩種解決方案。但是,我不知道如何使它們工作:

  1. 保持上述概念,我需要:
  • 為我的 wan_zone 添加 MASQUERADE(我這樣做了)
  • 添加從 lan 到 wan 和從 wan 到 lan 的 FORWARD 規則(我可以這樣做,但隨後我失去了“vpn 故障保護”),這些規則取決於我要訪問的 IP(我不知道是否以及如何訪問)作品)
  1. 改變概念並擺脫 iptables 而是使用 iproute2 和基於策略的路由(http://www.linupedia.org/opensuse/Policy_Based_Routing
  • 預設情況下,僅通過 vpn 路由所有內容
  • 有條件地通過 A. 直接路由特定 IP

但是,這似乎更加複雜,至少對我來說是這樣,因為我從未使用過它。

/edit:好的,我找到了一個非常適合我需要的解決方案。

我已經設法改進了下面的第一個工作想法。特別是,現在我可以管理要在外部列表中直接路由/轉發到 A 的 ips 列表。我已將以下內容添加到 /etc/firewall.user

# If connection was established before, accept it (so we dont have to deal with inbound connections)
iptables -A forwarding_rule -m state --state ESTABLISHED,RELATED -j ACCEPT
# Read ips from file
FORWARDIPS=$(egrep -v -E "^#|^$" /etc/forward_ip)

# create new iptables and route table entries for each ip in the file
# allow forward if packet matches destination and route it through "table admin", for which we set a default gateway below 
for ipblock in $FORWARDIPS
do
  iptables -A forwarding_rule -d $ipblock -j ACCEPT -p all
  ip rule add to $ipblock table admin
done
~

root@OpenWrt:~# cat /etc/forward_ip 
54.164.36.0/24
8.31.8.0/22     

我需要在啟動時從另一個文件中呼叫以下命令(我將其放入 /etc/rc.local):

# Route everything in table admin by default through ISP-Router
ip route add default via 192.168.0.1 dev eth0 table admin  

還編輯 /etc/iproute2/rt_tables 並添加以下行:

10     admin

/edit,這是我的第一個解決方案:

我找到了解決方案。但是,它可以大大改進。這個想法遵循我在 /edit 1 中的直覺。我為我的 wan 區域啟用偽裝,還為特定目標 IP 在我的 lan 和 wan 區域之間啟用條件轉發。不過,我不能為配置規則添加多個“選項 dest_ip”。因此,最好將我在 uci 防火牆配置中所做的作為 iptables 規則添加到 /etc/firewall.user

我編輯了 /etc/config/firewall 並更改了配置區域並添加了配置規則

config zone
       option input 'ACCEPT'
       option output 'ACCEPT'
       option name 'wan'
       option network 'wan'
       option forward 'REJECT'
       option masq '1'
       option mtu_fix '1'

config rule
       option target 'ACCEPT'
       option src 'lan'
       option dest 'wan'
       option name 'Lan to Wan'
       option proto 'all'
       option dest_ip '54.164.36.190'
       option enabled '0'

經過一番嘗試,我在 /edit 2 中放棄了我的想法,因為有許多無法預料的障礙。例如,如果沒有從 B 到 A 的預設網關,我首先無法建立我的 vpn 連接。儘管如此,我想如果你比我對路由有更好的理解,就可以做到。

引用自:https://serverfault.com/questions/776869