标签:操作 用户空间 默认 转换 指定 顺序 raw 方向 四种
iptables 是 Linux 内核集成的防火墙系统, 几乎所有 Linux 发行版都会内置 iptables。
iptables 对进出的 IP 数据报进行处理和过滤, 过滤规则(rule)存储在4个表(table)中, 表中的规则又组成了数条完整的规则链(chain)。
iptables 可以追踪数据包所属的连接(TCP/UCP/ICMP协议)及其状态,允许根据连接状态进行处理和过滤。
iptables 中有四张表, 优先级从高到低是:
表中的规则构成了链:
在运行中 iptables 可能处理三种场景:
虽然我们通常将 iptables 视为单个实体, 但实际上它由两部分组成: 执行数据包过滤处理的内核模块 netfilter 和运行于用户空间的过滤规则配置工具 iptables。
iptables 是有状态的防火墙,使用 ip_conntrack 模块进行连接跟踪。ip_conntrack 可以实时追踪本机的 ICMP/TCP/UDP 流并保存在内存中。
根据数据包在连接中的角色,将数据包分为四种状态:
连接追踪允许我们根据包的连接状态进行过滤。比如我们只允许本地 80 端口的 HTTP 服务器进行响应而不允许通过 80 端口主动向外请求,那么在本地 80 端口的出方向上只允许 ESTABLISHED 状态的包不允许 NEW 状态数据包即可。(通常情况下 HTTP 服务器进程是可以主动向外请求的,但是本地地址不会是 80 端口)
入站数据流和转发数据流是在 PREROUTING 链中进行连接追踪的(即标记所属连接和状态), 出站数据流在 OUTPUT 链中进行状态追踪。使用 RAW 表可以配置数据流绕过状态追踪。
iptables -h
可以查看 iptables 自带的帮助手册。
我们将 iptables 命令分解为几部分:
iptables -t <table> <cmd> <pattern> <action>
-t <table>
或 --table <table>
选项用来指定要查看或修改的表(raw, mangle, nat, filter)。
常用的 iptables 命令选项(上文中的<cmd>
部分)包括:
-L <chain>
/ --list <chain>
: 列出某条规则链中所有规则, 不指定 chain
参数则列出指定表中所有链上的规则。iptables 会按照列出的顺序依次尝试匹配规则并执行匹配的动作。规则可用链上的序号来描述,第一条规则的序号为1(不是编程语言常见的0)。
-L -V
/ -L --verbose
会显示更详细的内容-A <chain>
/ --append <chain>
: 在规则链的末尾添加规则, 规则的内容由后面的匹配选项<pattern>
和动作<action>
两部分来描述-I <chain> <index>
/ --insert <chain> <index>
: 在规则链的指定位置插入规则。-i INPUT 2
会在INPUT链第2个位置插入一条规则,原第2条及以后的规则均后移一位- R <chain> <index> /
/ --replace <chain> <index>
: 替换规则链指定位置上的规则-D <chain>
/ --delete <chain>
: 删除链上某条规则,可以使用序号指定某条规则或者使用匹配和动作完整描述规则进行删除-F <chain>
/ --flush <chain>
: 删除链上的全部规则-P <chain> <action>
/ --policy <chain> <action>
: 修改某条链的默认策略, 示例iptables -P filter ACCEPT
iptables 的规则(<pattern>
)包含匹配条件和动作两部分。可以根据网络接口、地址、协议等进行匹配:
-i
/ --in-interface
: 进入的网络接口,如以太网eth, 本地回环lo。-o
/ --out-interface
: 输出的网络接口-s
/ --source
: 输入IP地址, 格式为 address[/mask]
, 如192.168.1.1
, 192.168.1.0/24
-d
/ --destination
: 目标IP地址-p
/ ---proto
: 协议类型, 包括TCP/UCP/ICMP等--sport
: 源端口号--dport
: 目标端口号–-state
: 连接跟踪状态, 需要-m state
启动连接跟踪模块。示例: --state NEW,ESTABLISHED
ifconfig
命令可以查看本机可用的网络接口
iptables 常用规则的动作(<action>
)包括:
ICMP port-unreachable
, ICMP echo-reply
, tcp-reset
iptables -A INPUT -p TCP --dport 22 -j REJECT --reject-with tcp-reset
拒绝22端口的tcp连接iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to-source 192.168.1.1-192.168.1.100:2000-3000
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE --to-ports 2000-3000
iptables -t nat -A PREROUTING -s 192.168.1.10 --sport 80 -j DNAT --to-destination 192.168.1.11:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
将对本地80端口的数据包重定向到8080保存规则
iptables 命令修改后规则只存在于内存中, 使用service iptables save
保存规则到配置文件。
默认配置文件地址一般为/etc/sysconfig/iptables
。
修改/etc/sysconfig/iptables-config
中的配置项:
IPTABLES_SAVE_ON_STOP=yes
在 iptables 服务停止时存储规则。
iptables-save
iptables -L
只能逐表查看规则,iptables-save
命令将 netfilter 内核模块中的规则导出到标准输出。
我们可以使用 iptables-save 查看所有规则, 或将其备份到文件中。
iptables-save 命令执行读取操作,不会更改 iptables 配置请放心使用。
iptables-save -t <table>
仅导出指定表的内容。
iptables-save -c
将会导出字节计数器和包计数器的值。
查看规则:
iptables -L
列出默认表 filter 所有链上的规则。iptables -t nat -L
列出 nat 表中所有链上的规则iptables -t nat -L PREROUTING
列出 nat 表中 PREROUTING 链上的规则拦截特定流量:
iptables -t filter -A INPUT -s 11.11.11.11 -j DROP
拦截来自特定 IP 地址(11.11.11.11)对本地服务全部流量iptables -t filter -D INPUT -s 11.11.11.11 -j DROP
删除上一条拦截规则iptables -t filter -A INPUT -p tcp -sport 445 -j DROP
封锁特定端口(TCP 445)iptables -t filter -A INPUT -p icmp --icmp-type echo-request -j REJECT ---reject-with icmp-host-prohibited
禁止 ICMP (ping)iptables -t filter -A OUTPUT -p tcp --dport 80 -m state --state NEW -j DROP
禁止从80端口发起新的TCP连接但允许80端口响应TCP连接作为网关提供NAT服务:
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to-source 192.168.1.1
将来自192.168.2.0/24子网数据包源地址改写为192.168.1.1iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j MASQUERADE
将来自192.168.2.0/24子网数据包源地址改写为防火墙地址iptables -t nat -A PREROUTING -d 192.168.1.1/24 --dport 80 -j DNAT --to-destination 192.168.1.11:80
将对192.168.1.1:80的数据包发送到192.168.1.11:80iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
将对本地80端口的数据包重定向到8080标签:操作 用户空间 默认 转换 指定 顺序 raw 方向 四种
原文地址:https://www.cnblogs.com/Finley/p/10424842.html