Linux iptables防火墙配置

记录一下实验过程,顺便温习一下linux服务配置的知识

预备知识

Iptables服务不是真正的防火墙,它只是用来定义防火墙规则功能的防火墙管理工具,将定义好的规则交给内核中的netfilter,即网络过滤器来读取,从而真正实现防火墙功能

Iptables命令中设置数据过滤或处理数据包的策略叫做规则,将多个规则合成一条链,叫做规则链。规则链依据处理数据包的位置不同分类:

  • PREROUTING: 在进行路由判断之前所要进行的规则(DNAT/REDIRECT)
  • INPUT:处理入站的数据包
  • OUTPUT:处理出站的数据包
  • FORWARD:处理转发的数据包
  • POSTROUTING: 在进行路由判断之后所要进行的规则(SNAT/MASQUERADE)

Iptables命令常用参数

  • -P:设置默认策略:iptables -P INPUT (DROP|ACCEPT)
  • -F:清空规则链
  • -L:查看规则链
  • -A:在规则链加入新规则
  • -I num:在规则链的头部加入新规则
  • -D num:删除某一条规则
  • -s:匹配来源地址IP/MASK,加叹号”!”表示除这个IP外。
  • -d:匹配目标地址
  • -i 网卡名称:匹配从这块网卡流入的数据
  • -o 网卡名称:匹配从这块网卡流出的数据
  • -p:匹配协议,如 tcp, udp, icmp
  • --dport num:匹配目标端口号
  • --sport num:匹配来源端口号

实验环境

Ubuntu18.04,IP:192.168.43.19
Windows7虚拟机,IP:192.168.43.230

实验过程

一、Ubuntu开放服务

在Ubuntu主机开放HTTP、FTP服务

systemctl start apache2
systemctl start vsftpd

若不存在这些服务则需要安装,安装步骤:

1.安装apache2

sudo apt install apache2

2.安装ftp

sudo apt install vsftpd
sudo mkdir /home/uftp # 建立ftp用户文件夹
sudo useradd -d /home/utfp -s /bin/bash uftp # 新建ftp用户uftp
sudo passwd uftp # 设置uftp的密码
sudo chown uftp:uftp /home/uftp # 将目录的所属者和所属组都改为uftp
sudo vi /etc/vsftpd.user_allowlist # 新建该文件,将`uftp`写进去保存
sudo vi /etc/vsftpd.conf 
# 去掉write_enable=YES前的注释,并添加userlist_enable=YES  userlist_deny=NO
sudo systemctl restart vsftpd

二、Ubuntu下创建防火墙

该防火墙要实现的功能:

  • 清空 INPUT 链
  • 开放回送接口 lo
  • 对所在子网开放 FTP,SSH,HTTP 服务
  • 允许回复包
  • 除此以外,拒绝所有输入数据包。

步骤:

1.新建fw.sh文件,写入:

#!/bin/bash
LAN=192.168.43.0/24
iptables -F INPUT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -s $LAN --dport 21 -j ACCEPT
iptables -A INPUT -p tcp -s $LAN --dport 80 -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -j DROP

2.运行:

sudo bash fw.sh

三、测试

在Windows虚拟机上访问http:

访问ftp服务:

进行ping测试,发现是ping不通的,因为没有开放icmp协议:

接下来改变iptables规则,注释掉设置开放的http服务,增加一个icmp协议:

#!/bin/bash
LAN=192.168.43.0/24
iptables -F INPUT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -s $LAN --dport 21 -j ACCEPT
#iptables -A INPUT -p tcp -s $LAN --dport 80 -j ACCEPT
iptables -A INPUT -p icmp -s $LAN -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -j DROP

测试结果和设置的一样,能ping通ip,但不能访问http服务了:

四、清空、查看与添加规则

通过命令:

iptables -L -n

查看防火墙filter的所有规则,发现有一大堆内容:

可以使用命令清除这些规则:

iptables -F  # 清除预设表filter中的所有规则链的规则
iptables -X  # 清除预设表filter中使用者自定链中的规则

再查看filter表,发现表中什么配置都没有了:

当清空filter链后,发现此时既不能ping通也不能访问http服务了:

现在设定预设规则:

sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT

即丢弃入站和转发的数据包,出站的数据包不做限制

之后配置,开启对80端口的访问:

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

查看规则表,可以清晰地了解到自己配置了什么规则:

五、配置NAT表防火墙

查看本机关于NAT的设置情况:

iptables -t nat -L

在默认情况下NAT是什么都没有的;NAT的默认链是ACCEPT

局域网内封包的传送:

  1. 先经过 NAT table 的 PREROUTING 链;

  2. 经由路由判断确定这个封包是要进入本机与否,若不进入本机,则下一步;

  3. 再经过 Filter table 的 FORWARD 链;

  4. 通过 NAT table 的 POSTROUTING 链,最后传送出去。

例.通过配置NAT防火墙来禁用10.133.15.206的FTP连接:

sudo iptables -t nat -A PREOUTING -p tcp --dport 21 -d 10.133.15.206 -j DROP