iptables常用命令与实例:从开放端口到配置NAT防火墙

发布于 2025-10-29 分类: Linux

本章将是你日常工作中随时可以查阅的实用手册,聚焦于 iptables常用命令与实例,让你从理论走向实践。

我们将学习iptables的语法,通过一系列由浅入深的实战演练,将理论知识转化为坚不可摧的防火墙规则,让你从一个旁观者,变成一个能够熟练指挥“网络门卫”的指挥官。

基本命令结构解析

一个典型的iptables命令看起来像这样:

iptables [-t 表名] 操作命令 [链名] [规则匹配条件] [-j 动作]

让我们来拆解这个结构:

  • -t 表名 (Specify Table):

    • 用于指定要操作的表,如 -t nat
    • 如果省略此参数,默认操作的是 filter。这是最重要的一个约定,因为我们大部分时间都在和 filter 表打交道。
  • 操作命令 (COMMAND):

    • 这是你对规则要做的主要动作,就像文件的增删改查。
    • -L (List): 查看指定链的规则。
    • -A (Append): 在链的末尾追加一条新规则。
    • -I (Insert): 在链的开头或指定位置插入一条新规则。例如 iptables -I INPUT 2 ... 表示插入到INPUT链的第2个位置。
    • -D (Delete): 删除一条规则,可以按规则内容或编号删除。
    • -R (Replace): 替换一条规则。
    • -F (Flush): 清空指定链的所有规则。
    • -P (Policy): 设置链的默认策略(当所有规则都不匹配时执行的动作,如 ACCEPTDROP)。
  • 链名 (Chain):

    • 指定操作在哪一个链上进行,如 INPUT, OUTPUT, POSTROUTING 等。
  • 规则匹配条件 (Matches):

    • 用来定义规则的生效范围,这部分参数非常丰富。
    • -p (Protocol): 协议,如 tcp, udp, icmp
    • -s (Source): 源地址,可以是IP或网段(如 192.168.1.100192.168.1.0/24)。
    • -d (Destination): 目的地址。
    • -i (In-interface): 数据包进入的网卡,如 eth0
    • -o (Out-interface): 数据包出去的网卡。
    • --sport (Source Port): 源端口。
    • --dport (Destination Port): 目的端口。
  • -j 动作 (Jump to Target):

    • 如果数据包满足所有匹配条件,就执行这个动作,如 ACCEPT, DROP, REJECT, MASQUERADE, DNAT 等。

最佳实践命令:iptables -L -n -v --line-numbers
这是查看规则时最推荐的组合,也是 iptables常用命令 中排查问题的利器:

  • -L: 列出规则。
  • -n (Numeric): 以数字形式显示IP和端口,而不是尝试解析成域名和服务名,速度更快,显示更清晰。
  • -v (Verbose): 显示详细信息,包括通过规则的数据包计数器(pkts)和字节数(bytes),这在排错时至关重要。
  • --line-numbers: 显示规则的行号,方便我们按编号进行插入或删除操作。

实战演练:三大核心iptables常用命令与实例

警告: 以下操作会修改您服务器的防火墙规则。如果您是通过SSH远程操作,请确保您有其他方式(如KVM、VNC或物理接触)可以访问服务器,以防错误地将自己锁在外面。一个常见的保险做法是先设置一个 at 定时任务,在几分钟后清空所有防火墙规则。

任务一:配置安全防火墙 (filter 表) - 基础iptables实例

我们的目标是:构建一个“默认拒绝,按需允许”的安全防火-墙,只开放必要的服务端口。

第1步:清空规则并设置默认DROP策略

# 1. 清空所有链的规则
iptables -F
iptables -X  # 删除所有自定义链
iptables -Z  # 清零所有链的计数器

# 2. 设置默认策略(这是安全的核心)
iptables -P INPUT DROP     # 默认丢弃所有进入的包
iptables -P FORWARD DROP   # 默认丢弃所有转发的包
iptables -P OUTPUT ACCEPT  # 默认允许所有出去的包 (对于服务器而言,通常是安全的)

