为所有必需的端口创建单独的规则

# iptables -I INPUT -s 192.168.0.0/24 -p tcp --dport 389 -j ACCEPT
# iptables -I INPUT -s 192.168.0.0/24 -p tcp --dport 88 -j ACCEPT
# iptables -I INPUT -s 192.168.0.0/24 -p tcp --dport 53 -j ACCEPT
# iptables -I INPUT -s 192.168.0.0/24 -p tcp --dport 445 -j ACCEPT
# iptables -I INPUT -s 192.168.0.0/24 -p tcp --dport 135 -j ACCEPT
# iptables -I INPUT -s 192.168.0.0/24 -p tcp --dport 5722 -j ACCEPT
# iptables -I INPUT -s 192.168.0.0/24 -p tcp --dport 464 -j ACCEPT
# iptables -I INPUT -s 192.168.0.0/24 -p tcp --dport 9389 -j ACCEPT
# iptables -I INPUT -s 192.168.0.0/24 -p tcp --dport 139 -j ACCEPT
# iptables -I INPUT -s 192.168.0.0/24 -p udp --dport 389 -j ACCEPT
# iptables -I INPUT -s 192.168.0.0/24 -p udp --dport 88 -j ACCEPT
# iptables -I INPUT -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
# iptables -I INPUT -s 192.168.0.0/24 -p udp --dport 445 -j ACCEPT
# iptables -I INPUT -s 192.168.0.0/24 -p udp --dport 464 -j ACCEPT
# iptables -I INPUT -s 192.168.0.0/24 -p udp --dport 138 -j ACCEPT
# iptables -I INPUT -s 192.168.0.0/24 -p udp --dport 67 -j ACCEPT
# iptables -I INPUT -s 192.168.0.0/24 -p udp --dport 2535 -j ACCEPT
# iptables -I INPUT -s 192.168.0.0/24 -p udp --dport 137 -j ACCEPT

可以看到,我将规则分为 2 部分,其中第一部分允许从 192.168.0.0/24 连接 tcp 端口,第二部分包含接受 udp 端口连接的规则

现在规则部分已经完成,但是如何验证规则是否有效以及如何调试防火墙规则的任何类型的问题?

建议为 iptables 配置一个单独的日志文件。

在这里,我们将使用包含 iptables 的所有日志规则的单独链将规则划分为子链

# iptables -N LOGGER
# iptables -I INPUT 1 -s 192.168.0.0/24 -j LOGGER

使用上述 2 条规则,我们创建了一个新链,它将被 INPUT 链用作参考。
因此,进入 INPUT 链的任何流量都会查看 LOGGER 链中的任何适用规则,并将相应地记录在日志文件中,对我们来说是 /var/log/firewall.log

# iptables -I LOGGER  -p tcp --dport 389 -j LOG --log-prefix="LDAP:  "
 # iptables -I LOGGER  -p tcp --dport 88 -j LOG --log-prefix="Kerberos:  "
 # iptables -I LOGGER  -p tcp --dport 53 -j LOG --log-prefix="DNS  :"
 # iptables -I LOGGER  -p tcp --dport 445 -j LOG --log-prefix="SMB: "
 # iptables -I LOGGER  -p tcp --dport 135 -j LOG --log-prefix="RPC:  "
 # iptables -I LOGGER  -p tcp --dport 5722 -j LOG --log-prefix="SYSVOL:  "
 # iptables -I LOGGER  -p tcp --dport 464 -j LOG --log-prefix="Kerberos pswd:  "
 # iptables -I LOGGER  -p tcp --dport 9389 -j LOG --log-prefix="SOAP:  "
 # iptables -I LOGGER  -p tcp --dport 139 -j LOG --log-prefix="NetLogon:  "
# iptables -I LOGGER  -p udp --dport 389 -j LOG --log-prefix="LDAP:  "
 # iptables -I LOGGER  -p udp --dport 88 -j LOG --log-prefix="Kerberos:  "
 # iptables -I LOGGER  -p udp --dport 53 -j LOG --log-prefix="DNS:  "
 # iptables -I LOGGER  -p udp --dport 445 -j LOG --log-prefix="SMB :"
 # iptables -I LOGGER  -p udp --dport 464 -j LOG --log-prefix="Kerberos pswd:  "
 # iptables -I LOGGER  -p udp --dport 138 -j LOG --log-prefix="Group Policy:  "
 # iptables -I LOGGER  -p udp --dport 67 -j LOG  --log-prefix="DHCP:  "
 # iptables -I LOGGER  -p udp --dport 2535 -j LOG  --log-prefix="DHCP:  "
 # iptables -I LOGGER  -p udp --dport 137 -j LOG  --log-prefix="NetBIOS:  "

