如何在Linux中设置WireGuard防火墙规则
如何在Linux中设置WireGuard防火墙规则(iptables)?
出于公路战士WireGuard和其他目的,您需要设置和配置防火墙规则。
您需要配置NAT(网络地址转换)以允许WireGuard客户端访问Internet。
在Linux中,我们使用称为IP Masquerade的术语。
这意味着一对多NAT(1:Many)。
我们还需要一个FORWARD链规则。
本教程说明如何在Linux中为WireGuard设置NAT和FORWARD防火墙规则。
设置WireGuard防火墙规则的过程
Linux附带了原始iptables和易于使用的前端脚本。
例如,UFW就是这样一种流行的工具。
在使用任何工具之前,我们需要了解确切的iptables规则。
自然,您必须配置WireGuard。
如果没有看到我们的教程:
- CentOS 8 WireGuard VPN入门
- Ubuntu 20.04 Linux WireGuard VPN
- Debian 10设置WireGuard服务器
步骤1:设定NAT防火墙规则
语法如下:
# iptables -t nat -I POSTROUTING 1 -s {sub/net} -o {interface} -j MASQUERADE
确保所有传出数据包都通过VPN转换:
# iptables -t nat -I POSTROUTING 1 -s 10.8.1.0/24 -o eth0 -j MASQUERADE
其中:
-t nat
:为WireGuard设置nat表。- `-I POSTROUTING 1':在位置1插入规则,以更改要发送给POSTROUTING链的数据包。
-s 10.8.1.0/24
:仅当WireGuard wg0接口创建源地址时才进行NAT。-o eth0
:将通过其发送数据包的接口的名称。在这种情况下,eth0连接到Internet。-j MASQUERADE
:告诉(跳转)如果数据包根据给定条件匹配,该怎么办。 MASQUERADE目标仅在POSTROUTING链的nat表中有效。该规则负责将所有WireGuard客户端的流量路由到Internet。
步骤2:接受wg0接口创建的所有流量
允许wg0接口上的所有流量:
# iptables -I INPUT 1 -i {interface} -j ACCEPT # iptables -I INPUT 1 -i wg0 -j ACCEPT
以上规则允许目的地为wg0的数据包。
步骤3:配置FORWARD规则
我们必须通过设置FORWARD规则允许数据包通过WireGuard服务器路由。
语法为:
# iptables -I FORWARD 1 -i eth0 -o wg0 -j ACCEPT # iptables -I FORWARD 1 -i wg0 -o eth0 -j ACCEPT
步骤4:打开WireGuard UDP端口#51194
最后,如下打开UDP端口51194:
# iptables -I INPUT 1 -i eth0 -p udp --dport 51194 -j ACCEPT
步骤5:删除WireGuard iptables规则的命令
我们可以通过删除所有添加的iptabes规则来撤消所有命令,如下所示:
# iptables -t nat -D POSTROUTING -s 10.8.1.0/24 -o eth0 -j MASQUERADE # iptables -D INPUT -i wg0 -j ACCEPT # iptables -D FORWARD -i eth0 -o wg0 -j ACCEPT # iptables -D FORWARD -i wg0 -o eth0 -j ACCEPT # iptables -D INPUT -i eth0 -p udp --dport 51194 -j ACCEPT
步骤6:在Linux上启用IP转发
对于IPv4,我们将以下Linux内核变量设置为在wg0上接受传入的网络数据包,并传递到另一个网络接口(例如eth0),然后进行相应的转发:
# sysctl -w net.ipv4.ip_forward=1
对于IPv6,请尝试以下sysctl命令:
# sysctl -w net.ipv6.conf.all.forwarding=1
步骤7:更新Wireguard配置文件以获得防火墙和路由支持
我们需要告诉WireGuard命令和脚本片段,这些命令和脚本片段将通过以下两个指令执行:
# Turn on NAT when wg0 comes up # PostUp = /path/to/add-nat-routing.sh # Turn of NAT when wg0 goes down # PostDown = /path/to/remove-nat-routing.sh
放在一起:WireGuard的防火墙规则
如下更新您的/etc/wireguard/wg0.conf文件:
# vim /etc/wireguard/wg0.conf
追加在[interface]部分:
PostUp = /etc/wireguard/helper/add-nat-routing.sh PostDown = /etc/wireguard/helper/remove-nat-routing.sh
参考配置:
[Interface] Address = 10.8.0.1/24 ListenPort = 51194 PrivateKey = My_Server_KEY SaveConfig = false PostUp = /etc/wireguard/helper/add-nat-routing.sh PostDown = /etc/wireguard/helper/remove-nat-routing.sh [Peer] # My Linux Desktop PublicKey = My_Linux_Desktop_KEY PresharedKey = My_PRE_SHARED_KEY AllowedIPs = 10.8.0.2/32
使用mkdir命令创建一个新目录:
# mkdir -v /etc/wireguard/helper/
包含使用cat命令显示的add-nat-routing.sh:
# cat /etc/wireguard/helper/add-nat-routing.sh
#!/bin/bash IPT="/sbin/iptables" IPT6="/sbin/ip6tables" IN_FACE="eth0" # NIC connected to the internet WG_FACE="wg0" # WG NIC SUB_NET="10.8.1.0/24" # WG IPv4 sub/net aka CIDR WG_PORT="51194" # WG udp port SUB_NET_6="fd42:42:42:42::/112" # WG IPv6 sub/net ## IPv4 ## $IPT -t nat -I POSTROUTING 1 -s $SUB_NET -o $IN_FACE -j MASQUERADE $IPT -I INPUT 1 -i $WG_FACE -j ACCEPT $IPT -I FORWARD 1 -i $IN_FACE -o $WG_FACE -j ACCEPT $IPT -I FORWARD 1 -i $WG_FACE -o $IN_FACE -j ACCEPT $IPT -I INPUT 1 -i $IN_FACE -p udp --dport $WG_PORT -j ACCEPT ## IPv6 (Uncomment) ## ## $IPT6 -t nat -I POSTROUTING 1 -s $SUB_NET_6 -o $IN_FACE -j MASQUERADE ## $IPT6 -I INPUT 1 -i $WG_FACE -j ACCEPT ## $IPT6 -I FORWARD 1 -i $IN_FACE -o $WG_FACE -j ACCEPT ## $IPT6 -I FORWARD 1 -i $WG_FACE -o $IN_FACE -j ACCEPT
和:
# cat /etc/wireguard/helper/remove-nat-routing.sh
#!/bin/bash IPT="/sbin/iptables" IPT6="/sbin/ip6tables" IN_FACE="eth0" # NIC connected to the internet WG_FACE="wg0" # WG NIC SUB_NET="10.8.1.0/24" # WG IPv4 sub/net aka CIDR WG_PORT="51194" # WG udp port SUB_NET_6="fd42:42:42:42::/112" # WG IPv6 sub/net # IPv4 rules # $IPT -t nat -D POSTROUTING -s $SUB_NET -o $IN_FACE -j MASQUERADE $IPT -D INPUT -i $WG_FACE -j ACCEPT $IPT -D FORWARD -i $IN_FACE -o $WG_FACE -j ACCEPT $IPT -D FORWARD -i $WG_FACE -o $IN_FACE -j ACCEPT $IPT -D INPUT -i $IN_FACE -p udp --dport $WG_PORT -j ACCEPT # IPv6 rules (uncomment) # ## $IPT6 -t nat -D POSTROUTING -s $SUB_NET_6 -o $IN_FACE -j MASQUERADE ## $IPT6 -D INPUT -i $WG_FACE -j ACCEPT ## $IPT6 -D FORWARD -i $IN_FACE -o $WG_FACE -j ACCEPT ## $IPT6 -D FORWARD -i $WG_FACE -o $IN_FACE -j ACCEPT
确保也使用文本编辑器创建以下文件:
# vim /etc/sysctl.d/10-wireguard.conf
添加以下文本:
net.ipv4.ip_forward=1 net.ipv6.conf.all.forwarding=1
重新加载所有更改并打开NAT路由:
# sysctl -p /etc/sysctl.d/10-wireguard.conf # chmod -v +x /etc/wireguard/helper/*.sh # systemctl restart [email protected]
更新客户端配置文件
您必须告诉Wireguard客户端远程服务器是客户端网关。
换句话说,我们将覆盖客户端上的默认路由。
在[Peer]部分中,按如下所示在客户端上编辑/etc/wireguard/wg0.conf。
AllowedIPs = 0.0.0.0/0
配置参考:
# Config client for Linode VPN # [Interface] ## This Desktop/client's private key ## PrivateKey = {KEY_GOES_HERE} ## Client ip address ## Address = 10.8.0.2/24 [Peer] ## Remote Ubuntu 20.04 wg0 server public key ## PublicKey = {KEY_GOES_HERE} ## set ACL ## ################################################# ## Allow remote server as gateway ## Edit/Update old AllowedIPs entry as follows ## Otherwise client won't show server's IP ################################################# AllowedIPs = 0.0.0.0/0 ## Your Ubuntu 20.04 LTS server's public IPv4/IPv6 address and port ## Endpoint = {SERVER_IP_HERE}:51194 ## Key connection alive ## PersistentKeepalive = 15
验证
从客户端测试您的配置。
查看是否可以使用ping命令,dig命令/主机命令和Web浏览器访问Internet:
Hyman@client:~$ ping -c 4 1.1.1.1 Hyman@client:~$ host www.theitroad.local ## See if you can access WG based DNS server too (must be configured) ## Hyman@client:~$ dig -p 53 www.google.com 10.8.0.1 ## View routing using the ip command ## Hyman@client:~$ ip r ## We must get our WireGuard public IP address ## ## Find public IP address from command line on Linux ## Hyman@client:~$ dig TXT +short o-o.myaddr.l.google.com @ns1.google.com