与其他局域网用户共享我的VPN连接

我有一台连接到VPN服务器的PC,其中有一个物理LAN适配器。是否可以在同一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

在其他客户端机器上使用“route add”命令,将您的PC作为网关。在您的带有VPN的PC上,您需要接受连接并将传入的连接重定向到VPN接口。 - kukulo
1谢谢 @kukulo, 正是这两个服务器步骤,我真的不知道该如何做或最好的方式。不确定是否需要使用类似 iptables 的东西: {iptables -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT}? 然后重新路由一些东西,例如: {iptables -t nat -A PREROUTING -s 192.168.1.0 -j DNAT --to 10.11.0.1 iptables -t nat -A POSTROUTING -s 192.168.1.0 -d 10.11.0.1 -j MASQUERADE}? 同时,我在上面添加了我的路由表。 - UbuNoob
其他客户端如何连接到您?在我看来,您似乎正在尝试将您的个人电脑作为路由器使用,因此您需要启用IP转发,但您的目标并不清楚。 - fugitive
你可以使用类似于hostapd的工具,获取一个无线适配器,并将其设置为一个接入点,但这仍然不是非常可靠的解决方案。 - fugitive
谢谢@fugitive,是的,我希望它能作为一个路由器,并通过其VPN连接传递来自同一(V)LAN上其他电脑(设备)的流量。通过添加一个无线适配器(或额外的RJ45插口),我相信我可以让它工作,因为在解决这个问题时,我找到了一些相关的操作指南,但如果可能的话,我希望不用添加额外的硬件来实现。我曾经成功地使用一个Linksys/DD-WRT路由器只使用一个端口来实现这个功能,但我现在没有它了,所以我想在我的Ubuntu电脑上让它工作。 - UbuNoob
2个回答

@fugitive的答案适用于Ubuntu 19.04,但如果您不需要为其他局域网设备提供互联网连接,则可以跳过一些步骤。

如果所有设备都通过Wi-Fi或有线连接到您的局域网,您可以按照以下步骤操作:

  1. 确认您的带有VPN连接的计算机可以像路由器一样转发数据包
    cat /proc/sys/net/ipv4/ip_forward  #(应返回`1`)
    

    如果返回的是0而不是1,则需要按如下方式启用转发:

    echo '1' >> /proc/sys/net/ipv4/ip_forward`  
    
    • [可选]使其在重新启动后保持持久化:

      echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf && sysctl -p 
      
  2. 获取适配器名称以在设置iptables时使用 使用ifconfigip 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&lt;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&lt;host&gt; 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.

这是一个很好的回答,但我觉得如果指出上面建立的netfilter规则在接口名称中使用了通配符,会更有帮助。许多人尽管不知道它们的用途,但从未接触过这些通配符。 - 0xC0000022L
感谢你的建议 @0xC0000022L。我已经根据你的建议进行了修改,现在只等待批准。 - wsmyth

使用 wifi适配器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

因为您的PC是路由器,所以您需要启用转发到接口。
第一种方法:`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
编辑其配置文件: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

如果对你来说可以的话,就告诉我一声。

我在家里使用类似的东西,但是用的是树莓派作为防火墙,还有一个旧路由器用来提供无线网络。相比无线适配器,路由器更加可靠。 - fugitive
iptables规则运行得很好。尽管如此,我并不需要安装dnsmasq - danidee
工作得很好,谢谢 :) 对不起这里回复晚了! - UbuNoob
1iptables -A FORWARD -o tun+ -j ACCEPT是不必要的,因为它只是上面的iptables -A FORWARD -i wlan+ -o tun+ -j ACCEPT这一行的更通用版本,而后者已经足够与其他列出的规则结合使用了。(您可以通过检查iptables -L -v -n的字节计数器来验证这一点:对于流量成功但计数器仍保持为0的规则将不会被应用。) - Will