linux_iptables基础以及常见配置

Linux:网络防火墙
  netfilter: Frame
  iptables: 数据报文过滤,NAT、mangle等规则生成的工具

TCP连接的三次握手:
  Client --1--> Server : SYN=1,ACK=0,FIN=0,RST=0;     Client 状态:Closed-->SYN_SENT;
  Client <--2-- Server : SYN=1.ACK=1,FIN=0,RST=0;     Server 状态:Listen-->SYN_RCVD
  Client --3--> Server : SYN=0,ACK=1,FIN=0,RST=0;     Server 收到Client的ACK之后,两者转换为ESTABLISHED

TCP断开连接



防火墙:  硬件,软件:规则(匹配标准,处理办法)
 
  Framework:
    默认规则:
       开放:堵
       关闭:通

  规则:匹配标准
    IP: 源IP,目标IP
    TCP: 源端口,目标端口
    UDP: 源端口,目标端口
    ICMP: icmp-type


linux不同内核的不同防火墙以及工具:
  Linux 2.0
    ipfw/firewall

  Linux 2.2
    ipchain/firewall
 
  Linux 2.4-2.6
    iptables/netfilter


hook function: 钩子函数
    prerouting
    input
    output
    forward
    postrouting

规则链(CHAIN):
   PERROUTING
   INPUT
   OUTPUT
   FORWARD
   POSTROUTING


iptables表:
  filter(过滤):
    INPUT
    OUTPUT
    FORWARD

  NAT(地址转换):
    PREDOUTING
    OUTPUT
    POSTROUTING

  mangle(拆开、修改、封装):
    PREROUTING
    INPUT
    FORWARD
    OUTPUT
    POSTROUTING
 
  raw(原始格式):
    PREROUTING
    OUTPUT


  表在规则链上的优先级:
    PREROUTING: raw-->mangle-->nat
    INPUT     : mangle-->filter
    FORWARD   : mangle-->filter
    OUTPUT    : raw-->mangle-->nat-->filter
    POSTROUTING: mangle-->nat

 
  可以使用自动义链,但只有在被调用时才能发挥作用,而且如果没有自定义链中的任何规则匹配,还应该有返回机制;
    用户可以删除自定义的空链
    默认链不能被删除

  每一条规则都有两个内置的计数器
    1、被匹配的报文个数
    2、被匹配的报文大小之和




规则:匹配标准, 处理动作
 
iptables [-t TABLE_NAME] COMMAND CHAIN [num] 匹配标准 -j 处理方法


保存iptables写入的规则
  # service iptables save
     /etc/sysconfig/iptables
     此命令保存的配置文件,在下次启动iptables时会自动读取此配置文件

  # iptables-save > /etc/sysconfig/iptables.20160216
     此种方式保存的配置文件,在下次启动iptables时需要使用下面的指令加载配置
       # iptables-restore < /etc/sysconfig/iptables.20160216

 
  COMMAND:
    管理规则:
       -A: 在链的尾部添加一条规则
       -I CHAIN [num]: 在链中插入一条规则,如果省略 num ,则插入为第一条
       -D CHAIN [num]: 删除链中的第num条规则
       -R CHAIN [num]: 替换指定的规则:

    管理链:
       -F [CHAIN]: flush,清空指定链中的规则,如果省略 CHAIN ,则可以实现删除对应表中所有链中的规则
       -P CHAIN target: 设定指定链的默认策略
       -N CHAIN: 自定义一个新的空链
       -X [CHAIN]: 删除一个自定义的空链
       -Z [CHAIN [num]]: 将指定链中的规则的计数器置为0
       -E old-chain new-chain: 重命名自定义的链

    查看:
       -L: 显示指定表中的规则
         -n: 以数字格式显示主机地址和端口号
     -v: 显示链及规则的详细信息
     -vv:
     -x: 显示计数器的精确值
     --line-numbers: 显示链中规则的号码
 
 
  -j target
    动作(target):
       ACCEPT :放行
       DROP :丢弃
       REJECT :拒绝
       DNAT :目标地址转换
       SNAT :源地址转换
       REDIRECT :端口重定向
       MASQUERADE :地址伪装
       LOG : 日志
       MARK : 打标记

 
  匹配标准:
    通用匹配
       -s,--src : 指定源地址
       -d,--dst : 指定目标地址
       -p {tcp|udp|icmp} : 指定协议
       -i INTERFACE: 指定数据报文流入接口
            可用于定义标准的链: PREROUTING,INPUT,FORWARD
       -o INTERFACE: 指定数据报文流出接口
            可用于定义标准的链: OUTPUT,POSTROUTING,FORWARD

    扩展匹配:
       隐含扩展: 不要特别指明由哪个模块进行的扩展,因为此时使用 -p {tcp|udp|icmp}
         -p tcp
        --sport PORT[-PORT]: 源端口
        --dport PORT[-PORT]: 目标端口
        --tcp-flags mask comp:只检查mask指明的标志位,使用逗号分隔的标志位列表;comp中指明的标志为必须为1
          --tcp-flags SYN,FIN,ACK,RST SYN :表示检查四个标志位,其中SYN为1,其他标志位为0,其相当于 --syn
        --syn :TCP三次握手的第一个数据报文

         允许192.168.21.64/26访问21.117的80端口(http服务)
        # iptables -t filter -A INPUT -s 192.168.21.64/26 -d 192.168.21.117 -p tcp --dport 80 -j ACCEPT
            # iptables -A OUTPUT -s 192.168.21.117 -d 192.168.21.64/26 -p tcp --sport 80 -j ACCEPT

     -p icmp
        --icmp-type
          0: echo-reply
          8: echo-request
    
     允许本机21.117 ping所有主机,但不允许其他主机ping本机
        # iptables -A OUTPUT -s 192.168.21.117 -p icmp --icmp-type 8 -j ACCEPT
            # iptables -A INPUT -d 192.168.21.117 -p icmp --icmp-type 0 -j ACCEPT

         -p udp
        --sport PORT[-PORT]: 源端口
        --dport PORT[-PORT]: 目标端口

       
       
       显式扩展: 必须指明由哪个模块进行的扩展,在iptables中使用 -m 选项完成此功能
         -m EXTESTION --spe-opt
        state: 状态扩展
          --state
             NEW : 新请求
             ESTABLISHED: 已建立的连接
             INVALID: 非法连接
             RELATED: 相关联的
              # iptables -I INPUT -d 192.168.21.117 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT

        multiport: 离散多端口匹配
          --sports,--source-ports PORT[,PORT|PORT:PORT...]
          --dports,--destination-ports
          --ports
          # iptables -I INPUT 2 -d 192.168.21.117 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT



