一般来说:
查看和修改防火墙配置需要管理员权限(root
),在受限端口号范围内打开服务也是如此。这意味着您应该以root用户身份登录,root
或者可以使用sudo
root用户身份运行命令。我将尝试使用可选的标记此类命令[sudo]
。
内容:
- 为了事项或者差
-I
和-A
- 显示当前的防火墙配置
- 解释输出
iptables -L -v -n
- 了解你的环境
- 输入和正向链
- 内核模块
1.订购事宜或者差-I
和-A
要记住的是,防火墙规则是按照列出的顺序进行检查的。当触发允许或禁止数据包或连接的规则时,内核将停止处理链。
我认为 对于新手防火墙管理员来说,最常见的错误是他们遵循正确的说明来打开新端口,例如以下端口:
[sudo] iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT
然后发现它不会生效。
这样做的原因是,该-A
选项在所有现有规则之后添加了新规则,
并且由于现有防火墙中的最终规则通常是阻止所有未明确允许的流量的最终规则,因此
...
7 2515K 327M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
8 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8080
或等价于iptables-save:
...
iptables -A INPUT -j REJECT
iptables -A INPUT -p tcp --dport 8080 -j ACCEPT
并且永远不会达到打开TCP端口8080的新规则。(正如计数器顽固地保留在0个数据包和零个字节中所证明的)。
通过-I
在新规则中插入规则,将是链中的第一个规则,并且可以正常工作。
2.显示当前的防火墙配置
我对防火墙管理员的建议是查看Linux内核正在运行的实际配置,而不是尝试通过用户友好的工具诊断防火墙问题。通常,一旦您了解了潜在的问题,就可以轻松地解决这些工具支持的问题。
该命令[sudo] iptables -L -v -n
是您的朋友(尽管有些人iptables-save
更喜欢)。通常,在讨论配置时,将--line-numbers
选项也用于数字行很有用。参考规则#X会使讨论起来更加容易。
注意: NAT规则包含在iptables-save
输出中,但必须通过添加-t nat
选项单独列出[sudo] iptables -L -v -n -t nat --line-numbers
。
多次运行该命令并检查计数器的增加可能是查看新规则是否真正被触发的有用工具。
[root@host ~]# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 784K 65M fail2ban-SSH tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
2 2789K 866M ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
3 15 1384 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
4 44295 2346K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
5 40120 2370K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:80
6 16409 688K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:443
7 2515K 327M REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT 25 packets, 1634 bytes)
num pkts bytes target prot opt in out source destination
Chain fail2ban-SSH (1 references)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT all -- * * 117.239.37.150 0.0.0.0/0 reject-with icmp-port-unreachable
2 4 412 REJECT all -- * * 117.253.208.237 0.0.0.0/0 reject-with icmp-port-unreachable
另外,的输出iptables-save
提供了可以重新生成上述防火墙配置的脚本:
[root@host ~]# iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [441:59938]
:fail2ban-SSH - [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A fail2ban-SSH -s 117.239.37.150/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 117.253.208.237/32 -j REJECT --reject-with icmp-port-unreachable
COMMIT
优先考虑的是您会更容易理解的内容。
3.解释 iptables -L -v -n
当没有明确的规则匹配时,该策略设置链使用的默认操作。在INPUT
设置为接受所有流量的链中。
INPUT链中的第一个规则立即很有趣,它将发送到TCP端口22(tcp dpt:22
)的所有流量(源0.0.0.0/0和目标0.0.0.0/0)(默认的SSH 端口)发送到自定义目标(fail2ban-SSH
) 。顾名思义,此规则由fail2ban维护(fail2ban(一种安全产品,它会扫描系统日志文件以查找可能的滥用情况并阻止滥用者的IP地址))。
该规则将由iptables命令行创建,类似于iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
iptables-save as或在其输出中找到-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
。通常,您会在文档中找到任何一种表示法。
计数器表明此规则已匹配784'000个数据包和65 MB的数据。
然后,与该第一条规则匹配的流量由fail2ban-SSH
作为非标准链的链在OUTPUT链下方列出。
该链由两个规则组成,每个规则一个(对于每个滥用者)(源ip地址117.253.221.166或58.218.211.166)被阻止(带有reject-with icm-port-unreachable
)。
-A fail2ban-SSH -s 117.253.221.166/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 58.218.211.166/32 -j REJECT --reject-with icmp-port-unreachable
既不允许也不允许不允许那些不是来自那些被阻止的主机的SSH数据包,现在将根据INPUT链中的第二条规则检查自定义链的完成。
并非所有发往端口22的数据包都通过了INPUT链中的第一个规则,并且还将在INPUT规则2中进行评估。
INPUT规则编号2使其打算成为跟踪连接的全状态防火墙。这具有一些优点,只需要对照完整的规则集检查用于新连接的数据包,但是一旦允许,就可以接受属于已建立或相关连接的其他数据包,而无需进一步检查。
输入规则2将匹配所有打开的连接和相关的连接,与该规则匹配的数据包将无需进一步评估。
注意:有状态防火墙的配置中的规则更改只会影响新的连接,不会影响已建立的连接。
相比之下,简单的数据包筛选器会针对整个规则集测试每个数据包,而不跟踪连接状态。在这种防火墙中,不会使用任何状态关键字。
INPUT规则3非常无聊,lo
允许所有连接到回送(或127.0.0.1)接口的流量。
INPUT规则4、5和6用于通过授予对NEW连接的访问权限来打开TCP端口22、80和443(分别是SSH,HTTP和HTTPS的默认端口)(INPUT规则2已允许现有连接)。
在无状态防火墙中,这些规则将显示为没有状态属性:
4 44295 2346K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
5 40120 2370K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
6 16409 688K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0
要么
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
最终的INPUT规则#7是阻止INPUT规则1-7中未授予访问权限的所有流量的规则。一个相当普通的约定:不允许的所有事情都被拒绝。从理论上讲,可以通过将默认POLICY设置为REJECT来省略该规则。
始终调查整个链条。
4.了解你的环境
4.1。软件防火墙中的设置不会影响在网络中其他位置维护的安全设置,即,尽管iptables
使用路由器上未经修改的访问控制列表打开了网络服务,或者网络中的其他防火墙仍可能阻止流量...
4.2。当没有服务在监听时,无论防火墙设置如何,您都将无法连接并出现连接拒绝错误。因此:
- 确认服务正在侦听(在正确的网络接口/ ip地址上)并且正在使用您期望的端口号
[sudo] netstat -plnut
或与一起使用ss -tnlp
。
- 如果您的服务尚未运行,请使用例如netcat:模拟一个简单的侦听器,
[sudo] nc -l -p 123
或者openssl s_server -accept 1234 [options]
如果您需要TLS / SSL侦听器(检查man s_server
选项)。
- 验证您是否可以从本身即服务器连接
telnet <IP of Server> 123
或echo "Hello" | nc <IP of Server> 123
或测试TLS / SSL安全服务时openssl s_client -connect <IP of Server>:1234
,从远程主机试图同前。
4.3。了解您的服务使用的协议。您无法正确启用/禁用您不太了解的服务。例如:
- 是使用TCP还是UDP或同时使用两者(与DNS一样)?
- 服务是否使用固定的默认端口(例如,Web服务器的TCP端口80之类的东西)?
- 或者,是否选择了一个可以变化的动态端口号(例如,向Portmap注册的RPC服务(如经典NFS))?
- 当配置为使用被动模式时,臭名昭著的FTP甚至使用两个端口,一个是固定端口,一个是动态端口号。
- 服务,端口和协议描述
/etc/services
不一定与使用端口的实际服务相匹配。
4.4。内核数据包筛选器不是唯一可能限制网络连接的东西:
- SELinux可能还会限制网络服务。
getenforce
将确认SELinux是否正在运行。
- 尽管TCP Wrappers变得有些晦涩,但它仍然是增强网络安全性的强大工具。检查
ldd /path/to/service |grep libwrap
和/hosts.[allow|deny]
控制文件。
5. INPUT
或FORWARD
链
链的概念在此处进行了更全面的解释,但其简短之处在于:
该INPUT
链是你打开和/或你发出的iptables命令的贴心服务网络端口本地运行,在主机上。
该FORWARD
链是你将规则应用于过滤流量是被内核转发到其他系统,实际的系统,而且Docker容器和虚拟客户服务器的服务器时,你的Linux机器充当网桥,路由器,管理程序和/或做网络地址转换和端口转发。
一个常见的误解是,由于docker容器或KVM guest虚拟机在本地运行,因此适用的过滤器规则应在INPUT链中,但通常不是这种情况。
6.内核模块
由于数据包过滤器在Linux内核中运行,因此它也可以编译为动态模块,实际上是多个模块。大多数发行版都将netfilter作为模块包含在内,并且所需的netfilter模块将根据需要加载到内核中,但是对于某些模块,防火墙管理员将需要手动确保它们已加载。这主要涉及连接跟踪模块,例如nf_conntrack_ftp
可以加载insmod
。
当前加载到正在运行的内核中的模块可以用显示lsmod
。
确保模块在重新引导后能持久加载的方法取决于Linux发行版。