之前使用cloudflare提供的过滤保护自动将所有做了保护的记录做了反代,导致无法解析相应端口,只能使用通用的端口如80,443,在这种情况下对于降权的服务器除了配置nginx反代还可以使用iptables这个强大的东西,只要一条命令:

# 443 映射 node 3000
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 3000  

之前没有很好的看过Ta的教程,只是用到才去查资料,今天突发性无聊去查了iptables发现他真的是很好很强大啊。

那么就一起来学习这个强大而简洁的iptables吧!

Start

iptables可以将规则组成一个列表,实现绝对详细的访问控制功能。

对于TCP/IP的七层模型来讲,我们知道第三层是网络层,三层的防火墙会在这层对源地址和目标地址进行检测。但是对于七层的防火墙,不管你源端口或者目标端口,源地址或者目标地址是什么,都将对你所有的东西进行检查。

iptables在内核中选择了5个位置进行过滤:

  1. 内核空间中:从一个网络接口进来,到另一个网络接口去的
  2. 数据包从内核流入用户空间的
  3. 数据包从用户空间流出的
  4. 进入/离开本机的外网接口
  5. 进入/离开本机的内网接口

这五个位置也被称为五个钩子函数(hook functions),也叫五个规则链。

  1. PREROUTING (路由前)
  2. INPUT (数据包流入口)
  3. FORWARD (转发管卡)
  4. OUTPUT(数据包出口)
  5. POSTROUTING(路由后)

这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。

Strategy

不同的table用来记录不同的Strategy

  1. filter 定义允许或者不允许的(INPUT ,FORWARD ,OUTPUT)
  2. nat 定义地址转换的(PREROUTING ,OUTPUT ,POSTROUTING)
  3. mangle 修改报文原数据(PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING)

iptables还支持自己定义链。但是自己定义的链,必须是跟某种特定的链关联起来的。规则的次序非常关键,谁的规则越严格,应该放的越靠前。

Grammar

查看man iptables可以看到

iptables [-t table] COMMAND chain CRETIRIA -j ACTION  

下面逐一说明

table
filter/ nat/ mangle
command
  • chains command
    • P 默认策略
    • F 清空规则链
    • N 新建链
    • X 删除链
    • E 链重命名
    • Z 清空链
  • rules command
    • A 在当前链追加
    • I num 插入规则num
    • R num 修改规则num
    • D num 删除规则num
  • show command
    • n 显示ip
    • v 显示详细信息
    • t nat 关卡信息
    • --line-numbers : 显示规则
match
  • s 源地址匹配
  • d 目标地址匹配
  • p 协议匹配
    • tcp
    • udp
    • icmp
  • i eth0 网卡输入
  • o eth0 网卡输出
  • m 多端口
action
  • SNAT 源地址转换
  • DNAT 目标地址转换
  • DROP 丢弃
  • REJECT 拒绝
  • ACCEPT 接受
  • REDIRECT 重定向
  • RETURN 返回
  • MASQUERADE 源地址伪装

Example

port redirect
# node https 降权
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 3000

# 本机作为路由或者NAT设备,A网络到B网络的 端口映射 本地22转发目标22
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 222 -j DNAT --to 192.168.3.3:22  
# 先建立 DNAT 规则,这里将 eth0 接口上面222端口的数据包,全部转发到 192.168.3.3:22上面
# 数据包来源: -i [收到数据包的网卡] -d [收到数据包的ip地址] 这两种参数都可以接受
iptables -I FORWARD -p tcp -d 192.168.3.3 --dport 22 -j ACCEPT  
# FORWARD链添加转发条目,接受发往192.168.3.3 22端口的数据包
NAT data redirect
# eth0 连接外网,eth1连接内网
iptable -t nat -A POSTROUTING -o eth0 -j MASQUERADE  
# 使用地址伪装,这是一种 NAT 技术,比手动配置 SNAT 更方便
iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT  
# 外网连入内网的包,只允许通过特定状态的包
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT  
# 内网发往外网的数据,全部允许

Reference

kin

Read more posts by this author.

分享一下

查看评论