NAT:
  DNAT:
    -j DNAT
       --to-destination IPaddr[:PORT]
    # iptables -t nat -A PREROUTING -d 105.236.8.106 -p tcp --dport 80 -j DNAT --to-destination 192.168.17.212
    

  SNAT:源地址转换(POSTROUTING,OUTPUT)
    -j SNAT
       --to-source IPaddr[-IPaddr[:PORT]] :指定NAT转换的地址

    -j MASQUERADE: 例如使用ADSL拨号上网的时候使用,它会自动选择能够上网的地址进行NAT的转换


SNAT简易实验,三台linux虚拟机
虚拟机1:主机名 httpd ip=192.168.21.117 gw=192.168.21.120
虚拟机2:主机名 test_hostonly ip=172.16.10.123 gw=172.16.10.101
虚拟机3: 主机名 lvs1 eth0=192.168.21.120 eth1=172.16.10.101


打开网关主机LVS1的网卡间转发功能
[root@lvs1 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@lvs1 ~]# cat /proc/sys/net/ipv4/ip_forward
1


在虚拟主机1上抓包
[root@httpd ~]# tcpdump -i eth0 -nn -X icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes


此时在虚拟主机2上ping 虚拟机1
[root@test_hostonly ~]# ping 192.168.21.117
PING 192.168.21.117 (192.168.21.117) 56(84) bytes of data.
64 bytes from 192.168.21.117: icmp_seq=1 ttl=63 time=0.393 ms


查看当前虚拟机1抓取到的icmp包:
13:55:35.411979 IP 172.16.10.123 > 192.168.21.117: ICMP echo request, id 54795, seq 3, length 64

13:55:35.412037 IP 192.168.21.117 > 172.16.10.123: ICMP echo reply, id 54795, seq 3, length 64
此时的ping的源地址是虚拟机2的IP地址

接下来在虚拟机3上添加SNAT的规则
[root@lvs1 ~]# iptables -t nat -A POSTROUTING -s 172.16.10.0/24 -j SNAT --to-source 192.168.21.120
[root@lvs1 ~]# iptables -t nat -L -n
Chain POSTROUTING (policy ACCEPT)
target     prot opt source
SNAT       all  --  172.16.10.0/24       0.0.0.0/0           to:192.168.21.120

再次在虚拟机2上ping 虚拟机1
[root@test_hostonly ~]# ping 192.168.21.117
PING 192.168.21.117 (192.168.21.117) 56(84) bytes of data.
64 bytes from 192.168.21.117: icmp_seq=1 ttl=63 time=2.19 ms
64 bytes from 192.168.21.117: icmp_seq=2 ttl=63 time=0.375 ms

然后再查看虚拟机1上的抓包情况,这个时候的ping源地址变成了192.168.21.120,和预期结果相同
14:07:17.711563 IP 192.168.21.120 > 192.168.21.117: ICMP echo request, id 12814, seq 1, length 64
14:07:17.711605 IP 192.168.21.117 > 192.168.21.120: ICMP echo reply, id 12814, seq 1, length 64

这样一个简单的SNAT转换配置就完成了

此时想禁止虚拟主机2 ping 虚拟机1,则在虚拟机3 上添加FORWARD规则:
[root@lvs1 ~]# iptables -t filter -A FORWARD -s 172.16.10.0/24 -p icmp -j REJECT
[root@lvs1 ~]# iptables  -L -n
Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
REJECT     icmp --  172.16.10.0/24       0.0.0.0/0           reject-with icmp-port-unreachable


posted @ 2016-02-17 16:10  Mr.hale  阅读(275)  评论(0编辑  收藏  举报