Iptables简介

Netfilter/Iptables 是一个包过滤防火墙系统。Netfilter 是 Linux 内核的一个子系统,采用模块化设计,具有良好的可扩充性。Iptables 工具模块能让用户通过它去调用 Netfilter 内核,并允许使用者对数据报进行过滤、地址转换、处理等操作。Iptables 是有状态防火墙。

有状态防火墙和无状态防火墙

有状态防火墙

有状态防火墙会检查数据包中的所有内容、数据特征以及数据的通信通道,还会检查数据包的行为,如果发现任何异常,可以过滤掉可疑数据。此外,有状态防火墙可以跟踪数据的行为方式,对行为模式进行编录。

无状态防火墙

无状态防火墙利用数据包的来源、目的地和其他参数来查明数据是否会构成威胁。这些参数必须由管理员或制造商通过他们事先设置的规则输入。

Netfilter/Iptables的状态信息

netfilter/iptables 有四种有效状态分别为: established(建立)、invalid(无效)、new(新)、related(相关的)。

established

状态 established 指出该信息包属于已建立的连接,该连接一直用于发送和接受信息包并且完全有效。

invalid

状态 invalid 指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。

new

状态 new 意味着该信息包已经或将启动新的连接,或者它尚未用于发送和接受信息包的连接相关联。

状态 related 表示该信息包正在启动新连接,以及它与已建立的连接相关联。

Netfilter实现

Netfilter 主要通过表、链实现规则。Netfilter 中包含表,表中包含链,链中包含规则,最终形成对数据报处理规则的实现。

规则(rules)

规则(rules) 其实就是网络管理员预定义的条件,规则一般的定义为"如果数据包头符合这样的条件,就这样处理这个数据包"。这些规则分别指定了源地址、目的地址、传输协议 (如TCP、UDP、ICMP) 和服务类型 (如HTTP、FTP和SMTP) 等。当数据包与规则匹配时,Iptables 就根据规则所定义的方法来处理这些数据包,如放行 (accept)、拒绝 (reject) 和丢弃 (drop) 等。配置防火墙的主要工作就是添加、修改和删除这些规则。

链(chains)

链(chains) 是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或者数条规则。

表(tables)

表(tables) 提供特定的功能,Iptables 内置了4个表,即 raw 表、filter 表、nat 表和 mangle 表,分别用于实现包过滤,网络地址转换和包重构的功能。

Iptables命令

iptable [-t 表] -命令 匹配 操作
#默认iptable使用filter表

命令

-P  --policy        <链名>  定义默认策略
-L  --list          <链名>  查看iptables规则列表
-A  --append        <链名>  在规则列表的最后增加1条规则
-I  --insert        <链名>  在指定的位置插入1条规则
-D  --delete        <链名>  从规则列表中删除1条规则
-R  --replace       <链名>  替换规则列表中的某条规则
-F  --flush         <链名>  删除表中所有规则
-Z  --zero          <链名>  将表中数据包计数器和流量计数器归零
-X  --delete-chain  <链名>  删除自定义链
-v  --verbose       <链名>  与-L他命令一起使用显示更多更详细的信息

规则

-i --in-interface    网络接口名>     指定数据包从哪个网络接口进入,
-o --out-interface   网络接口名>     指定数据包从哪个网络接口输出
-p ---proto          协议类型        指定数据包匹配的协议,如TCP、UDP和ICMP等
-s --source          源地址或子网>   指定数据包匹配的源地址
   --sport           源端口号>       指定数据包匹配的源端口号
   --dport           目的端口号>     指定数据包匹配的目的端口号
-m --match           匹配的模块      指定数据包规则所使用的过滤模块

动作

REJECT    阻拦数据包,并返回数据包通知对方。
          返回的数据包有几个选择:
            #1 ICMP port-unreachable
            #2 ICMP echo-reply
            #3 tcp-reset (这个数据包会要求对方关闭联机)
          执行完此动作后将不再对比其他规则,直接中断过滤程序

iptables -A  INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply
DROP    丢弃数据包不予处理,执行完此动作后将不再对比其他规则,直接中断过滤程序
REDIRECT    将封包重定向到另一个端口

iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081
MASQUERADE    改写封包来源IP为防火墙IP,可指定port对应的范围
              执行完此动作后,直接跳往下一个规则链

iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000
LOG    将数据包相关信息记录在 /var/log 中
       详细位置可以查看 /etc/rsyslog.conf 配置文件
       执行完此处理动作后,将会继续对比其他规则

iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"
SNAT    改写封包来源IP为某特定IP或范围IP,可以指定port对应的范围
        执行完此动作后,将直接跳往下一个规则链

iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200
DNAT    改写数据包目的IP为某特定IP或IP范围,可以指定port对应的范围
        进行完此处理动作后,将会直接跳往下一个规则链

iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination 192.168.10.1-192.168.10.10:80-100
MIRROR    镜像数据包,将来源IP与目的IP对调后,将数据包返回
          进行完此处理动作后,将会中断程序
QUEUE    中断过滤程序,将封包放入队列,交给其它程序处理

常用服务和其端口

协议名端口号协议名端口号协议名端口号协议名端口号
FTP20/tcpSMTP25/tcpTFTP69/udpSMTP SSL465/tcp
FTP21/tcpDNS53/tcp/udpHTTP80/tcpIMAP SSL993/tcp
SSH22/tcpDHCP67/udpPOP3110/tcpPOP3 SSL995/tcp
Telnet23/tcpDHCP68/udpIMAP143/tcp

还有一些端口是局域网互联和文件传输相关的:137,138,139,444,445,3358。

不清楚的端口4500-5000

赛题

SNAT规则

源地址为内网地址的IP经过外网网卡ens37时转换为外网地址。

[root@routersrv ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o ens37 -j MASQUERADE
[root@routersrv ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens37 -j MASQUERADE

DNAT规则

实现外网访问网关设备映射到内网服务器上。

AppSrv

[root@routersrv ~]# iptables -t nat -A PREROUTING -d 81.6.63.254 -p udp --dport 53 -j DNAT --to 192.168.100.100
[root@routersrv ~]# iptables -t nat -A PREROUTING -d 81.6.63.254 -p tcp -m multiport --dport 53,80,443,465,993 -j DNAT --to 192.168.100.100

StorageSrv

[root@routersrv ~]# iptables -t nat -A PREROUTING -d 81.6.63.254 -p tcp -m multiport --dport 20,21,137,138,139,444,445,3358,4500:5000 -j DNAT --to 192.168.100.200

默认拒绝和放行必要流量通行

[root@routersrv ~]# iptables -P INPUT DROP
[root@routersrv ~]# iptables -P FORWARD DROP
[root@routersrv ~]# iptables -P OUTPUT DROP
[root@routersrv ~]# iptables -A INPUT -p tcp -m multiport --dport 22 -j ACCEPT
[root@routersrv ~]# iptables -A INPUT -p udp -m multiport --dport 67,68 -j ACCEPT
[root@routersrv ~]# iptables -A FORWARD -p udp -m multiport --dport 53 -j ACCEPT
[root@routersrv ~]# iptables -A FORWARD -p tcp -m multiport --dport 20,21,53,80,443,137,138,139,444,445,3358,4500:5000,465,993 -j ACCEPT
[root@routersrv ~]# iptables -A OUTPUT -p udp -m multiport --dport 67,68 -j ACCEPT