Iptables 一生逃不掉的东西
IP 报文
0 1 2 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
|Version| IHL |Type of Service| Total Length |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Identification |Flags| Fragment Offset |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Time to Live | Protocol | Header Checksum |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Source Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Destination Address |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| Options | Padding |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
Iptables常用字段
- Source Address: 源IP地址
- Destination Address: 目的IP地址
- Time to Live(TTL): 生存时间 可经过的最多路由数,每经过一个路由就会减1
- Protocol: 下层协议 TCP/UDP/ICMP/其他 指出此数据包携带的数据使用何种协议,以便目的主机的IP层将数据部分上交给哪个进程处理
- Type of Service(TOS): 服务类型
IPtables 的五个Hook点
->进入网卡
-> **PREROUTING(PRE_ROUTING)**:所有接收数据包到达的第一个hook触发点,此处将进行数据包目的地转换 (DNAT), 决定数据包是发给 本地进程、其他机器、其他network namespace
->进入路由决策
-> 本机接收
-> **INPUT(LOCAL_IN)**: 经过路由判断后,目标地址是本机的接收数据包到达此hook触发
-> 转发
-> **FORWARD(FORWARD)**: 经过路由判断后,目标地址不是本机地址的数据包到达此hook触发点
-> 本机发送
-> 路由决策
-> **OUTPUT(LOCAL_OUT)**: 所有本地生成的发往其他机器的包, 在进入网络栈后首先到达此hook触发点
-> 转发 or 本机发送
-> **POSTROUTING(POST_ROUTING)**: 本机产生准备发出的包或者转发的包,在经过路由判断后到达此hook触发点
五表五链
在IPtables中实际有五张表常用的有三张表,而五链则是针对每个表的五个hook点的处理逻辑。每张表有固定的链
五表
filter表
过滤
- INPUT:所有接收数据包到达的第一个hook触发点,此处将进行数据包目的地转换 (DNAT), 决定数据包是发给 本地进程、其他机器、其他network namespace
- OUTPUT: 所有本地生成的发往其他机器的包, 在进入网络栈后首先到达此hook触发点
- FORWARD: 经过路由判断后,目标地址不是本机地址的数据包到达此hook触发
nat表
网络地址转换
- PREROUTING:所有接收数据包到达的第一个hook触发点,此处将进行数据包目的地转换 (DNAT), 决定数据包是发给 本地进程、其他机器、其他network namespace
- POSTROUTING: 本机产生准备发出的包或者转发的包,在经过路由判断后到达此hook触发点
- OUTPUT: 所有本地生成的发往其他机器的包, 在进入网络栈后首先到达此hook触发点
mangle表
包处理 篡改包
五张链都有
- INPUT:所有接收数据包到达的第一个hook触发点,此处将进行数据包目的地转换 (DNAT), 决定数据包是发给 本地进程、其他机器、其他network namespace
- PREROUTING:所有接收数据包到达的第一个hook触发点,此处将进行数据包目的地转换 (DNAT), 决定数据包是发给 本地进程、其他机器、其他network namespace
- POSTROUTING: 本机产生准备发出的包或者转发的包,在经过路由判断后到达此hook触发点
- FORWARD: 经过路由判断后,目标地址不是本机地址的数据包到达此hook触发
- OUTPUT: 所有本地生成的发往其他机器的包, 在进入网络栈后首先到达此hook触发点
raw表(不常用)
security表(不常用)
五链
在Iptables中 Hook点以chain的形式出现,而每条链又是由一条或多条规则组成
Iptables 基础使用
修改链的动作
iptables -P FORWARD DROP # 将FORWARD链的默认动作设置为DROP(丢弃)
向链中追加规则
# iptables -A 链 MATCH条件 -j 动作
#Match和动作是可选的但是不能同时为空
#只有match没有动作时不会有任何效果 可以进行流量统计
#只有动作没有match默认对所有包生效
iptables -A FORWARD -s 237.84.2.178 -j DROP # 将FORWARD链的动作设置为DROP(丢弃)
删除规则
# 使用策略原文删除
iptables -D FORWARD -s 237.84.2.178 -j DROP
# 使用序号删除
iptables -D FORWARD -F 1 # 删除FORWARD链的第一个规则 iptables策略序号从1开始 当1被删除后2就变成1
插入规则
iptables -I FORWARD 1 -s 237.84.2.178 -j DROP # 加入成为FORWARD链的第一个规则
列出规则
iptables -L FORWARD # 列出FORWARD链的所有规则
iptables -L # 列出当前表的所有链规则
Match条件
Match 多个条件永远是且的关系 A AND B AND C AND D AND E 不是所有的match条件 在任何链中都可以使用
match 条件
- -i: 指定输入接口 网卡
- -o: 指定输出接口 网卡
- -s: 指定源地址 IP/CIDR
- -d: 指定目的地址 IP/CIDR
- -p: 指定协议
动作
- -j
- DROP: 丢弃
- ACCEPT: 允许
- 自定义链: 自定义链作为动作使用
- -g: 跳转到自定义链 goto 此时不会回到原来的链中 结束后默认执行原来链最后的动作
新建链
自定义链作为动作使用
iptables -N mychain # 新建名为mychain的链
当自定义链中的命中动作为 return 时 会返回到原来的链中 会回到最初的第一个链中
自定义链策略执行完也会返回到原来的链中 因为自定义链是没有默认动作的
扩展Iptables
match 扩展模块
target 扩展模块
SNAT 源地址转换 nat表 POSTROUTING
iptables -t nat -A POST_ROUTING -o eth0 -j SNAT --to 要转换源IP
DNAT 目的地址转换 nat表 PREROUTING 内网映射 负载均衡
内网映射
iptables -t nat -A PREROUTING -i eth0 -j DNAT -p tcp -m tcp --dport 要转换的目的端口 --to 要转换的目的IP
负载均衡 statistics
iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 --dport 27017 \
-m statistic --mode random --probability 0.33 \
-j DNAT --to-destination 10.0.0.2:1234
iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 --dport 27017 \
-m statistic --mode random --probability 0.5 \
-j DNAT --to-destination 10.0.0.3:1234
iptables -A PREROUTING -t nat -p tcp -d 192.168.1.1 --dport 27017 \
-j DNAT --to-destination 10.0.0.4:1234
请注意,这里定义了 3 个不同的概率,而不是到处都是 0.33。原因是规则是按顺序执行的。
以 0.33 的概率,第一条规则将在 33% 的时间内执行,在 66% 的时间内被跳过。
概率为 0.5 时,第二条规则将在 50% 的时间内执行,50% 的时间内跳过。但是,由于此规则位于第一条规则之后,因此只有 66% 的时间内会执行它。因此,此规则将仅应用于 (50%*66%=33%) 的请求。
由于只有 33% 的流量到达最后一条规则,因此必须始终应用该规则。
MASQUERADE 不需要知道转换到哪个源IP 因为源IP可能是随机的 比如动态公网IP
iptables -t nat -A POSTROUTING -o eth0 -A MASQUERADE
附录
参考文章
将 IPTables 转变为 TCP 负载均衡器,既有趣又有利可图
版权信息
本文原载于 not only security,复制请保留原文出处。