WireGuard 如何直接使用局域网的 IP 访问

167 天前
 eunrui
本地 阿里云服务器 公司内网
虚拟 IP(wireguard) 10.0.8.2 10.0.8.1(服务端) 10.0.8.3
实际 IP 192.168.1.47 x.x.x.x 192.168.11.222

阿里云上部署用的wg-easy,以下是默认的配置

# Note: Do not edit this file directly.
# Your changes will be overwritten!

# Server
[Interface]
PrivateKey = KA8QwuT3CzNNGGWD9iXl7YxSqtI5urW89+k8oO5bDWM=
Address = 10.0.8.1/24
ListenPort = 51820
PreUp = 
PostUp =  iptables -t nat -A POSTROUTING -s 10.0.8.0/24 -o eth0 -j MASQUERADE; iptables -A INPUT -p udp -m udp --dport 51820 -j ACCEPT; iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; 
PreDown = 
PostDown =  iptables -t nat -D POSTROUTING -s 10.0.8.0/24 -o eth0 -j MASQUERADE; iptables -D INPUT -p udp -m udp --dport 51820 -j ACCEPT; iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; 


# Client: test (6a258866-5164-4ecc-9873-2b1cc4dc6806)
[Peer]
PublicKey = 1jGq3SNpQhm0ucRGpNevW0dnAVYk3y5aFTdb5mk4EHg=
PresharedKey = V9iL5IfalLvZiuGeXRZe3EUtutLnBXJYs5R90RNsbSs=
AllowedIPs = 10.0.8.2/32

# Client: server (9d0012cd-0248-4ee8-b845-c3cbf07172d7)
[Peer]
PublicKey = UqJD/AaTXBLi1kAMZn99TT4eapO8hdtAmyUeK9TdkhY=
PresharedKey = r2WVnILyhEsZNhRhDN5dcfP84xLrQ6/Z9ohGSq0rNLs=
AllowedIPs = 10.0.8.3/32

目前按照上面的虚拟 ip ,可以互相 ping 通,但是没办法直接访问局域网中的 IP ,看过这个帖子/t/857269,按照 1 楼 V 友说的配置的 iptables ,添加到了内网服务器上 wireguard 配置,如下

[Interface]
PrivateKey = qGn5f2GtvQm/5GmudGGgdzb2IBt4nzZYudYDvVfd0H8=
Address = 10.0.8.3/24
DNS = 114.114.114.114

PreUp=iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 192.168.11.222
PostDown=iptables -t nat -D POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 192.168.11.222

[Peer]
PublicKey = cXPP7xJXo/QDDiEiwEfuDsUq1ytjSXsulawokP4eg3Q=
PresharedKey = r2WVnILyhEsZNhRhDN5dcfP84xLrQ6/Z9ohGSq0rNLs=
AllowedIPs = 10.0.8.0/24
PersistentKeepalive = 25
Endpoint = xx.xx.xx.xx:51820

加完虚拟 ip 都无法 ping 通了,请教下大家,这个该怎么加呢。

以下是 wg-easy 分配给我本地的客户端

[Interface]
PrivateKey = IPh0aFShR2hw+53TPLiXvt7kLofdjkxYSPLhG4yvMnc=
Address = 10.0.8.2/24
DNS = 114.114.114.114

[Peer]
PublicKey = cXPP7xJXo/QDDiEiwEfuDsUq1ytjSXsulawokP4eg3Q=
PresharedKey = V9iL5IfalLvZiuGeXRZe3EUtutLnBXJYs5R90RNsbSs=
AllowedIPs = 10.0.8.0/24, 192.168.11.0/24
Endpoint = xx.xx.xx.xx:51820
PersistentKeepalive = 25
2847 次点击
所在节点    程序员
34 条回复
kivmi
167 天前
Endpoint 能不能暴露出来
javazero
167 天前
你要 ping 某个机器的内网 ip 。就要在除了这个机器的 wg 配置里添加 机器的 ip (网段)

