Iptables防火墙
Iptables简介
Netfilter/Iptables 是一个包过滤防火墙系统。Netfilter 是 Linux 内核的一个子系统,采用模块化设计,具有良好的可扩充性。Iptables 工具模块能让用户通过它去调用 Netfilter 内核,并允许使用者对数据报进行过滤、地址转换、处理等操作。Iptables 是有状态防火墙。
有状态防火墙和无状态防火墙
有状态防火墙
有状态防火墙会检查数据包中的所有内容、数据特征以及数据的通信通道,还会检查数据包的行为,如果发现任何异常,可以过滤掉可疑数据。此外,有状态防火墙可以跟踪数据的行为方式,对行为模式进行编录。
无状态防火墙
无状态防火墙利用数据包的来源、目的地和其他参数来查明数据是否会构成威胁。这些参数必须由管理员或制造商通过他们事先设置的规则输入。
Netfilter/Iptables的状态信息
netfilter/iptables 有四种有效状态分别为: established(建立)、invalid(无效)、new(新)、related(相关的)。
established
状态 established 指出该信息包属于已建立的连接,该连接一直用于发送和接受信息包并且完全有效。
invalid
状态 invalid 指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。
new
状态 new 意味着该信息包已经或将启动新的连接,或者它尚未用于发送和接受信息包的连接相关联。
related
状态 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 中断过滤程序,将封包放入队列,交给其它程序处理
常用服务和其端口
| 协议名 | 端口号 | 协议名 | 端口号 | 协议名 | 端口号 | 协议名 | 端口号 |
|---|---|---|---|---|---|---|---|
| FTP | 20/tcp | SMTP | 25/tcp | TFTP | 69/udp | SMTP SSL | 465/tcp |
| FTP | 21/tcp | DNS | 53/tcp/udp | HTTP | 80/tcp | IMAP SSL | 993/tcp |
| SSH | 22/tcp | DHCP | 67/udp | POP3 | 110/tcp | POP3 SSL | 995/tcp |
| Telnet | 23/tcp | DHCP | 68/udp | IMAP | 143/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