iptables 是一个在 Linux 系统上用于配置 IPv4 数据包过滤和网络地址转换的工具。它允许你设置规则来控制数据包的流向、转发和处理。
1、主要参数的说明
- 表(Table):
-t, --table table_name:指定要操作的表,常见的表有 filter, nat, mangle, raw, security。默认为 filter 表。
- 链(Chain):
-A, --append chain rule-specification:在指定链末尾添加规则。
-D, --delete chain rule-specification:删除指定链中的规则。
-I, --insert chain [rulenum] rule-specification:在指定位置插入规则。
-R, --replace chain rulenum rule-specification:替换指定位置的规则。
-N, --new-chain chain:创建新的用户自定义链。
-X, --delete-chain [chain]:删除指定的用户自定义链。
-F, --flush [chain]:清除指定链中的所有规则。
- 规则规范(Rule Specification):
-s, --source address[/mask]:指定来源 IP 地址或网络。
-d, --destination address[/mask]:指定目标 IP 地址或网络。
-p, --protocol protocol:指定协议,如 tcp, udp, icmp 等。
-i, --in-interface name:指定进入接口。
-o, --out-interface name:指定输出接口。
-j, --jump target:指定动作目标,如 ACCEPT, DROP, REJECT, SNAT, DNAT 等。
-m, --match match:指定匹配模块,如 state, tcp, udp, mac 等。
-g, --goto chain:跳转到指定链。
- 其他选项:
-v, --verbose:显示详细信息。
-n, --numeric:以数字格式显示 IP 地址和端口号。
-c, --set-counters PKTS BYTES:设置计数器的值。
-R, --rename-chain old-chain new-chain:重命名用户自定义链。
-Z, --zero:重置数据包和字节的计数器。
--line-numbers:显示规则的行号。
-L, --list [chain]:列出指定链或所有链的规则。
-S, --list-rules [chain]:以规则格式显示指定链或所有链的规则。
2、常用的命令及其功能:
- 显示规则(List Rules):
iptables -L:显示当前所有的 iptables 规则。
iptables -L -v:显示详细的规则,包括数据包计数。
iptables -L -n:显示数字格式的 IP 和端口号,而不是尝试解析。
- 清除规则(Flush Rules):
iptables -F:清除所有的规则。
iptables -F INPUT:清除 INPUT 链中的所有规则。
- 默认策略(Default Policies):
iptables -P INPUT ACCEPT:设置 INPUT 链的默认策略为接受。
iptables -P OUTPUT ACCEPT:设置 OUTPUT 链的默认策略为接受。
iptables -P FORWARD ACCEPT:设置 FORWARD 链的默认策略为接受。
- 添加规则(Add Rules):
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT:允许来自 192.168.1.0/24 网段的 TCP 端口 22 的流量进入。
iptables -A INPUT -i eth0 -p icmp --icmp-type echo-request -j ACCEPT:允许通过 eth0 接口进入的 ICMP 回显请求。
iptables -A INPUT -j DROP:拒绝所有输入流量。
- 删除规则(Delete Rules):
iptables -D INPUT 5:删除 INPUT 链中编号为 5 的规则。
iptables -D INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT:删除允许指定 IP 地址范围和端口的规则。
- 保存和加载规则(Save and Restore Rules):
iptables-save > filename:保存当前的 iptables 规则到文件中。
iptables-restore < filename:从文件中加载 iptables 规则。
- 其他操作:
iptables -N chainname:创建一个新的用户自定义链。
iptables -X chainname:删除一个用户自定义链。
iptables -Z:重置数据包和字节的计数器。
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT:允许通过防火墙从 eth0 到 eth1 的转发流量。
- 动作包括:
accept:接收数据包。
DROP:丢弃数据包。
REDIRECT:重定向、映射、透明代理。
SNAT:源地址转换。
DNAT:目标地址转换。
MASQUERADE:IP伪装(NAT),用于ADSL。
LOG:日志记录。
3. 示例
- 开放指定的端口
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行 iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问
iptables -A INPUT -p tcp --dport 22 -j ACCEPT #允许访问22端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT #允许访问80端口
iptables -A INPUT -p tcp --dport 21 -j DROP #禁止ftp服务的21端口
iptables -A INPUT -p tcp --dport 20 -j DROP #禁止FTP服务的20端口
iptables -A INPUT -j reject #禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问
- 屏蔽IP
iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令
iptables -I INPUT -s 123.0.0.0/8 -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 124.45.0.0/16 -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 123.45.6.0/24 -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令
- 端口转发
iptables -t nat -A PREROUTING -i eth0 -d 1.2.3.4 -p tcp --dport 2222 -j DNAT --to-destination 192.168.1.200:22
#内网主机192.168.1.200的TCP端口22(SSH)映射到公网服务器1.2.3.4的TCP端口2222
-t nat:指定操作的表为 nat 表,用于网络地址转换。
-A PREROUTING:在数据包进入路由之前的 PREROUTING 链上执行。
-i eth0:指定数据包进入的网络接口。
-p tcp:指定数据包的协议为 TCP。
--dport 8080:指定目标端口为 8080。
-j DNAT --to-destination 192.168.1.100:80:使用 DNAT 动作将目标地址和端口修改为 192.168.1.100 的 TCP 端口 80。