反向同理
ovoo
167 天前
楼主的意思是 192.168.1.47 需要使用 192.168.11.222 直接访问内网服务器?
最简单的方法是修改 wg-wasy 生成的配置,
Client:Server 的 Allow IP
kivmi
167 天前
你做 NAT 转换的机器 192.168.11.222 是防火墙吗?
bouts0309
167 天前
看起来貌似是云服务器上的 AllowedIPs 设置的问题?
ovoo
167 天前
@ovoo 接楼上, 修改 AllowIPS ,添加 192.168.11.222/32
spencerseth44
167 天前
我最近也碰到这个问题,我是希望本地的笔记本,能访问公司内网的其他网络设备,我在网上查资料说的是要在公司内网环境里面配置静态路由,不过目前还没有折腾成功
eunrui
167 天前
@kivmi 能暴露出来
eunrui
167 天前
@javazero 我试试
eunrui
167 天前
@ovoo 加了的,docker 启动的时候有给,
```
docker run -d \
--name=wg-easy \
-e WG_HOST=xx.xx.xx.xx \
-e PASSWORD=xxxxxxxxxxx \
-e WG_DEFAULT_ADDRESS=10.0.8.x \
-e WG_DEFAULT_DNS=114.114.114.114 \
-e WG_ALLOWED_IPS=10.0.8.0/24,192.168.11.0/24 \ <===========================
-e WG_PERSISTENT_KEEPALIVE=25 \
-e LANG=chs \
-v ~/.wg-easy:/etc/wireguard \
-p 51820:51820/udp \
-p 51821:51821/tcp \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
--sysctl="net.ipv4.ip_forward=1" \
--restart always\
ghcr.io/wg-easy/wg-easy
```
eunrui
167 天前
@kivmi 不是防火墙,就是一台内网的机器,因为我想访问的那台是麒麟信安的系统,他们还没对 wireguard 提供支持,所以就想着要不把内网 192.168.11.0 段的都能访问算了
eunrui
167 天前
@bouts0309 server 上在启动的时候给了-e WG_ALLOWED_IPS=10.0.8.0/24,192.168.11.0/24
eunrui
167 天前
@ovoo 启动的时候有给 192.168.11.0/24 ,我试试直接指定这个
eunrui
167 天前
@spencerseth44 是的,我也是想这么做,[/t/857269]( https://www.v2ex.com/t/857269) 这个帖子也是这么说,不过到现在配置的一头雾水
eunrui
167 天前
@javazero 现在应该就是这样的,server 和本地都 AllowedIPs = 10.0.8.0/24, 192.168.11.0/24 了,内网服务器 AllowedIPs =10.0.8.0/24
ovoo
167 天前
@spencerseth44 这个需要公司内网里有一台服务器安装 wireguard ( 配置 IP 转发 和 MASQUERADE ) ,内网 IP 加入到 笔记本的 AllowIPs 配置里即可,不用配置静态路由。反过来内网没有安装 wireguard 的机器访问笔记本才需要配置静态路由。
eunrui
167 天前
@ovoo 嗯呢,192.168.11.222 就是我在内网中安装 wireguard 的服务器,因为网络这块儿我不是很懂,chatgpt 问了一些规则,不知道是不是你说的转发那些
```
PreUp = sysctl -w net.ipv4.ip_forward=1

PreUp = iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PreUp = iptables -A FORWARD -i wg0 -o eth0 -s 10.0.8.0/24 -d 192.168.11.0/24 -j ACCEPT
PreUp = iptables -A FORWARD -i eth0 -o wg0 -s 192.168.11.0/24 -d 10.0.8.0/24 -j ACCEPT

PostDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -o eth0 -s 10.0.8.0/24 -d 192.168.11.0/24 -j ACCEPT
PostDown = iptables -D FORWARD -i eth0 -o wg0 -s 192.168.11.0/24 -d 10.0.8.0/24 -j ACCEPT
```
这样配置还是笔记本还是没法 ping 内网,笔记本配置的 AllowIPs=10.0.8.0/24, 192.168.11.0/24 ,
目前还是只有 10.0.8.1 、.2 、.3 这三个能互相 ping 通,上面的规则有什么错误的地方吗,希望指点一下
eunrui
167 天前
➜ ~ ping 10.0.8.1
PING 10.0.8.1 (10.0.8.1): 56 data bytes
64 bytes from 10.0.8.1: icmp_seq=0 ttl=64 time=149.753 ms
64 bytes from 10.0.8.1: icmp_seq=1 ttl=64 time=192.396 ms
64 bytes from 10.0.8.1: icmp_seq=2 ttl=64 time=236.938 ms
64 bytes from 10.0.8.1: icmp_seq=3 ttl=64 time=260.519 ms
64 bytes from 10.0.8.1: icmp_seq=4 ttl=64 time=24.365 ms
64 bytes from 10.0.8.1: icmp_seq=5 ttl=64 time=24.365 ms
64 bytes from 10.0.8.1: icmp_seq=6 ttl=64 time=24.495 ms
^C
--- 10.0.8.1 ping statistics ---
7 packets transmitted, 7 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 24.365/130.404/260.519/97.249 ms

➜ ~ ping 10.0.8.3
PING 10.0.8.3 (10.0.8.3): 56 data bytes
64 bytes from 10.0.8.3: icmp_seq=0 ttl=63 time=44.425 ms
64 bytes from 10.0.8.3: icmp_seq=1 ttl=63 time=46.835 ms
64 bytes from 10.0.8.3: icmp_seq=2 ttl=63 time=44.923 ms
64 bytes from 10.0.8.3: icmp_seq=3 ttl=63 time=46.621 ms
^C
--- 10.0.8.3 ping statistics ---
4 packets transmitted, 4 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 44.425/45.701/46.835/1.045 ms

➜ ~ ping 192.168.11.222
PING 192.168.11.222 (192.168.11.222): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
^C
--- 192.168.11.222 ping statistics ---
3 packets transmitted, 0 packets received, 100.0% packet loss

➜ ~ ping 192.168.11.215
PING 192.168.11.215 (192.168.11.215): 56 data bytes
Request timeout for icmp_seq 0
Request timeout for icmp_seq 1
Request timeout for icmp_seq 2
^C
--- 192.168.11.215 ping statistics ---
4 packets transmitted, 0 packets received, 100.0% packet loss
isAK47
167 天前
试试 192.168.11.0/24 -->192.168.0.0/16 ,还不行的话重点看两边的防火墙
shiyuu
167 天前
给你一个思路吧,首先服务端的 IPV4 转发要开启,也就是 net.ipv4.ip_forward=1 ,如果客户端是 linux 也要打开。

然后服务端和 peer 端的[Interface]下都要加上这条,你是用的 IP 写,我是直接写的端口,自己改成自己对应的端口,也就是服务端和 peer 端都要用 iptables 的策略接管,进行流量的转发,没有 iptables 服务就要装 iptables 服务,把别的防火墙关掉。

PostUp = iptables -A FORWARD -i wg0 -j ACCEPT;iptables -A FORWARD -o wg0 -j ACCEPT;iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;iptables -I INPUT -i wg0 -j ACCEPT;

PostDown = iptables -D FORWARD -i wg0 -j ACCEPT;iptables -D FORWARD -o wg0 -j ACCEPT;iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE;iptables -D INPUT -i wg0 -j ACCEPT;

# 重要:仔细理解我下面这句话,理解这个是关键的。
服务端的[Peer]参数中,AllowedIPs = 意思是指定 IP 段通过这个[Peer]进行传输

客户端的[Peer]参数中(我这个客户端指的就是电脑、手机等)
AllowedIPs = 意思是电脑访问这个 IP 段都通过 wiregurd 隧道进行传输


你的服务器端[Peer]就应该要写成这样,这个服务端 AllowedIPs 的意思就是,整个 wg 通道中,
```sh
# Client: test (6a258866-5164-4ecc-9873-2b1cc4dc6806)
[Peer]
PublicKey = 1jGq3SNpQhm0ucRGpNevW0dnAVYk3y5aFTdb5mk4EHg=
PresharedKey = V9iL5IfalLvZiuGeXRZe3EUtutLnBXJYs5R90RNsbSs=
AllowedIPs = 10.0.8.2/32,192.168.1.0/24

# Client: server (9d0012cd-0248-4ee8-b845-c3cbf07172d7)
[Peer]
PublicKey = UqJD/AaTXBLi1kAMZn99TT4eapO8hdtAmyUeK9TdkhY=
PresharedKey = r2WVnILyhEsZNhRhDN5dcfP84xLrQ6/Z9ohGSq0rNLs=
AllowedIPs = 10.0.8.3/32,192.168.11.0/24
```

然后你的客户端的[Peer]是这样没有问题
```sh
[Peer]
PublicKey = cXPP7xJXo/QDDiEiwEfuDsUq1ytjSXsulawokP4eg3Q=
PresharedKey = V9iL5IfalLvZiuGeXRZe3EUtutLnBXJYs5R90RNsbSs=
AllowedIPs = 10.0.8.0/24, 192.168.11.0/24
Endpoint = xx.xx.xx.xx:51820
PersistentKeepalive = 25
```

# 整个思路串联起来就是:客户端访问 192.168.11.0/24 地址段,就会被电脑丢到 wg 的通道中,192.168.11.0/24 地址段到了服务端,服务端会进行识别,把数据丢到你的# Client: server 这个通道中,因为# Client: server 里[Peer]的 AllowedIPs 已经写了 192.168.11.0/24 往我这里走

# 慢慢理解吧


下面是添加 iptables 参数的解释,PostDown 反之就是执行删除了。

```sh
PostUp 表示在 WireGuard 接口启动后要执行的命令。这些命令包括:

iptables -A FORWARD -i wg0 -j ACCEPT;

允许所有从 wg0 接口进入的流量进行转发。
-A FORWARD:在 FORWARD 链中添加一条规则。
-i wg0:匹配从 wg0 接口进入的流量。
-j ACCEPT:接受并转发该流量。
iptables -A FORWARD -o wg0 -j ACCEPT;

允许所有从 wg0 接口出去的流量进行转发。
-A FORWARD:在 FORWARD 链中添加一条规则。
-o wg0:匹配从 wg0 接口出去的流量。
-j ACCEPT:接受并转发该流量。
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE;

对所有通过 eth0 接口出去的流量进行地址伪装( NAT )。
-t nat:在 nat 表中操作。
-A POSTROUTING:在 POSTROUTING 链中添加一条规则。
-o eth0:匹配通过 eth0 接口出去的流量。
-j MASQUERADE:对流量进行地址伪装。
iptables -I INPUT -i wg0 -j ACCEPT;

允许所有从 wg0 接口进入的流量。
-I INPUT:在 INPUT 链的顶部插入一条规则。

-i wg0:匹配从 wg0 接口进入的流量。
-j ACCEPT:接受该流量。
```

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1054742

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX