8.5.3 IPtables防火墙应用参考

2025-06-17 16:30:11 更新

(一)IPtables

是Linux系统自带的防火墙,支持数据包过滤、数据包转发、地址转换、基于MAC地址过滤、基于状态过滤、包速率限制等安全功能。

(1)Linux系统防火墙

netfilter是Linux防火墙框架

iptables是Linux防火墙管理工具,基于netfilter

firewalld是Redhat、CentOS等对iptables的包装

ufw 是Debian、Ubuntu等对iptables的包装

(二)作用

  1. 构建Linux主机防火墙
  2. 搭建网络防火墙

(三)IPtables规则

(1)数据包流程图

(2)4表5链(防火墙策略规则)

优先级:raw>mangle>nat>filter

4表

说明

作用

功能

filter表

包过滤(默认)

过滤数据包,即根据规则决定是否允许数据包通过

实现基本网络安全功能,如阻止特定IP地址访问、允许特定端口访问等

nat表

网络地址转换

修改数据包的源或目标地址,实现网络地址转换

实现内网访问外网的功能,或者实现端口映射等

mangle表

包重构

对数据包进行特定修改,如修改TTL字段、标记数据包等

实现一些高级网络功能,如负载均衡、QoS等

raw表

数据跟踪处理

特殊表,在数据包进入连接追踪之前进行处理

特定的场景和需求

链附属于某表

5链

说明

描述

PREROUTING

路由之前规则链

对数据包做路由选择之前

INPUT

数据包入口规则链

收到访问本机地址的数据包时

FORWARD

转发规则链

收到需要转发给其他地址的数据包时(需开启Linux内核ip_forward功能)

OUTPUT

数据包出口规则链

本机向外发送数据包时

POSTROUTING

路由之后规则链

对数据包做路由选择之后

表链关系


工作流程:从上到下逐个匹配规则,匹配上则停止。默认规则在链上所有规则均未匹配上后执行。

(四)语法规则

iptables [OPTIONS] -t table -A chain [MATCH] -j target

表>链>规则

语法:iptables [-t table] command [chain] criteria –j action

table表

command

chain链

criteria规则

action

-t filter/nat/mangle/raw

-A(添尾)

-D(删除)

-I(插头)

-R(替换)

-L(列出)

-F(清空)

-Z(清数)

-N(新链)

-X(删链)

-P(默认)

PREROUTING

INPUT

FORWARD

OUTPUT

POSTROUTING

-p(协议) 默认all

-s(源)

-d(目标)

-i(入网卡)

-o(出网卡)

--sport(源端)

等价--source-port

--dport(目端)

等价--destination-port

--limit(速率)

--mac-source(源)

--state

(INVALID、ESTABLISHED、NEW、RELATED)针对ICMP/TCP/UDP

!(取反)

ACCEPT

DROP

REJECT

LOG

DNAT

SNAT

MASQUERADE

(地址欺骗)

REDIRECT

-A = --append

-Z = --zero

-P = --policy

--dport 8080:9090

-m multiport(离散端口)

--dports 22,80

ACCEPT:允许数据包通过。

DROP:直接丢弃数据包,不给任何回复信息。超时后才会反应。

REJECT:拒绝数据包通过,必要时响应信息。客户端请求后就会收到拒绝信息。

LOG:在/var/log/message文件中记录日志,然后将数据包传递给下一规则

(五)常见语法

(1)查询规则

-t:表名

-n:不解析IP地址

-v:显示出计数器信息,数据包数量和大小

-x:显示计数器精确值

--line-numbers:显示规则的序号(简写为--line)

-L:链名

iptables -t filter -nvxL --line

(2)增加规则


位置

语法

示例

1

尾部添加

iptables -t 表名 -A 链名 匹配条件 -j 动作

iptables -t filter -A INPUT -s 192.168.1.146 -j DROP

2

首部添加

iptables -t 表名 -I 链名 匹配条件 -j 动作

iptables -t filter -I INPUT -s 192.168.1.146 -j ACCEPT

3

指定位置添加

iptables -t 表名 -I 链名 规则序号 匹配条件 -j 动作

iptables -t filter -I INPUT 5 -s 192.168.1.146 -j REJECT

(3)删除规则


规则

语法

示例

1

按规则序号

iptables -t 表名 -D 链名 规则序号

iptables -t filter -D INPUT 3

2

按具体的匹配条件与动作

