如何在Linux中设置WireGuard防火墙规则

时间:2020-01-09 10:39:44  来源:igfitidea点击:

如何在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