如果我们想拒绝所有其他流量连接域服务器,除了 192.168.0.0/24

注意:此规则在任何生产环境中都可能是危险的,因为它会阻止来自上述范围以外的所有其他网络范围的流量

# iptables -I INPUT ! -s 192.168.0.0/24 -j DROP
适用于Red Hat Linux 中Samba 4 的 iptables 规则

下面是可以在域服务器上应用的 iptables 规则。

Samba 4 域服务器所需的端口如下所示(从微软页面收集)

协议和端口用法类型
TCP and UDP 389目录,复制,用户和计算机身份验证,组策略,信任LDAP.
TCP and UDP 88用户和计算机身份验证,森林级信任Kerberos.
TCP and UDP 53用户和计算机身份验证,名称解析,信任DNS.
TCP and UDP 445复制,用户和计算机身份验证,组策略,信任SMB,CIFS,SMB2
TCP 135复制RPC.
TCP 5722文件复制RPC,DFSR(SYSVOL)
UDP 123Windows时间,信任Windows时间
TCP and UDP 464复制,用户和计算机身份验证,信任Kerberos更改/设置密码
UDP Dynamic组策略DCOM,RPC,EPM
UDP 138DFS,组政策DFSN,NetLogon,NetBIOS数据报服务
TCP 9389ADDS Web服务肥皂
UDP 67 and UDP 2535DHCP.DHCP.
UDP 137用户和计算机身份验证,Netlogon,NetBIOS名称解析
TCP 139用户和计算机身份验证,复制DFSN,NetBIOS会话服务,NetLogon

现在有两种方式来配置规则

  • 为每个端口创建单独的规则
  • 为所有端口创建一个规则

第一种方法非常冗长乏味,好处是它对排除故障和调试问题会更有帮助,但仅出于测试目的,我们可以使用第二种更简单的方法。

为多个端口创建单个规则

# iptables -I INPUT -s 192.168.0.0/24 -p tcp -m multiport --dport 389,88,53,445,135,5722,464,9389,139 -j ACCEPT

# iptables -I INPUT -s 192.168.0.0/24 -p udp -m multiport --dport 389,88,53,445,464,138,67,2535,137 -j ACCEPT

可以看到,我们对所有端口使用单一规则(分离 tcp 和 udp 端口)减少了复杂性。

为了记录,我们可以使用上述规则(单独端口的单独规则:建议)或者以下规则

# iptables -I INPUT -s 192.168.0.0/24 -p tcp -m multiport --dport 389,88,53,445,135,5722,464,9389,139 -j LOG --log-prefix="TCP_LOG:  "
# iptables -I INPUT -s 192.168.0.0/24 -p udp -m multiport --dport 389,88,53,445,464,138,67,2535,137 -j LOG --log-prefix="UDP_LOG:  "

为了测试目的,我在我的服务器上应用了这些规则,您可以验证下面的日志

# cat /var/log/firewall.log
Sep 24 15:07:31 test kernel: TCP_LOG:  IN=eth0 OUT= MAC=00:50:56:9e:79:17:00:50:56:8a:71:2b:08:00 SRC=192.168.0.30 DST=192.168.0.61 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=3224 DF PROTO=TCP SPT=1181 DPT=389 WINDOW=64912 RES=0x00 ACK FIN URGP=0

Sep 24 15:07:32 test kernel: TCP_LOG:  IN=eth0 OUT= MAC=00:50:56:9e:79:17:00:50:56:8a:71:2b:08:00 SRC=192.168.0.30 DST=192.168.0.61 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=3262 DF PROTO=TCP SPT=65107 DPT=53 WINDOW=65460 RES=0x00 ACK FIN URGP=0

Sep 24 15:07:32 test kernel: TCP_LOG:  IN=eth0 OUT= MAC=00:50:56:9e:79:17:00:50:56:8a:71:2b:08:00 SRC=192.168.0.30 DST=192.168.0.61 LEN=40 TOS=0x00 PREC=0x00 TTL=128 ID=3248 DF PROTO=TCP SPT=1173 DPT=445 WINDOW=64343 RES=0x00 ACK URGP=0
日期:2020-06-02 22:18:35 来源:oir作者:oir