首先我要说一下,我是 Centos 新手,因此非常欢迎所有信息、链接和建议!
我最近用 Centos 6 设置了一个托管服务器,并将其配置为 Web 服务器。运行在其上的网站没什么特别的,只是一些流量较低的项目。我尝试将服务器配置为尽可能默认,但我也希望它是安全的(没有 ftp,自定义 ssh 端口)。
在让我的 Wordpress 按预期运行的过程中,我遇到了一些连接问题。有两件事不起作用:
- 通过 ssh2 安装插件和更新(无法连接到 localhost:sshportnumber)
- 使用 Gmail smtp 从我的网站发送电子邮件(无法连接到服务器:权限被拒绝(13))
我感觉这两者都与 iptables 配置有关,因为我已经尝试了其他所有方法(我认为)。我尝试打开防火墙以接受端口 465(gmail smtp)和 ssh 端口(假设此端口为 8000)的流量,但两个问题仍然存在。不过,来自终端的 ssh 连接工作正常。每次尝试实施更改后,我都会重新启动 iptables 服务。
这是我的 iptables 配置(使用 vim):
# Generated by iptables-save v1.4.7 on Sun Jun 1 13:20:20 2014
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m tcp --dport 8000 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 465 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 8000 -j ACCEPT
-A OUTPUT -p tcp -m tcp --dport 465 -j ACCEPT
COMMIT
# Completed on Sun Jun 1 13:20:20 2014
考虑到上述问题,我的 iptables 设置是否存在任何(明显的)问题?说防火墙在这种状态下什么也不做也是一个答案……
再说一次,如果您对我提高安全性有任何其他建议(考虑到我对这个盒子所做的基本事情),我很乐意听到,包括那些显而易见的建议!
谢谢!
答案1
我注意到,您的 OUTPUT 链的默认策略是 ACCEPT。因此,如果 OUTPUT 链底部没有任何 DROP 或 REJECT 规则,您的WordPress iptables规则允许所有流量从任意端口传出。
因此需要澄清的是,在上述配置中,全部允许流量通过OUTPUT链。
检查 /var/log/audit/audit.log 中的 selinux AVC 拒绝,因为权限被拒绝可能表明 httpd 无法连接到 SMTP 网络端口来发送电子邮件。
无论如何,您还应该检查 /var/log/maillog 以查看是否被拒绝授予权限,当然还要确保 postfix/sendmail 确实在本地运行且可用。
如果你无法安装插件等,这几乎肯定会是一个wordpress 文件权限问题,您可以在下面的链接中查看。
希望这会有所帮助,虽然我知道你的问题有些老旧,但它在谷歌上对该主题的搜索量确实很高,所以也许这可能会对其他人有所帮助。
答案2
就我个人而言,我的根文件夹中有一个 shell 脚本,我可以运行它来添加我的 iptables 规则,我只需在需要添加新规则时更新它,然后运行该脚本,我还有一个脚本可以打开所有端口以查看是否存在防火墙问题导致我出现问题(这是我的个人服务器,上面没有任何关键业务,如果上面有任何值得窃取的东西,我不建议您长时间打开所有端口)。
但是如果您能够测试,我建议您将其保存在机器本地(在我看来,根文件夹是个好地方,因为只有 root 才能看到这些文件,然后将其权限设置为 700(chmod 700 filename.sh - 我将其称为firewall.sh 和firewallopen.sh)):
#!/bin/bash
#
# iptables config script
#
# Flush all current rules from iptables
#
iptables -F
#
iptables -P INPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -P OUTPUT ACCEPT
#
# Set access for localhost
#
iptables -A INPUT -i lo -j ACCEPT
#
# Accept packets belonging to established and related connections
#
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#
# Save settings
#
/sbin/service iptables save
#
# List rules
#
iptables -L -v
然后创建一个类似的文件来锁定您的服务器(我在脚本开始时删除所有规则以确保没有意外结果 - 注意我接受来自我的服务器的所有传出连接):
#!/bin/bash
#
# iptables config script
#
# Flush all current rules from iptables
#
echo "Clearing old rules"
iptables -F
#
echo "Adding new rules"
# Example rules
# Allow SSH connections on tcp port 22
iptables -A INPUT -p tcp --dport 22 -j ACCEPT -m comment --comment "SSH"
# Set default policies for INPUT, FORWARD and OUTPUT chains
#
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
#
# Set access for localhost
#
iptables -A INPUT -i lo -j ACCEPT
#
# Accept packets belonging to established and related connections
#
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#
# Save settings
#
/sbin/service iptables save
#
# List rules
#
iptables -L -v
您可以在此文件中添加任何您想要设置的类似规则,我倾向于对所有内容进行评论,以确保我稍后返回时不会出现脑筋急转弯。
有了这两个脚本后,您可以轻松快速地打开和关闭防火墙,然后测试禁用防火墙后问题是否仍然存在。然后,您可以轻松地将其重新打开。
在 CentOS 上要考虑的一个非常重要的事情是安全增强 (SE) Linux,如果使用得当,它是一个强大的工具,但在第一次设置系统时可能会使您陷入困境,如果禁用防火墙不能解决问题,我会尝试禁用 selinux 进行测试(如果这解决了您的问题,那么您可以保持 SE Linux 处于禁用状态,这会不太安全,或者您可以研究使用 audit2allow 构建自己的 SE linux 策略)
要禁用 SE Linux:
setenforce 0
您可能还需要同时重新启动您的网络托管服务(假设您使用的是 httpd/apache):
service httpd restart
然后您可以重新测试,重新打开,只需:
setenforce 1
我希望这有帮助 :)