适用于Ubuntu 13 Web服务器的IPtables

时间:2020-01-09 10:41:05  来源:igfitidea点击:

服务器配置

我们将使用下面的服务器配置:

名称操作系统角色网络接口
WEBAPP01Ubuntu 13.10Web应用服务器ETH0 172.30.0.50
WEBDB01Ubuntu 13.10MySQL数据库服务器ETH0 172.16.0.22

并且环境中存在以下网络。

网络目的
172.30.0.0/24DMZ
172.16.0.0/24内部生产服务器
172.20.0.0/24IT内部网络

防火墙策略

始终为可公开访问的服务器定义防火墙策略并强制执行。公司或者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脚本以应用我们的新规则。