如何仅允许WireGuard客户端连接,拦截所有其他网络连接?
如何仅允许WireGuard客户端连接,拦截所有其他网络连接?
看起来你是想把Computer A变成只能通过WireGuard内网访问的自托管服务器,彻底切断它和非WireGuard网络的联系对吧?我来一步步给你捋清楚怎么操作,全部在Computer A上设置就行,不用动Main Server那边。
核心思路
先把所有默认的网络连接都设为拦截,然后只放行WireGuard内网相关的必要流量,相当于给Computer A套个“WireGuard专属防护罩”。
具体操作步骤(用iptables,大部分Linux系统都支持)
先设置默认拦截策略
这一步会把所有没被明确允许的连接都挡住,是核心的限制规则:iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -P FORWARD DROP必须放行本地回环流量
本地服务之间的通信(比如Caddy和本地应用)都靠回环接口,不放行的话很多服务会直接崩:iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT放行已建立的连接流量
不然你从WireGuard客户端连上去之后,只能发起请求但收不到回应,得允许已连接的会话继续通信:iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT放行WireGuard内网访问Caddy的流量
假设你的Caddy用的是标准的80(HTTP)和443(HTTPS)端口,直接放行WireGuard整个网段(10.8.0.0/24,和Main Server的配置对应)的访问:iptables -A INPUT -s 10.8.0.0/24 -p tcp --dport 80 -j ACCEPT iptables -A INPUT -s 10.8.0.0/24 -p tcp --dport 443 -j ACCEPT要是你Caddy用了其他端口,把
--dport后面的数字换成你实际用的就行。放行Computer A和Main Server的WireGuard握手流量
得让Computer A能和Main Server保持WireGuard连接,所以允许它往Main Server的WireGuard端口发流量:# 这里替换成你的Main Server的WireGuard内网IP(比如10.8.0.1)或者公网IP iptables -A OUTPUT -d 10.8.0.1 -p udp --dport 51820 -j ACCEPT保存规则防止重启失效
上面的规则只是临时的,重启电脑就没了,得存下来:- 如果你用的是Ubuntu/Debian系,先装持久化工具:
然后保存规则:apt install iptables-persistentiptables-save > /etc/iptables/rules.v4 - 其他系统可以对应找一下保存iptables规则的方法,比如CentOS用
service iptables save。
- 如果你用的是Ubuntu/Debian系,先装持久化工具:
额外注意事项
- 记得修改Computer A的WireGuard配置,把DNS那一行删掉或者留空,毕竟你不想用PiHole,而且我们已经限制了它的外网访问,也不需要公网DNS。
- 测试的时候,先从WireGuard内网的其他客户端(比如你的电脑)访问Computer A的Caddy服务,确认能正常打开;再用没连WireGuard的设备(比如手机连公网)尝试访问Computer A的公网IP,应该是完全连不上的,这就说明规则生效了。
备注:内容来源于stack exchange,提问作者abhisek
相关产品推荐
相关产品推荐

