iptables常见命令解与DNAT

1. netfilter中五个钩子函数和报文流向
- 1.1 各链路生效的时间
- 1.2 三种报文流向
- 1.3流入报文规则图
- 1.4 流出报文规则图
- 2 iptables
- 2.1 五个表格
- 2.2 五个内置链
- 2.3 链路与表的关系
- 3 iptables 格式及子命令
- 3.1 子命令
- 3.1.0 -L子命令规则
- 4.1 隐式扩展匹配
- 4.1.1 tcp子选项
- 4.1.2 udp子选项
- 4.1.4 显式扩展及相关模块
- 4.1.5 connlimit扩展
- 4.1.6 limit扩展
- 4.1.7 state扩展
- 5 DNAT
- 5.1 公网服务器
- 5.2 网关
- 5.3客户端:

1. netfilter中五个钩子函数和报文流向

Netfilter在内核中定义了五个钩子,用户可以通过iptables写入规则 。
只要是流入的报文,都会在接触网卡瞬间让PREROUTING检查;流出的报文流出前也会在接触网卡瞬间让POSTROUTING检查。

1.1 各链路生效的时间

iptables常见命令解与DNAT_第1张图片

  • PREROUTING:报文到主机网卡瞬间,由PREROUTING链进行规则检查
  • INPUT:经过PREROUTING的报文,经过路由选择,如果是发给本主机的报文(例如防火墙主机),则需要经过INPUT链规则检查再进入用户空间的程序与进程中
  • OUTPUT: 从用户空间发出的报文,需要第一时间经过OUTPUT然后在交给路由选择发出去
  • POSTROUTING: 在报文到达网卡简要离网卡瞬间需要经过POSTROUTING链上的规则检查

1.2 三种报文流向

  • 流入本机:PREROUTING---->INPUT—>用户空间
  • 流出本机: 用户空间------>OUTPUT—>POSTROUTING
  • 转发: PREROUTING------->FORWARD–>POSTROUTING

1.3流入报文规则图

iptables常见命令解与DNAT_第2张图片

1.4 流出报文规则图

iptables常见命令解与DNAT_第3张图片

1.5转发报文

iptables常见命令解与DNAT_第4张图片

2 iptables

iptables由五各表和五个链路以及一些规则组成
Tips: 放行规则哪个匹配的范围越小,越放在前,因为只要条件符合不会继续进行规则匹配
拒绝规则由大到小,一般不使用默认拒绝,因为清空规则表会拒绝所有链接,会导致SSH无法登陆

2.1 五个表格

  • raw------>用于关闭某些连接的追踪机制,加快封包穿越防火墙速度
  • filter—>用于按规则过滤报文
  • nat------>地址转换规则表network address translation
  • mangle—>修改数据标记位规则表
  • security:用于强制访问控制MAC网络规则,由Linux安全模块实现(selinux)
  • 优先级顺序由高到低分别为: security–>raw–>mangle–>nat–>filter

2.2 五个内置链

  • PREROUTING:报文到主机网卡瞬间,由PREROUTING链进行规则检查
  • INPUT:经过PREROUTING的报文,经过路由选择,如果是发给本主机的报文(例如防火墙主机),则需要经过INPUT链规则检查再进入用户空间的程序与进程中
  • OUTPUT: 从用户空间发出的报文,需要第一时间经过OUTPUT然后在交给路由选择发出去
  • POSTROUTING: 在报文到达网卡简要离网卡瞬间需要经过POSTROUTING链上的规则检查

2.3 链路与表的关系

iptables常见命令解与DNAT_第5张图片

3 iptables 格式及子命令

常用也就只有filter表和net表,本文仅针对这两种规则表进行描述。
-t table:指定将要操纵的表

  • filter:默认,过滤规则
  • raw:关闭某些链接的追踪机制,加快封包穿越防火墙速度
  • mangle:用于修改报文中的部分信息
  • nat: 地址转换规则表network address translation
    -j target:对匹配到的报文的执行动作
  • -j ACCEPT:允许通过
  • -j DROP :丢弃包
  • -j DNAT:目标地址转换
  • -j SNAT:源地址转换
  • -j REDIRECT:端口重定向
  • -j REJECT:丢弃匹配到的报文,并告知发送方被拒绝

