moo*_*oon 6 networking router vpn routing openvpn
我的网络看起来像这样:

我正在尝试配置我的路由器,以便子网 (192.168.2.0/24) 通过网关/路由器上的 VPN 隧道 (tun0) 进行路由。
同时,子网 (192.168.1.0/24) 上的客户端直接通过 ppp0 路由出去,即不通过 VPN。
我不想运行 VPN 软件客户端,网络上的某些客户端需要直接访问。例如 Windows 游戏计算机、voip 电话等。
我的路由器还运行一个未绑定的 DNS 服务器,它将 DNS 查找转发到 dnscrypt-proxy。
路由器上的网络接口配置如下:
auto lo
iface lo inet loopback
auto lo:1
iface lo:1 inet static
address 127.0.0.2
netmask 255.0.0.0
auto eth0
iface eth0 inet static
address 192.168.1.1
netmask 255.255.255.0
# Virtual interface
auto eth0:2
iface eth0:2 inet static
address 192.168.2.1
netmask 255.255.255.0
auto eth1
iface eth1 inet static
address 192.168.0.2
netmask 255.255.255.252
auto ppp0
iface ppp0 inet ppp
pre-up ip link set dev eth1 up
provider <isp>
post-down ip link set dev eth1 down
Run Code Online (Sandbox Code Playgroud)
目前我使用的是虚拟接口,即 eth0:2。我还想知道这是否合适或者应该是一个 VLAN,即 eth0.2?
据我所知,唯一的区别是客户端需要一个 VLAN 接口,例如:
/etc/systemd/network/MyEth.network
[Match]
Name=enp10s0
[Network]
DHCP=v4
DNS=192.168.2.1
Address=192.168.2.30/24
Gateway=192.168.2.1
VLAN=vlan2
Run Code Online (Sandbox Code Playgroud)
/etc/systemd/network/MyEth.netdev
[NetDev]
Name=vlan2
Kind=vlan
[VLAN]
Id=2
Run Code Online (Sandbox Code Playgroud)
并且无法跨越子网,例如 192.168.1.10 将无法与 192.168.2.10 通话。
我尝试使用的 iptables 规则如下:
iptables -F
iptables -t nat -F
export WAN=ppp0 # Link to ISP
export INT_IF=eth0 # Interface that serves internal network
export EXT_IF=eth1 # Interface between router and modem
export WAN_TUNNEL=tun0 # VPN tunnel created by OpenVPN
export VPN_VLAN_IF=eth0:2 # Interface internal clients have as their gateway
# Allows internet access on gateway
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
#############
# NAT Rules #
###############################################################################
# VPN
iptables -I FORWARD -i ${VPN_VLAN_IF} -d 192.168.2.0/24 -j DROP
iptables -A FORWARD -i ${VPN_VLAN_IF} -s 192.168.2.0/24 -j ACCEPT
iptables -A FORWARD -i ${WAN_TUNNEL} -d 192.168.2.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o ${WAN_TUNNEL} -j MASQUERADE
###############################################################################
###############################################################################
# NO VPN
iptables -I FORWARD -i ${INT_IF} -d 192.168.1.0/24 -j DROP
iptables -A FORWARD -i ${INT_IF} -s 192.168.1.0/24 -j ACCEPT
iptables -A FORWARD -i ${WAN} -d 192.168.1.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ${WAN} -j MASQUERADE
###############################################################################
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD DROP
echo 1 > /proc/sys/net/ipv4/ip_forward
for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do echo 1 > $f ; done
/etc/init.d/iptables save
Run Code Online (Sandbox Code Playgroud)
我还希望我需要在我的 openvpn 配置中使用 route-nopull,否则网关上的所有内容都将通过 VPN 路由?
默认情况下,当我连接到 OpenVPN 服务器时,我看到:
openvpn[3469]: /sbin/ip route add <ip_of_vpn> dev ppp0
openvpn[3469]: /sbin/ip route add 0.0.0.0/1 via 172.16.32.1
openvpn[3469]: /sbin/ip route add 128.0.0.0/1 via 172.16.32.1
Run Code Online (Sandbox Code Playgroud)
这会导致如下路线:
ip route
0.0.0.0/1 via 172.16.32.1 dev tun0
default dev ppp0 scope link metric 300
<ip_of_vpn> dev ppp0 scope link
128.0.0.0/1 via 172.16.32.1 dev tun0
172.16.32.0/20 dev tun0 proto kernel scope link src 172.16.39.64
192.168.0.0/30 dev eth1 proto kernel scope link src 192.168.0.2
192.168.1.0/24 dev eth0 proto kernel scope link src 192.168.1.1
192.168.2.0/24 dev eth0 proto kernel scope link src 192.168.2.1
<ip_from_isp> dev ppp0 proto kernel scope link src X.X.X.X
Run Code Online (Sandbox Code Playgroud)
我是否需要一条静态路由来将 192.168.2.0/24 路由到 VPN,即到 tun0
小智 5
这可以使用自定义路由表和策略来实现(我最近自己做了一些非常相似的事情)
首先为您的 VPN 创建自定义路由表
echo "10 vpn" >> /etc/iproute2/rt_tables
Run Code Online (Sandbox Code Playgroud)告诉 iproute2 将此路由表用于进出 192.168.2.0 网络的流量
ip rule add from 192.168.2.0/24 table vpn
ip rule add to 192.168.2.0/24 table vpn
Run Code Online (Sandbox Code Playgroud)为 192.168.2.0 网络设置 NAT 伪装
iptables -A FORWARD -i eth0:2 -s 192.168.2.0/24 -j ACCEPT
iptables -A FORWARD -i tun0 -d 192.168.2.0/24 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o tun0 -j MASQUERADE
Run Code Online (Sandbox Code Playgroud)如果未启用,则启用 IP 转发(NAT 需要)
echo 1 > /proc/sys/net/ipv4/ip_forward
Run Code Online (Sandbox Code Playgroud)在您的 OpenVPN 配置中添加以下几行
#Prevents default gateway from being set on the default routing table
route-noexec
#Allows route-up script to be executed
script-security 2
#Calls custom shell script after connection to add necessary routes
route-up /etc/openvpn/route-up.sh
Run Code Online (Sandbox Code Playgroud)在 /etc/openvpn/route-up.sh 中创建自定义 shell 脚本并 chmod +x it
#!/bin/sh
#Clear all routes on vpn routing table (this is to make sure there isn't any crap left over from a previous vpn connection
/sbin/ip route flush table vpn
#Copy routing table from main routing table into vpn table
/sbin/ip route show table main | grep -Ev ^default | while read ROUTE ; do ip route add table vpn $ROUTE; done
#Add default gateway to vpn routing table
/sbin/ip route add default via ${route_vpn_gateway} dev ${dev} table vpn
Run Code Online (Sandbox Code Playgroud)步骤 2 和 3 不会在重新启动后持续存在,因此您需要根据需要将这些部分添加到您的 init 脚本中。
| 归档时间: |
|
| 查看次数: |
10866 次 |
| 最近记录: |