Iptables基础
核心前提说明
-
以下命令均需 root 权限 执行(或前缀加
sudo)。 -
iptables 规则默认保存在内存中,重启后失效,配置完成后需执行 “保存命令”(见文末)。
-
假设环境:
-
公网网卡:
eth0(可根据实际修改,如ens33、eth1) -
内网网卡:
eth1(内网网段示例:192.168.1.0/24) -
本地回环:
lo(必须放行,否则影响本地服务通信)
场景 1:只允许指定 IP 访问服务器(全局限制)
需求
仅允许 192.168.1.100(内网管理机)和 203.0.113.20(外网固定 IP)访问服务器所有开放端口,拒绝其他所有 IP。
配置命令
# 1. 清空现有规则(可选,首次配置建议执行)
iptables -F
iptables -X
# 2. 放行本地回环(必须保留)
iptables -A INPUT -i lo -j ACCEPT
# 3. 放行已建立的连接(避免连接中断,如 SSH 登录后不被踢掉)
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 4. 允许指定 IP 访问(添加需要放行的 IP)
iptables -A INPUT -s 192.168.1.100 -j ACCEPT # 内网管理机
iptables -A INPUT -s 203.0.113.20 -j ACCEPT # 外网固定 IP
# 5. 拒绝所有其他入站请求(默认策略,放在最后)
iptables -P INPUT DROP逻辑解释
-
-s:指定 “源 IP”(即访问方的 IP)。 -
DROP:默认拒绝所有未匹配的入站流量,安全性最高(需确保已放行必要 IP,否则会失联)。 -
若需添加多个 IP,重复执行
iptables -A INPUT -s 目标IP -j ACCEPT即可。
场景 2:公网仅开放 80/443 端口,22 端口仅指定 IP 访问,内网互通
需求拆解
-
公网(
eth0网卡):仅允许 80(HTTP)、443(HTTPS)端口访问,其他端口拒绝。 -
22 端口(SSH):仅允许
192.168.1.100(内网)和203.0.113.20(外网管理 IP)访问。 -
内网(
192.168.1.0/24网段):所有主机可互通(任意端口、任意协议)。 -
放行已建立的连接,避免通信中断。
配置命令
# 1. 清空现有规则(可选)
iptables -F
iptables -X
# 2. 放行本地回环
iptables -A INPUT -i lo -j ACCEPT
# 3. 放行已建立的连接(关键:允许服务器主动发起的连接返回数据)
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
# 4. 内网互通:允许内网网段(192.168.1.0/24)所有入站流量
iptables -A INPUT -i eth1 -s 192.168.1.0/24 -j ACCEPT # 按内网网卡限制
# 或(不限制网卡,仅按网段):iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
# 5. 22 端口(SSH):仅允许指定 IP 访问
iptables -A INPUT -p tcp --dport 22 -s 192.168.1.100 -j ACCEPT # 内网管理机
iptables -A INPUT -p tcp --dport 22 -s 203.0.113.20 -j ACCEPT # 外网管理 IP
# 6. 公网开放 80/443 端口(TCP 协议)
iptables -A INPUT -i eth0 -p tcp --dport 80 -j ACCEPT # HTTP
iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT # HTTPS
# 7. 默认策略:拒绝所有未匹配的入站流量
iptables -P INPUT DROP
# (可选)放行出站流量(默认通常为 ACCEPT,若需限制可调整)
iptables -P OUTPUT ACCEPT关键参数说明
| 参数 | 作用 |
|---|---|
-i eth0 |
指定网卡(公网网卡),仅匹配该网卡的流量 |
-p tcp |
指定协议(TCP,80/443/22 均为 TCP 协议) |
--dport |
指定 “目标端口”(即服务器开放的端口) |
-s 目标IP |
指定 “源 IP”(仅允许该 IP 访问对应端口) |
-j ACCEPT |
匹配后放行流量 |
-m state --state RELATED,ESTABLISHED |
匹配 “已建立的连接” 或 “与已建立连接相关的流量”(如服务器访问外部后,外部返回的数据) |
场景 3:补充说明(内网互通的其他实现方式)
若内网有多网段(如 192.168.1.0/24 和 192.168.2.0/24),需放行所有内网网段:
# 放行 192.168.1.0/24 网段
iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT
# 放行 192.168.2.0/24 网段
iptables -A INPUT -s 192.168.2.0/24 -j ACCEPT若需允许服务器主动访问内网其他主机(出站流量),确保 OUTPUT 链策略为 ACCEPT(默认通常如此):
iptables -P OUTPUT ACCEPT重要操作:保存 iptables 规则(避免重启失效)
CentOS/RHEL 系统
# 保存规则到配置文件
service iptables save
# 或
iptables-save > /etc/sysconfig/iptables
# 设置开机自启(确保规则加载)
systemctl enable iptables
systemctl start iptablesUbuntu/Debian 系统
默认无内置保存工具,需安装 iptables-persistent:
# 安装工具
apt-get install -y iptables-persistent
# 保存规则(保存后重启自动加载)
netfilter-persistent save
# 或手动保存到文件
iptables-save > /etc/iptables/rules.v4验证与调试命令
# 查看当前 iptables 规则(INPUT 链)
iptables -L INPUT -n --line-numbers
# 测试端口是否可访问(从外部主机执行)
telnet 服务器IP 80 # 测试 80 端口
telnet 服务器IP 22 # 测试 22 端口(仅指定 IP 可通)
# 清空所有规则(出错时紧急恢复)
iptables -F
iptables -X
iptables -P INPUT ACCEPT # 临时放行所有入站,避免失联注意事项
-
先放行关键 IP / 端口:配置
DROP默认策略前,务必先放行 SSH 管理 IP(如192.168.1.100),否则会被踢下线,无法远程恢复。 -
网卡名称确认:通过
ip addr命令查看实际网卡名称(如ens33、eth0),避免配置错误。 -
协议匹配:80/443/22 均为 TCP 协议,需指定
-p tcp;若需开放 UDP 端口(如 53 DNS),需改为-p udp。 -
云服务器安全组:若为云服务器(阿里云、腾讯云等),需同时在云厂商的 “安全组” 中开放对应端口,否则 iptables 配置生效但外部仍无法访问。