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命令
1 2
| iptable [-t 表] -命令 匹配 操作
|

命令
1 2 3 4 5 6 7 8 9 10
| -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他命令一起使用显示更多更详细的信息
|

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

动作
1 2 3 4 5 6 7 8
| 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
|

1
| DROP 丢弃数据包不予处理,执行完此动作后将不再对比其他规则,直接中断过滤程序
|

1 2 3
| REDIRECT 将封包重定向到另一个端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT--to-ports 8081
|

1 2 3 4
| MASQUERADE 改写封包来源IP为防火墙IP,可指定port对应的范围 执行完此动作后,直接跳往下一个规则链
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000
|

1 2 3 4 5
| LOG 将数据包相关信息记录在 /var/log 中 详细位置可以查看 /etc/rsyslog.conf 配置文件 执行完此处理动作后,将会继续对比其他规则
iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"
|

1 2 3 4
| 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
|

1 2 3 4
| 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
|

1 2
| MIRROR 镜像数据包,将来源IP与目的IP对调后,将数据包返回 进行完此处理动作后,将会中断程序
|

1
| 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时转换为外网地址。
1 2
| [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
1 2
| [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
1
| [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
|

默认拒绝和放行必要流量通行
1 2 3
| [root@routersrv ~]# iptables -P INPUT DROP [root@routersrv ~]# iptables -P FORWARD DROP [root@routersrv ~]# iptables -P OUTPUT DROP
|

1 2 3 4 5
| [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
|
