iptables基础

概述

iptables是一个user-space的工具, 用来配置linux内核防火墙提供的table, 通过配置该table来改变内核防火墙的行为.

表(table)

表通过-t来指定, 如果省略-t默认是filter

说明 支持的链
filter (默认) 对包进行过滤 INPUT、FORWARD、OUTPUT
nat 进行地址转换 PREROUTING、OUTPUT、POSTROUTING
raw (不常用) 用于处理异常 PREROUTING、OUTPUT
mangle (不常用) 对数据包进行修改,它能改变TCP头中的QoS位 五个链都可以

链(chain)

  • PREROUTING 刚到达本机并在路由转发前的数据包 (通常用于DNAT)
  • INPUT 在交付到本地程序的socket之前
  • PORWARD 非本地的数据包(目标地址与本机不同), 会被转发. 需要linux开启转发功能才会经过此链进行转发
  • OUTPUT 本机产生的数据包
  • POSTROUTING 路由之后, 即将离开本机的数据包, 在硬件层之前 (通常用于SNAT)

常用参数

公共参数

以下这些选项指定期望执行的命令, 每条iptables命令里面只能包含一个

-A 在指定链尾部添加规则
-I 在指定位置插入规则, 如果不指定位置则插在开头

例:iptables -I INPUT 1 –dport 80 -j ACCEPT(将规则插入到filter表INPUT链中的第一位上)

-D 删除匹配的规则

iptables -nL --line-num 显示所有规则, 并显示行号
iptables -D INPUT <行号> 删除指定行号的规则

-L 列出指定链或所有链的规则
-S 以iptables命令的形式打印

iptables -nvL 以数字形式显示端口号, -v表示显示具体接口

-N 创建自定义链. 新的自定义链无任何引用, 无任何规则

iptables -t filter -N IN_WEB

-F 删除指定链或所有链的规则
-N 创建用户自定义链
-X 删除指定的用户自定义链

iptables -X WEB 删除自定义链

-P 为指定链设置默认规则策略,对自定义链不起作用
-Z 将指定链或所有链的计数器清零
-E 更改自定义链的名称

iptables -E IN_WEB WEB 自定义链改名, IN_WEB->WEB

-m 启用扩展模块,如state、tcp 、udp、multiport 、string 、addrtype 、mac 等

iptables -m module_name -h

nat表参数

-j ACTION, 常用的ACTION:

  • DROP 悄悄丢弃, 一般我们多用DROP来隐藏我们的身份,以及隐藏我们的链表
  • REJECT 明示拒绝
  • ACCEPT 接受
  • DNAT 改变数据包的目的地址使包能重路由到某台机器 (使公网能够访问局域网的服务器)
  • SNAT 改变数据包的源地址(使局域网能访问公网)
  • MASQUERADE 源地址伪装, 和SNAT一样使局域网能访问公网, 与普通路由器的行为类似
  • REDIRECT 重定向:主要用于实现端口重定向
  • MARK 防火墙标记
  • RETURN 返回, 在自定义链执行完毕后使用返回,来返回原规则链。

常用命令

涉及到转发的需要确保内核转发已经是开启状态

开启内核转发的命令:

1
2
3
4
5
6
# 暂时开启(重启后会还原)
echo 1 >/proc/sys/net/ipv4/ip_forward

# 永久开启
sysctl -w net.ipv4.ip_forward=1
sysctl -p /etc/sysctl.conf # 保存

完全清空iptables

1
2
3
4
5
6
7
8
9
10
11
12
# 清除filter表规则
iptables -F
# 清除filter的自定义链
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
# 还原默认的行为
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

SNAT

开启snat(eth0为外网网卡)

1
2
3
4
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# 开启FORWARD(如果SNAT不成功可尝试执行该命令, FORWORD默认就是开启的)
iptables -A FORWARD -i eth0 -j ACCEPT

该snat方式与普通家用路由器的方式类似

DNAT

目标地址伪装, 自动改写目标地址

1
iptables -t nat -A PREROUTING -p tcp --dport 80,443 -j DNAT --to-destination 伪装网关 IP

NAT之路由器内网映射外网端口

外网访问122.78.203.85:80 映射到:192.168.8.175:8080

1
2
3
4
5
iptables -t nat -A PREROUTING -d 122.78.203.85 -p tcp --dport 80 -j DNAT --to 192.168.8.175:8080
iptables -t nat -A POSTROUTING -d 192.168.8.175 -p tcp --dport 8080 -j SNAT --to 122.78.203.85:80

# 如果不成功, 补充一句:
iptables -A FORWARD -p tcp -d 192.168.8.175 --dport 8080 -j ACCEPT

  • 解释:
    dnat 表 路由之前 以122.78.203.85:80为目标地址的包,将其目标地址修改为192.168.8.175:8080; 当广域网上的电脑访问路由器时会触发该条规则 ,由于这条规则会将ip修改为非本机ip,所以会进入FORWORD
    snat 表 路由之后 以192.168.8.175:8080为目标地址的包,将其源地址修改为122.78.203.85:80; 从FORWORD出来后触发这条规则,出来后将来源地址修改为 路由器的地址 (有啥用?)

本机端口80转换成8118

1
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8118

开放指定端口

  • 对所有地址开放本机的tcp(80,22,10-21)端口访问
  • 允许对所有的地址开放本机的基于ICMP协议的数据包访问(ping)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 白名单在上层
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -p tcp --dport 10:21 -j ACCEPT
iptables -I INPUT -p icmp -j ACCEPT

# 在对底下一层加入拒绝
iptables -A INPUT -j REJECT

#允许本地回环(127.0.0.1)访问
iptables -I INPUT -i lo -j ACCEPT

# 允许本地访问外网 (本地已经建立连接的放行)
iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

从一台机到另一台机端口转发

外网有两台机器, A 和 B, 希望在A上做端口映射访问B:

a. 同一端口转发

A的80端口映射B的80端口:

1
2
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to <B_IP>
iptables -t nat -A POSTROUTING -p tcp --dport 80 -j MASQUERADE

b. 不同端口转发

A的888端口映射B的80端口:

1
2
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to <B_IP>:888
iptables -t nat -A POSTROUTING -p tcp --dport 888 -j MASQUERADE

c. 外网转发demo

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#!/bin/bash
echo 1 > /proc/sys/net/ipv4/ip_forward

# clean all
iptables -F
iptables -t nat -F

# ############
tsw_server=45.77.79.154
# udp: 150
iptables -t nat -A PREROUTING -p udp --dport 150 -j DNAT --to $tsw_server
iptables -t nat -A POSTROUTING -p udp --dport 150 -j MASQUERADE

# udp: 53701
iptables -t nat -A PREROUTING -p udp --dport 53701 -j DNAT --to $tsw_server
iptables -t nat -A POSTROUTING -p udp --dport 53701 -j MASQUERADE

# tcp: 8388
iptables -t nat -A PREROUTING -p tcp --dport 8388 -j DNAT --to $tsw_server
iptables -t nat -A POSTROUTING -p tcp --dport 8388 -j MASQUERADE
# ############

iptables备份/恢复

备份: iptables-save > filter.iptables
恢复: iptables-resotre < filter.iptables
-c 保存的时候同时保存计数信息
-t <tableName> 指定表名, 不指定则保存/恢复所有

一些参考图片


图片来自wikipedia


图片来自wikipedia


图片来自网络


图片来自慕课网


图片来自慕课网

进一步阅读

iptables man
官方扩展man文档
创建自定义链
iptables超全详解
iptables 记录日志
conntrack
iptables 从链、表开始理解

0%