iptables -t 表名 -D 链名 匹配条件 -j 动作

iptables -t filter -D INPUT -s 192.168.1.146 -j DROP

3

指定表链所有规则

iptables -t 表名 -F 链名

iptables -t filter -F INPUT

(4)修改规则


规则

语法

示例

1

修改指定表中指定链的指定规则

iptables -t 表名 -R 链名 规则序号 规则原本的匹配条件 -j 动作

iptables -t filter -R INPUT 3 -s 192.168.1.146 -j ACCEPT

2

设置指定表的指定链的默认策略

iptables -t 表名 -P 链名 动作

iptables -t filter -P FORWARD ACCEPT

(5)保存&恢复


语法

说明

示例

1

iptables-save

保存iptables规则,将当前配置的防火墙规则保存到一个文件中

iptables-save > /etc/sysconfig/iptables

2

iptables-restore

还原iptables规则,从一个文件中加载之前保存的防火墙规则

iptables-restore < /etc/sysconfig/iptables

(六)转发


方向

描述

1

源NAT(SNAT)

更改所有来自192.168.1.0/24的数据包的源IP地址为123.4.5.100

iptables –t nat –A POSTROUTING –s 192.168.1.0/24 –o eth0 –j SNAT –to 123.4.5.100

2

目的NAT(DNAT)

更改所有来自192.168.1.0/24的数据包的目的IP地址为123.4.5.100

iptables –t nat –A PREROUTING –s 192.168.1.0/24 –i eth1 –j DNAT –to 123.4.5.100

3

端口映射

将访问公网123.4.5.100:2222的数据包转发到内网10.0.0.20:22

iptables –t nat –A PREROUTING -p tcp –d 123.4.5.100 –dport 2222 –j DNAT –to-destination 10.0.0.20:22

iptables –t nat –A POSTROUTING -p tcp –d 10.0.0.20 –dport 22 –j SNAT –to-source 123.4.5.100


(七)配置案例


说明

命令

1

清空已存在策略

iptables -F或 iptables --flush

2

设置默认策略

默认链策略是ACCEPT,改变所有链策略为DROP

iptables -P INPUT DROP

iptables -P FORWARD DROP

iptables -P OUTPUT DROP

3

阻止某个指定IP

BLOCK_THIS_IP="x.x.x.x"

iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP

iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP

iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP

4

允许SSH

允许所有通过eth0接口使用ssh协议连接本机

iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

5

允许某个网段通过ssh连接

iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

6

允许http和https

允许http协议80端口

iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

允许https协议443端口

iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

7

多个策略联合

允许ssh、http、https

iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT

8

允许SSH连接其他主机

iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

9

允许SSH连接指定网段

iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT

10

允许https出去

iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT

11

对web请求做负载均衡

每三个包均衡到指定服务器,需要扩展iptables

iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443

iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443

iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443

12

允许ping

iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT

13

允许ping远程

iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT

iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT

14

允许本地回环

如果没有此规则,将不能通过127.0.0.1访问本地服务,例如ping 127.0.0.1

iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

15

允许内网访问外部网络

eth1连接外部网络,eth0连接内部网络

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

16

允许DNS出去

iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT

iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT

17

允许NIS连接

NIS端口是动态的,当ypbind启动时它分配端口,首先运行 rpcinfo -p 显示得到端口号

iptables -A INPUT -p tcp --dport 111 -j ACCEPT

iptables -A INPUT -p udp --dport 111 -j ACCEPT

iptables -A INPUT -p tcp --dport 853 -j ACCEPT

iptables -A INPUT -p udp --dport 853 -j ACCEPT

iptables -A INPUT -p tcp --dport 850 -j ACCEPT

iptables -A INPUT -p udp --dport 850 -j ACCEPT

18

允许指定网段连接Rsync

iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT

19

允许mysql从指定网段连接

iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT

20

允许sendmail或者postfix

iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT

21

允许IMAP和IMAPS

iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT

iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT

22

允许POP3和POP3S

iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT

iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT

23

预防DOS攻击

iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT

24

端口转发

iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22

iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT

25

包丢弃日志

iptables -N LOGGING#创建新链

iptables -A INPUT -j LOGGING#确保所有连接跳到新链

iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix “IPTables Packet Dropped:” --log-level 7 #自定义名

iptables -A LOGGING -j DROP #丢弃数据包

【参考链接】https://ipset.netfilter.org/