3.1 子命令

  • -N:新建一条自定义链路
  • -X #删除自定义的空链,如上面定义了规则是无法删除的
  • -F #清空规则。可清空所有链上的规则,也可清空指定链的所有规则,也可清空指定链的指定规则(这就和-D一样了)
  • -P #定义默认策略。即如果一个报文不符合所有规则的匹配条件,应采取的动作
  • -E #重命名未被内置链引用的自定义链(reference为0)
  • -L #列出规则
  • -A #追加(append)添加规则。即添加的规则会在原有规则的最后
  • -I #插入规则。默认插入原有规则的第一个,也可指定插入第几个
  • -D #删除指定规则。参数可以是数字,表示删除第几条
  • -R #用一个新规则替换指定规则
  • -Z #每个规则都有两计数器:一个用于该规则匹配到的报文总个数,另一个用于记录匹配到的报文总大小。-Z的意义是把这两数归零
  • -S #输出定义当前所有规则所使用的命令。可把这些命令重定向至某文件,这样运行这个文件中的命令,就能恢复之前定义的规则5

3.1.0 -L子命令规则

iptables [-t table] -L [chain [rulenum]] [options…]

  • -L:list, 列出指定鏈上的所有规则,本选项须置后

  • -n #以数字格式显示IP和端口

  • -v,-vv,-vvv #显示详细信息

  • -x #每个规则的两计数器(分别用于记录匹配到报文的总数和总大小),数过大时会使用其他单位(比如MB)从而四舍五入。此选项表示显示精确数值,不换算、四舍五入

  • –line-number #显示链上的规则的编号,方便引用。比如-D进行删除指定规则时,可指定规则内容也可指定编号
    常用组合:-vnL与-vvnxL --line-numbers
    Tips: 所有选项要加在L左侧,否则会报错

    4 常见基本匹配规则

  • !表示取反

  • -s 匹配源地址是指定IP(也可以是IP段)的报文。0/0或省略此选项均表示匹配所有源IP

  • -d 匹配目标地址是指定IP的报文

  • -i 参数是网卡名(如eth0),用于匹配从指定网卡流入的报文。注意因为是流入报文,所以只能定义在PREROUTING、INPUT、FORWARD链

  • -o 匹配从指定网卡流出的报文。因为是流出报文,所以只能定义在FORWARD、OUTPUT、POSTROUTING链

  • -p 指定协议,可以使用数字如0(all)

4.1 隐式扩展匹配

扩展匹配指的是需要使用额外模块才能使用的匹配条件。
隐式扩展是指不用-m显式引用的模块,不过也可以用-m来引用。
隐式扩展最常用的就是-p用于匹配使用指定的协议的报文。
最常用的协议就是tcp、udp、icmp,它们有各自的子选项,用于匹配使用指定协议

4.1.1 tcp子选项

  • !表示取反
  • –source-port 或–sport port[:port]:匹配报文源端口,可为端口范围
  • –destination-port 或–dport port[:port]:匹配报文目标端口,可为范围
  • –tcp-flags mask comp:匹配由MASK指定TCP报文中的标志位,由COMP限定这些标志位为1的报文
    mask 需检查的标志位列表,用,分隔

4.1.2 udp子选项

  • ! 表示取反
  • –source-port, --sport port[:port]:匹配报文的源端口或端口范围
  • –destination-port,–dport port[:port]:匹配报文的目标端口或端口范围

4.1.3 icmp 协议的扩展选项

  • !表示取反

  • [!] --icmp-type {type[/code]|typename}

  • type/code

  • 0/0 echo-reply icmp应答

  • 8/0 echo-request icmp请求

4.1.4 显式扩展及相关模块

显示扩展即必须使用-m选项指明要调用的扩展模块名称,需要手动加载扩展模块

[-m matchname [per-match-options]]

