在Linux服务器管理中,iptables是一款强大且灵活的防火墙工具,它允许管理员定义和管理网络数据包的过滤、NAT(网络地址转换)以及其他数据包处理规则。掌握iptables的使用,对于保障服务器的网络安全至关重要。本文将详细介绍iptables的核心概念、常用命令以及一些实际应用场景。
核心概念
iptables的工作原理是基于“链”(Chains)和“表”(Tables)。
表(Tables):
iptables有几个主要的表,用于处理不同类型的数据包:- filter表:这是默认的表,用于过滤数据包(允许或拒绝)。它包含
INPUT、OUTPUT和FORWARD三个链。 - nat表:用于网络地址转换,例如将私有IP地址转换为公有IP地址(SNAT)或反之(DNAT)。
- mangle表:用于修改数据包的IP头信息,例如TTL(Time To Live)、TOS(Type Of Service)等。
- raw表:用于 exempt(豁免)数据包,使其不再被其他表处理。
- filter表:这是默认的表,用于过滤数据包(允许或拒绝)。它包含
链(Chains):每个表都包含一些预定义的链,它们代表了数据包在经过防火墙时所遵循的处理路径:
- INPUT链:处理进入本地服务器的数据包。
- OUTPUT链:处理从本地服务器发出的数据包。
- FORWARD链:处理在本地服务器上转发(即不属于本地服务器)的数据包。
- PREROUTING链:在数据包进入路由判断之前进行处理(常用于DNAT)。
- POSTROUTING链:在数据包经过路由判断之后,准备离开本地服务器之前进行处理(常用于SNAT)。
规则(Rules):链中包含一系列的规则。当一个数据包进入某个链时,
iptables会按照规则的顺序进行匹配。一旦找到匹配的规则,就会执行该规则指定的“目标”(Target)。目标(Targets):规则执行的目标决定了对数据包的处理方式:
- ACCEPT:允许数据包通过。
- DROP:静默丢弃数据包,不给发送方任何回应。
- REJECT:丢弃数据包,并给发送方发送一个错误消息(如ICMP “port unreachable”)。
- SNAT:源地址转换。
- DNAT:目标地址转换。
- MASQUERADE:一种特殊的SNAT,适用于IP地址动态分配的接口。
常用命令
iptables命令的基本格式是:
iptables [-t table] -<command> <chain> [options] [-j target]
查看规则:
iptables -L:列出filter表中所有链的规则。iptables -L -v:详细列出规则,包括匹配的数据包数量和字节数。iptables -t nat -L:列出nat表中所有链的规则。
添加规则:
iptables -A <chain> -p <protocol> --dport <port> -j ACCEPT:在指定链的末尾添加规则,允许指定协议和端口的流量通过。-A:Append(追加)。-p:Protocol(协议),如tcp, udp, icmp。--dport:Destination Port(目标端口)。--sport:Source Port(源端口)。-s:Source IP address(源IP地址)。-d:Destination IP address(目标IP地址)。
插入规则:
iptables -I <chain> <rule_number> -p <protocol> --dport <port> -j ACCEPT:在指定链的指定位置插入规则。-I:Insert(插入)。<rule_number>:规则的序号,从1开始。
删除规则:
iptables -D <chain> <rule_number>:删除指定链中的指定序号的规则。iptables -D <chain> -p <protocol> --dport <port> -j ACCEPT:删除匹配指定条件的规则。
清空规则:
iptables -F:清空filter表所有链中的所有规则。iptables -t nat -F:清空nat表所有链中的所有规则。
设置默认策略:
iptables -P <chain> <target>:设置链的默认策略(如DROP或ACCEPT)。iptables -P INPUT DROP:将INPUT链的默认策略设为DROP,即默认拒绝所有进入的流量。
实际应用场景
禁止Ping(ICMP):
1iptables -A INPUT -p icmp --icmp-type echo-request -j DROP允许SSH访问(TCP 22端口):
1iptables -A INPUT -p tcp --dport 22 -j ACCEPT允许HTTP/HTTPS访问(TCP 80/443端口):
1iptables -A INPUT -p tcp --dport 80 -j ACCEPT 2iptables -A INPUT -p tcp --dport 443 -j ACCEPT配置NAT(内网穿透): 假设服务器有一个公网IP(eth0)和一个内网IP(eth1),需要将内网IP(如192.168.1.100)的流量通过公网IP访问外部。
1# 允许转发 2echo 1 > /proc/sys/net/ipv4/ip_forward 3# 配置SNAT 4iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 5# 允许内网访问外网 6iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT 7# 允许外网响应到内网 8iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT限制访问频率(SYN Flood保护):
1iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT 2iptables -A INPUT -p tcp --syn -j DROP
保存和加载规则
iptables规则在系统重启后会丢失。为了持久化规则,可以使用以下方法:
iptables-save和iptables-restore:
iptables-save > /etc/sysconfig/iptables:保存当前规则到文件。iptables-restore < /etc/sysconfig/iptables:加载规则。- 许多Linux发行版(如CentOS/RHEL)在安装
iptables-services包后,会提供service iptables save和service iptables restore命令,并在系统启动时自动加载。
firewalld:在较新的Linux发行版中,
firewalld是更常用的动态防火墙管理工具。但了解iptables的底层机制依然很有价值。
总结
iptables是一个强大的网络安全工具,通过理解其链、表、规则和目标的概念,并熟练运用相关命令,可以有效地保护Linux服务器免受未经授权的访问和网络攻击。在配置防火墙规则时,务必谨慎操作,并充分测试,以免意外阻止合法流量。