与其他 LAN 用户共享我的 VPN 连接

与其他 LAN 用户共享我的 VPN 连接

我有一台 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 或有线连接到您的局域网,您可以按照以下步骤操作:

  1. 确认连接 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 
      
  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.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+

  3. 设置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标志选项。

  4. 在您的其他设备/计算机上:使用 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 adapterhostapd软件的解决方案:

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

请让我知道这对你有没有用。

相关内容