适用于Ubuntu 13 Web服务器的IPtables
时间:2020-01-09 10:41:05 来源:igfitidea点击:
服务器配置
我们将使用下面的服务器配置:
名称 | 操作系统 | 角色 | 网络接口 |
---|---|---|---|
WEBAPP01 | Ubuntu 13.10 | Web应用服务器 | ETH0 172.30.0.50 |
WEBDB01 | Ubuntu 13.10 | MySQL数据库服务器 | ETH0 172.16.0.22 |
并且环境中存在以下网络。
网络 | 目的 |
---|---|
172.30.0.0/24 | DMZ |
172.16.0.0/24 | 内部生产服务器 |
172.20.0.0/24 | IT内部网络 |
防火墙策略
始终为可公开访问的服务器定义防火墙策略并强制执行。公司或者Web应用程序可能有不同的要求,但是,例如,以下策略将应用于Web服务器及其数据库服务器上的防火墙。
- 默认情况下,所有传入和传出连接都将被丢弃。
- 仅允许来自内部网络的传入SSH连接。
- 仅允许Webapp01和Webdb01之间的端口3306上的TCP连接。
禁用UFW
UFW是Ubuntu计算机上Iptables的基本前端。由于我们将使用IPtables目录允许更多自定义规则,因此我们需要确保未启用UFW。
- 检查是否启用了UFW。
sudo ufw status
- 如果启用了UFW,请禁用它。
sudo ufw disable
创建基本策略脚本
- 创建一个名为iptables-policy.sh的新文件
- 将以下行添加到文件中:
# Drop all packets by default iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP # Drop invalid packets iptables -A INPUT -m state --state INVALID -j DROP iptables -A FORWARD -m state --state INVALID -j DROP iptables -A OUTPUT -m state --state INVALID -j DROP iptables -A INPUT -p TCP -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP iptables -A INPUT -p TCP -m tcp --tcp-flags SYN,RST SYN,RST -j DROP # Allow remote ssh connections from internal network only. iptables -A INPUT -i eth0 -s 172.20.0.0/24 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -d 172.20.0.0/24 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT # Allow MySQL queries to and responses from our database server, WEBDB01, only. iptables -A OUTPUT -o eth0 -d 172.16.0.22 -p tcp --dport 1306 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -s 172.16.0.22 -p tcp --sport 1306 -m state --state ESTABLISHED -j ACCEPT # Allow HTTP traffic in iptables -A INPUT -i eth0 -p TCP --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A OUTPUT -o eth0 -p TCP --sport 80 -m state --state ESTABLISHED -j ACCEPT # Save and apply policy /sbin/service iptables save
- 将更改保存到脚本文件,然后退出文本编辑器。
- 确保脚本可以由我们执行。
sudo chmod u+x ./iptables-policy.sh
- 运行脚本以应用新策略。
./iptables-policy.sh
允许从Ubuntu存储库安装
我们最终将需要从Ubuntu存储库安装系统更新或者新应用程序。我们的基本政策会阻止所有新的传出HTTP连接。要允许这些连接,我们需要在策略脚本中添加一些额外的行。
- 将iptables-policy.sh打开到文本编辑器中。
- 在iptables save命令上方,添加以下行:
# Allow HTTP traffic out iptables -A OUTPUT -o eth0 -p TCP --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p TCP --sport 80 -m state --state ESTABLISHED -j ACCEPT
- 保存更改并退出文本编辑器。
- 这将允许HTTP连接断开,但是如果没有DNS,我们将无法进行名称解析。要允许DNS查找,请参阅下面的"允许DNS查找"。
允许DNS查找
除非我们允许与DNS相关的连接,否则我们将需要通过IP地址连接所有设备。要允许查询DNS服务器,我们需要添加另一个规则。
- 将iptables-policy.sh打开到文本编辑器中。
- 在iptables save命令上方,添加以下行:
# Allow DNS lookups iptables -A OUTPUT -o eth0 -p UDP --dport 53 -m state --state NEW,ESTABLISHED -j ACCEPT iptables -A INPUT -i eth0 -p UDP --sport 53 -m state --state ESTABLISHED -j ACCEPT
- 保存更改并退出文本编辑器。
- 执行iptables-policy.sh脚本以应用我们的新规则。