扩展模块的使用帮助:

  • CentOS 6: man iptables
  • CentOS 7,8: man iptables-extensions

4.1.5 connlimit扩展

根据每客户端IP做并发连接数数量匹配
可防止Dos(Denial of Service,拒绝服务)攻击

--connlimit-upto # :连接的数量小于等于#时匹配
--connlimit-above # :连接的数量大于#时匹配

范例

iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimitabove
2 -j REJECT

4.1.6 limit扩展

基于收发报文的速率做匹配
令牌桶过滤器

    --limit #[/second|/minute|/hour|/day]
    --limit-burst number

范例:

  iptables -I INPUT -d 172.16.100.10 -p icmp --icmp-type 8 -m limit --limit  
   10/minute --limit-burst 5 -j ACCEPT  
   iptables -I INPUT 2 -p icmp -j REJECT  

4.1.7 state扩展

state扩展模块,可以根据”连接追踪机制“去检查连接的状态,较耗资源
conntrack机制:追踪本机上的请求和响应之间的关系
状态类型:
* NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
* ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
* RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
* INVALID:无效的连接,如flag标记不正确
* UNTRACKED:未进行追踪的连接,如raw表中关闭追踪

5 DNAT

  • 目标地址转换要定义在PREROUTING链上,否则因为报文最开始的目标是网关主机,如果不在第一时间转换目标地址,就会被视为是发给本机的报文,这样就不会转发了
  • 原理:
  1. 公网服务器需要链接客户端,发出请求报文到达内网(私网)的客户端,但是公网IP是无法直达内网的,所以这个时候的请求报文会把数据发送到客户端网关的公网IP,由客户端网关发给网段内客户端;此时报文目标IP是网关公网IP,源IP是服务器自己的IP;
  2. 网关在请求报文进入网卡的瞬间通过prerouting山规则检查,发现添加的规则里有一条转发规则是和此请求报文符合的,所以按照规则将此请求转发给客户端,此时报文目标IP是客户端,源IP是服务器IP
    3.客户端收到报文以后进行响应,此时响应报文的源IP是客户端IP,目标IP是服务器IP,将报文发送至网关,由网关送往公网的服务器
  3. 因为数据报文有些可能是客户端要发送给网关的,有些是送往公网的,所以网关只能让数据报文先通过PREROUTING链路和经过路由选择发现是要离开送往公网的,所以在POSTROUTING做转发规则给服务器,此时响应报文的目标IP是服务器IP,源IP是网关IP
  • 1和2为公网访问私网的DNAT转发,规则定义在进入网卡瞬间PREROUTING
  • 3和4为私网访问公网的SNAT转发,规则定义在离开路由器瞬间POSTROUTING
    iptables常见命令解与DNAT_第6张图片

5.1 公网服务器

  yum -y install httpd
        
  echo hello > /var/www/html/index.html
 systemctl enable --now httpd
  tcpdump -i eth0 -vv -nn port 80
  或者
  tail -f /var/log/httpd/access_log#可以看到源IP为网关的访问

配置公网IP:172.20.20.1/24

5.2 网关

配置公网IP:172.20.20.2/24
链接客户端局域网网段:192.168.30.2/24
开启ip_forward转发

     echo 1 > /proc/sys/net/ipv4/ip_forward
     iptables -t nat -A POSTROUTING -s 192.168.30.0/24 -j SNAT --to-source 172.20.2.2#SNAT转发
     iptables -t nat -A PREROUTING -d 172.20.2.2 -j DNAT --to-destination 192.168.30.3#DNAT转发

5.3客户端:

配置属于网关同网段私网:192.168.30.3/24
配置路由指向网关:172.20.20.3/24

  curl 172.20.20.1   #回应报文为 hello  

tips:

  服务器测试客户端可以在客户端安装httpd,此时服务器访问不到内网的客户端,目标IP是网关即:curl 172.20.20.2  

这是一个测试1脚注


  1. 这是一条角注释 ↩︎

你可能感兴趣的:(iptables,DNAT)