我有一台 PC,它有一个物理 LAN 适配器,连接到 VPN 服务器。有没有办法在同一个 LAN 适配器上设置一个(虚拟)网关接口,以便网络上的其他设备可以将其用作网关,并通过该网关和 VPN 连接传输流量?
我的大部分 ifconfig:
enp0s21f5 Link encap:Ethernet HWaddr 4c:cc:6a:d5:94:96
inet addr:192.168.1.120 Bcast:192.168.1.255 Mask:255.255.255.0
inet6 addr: fe80::76e3:9399:187d:fdad/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
inet addr:10.11.0.2 P-t-P:10.11.0.2 Mask:255.255.0.0
inet6 addr: fdda:d0d0:cafe:1197::1000/64 Scope:Global
inet6 addr: fe80::c9b:2e1b:882:1637/64 Scope:Link
UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
virbr0 Link encap:Ethernet HWaddr 00:00:00:00:00:00
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
这里是路由信息:
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.11.0.1 0.0.0.0 UG 50 0 0 tun0
0.0.0.0 192.168.1.1 0.0.0.0 UG 100 0 0 enp0s21f5
10.11.0.0 0.0.0.0 255.255.0.0 U 50 0 0 tun0
89.238.176.34 192.168.1.1 255.255.255.255 UGH 100 0 0 enp0s21f5
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 enp0s21f5
192.168.1.0 0.0.0.0 255.255.255.0 U 100 0 0 enp0s21f5
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
答案1
@逃犯的答案有效,即使在 Ubuntu 19.04 上也是如此,但如果您不需要为其他 LAN 设备托管互联网连接,那么您可以跳过几个步骤。
如果所有设备都通过 wifi 或有线连接到您的局域网,您可以按照以下步骤操作:
确认连接 VPN 的 PC 可以像路由器一样转发数据包
cat /proc/sys/net/ipv4/ip_forward #(this should return `1`)
如果上述返回的
0
是 而不是1
,则需要像这样启用转发:echo '1' >> /proc/sys/net/ipv4/ip_forward`
[选修的]使其在重启后仍然存在:
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf && sysctl -p
获取在设置 iptables 时使用的适配器名称,使用
ifconfig
或ip link
列出机器上的适配器。这是我的机器上的一个例子:
term-prompt$:> ifconfig -a enp0s31f6: flags=-28605<UP,BROADCAST,RUNNING,MULTICAST,DYNAMIC> mtu 1500 inet 192.168.199.71 netmask 255.255.255.0 broadcast 192.168.199.255 inet6 fe80::ac93:1176:160:e2cd prefixlen 64 scopeid 0x20<link> ether 04:0e:3c:4d:50:ab txqueuelen 1000 (Ethernet) RX packets 90437 bytes 61674092 (61.6 MB) RX errors 0 dropped 20 overruns 0 frame 0 TX packets 178888 bytes 41623722 (41.6 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 device interrupt 16 memory 0xec300000-ec320000 enx00e04c680345: flags=28669<UP,BROADCAST,MULTICAST,DYNAMIC> mtu 1500 ether 00:e0:4c:68:03:45 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1000 (Local Loopback) RX packets 122658 bytes 19677105 (19.6 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 122658 bytes 19677105 (19.6 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 virbr0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.122.1 netmask 255.255.255.0 broadcast 192.168.122.255 ether 52:54:00:19:32:b8 txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 virbr1: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500 inet 192.168.220.1 netmask 255.255.252.0 broadcast 192.168.223.255 ether 52:54:00:0a:f9:8a txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 wlp58s0: flags=-28670<BROADCAST,MULTICAST,DYNAMIC> mtu 1500 ether 80:45:dd:06:00:22 txqueuelen 1000 (Ethernet) RX packets 258636 bytes 148222512 (148.2 MB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 35682 bytes 4577182 (4.5 MB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
帮助:如您所见,我的以太网适配器名为
enp0s31f6
,而我的 Wi-Fi 适配器名为wlp58s0
。这意味着当我iptables
在机器上发出命令时,我必须将其更改wlan+
为wlp+
或wlp58s0
才能使它们正确。我的示例输出中目前没有tun
接口,因为我未连接到任何 VPN 或隧道。隧道接口通常以默认命名约定显示,其为tun{X}
从0 到无穷大的整数。因此,除非您有多个 VPN/隧道和更复杂的路由方案,否则在 iptables 规则中{X}
使用通配符名称应该没问题。tun+
设置
iptables
为 NAT 并转发在本地 LAN 接口上接收的数据包并从 tun 接口(VPN)发送出去iptables -t nat -A POSTROUTING -o tun+ -j MASQUERADE iptables -A FORWARD -i wlan+ -o tun+ -j ACCEPT iptables -A FORWARD -o tun+ -j ACCEPT iptables -A FORWARD -i tun+ -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -i tun+ -j ACCEPT
笔记:
tun+
— 用于上面的 netfilter/iptable 命令 — 是任何适配器名称tun
后跟字符的通配符匹配(例如 tun0、tun1、tun2 等)。 也一样wlan+
。 您需要确保tun+
和wlan+
条目与您机器上的适配器名称匹配,否则转发规则将不会应用于您的数据包,并且事情将无法按预期进行。 阅读更多Red Hat Enterprise Linux 4:参考指南,18.3.3. iptables 参数选项 用于-i
标志选项。在您的其他设备/计算机上:使用 route 命令为 VPN 子网添加路由,并将网关设置为具有 VPN 连接的计算机的 IP(不是 tun,而是 wlan+ 或 en+ 适配器)
例子:如果 VPN 连接的计算机在本地网络上有一个适配器,其 IP 为
192.168.0.100
,并且您的 VPN 可访问网络子网为10.0.0.0/24
。 在没有 VPN 连接的另一台 LAN 计算机上,您需要输入用作192.168.0.100
网关的路由10.0.0.0/24
。在 Windows 上,该命令如下所示:
route add 10.0.0.0 mask 255.255.255.0 192.168.0.100 metric 200 if <interface>
答案2
采用wifi adapter
和hostapd
软件的解决方案:
sudo apt-get install hostapd -y
配置hostapd
interface=wlan0
ssid=Your_WLAN
hw_mode=g # can be b/g/n
wpa=2
wpa_passphrase=PASS
wpa_key_mgmt=WPA-PSK WPA-EAP WPA-PSK-SHA256 WPA-EAP-SHA256
编辑/etc/network/interfaces
auto wlan0
iface wlan0 inet static
hostapd /etc/hostapd/hostapd.conf
address 192.168.0.1
netmask 255.255.255.0
因为你的电脑是路由器,所以你需要启用转发到接口
- 第一种方式
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf && sysctl -p
#持久模式 - 第二名
echo 1 > /proc/sys/net/ip/ipv4/ip_forward
要在启动时启用它并启动它:systemctl enable hostapd && systemctl start hostapd
安装,dnsmasq
因为它将成为您的 dns 和 dhcp 服务器。
sudo apt install dnsmasq
编辑它的conf文件:vi/etc/dnsmasq.conf
interface=lo,wlan0
no-dhcp-interface=lo
dhcp-range=192.168.0.2,192.168.0.254,255.255.255.0,12h
Iptables:
iptables -t nat -A POSTROUTING -o tun+ -j MASQUERADE
iptables -A FORWARD -i wlan+ -o tun+ -j ACCEPT
iptables -A FORWARD -o tun+ -j ACCEPT
iptables -A FORWARD -i tun+ -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i tun+ -j ACCEPT
请让我知道这对你有没有用。