解释:我们首先清空了场地,然后告诉“门卫”,对于所有来访者(INPUT)和路过者(FORWARD),如果没有我的特别许可,一概DROP。而对于自己人出去(OUTPUT),则全部放行。

第2步:放行基础和状态相关连接

# 允许本地回环接口 (lo) 的所有流量,本机服务间通信需要它
iptables -A INPUT -i lo -j ACCEPT

# 允许已经建立的、相关的连接通过
# 这是实现“状态防火墙”最关键的一条规则!
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

解释:第一条规则保证了服务器内部服务正常通信。第二条规则是精髓所在:它告诉门卫,对于一个已经“登记”并允许进入的连接(ESTABLISHED状态),后续的所有数据包都自动放行。这样,我们就不需要为返回的数据包再写一条反向规则了。

第3步:使用iptables命令开放常用服务端口

# 开放SSH端口 (22),让我们能远程管理
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 开放HTTP端口 (80)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# 开放HTTPS端口 (443)
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# (可选) 允许特定IP或IP段访问所有端口
# iptables -A INPUT -s 123.123.123.123 -j ACCEPT

第4步:(可选) 允许ICMP (ping) 请求

# 允许ping请求,方便网络诊断
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

现在,一个基础但坚固的防火墙已经配置好了!


任务二:实现共享上网 (NAT) - iptables NAT命令实例

这个场景下,你的Linux主机作为路由器,连接了公网(eth0)和内网(eth1)。我们要让内网的电脑通过它上网。

第1步:开启内核转发

# 临时开启
echo 1 > /proc/sys/net/ipv4/ip_forward

# 永久开启,需要修改 /etc/sysctl.conf 文件,将 net.ipv4.ip_forward 的值改为1
# 然后执行 sysctl -p 使其生效

解释:Linux内核默认是关闭IP转发功能的,我们必须先打开这个总开关,允许它充当路由器。

第2步:配置地址伪装 (MASQUERADE)

# 在nat表的POSTROUTING链上添加规则
# 将所有从内网(eth1)来,往外网(eth0)去的数据包的源地址,伪装成eth0的地址
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

解释:这条规则是共享上网的核心。-t nat 指定操作nat表。-A POSTROUTING 表示在数据包即将离开的最后一刻进行操作。-o eth0 匹配那些将要从eth0网卡出去的包。-j MASQUERADE 是一个特殊的SNAT,它会自动获取eth0的IP地址来做源地址转换,特别适用于eth0是动态IP(如拨号上网)的场景。如果你的eth0是固定IP,也可以用SNATiptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source <你的公网IP>


任务三:配置端口转发发布内网服务 (DNAT) - iptables端口转发实例

假设你有一个内网Web服务器 192.168.1.100,现在你想把路由器的公网IP的8080端口映射到它的80端口上。

第1步:配置端口转发规则 (DNAT)

# 在nat表的PREROUTING链上添加规则
# 将所有从外网(eth0)进入,访问TCP 8080端口的包,其目的地址改为192.168.1.100:80
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80

解释-A PREROUTING 表示在数据包刚进入,路由决策之前就修改目的地址,这样内核才能正确地将其转发到内网。-j DNAT 就是目的地址转换动作。

第2步:在filter表中放行转发流量
注意! 仅仅做了DNAT是不够的!数据包被修改了目的地址后,会进入FORWARD链,而我们之前已经把FORWARD链的默认策略设为了DROP。所以,必须明确放行这个转发流量。

iptables -A FORWARD -i eth0 -o eth1 -d 192.168.1.100 -p tcp --dport 80 -j ACCEPT

解释:这条filter表的规则允许从外网(-i eth0)进入,去往内网(-o eth1),目的地是 192.168.1.10080 端口的数据包通过FORWARD链。这是新手配置端口转发时最容易忘记的一步。


-- 感谢阅读 --