WireGuard 允许访问网络上的单一服务

WireGuard 允许访问网络上的单一服务

我在 Raspberry Pi 上运行 WireGuard 服务器,使用https://github.com/linuxserver/docker-wireguard图像。我想允许同龄人做两件事:

  1. 通过 SMB 连接到单个 NAS
  2. ping 同一 NAS

我编写了以下 iptables 规则来存档此内容(wg0是 WireGuard 接口,eth0即“朝向”我的网络的接口):

# Reset (flush) rules
iptables -t nat -F
iptables -F

# Allow WireGuard traffic
iptables --policy INPUT ACCEPT
iptables --policy OUTPUT ACCEPT

# Deny any forward traffic by default
iptables --policy FORWARD DROP

# Allow SAMBA traffic to NAS
NAS="192.168.178.23/32"
iptables -A FORWARD -i wg0 -p tcp --dport 445 -d "$NAS" -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o wg0 -m state --state RELATED,ESTABLISHED -j ACCEPT

# Allow ICMP echo request
iptables -A FORWARD -i wg0 -p icmp --icmp-type 8 -d "$NAS" -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -o wg0 -p icmp --icmp-type 0 -m state --state RELATED,ESTABLISHED -j ACCEPT

# NAT tunnel IP to internal IP
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

这些都可以工作,所以当通过 WireGuard 连接时,我可以通过 SMB ping 并挂载 NAS,但我无法 ping 网络中的任何其他服务或访问 NAS 的 HTTP 接口。

不过,我确实有几个问题需要弄清楚我到底做了什么:

  1. INPUT当将/OUTPUT策略设置为 时DROP,什么都不起作用。我的假设是,这是因为 上接收的 WireGuard UDP 数据包wg0被策略丢弃了?
  2. 如果我无论如何都要设置策略并添加ALLOW来自/到 的流量规则wg0,那么效果就是容器无法通过 连接到任何东西,eth0而只能FORWARD连接来自 的流量wg0
  3. RELATED,ESTABLISHED允许流量通过的规则wg0应该只匹配响应 TCP:445 或 ICMP:echo-r​​equest 的流量。无需在其中更具体(例如匹配端口/协议),对吗?
  4. ALLOW不需要规则echo-r​​esponses,因为允许RELATED,ESTABLISHED其上方流量的不太具体的规则将在它之前匹配,对吗?
  5. 由于链上的所有过滤FORWARD,我的假设是我不需要在表链上进行过滤natPOSTROUTING因为 TCP:445 或 ICM:echo-r​​equest 上任何不属于 NAS 的流量无论如何都不会“到达这么远”。这是正确的吗?

答案1

简要回答您的问题:

  1. 是的
  2. INPUT/链OUTPUT用于连接全部接口(loeth0wg0等)。通常,默认情况下,您不希望阻止所有出站流量,因为您最终会花时间排除通常认为理所当然的故障(DNS、DHCP、NTP、使用环回连接的其他进程等)
  3. 是的。通常情况下,只需允许所有连接RELATED,ESTABLISHED而无需任何附加条件即可(如果您已经允许通过一种方式建立连接,则以另一种方式进行对称响应也应该没问题)
  4. 是的
  5. 是的

我认为这iptables处理流程图也会帮助你更好地理解这是如何工作的:

iptables 处理流程图

我这样写规则:

iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# INPUT chain of filter table:

# drop known bad packets
iptables -A INPUT -m state --state INVALID -j DROP
# accept responses to established connections
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# accept ICMP packets
iptables -A INPUT -p icmp -J ACCEPT
# accept loopback connections
iptables -A INPUT -i lo -J ACCEPT
# accept connections to WireGuard listen port
iptables -A INPUT -p udp --dport 51820 -J ACCEPT

# FORWARD chain of filter table:

# drop known bad packets
iptables -A FORWARD -m state --state INVALID -j DROP
# forward responses to established connections
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
# forward ICMP packets from WireGuard network to NAS
iptables -A FORWARD -i wg0 -d 192.168.178.23 -p icmp -J ACCEPT
# forward SMB connections from WireGuard network to NAS
iptables -A FORWARD -i wg0 -d 192.168.178.23 -p tcp --dport 445 -J ACCEPT

# POSTROUTING chain of nat table:

# masquerade all packets forwarded to LAN
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

相关内容