linux中iptables与router

iptables

iptables是linux操作系统中一个重要的概念,但是同时它又比较复杂,所以弄清楚它得花一番功夫,我们先来看看iptables的流程:

  • iptables的结构:

表 : filter 过滤表 nats Network Address Translator,即做ip转换

链 :

     INPUT:     位于 filter 表,匹配目的 IP 是本机的数据包
     FORWARD:   位于 filter 表,匹配穿过本机的数据包,
     PREROUTING: 位于 nat 表,用于修改目的地址(DNAT)
     POSTROUTING:位于 nat 表,用于修改源地址 (SNAT) 
  • iiptables流程:

      1. 数据包到达网络接口,比如 eth0。
      2. 进入 nat 表的 PREROUTING 链,可以在此做DNAT,但不要做过滤。
      3. 决定路由,看是交给本地主机还是转发给其它主机。
    

    如果是转发给其他主机:

      4. 进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。
      需要注意的是:经过这里的数据包是转发的,方向是双向的。
      5. 进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤。
      6. 进入出去的网络接口。完毕。
    

    如果是交给本地主机:

      4. 进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,无论它来自哪个网络接口。
      5. 交给本地主机的应用程序进行处理,处理完毕后进行路由决定,看该往那里发出。
      6. 进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做 NAT 。
      7. 再次进行路由决定。
      8. 进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤。
      9. 进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤。
      10. 进入出去的网络接口,完毕。
    
  • iptables语法:

    iptables [-t 要操作的表] <操作命令> [要操作的链] [规则号码] [匹配条件] [-j 匹配到以后的动作] 
    
    1. 操作命令:

      -A <链名> APPEND,追加一条规则(放到最后)

      -I <链名> [规则号码] INSERT,插入一条规则,规则号码就是插入该链的第几条规则

      -D <链名> <规则号码 | 具体规则内容> DELETE,删除一条规则

      -P <链名> <动作> POLICY,设置某个链的默认规则

      -R <链名> <规则号码> <具体规则内容> REPLACE,替换一条规则

      -F [链名] FLUSH,清空规则

      -L [链名] LIST,列出规则

    2. 用例:

       iptables -t filter -A INPUT -j DROP
      

      在 filter 表的 INPUT 链里追加一条规则(作为最后一条规则),匹配所有访问本机 IP 的数据包,匹配到的丢弃。

       iptables -I INPUT 3 -j DROP
      

      在 filter 表的 INPUT 链里插入一条规则(插入成第 3 条)

       iptables -D INPUT -s 192.168.0.1 -j DROP(按内容匹配)
      

      删除 filter 表 INPUT 链中内容为“-s 192.168.0.1 -j DROP”的规则(不管其位置在哪里)

       iptables -R INPUT 3 -j ACCEPT
      

      将原来编号为 3 的规则内容替换为“-j ACCEPT”

       iptables -P INPUT DROP
      

      设置 filter 表 INPUT 链的默认规则是 DROP

       iptables -t nat -F PREROUTING
      

      清空 nat 表 PREROUTING 链中的所有规则

       iptables -L
      

      粗略列出 filter 表所有链及所有规则

    3. 匹配条件

       流入、流出接口(-i、-o)
       来源、目的地址(-s、-d)
       协议类型     (-p)
       来源、目的端口(--sport、--dport)
      
    4. 动作

      ACCEPT 不拦截
      DROP   丢弃
      SNAT   做源地址转换
      DNAT   做目的地址转换
      

在运用iptables的时候得多思考流程图,然后按照上面的规则一一匹配。

router

首先使用route -n观察一个本地主机的路由表:

目标            网关            子网掩码        标志  跃点   引用  使用  接口
0.0.0.0         192.168.0.1     0.0.0.0         UG    100    0        0  eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0  eth0

通过读上面的路由表我们可以知道:如果一个数据包目的地址是192.168.0.x(由192.168.0.0与255.255 .255.0得出),则由本机直接发出,这种情况是在局域网内通信。如果一个数据包ip是任意的,那么主机 就会把这个包转发给网关:192.168.0.1。

  • route

     route add -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.0.1
     route del -net 192.168.0.0 netmask 255.255.255.0 gw 192.168.0.1
    

上述命令可以在路由表中添加和删除路由规则,但是在添加的时候一定要确保能够与目的网段能够 MAC互通。

我们一般在查看数据包的转发情况时都会使用到traceroute这个软件,它能让你很明晰地了解到你的包 的转发过程。由于route不会像iptables那么多规则,所以route还是相对比较简单的。



Previous     Next
zhing /
Published under (CC) BY-NC-SA in categories linux  tagged with linux