我正在尝试将装有 Linux(CentOS)的旧 PC 设置成另一个家中 VPN 的接入点。我有两个以太网接口,因此我想使用其中一个通过路由器连接到互联网,连接到 VPN,然后通过第二个以太网共享该 VPN 连接。第二个设备上的 IP 应由 DHCP 分配。
我读了很多教程/帖子,我可以在关闭 VPN 的情况下共享普通互联网连接。但是,一旦我启动 VPN,无论我的 iptables/routes 规则是什么,我的第二台设备都无法上网。我不知道我做错了什么。有人能帮忙吗?
这是我的配置: - enp2s0:连接到我的主路由器。 - enp0s29f7u1:这将连接到第二个设备
enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether bc:ee:7b:19:89:68 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.26/24 brd 192.168.1.255 scope global noprefixroute enp2s0
valid_lft forever preferred_lft forever
inet6 fe80::c25c:2c9d:4777:79fc/64 scope link noprefixroute
valid_lft forever preferred_lft forever
enp0s29f7u1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast stat e UP group default qlen 1000
link/ether 00:e0:4c:69:35:d0 brd ff:ff:ff:ff:ff:ff
inet 10.8.0.5/24 brd 10.8.0.255 scope global noprefixroute enp0s29f7u1
valid_lft forever preferred_lft forever
inet6 fe80::2e0:4cff:fe69:35d0/64 scope link
valid_lft forever preferred_lft forever
一旦我连接到我的 VPN,就会有另一个接口,tun0:
tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
link/none
inet 10.8.0.2/24 brd 10.8.0.255 scope global tun0
valid_lft forever preferred_lft forever
inet6 fe80::2d75:64c0:6c21:c9d9/64 scope link flags 800
valid_lft forever preferred_lft forever
我的 /etc/dhcp/dhcpd.conf 有以下选项:
subnet 10.8.0.0 netmask 255.255.255.0 {
range 10.8.0.10 10.8.0.15;
option routers 10.8.0.5;
option domain-name-servers 8.8.8.8, 8.8.4.4;
}
第二台设备的 IP 为 10.8.0.11,因此我猜它工作正常。
我使用 iptables 添加了以下规则:
iptables -t nat -I POSTROUTING 1 -o tun0 -j MASQUERADE
iptables -I FORWARD 1 -i tun0 -o enp0s29f7u1 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD 1 -i enp0s29f7u1 -o tun0 -j ACCEPT
附加信息:
我确实启用了 ip4 转发:
/sbin/sysctl net.ipv4.ip_forward
返回net.ipv4.ip_forward = 1
我可以正常使用另一个家中的 VPN 服务器的 IP 访问互联网。但是,我只能从设置此配置的计算机执行此操作,而不能从通过 连接的设备执行此操作
enp0s29f7u1
。- 这是启动 vpn 之前/之后的路由。
前
ip route
default via 192.168.1.1 dev enp2s0 proto static metric 101
10.8.0.0/24 dev enp0s29f7u1 proto kernel scope link src 10.8.0.5 metric 100
后
路由
0.0.0.0/1 via 10.8.0.1 dev tun0
default via 192.168.1.1 dev enp2s0 proto static metric 101
10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.2
10.8.0.0/24 dev enp0s29f7u1 proto kernel scope link src 10.8.0.5 metric 100
xx.xx.xx.xx via 192.168.1.1 dev enp2s0
128.0.0.0/1 via 10.8.0.1 dev tun0
192.168.1.0/24 dev enp2s0 proto kernel scope link src 192.168.1.26 metric 101
192.168.1.0/24 dev enp2s0 proto kernel scope link src 192.168.1.26 metric 101
我已将我的 VPN 服务器公共 IP 替换为 xx.xx.xx.xx
我在这里遗漏了什么?
编辑:出于绝望,我尝试桥接接口,即使我知道这不是一个好主意。它也没有用。
答案1
您做对了很多事情,所以恭喜您取得如此大的成就。但我觉得有些事情不对。
您的 tun0 默认路由错误:0.0.0.0/1 仅将一半互联网传送到 tun0。您需要另一半。尝试添加 128.0.0.0/1。或者使用“默认”或 0.0.0.0/0 一次性获得两半,但请确保使用比“通过 192.168.1.1 默认”更低的度量。完成此操作后,请参阅我的最后一段。您可能会引入另一个问题。
让我感到困扰的另一件事是,你对 tun 子网和 LAN 子网都使用了 10.8.0.0/24。你可能希望它们是不同的子网。这也表现为路由表中 10.8.0.0/24 的两个重复路由。尝试将 enp0s29f7u1 转移到下一个子网 10.8.1.5/24,并对你的 dhcp 服务器执行相同操作。
subnet 10.8.1.0 netmask 255.255.255.0 {
range 10.8.1.10 10.8.1.15;
option routers 10.8.1.5;
option domain-name-servers 8.8.8.8, 8.8.4.4;
}
除此之外,配置看起来不错。还有一项完整性检查。确保您没有阻塞 VPN 与互联网的连接。您仍然需要一条优先于 0.0.0.0/0 的路由,以便 tun 不会尝试使用自身来访问 VPN 服务器。您的表中必须有一条比 0.0.0.0/0 更具体的路由。我相信您已经有了这条路由,但这是一个常见的错误。
xx.xx.xx.xx via 192.168.1.1 dev enp2s0
为了验证这一点,请确保 tun 接口上的 Rx 计数器增加后建立隧道。
答案2
这是我在别处找不到的答案,但适用于另一种网络拓扑。如果有人在搜索这个,我会发布它。
HOST3
将 openvpn 客户端托管到 vpn 提供商。
我想要的是任何本地主持人都可以选择互联网接入有两种方式:
- 正常情况下(通过 192.168.0.254)
- 通过 VPN 连接(通过 10.81.0.1)
我不得不 :
HOST3
为enp2s0 添加第二个 IP 地址(192.168.0.6)微型代理聆听并受其约束。- 添加第二个路由表
- 使用 netfilter SNAT (或 MASQUERADE)
INTERNET
|
ISP
|
LOCAL NETWORK 192.168.0.0/24
|
+-------------------+---------------------------+
| | |
ISP HOST3 HOST4
ROUTER GATEWAY enp2s0 192.168. 0. 3 enp2s0 192.168.0.4
192.168.0.254 192.168. 0. 6
tun0 10. 81. 0. 13
|
VPN GATEWAY 10.81.0.1
............................................................................
ip rules:
0: from all lookup local
32765: from 192.168.0.6 lookup VPN
32766: from all lookup main
32767: from all lookup default
table [main]:
default via 192.168. 0.254 dev enp2s0 metric 200
10. 81. 0. 0 /16 dev tun0 scope link metric 100
192.168. 0. 0 /24 dev enp2s0 scope link metric 200
table [VPN]:
default via 10. 81. 0. 1 dev tun0 metric 200
192.168. 0. 0 /24 dev enp2s0 scope link metric 100
[Netfilter:NAT]
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
10 600 SNAT all -- * tun0 192.168.0.6 0.0.0.0/0 to:10.81.0.13
ISP 本地网络上每个想要使用 VPN 的主机只需将浏览器配置为使用 192.168.0.6 的代理。
数据包路径:HOST
-->[电子邮件保护]--> tun0(路由表 [VPN])--> 使用 VPN 本地 IP 地址进行 SNAT(否则 openvpn 客户端将丢弃数据包)