iptables基本概念和操作
# 简介
iptables本质上只是一个命令行工具,真正起作用的是Linux内核中的netfilter,他有通过hook的方式进行相关的控制,如下图:
# 基础知识
# 四表
- filter表:负责过滤功能,防火墙;内核模块:iptables_filter
- nat表:network address translation,网络地址转换功能;内核模块:iptable_nat
- mangle表:拆解报文,做出修改,并重新封装 的功能;内核模块:iptable_mangle
- raw表:关闭nat表上启用的连接追踪机制;内核模块:iptable_raw
# 五链
- PREROUTING:在对数据包做路由选择之前,将应用此链中的规则
- POSTROUTING:在对数据包做路由选择之后,将应用此链中的规则
- INPUT:当收到访问本机地址的数据包时,将应用此链中的规则
- OUTPUT:当本机向外发送数据包时,将应用此链中的规则
- FORWARD:当收到需要通过防火墙转发给其他地址的数据包时,将应用此链中的规则
# 表链关系
raw | mangle | nat | filter | |
---|---|---|---|---|
PREROUTING | ✅ | ✅ | ✅ | ❌ |
POSTROUTING | ❌ | ✅ | ✅ | ❌ |
INPUT | ❌ | ✅ | ❌ | ✅ |
OUTPUT | ✅ | ✅ | ✅ | ✅ |
FORWARD | ❌ | ✅ | ❌ | ✅ |
# 规则
- 匹配条件
- 基本匹配条件
- source/destination:IP地址
- 扩展匹配条件
- protocol:指定协议后-h可以看到更多支持的条件,eg:
iptables -p tcp -h
- sport/dport:端口,指定协议后可用
- protocol:指定协议后-h可以看到更多支持的条件,eg:
- 基本匹配条件
- 控制类型
- ACCEPT:允许数据包通过
- DROP:直接丢弃数据包,不给任何回应信息
- REJECT:拒绝数据包通过,必要时会给数据发送端一个响应的信息
- SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题
- MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的ip上
- DNAT:目标地址转换
- REDIRECT:在本机做端口映射
- LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
# 实操
# 创建一条拦截规则,阻止所有来自本机的访问
root@lima-default:~# iptables -I INPUT -s 127.0.0.1 -j REJECT
root@lima-default:~# iptables -vnL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT all -- * * 127.0.0.1 0.0.0.0/0 reject-with icmp-port-unreachable
# 创建一条拦截规则,阻止访问本机8000端口
root@lima-default:~# iptables -I INPUT -p tcp --dport 8000 -j REJECT
root@lima-default:~# iptables -vnL INPUT
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:8000 reject-with icmp-port-unreachable
# 创建一条路由规则,将80端口的流量转向8000端口
root@lima-default:~# iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8000
root@lima-default:~# iptables -t nat -vnL PREROUTING
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 redir ports 8000
这是你会发现,你在本机访问80端口仍然不通,而在本机之外却通了。这是因为本机访问并没有走PREROUTING链。如果想要在本机也通,那么我们应该配置OUTPUT。
root@lima-default:~# iptables -t nat -I OUTPUT -d localhost -p tcp --dport 80 -j REDIRECT --to-ports 8000
root@lima-default:~# iptables -t nat -vnL OUTPUT
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1 60 REDIRECT tcp -- * * 0.0.0.0/0 127.0.0.1 tcp dpt:80 redir ports 8000
这里需要注意指定destination,否则你所有对外的请求都被转到8000端口了。
# 参考资料
- 原文出处:
- 原文作者: https://github.com/saltbo
- 原文链接:
- 版权声明:本文欢迎任何形式转载,转载时完整保留本声明信息(包含原文链接、原文出处、原文作者、版权声明)即可。本文后续所有修改都会第一时间在原始地址更新。