iptables snat dnat配置及测试

来源:本站原创 网络技术 超过41 views围观 0条评论

    

基本语法:iptables [-t TABLE] COMMAND CHAIN CRETIRIA -j TARGET

要实现nat,要将文件/proc/sys/net/ipv4/ip_forward内的值改为1,(默认是0)。
 
需要用到的几个动作选项:(真实环境中用大写)
redirect     将数据包重定向到另一台主机的某个端口,通常用实现透明代理和对外开放内网某些服务。
snat    源地址转换,改变数据包的源地址
dnat    目的地址转换,改变数据包的目的地址
masquerade    IP伪装,只适用于ADSL等动态拨号上网的IP伪装,如果主机IP是静态分配的,就用snat
PRERROUTING:DNAT 、REDIRECT   (路由之前)只支持-i,不支持-o。在作出路由之前,对目的地址进行修改

————–centos7 iptables服务安装————-
yum install -y iptables
yum update iptables
yum install iptables-services
systemctl start iptables

[root@lvs-d script]# systemctl enable iptables   ——-增加开机启动
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.
[root@lvs-d script]# systemctl status iptables   ——-状态
● iptables.service – IPv4 firewall with iptables
   Loaded: loaded (/usr/lib/systemd/system/iptables.service; enabled; vendor preset: disabled)
   Active: active (exited) since Wed 2017-11-15 09:44:19 EST; 4 days ago
Main PID: 8565 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/iptables.service

Nov 15 09:44:19 lvs-d systemd[1]: Starting IPv4 firewall with iptables…
Nov 15 09:44:19 lvs-d iptables.init[8565]: iptables: Applying firewall rules: [  OK  ]
Nov 15 09:44:19 lvs-d systemd[1]: Started IPv4 firewall with iptables.
[root@lvs-d script]#

 

—————使用–line-number 查看编号

[root@lvs-d script]# iptables -L -n -t nat –line-number -v
Chain PREROUTING (policy ACCEPT 105 packets, 132K bytes)
num   pkts bytes target     prot opt in     out     source               destination        
1        8   480 DNAT       tcp  –  ens33  *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:10.1.1.11:80
2        0     0 DNAT       tcp  –  ens33  *       0.0.0.0/0            192.168.142.188      tcp dpt:80 to:10.1.1.11:80
3       12   720 DNAT       tcp  –  *      *       0.0.0.0/0            192.168.142.188      tcp dpt:80 to:10.1.1.11:80

Chain INPUT (policy ACCEPT 9 packets, 868 bytes)
num   pkts bytes target     prot opt in     out     source               destination        

Chain OUTPUT (policy ACCEPT 1 packets, 76 bytes)
num   pkts bytes target     prot opt in     out     source               destination        

Chain POSTROUTING (policy ACCEPT 2 packets, 136 bytes)
num   pkts bytes target     prot opt in     out     source               destination        
1       94  128K SNAT       all  –  *      *       10.1.1.0/24          0.0.0.0/0            to:192.168.142.188
2        2   118 SNAT       all  –  *      *       10.1.1.0/24          0.0.0.0/0            to:192.168.142.123
3      169  134K LOG        all  –  *      *       10.1.1.0/24          0.0.0.0/0            LOG flags 0 level 4
4      441  518K MASQUERADE  all  –  *      *       10.1.1.0/24          0.0.0.0/0          
5        0     0 LOG        all  –  *      *       10.1.1.0/24          0.0.0.0/0            LOG flags 0 level 4

———–如何修改规则————
-A 增加
-I 插入
-D 删除
-R 替换
[root@linux ~]# iptables -D INPUT 3  //删除input的第3条规则 
 
[root@linux ~]# iptables -t nat -D POSTROUTING 1  //删除nat表中postrouting的第一条规则 
 
[root@linux ~]# iptables -F INPUT   //清空 filter表INPUT所有规则 
 
[root@linux ~]# iptables -F    //清空所有规则 
 
[root@linux ~]# iptables -t nat -F POSTROUTING   //清空nat表POSTROUTING所有规则

———-保存规则—
[root@lvs-d script]# iptables-save    ——–保存命令
# Generated by iptables-save v1.4.21 on Mon Nov 20 07:02:11 2017
*filter
:INPUT ACCEPT [215:18560]
:FORWARD ACCEPT [4:304]
:OUTPUT ACCEPT [144:16988]
-A INPUT -p tcp -m tcp –dport 20 -j ACCEPT
COMMIT
# Completed on Mon Nov 20 07:02:11 2017
# Generated by iptables-save v1.4.21 on Mon Nov 20 07:02:11 2017
*nat
:PREROUTING ACCEPT [121:133719]
:INPUT ACCEPT [20:2194]
:OUTPUT ACCEPT [5:380]
:POSTROUTING ACCEPT [6:440]
-A PREROUTING -i ens33 -p tcp -m tcp –dport 80 -j DNAT –to-destination 10.1.1.11:80
-A PREROUTING -d 192.168.142.188/32 -i ens33 -p tcp -m tcp –dport 80 -j DNAT –to-destination 10.1.1.11:80
-A PREROUTING -d 192.168.142.188/32 -p tcp -m tcp –dport 80 -j DNAT –to-destination 10.1.1.11:80
-A POSTROUTING -s 10.1.1.0/24 -j SNAT –to-source 192.168.142.188
-A POSTROUTING -s 10.1.1.0/24 -j SNAT –to-source 192.168.142.123
-A POSTROUTING -s 10.1.1.0/24 -j LOG
-A POSTROUTING -s 10.1.1.0/24 -j MASQUERADE
-A POSTROUTING -s 10.1.1.0/24 -j LOG
COMMIT
# Completed on Mon Nov 20 07:02:11 2017
[root@lvs-d script]#

                                                                                                                                                                 
"/etc/sysconfig/iptables"  ———实际配置存放的文件
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state –state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state –state NEW -m tcp –dport 22 -j ACCEPT
-A INPUT -j REJECT –reject-with icmp-host-prohibited
-A FORWARD -j REJECT –reject-with icmp-host-prohibited
 
————-MASQUERADE 配置让内网机器出去上网——————
和其它硬件设备的overload一样,叫接口负载或单IP负载
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j LOG   —在其它动作之前开启日志

第一种配置方式 -j MASQUERADE 只能使用单一地址常用在PPP,ADSL等环境
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j MASQUERADE
Chain POSTROUTING (policy ACCEPT)——–配置后显示
target     prot opt source               destination        
MASQUERADE  all  –  10.1.1.0/24          0.0.0.0/0

————-snat 配置————–

第二种配置方式 -j SNAT –to-source 可选用其它地址
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j SNAT –to-source 192.168.142.188
Chain POSTROUTING (policy ACCEPT)——–配置后显示
target     prot opt source               destination        
SNAT       all  –  10.1.1.0/24          0.0.0.0/0            to:192.168.142.188

————-dnat 配置————–
iptables -t nat -A PREROUTING -d 192.168.142.188 -p tcp –dport 80 -j DNAT –to-destination 10.1.1.11:80

  [root@lvs-d script]# iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination        
DNAT       tcp  –  0.0.0.0/0            192.168.142.188      tcp dpt:80 to:10.1.1.11:80—-配置

Chain INPUT (policy ACCEPT)
target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination        
LOG        all  –  10.1.1.0/24          0.0.0.0/0            LOG flags 0 level 4
MASQUERADE  all  –  10.1.1.0/24          0.0.0.0/0          
[root@lvs-d script]#

使用接口配置后的结果
[root@lvs-d script]# iptables -t nat -I PREROUTING -i ens33  -p tcp –dport 80 -j DNAT –to-destination 10.1.1.11:80
[root@lvs-d script]# iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination        
DNAT       tcp  –  0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:10.1.1.11:80

———–dnat 验证——–
jeff@ubuntu:~$ ip a |grep 192
    inet 192.168.142.140/24 brd 192.168.142.255 scope global ens33
jeff@ubuntu:~$ curl http://192.168.142.188
r1

[root@mysql01 ~]# tail -f /var/log/nginx/access.log
192.168.142.140 – – [20/Nov/2017:06:15:15 -0500] "GET / HTTP/1.1" 200 3 "-" "curl/7.47.0" "-"
192.168.142.140 – – [20/Nov/2017:06:15:20 -0500] "GET / HTTP/1.1" 200 3 "-" "curl/7.47.0" "-"
192.168.142.140 – – [20/Nov/2017:06:15:23 -0500] "GET / HTTP/1.1" 200 3 "-" "curl/7.47.0" "-"

———-配置详解————-
  1、链
    netfilter在整个网络流程中内置了几条链(检测点),而在每条链上登记了一些处理函数进行处理(如包过滤,NAT等,甚至可以是 用户自定义的功能)。
    netfilter内置的五条链:    
       PREROUTING:路由决策前
       INPUT:到达本机内部的报文必经之路
       FORWARD:由本机转发的报文必经之路
       OUTPUT:由本机发出的报文的必经之路
       POSTROUTING:路由决策后

数据报文流程:
       ①跟本机内部进程通信:
           进:PREROUTING,INPUT
           出:OUTPUT,POSTROUTING
       ②由本机转发:
           PREROUTING,FORWARD,POSTROUTING    
  2、表
      netfilter由一些按功能分类的信息包处理表组成,这些表是内核用来控制信息包处理的规则集。
      netfilter的四个表:       
         filter:过滤,定义是否允许通过防火墙
         nat:网络地址转换,会启用connection_track;
             SNAT:源地址转换
             DNAT:目标地址转换
             PNAT:端口和地址转换
         mangle:可以用来改变包的一些属性,如
             TOS(TYPE OF SERVICE):设置或改变数据包的服务类型
             TTL(TIME TO LIVE):改变数据包的生存时间
             MARK:给包设置特殊的标记
         raw:关闭nat表上启用的连接追踪功能(因连接追踪功能比较消耗系统性能)
      表的处理优先级:raw > mangle > nat > filter
  3、表和链的对应关系为:      
       filter:INPUT,FORWARD,OUTPUT
       nat:PREROUTING(DNAT),POSTROUTING(SNAT),OUTPUT
       mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
       raw:PREROUTING,OUTPUT
      

二、iptables的用法
  1、基本语法:iptables [-t TABLE] COMMAND CHAIN CRETIRIA -j TARGET
    ■-t TABLE:nat, mangle, raw, filter。默认为filter
    ■COMMAND:
        链:
          -F:flush,清空表中的指定链,缺省为所有链
          -N:new,自建一条链
             自定义的链只能被主链上的规则作为跳转目标,若自定义链上没有规则能匹配报文,应让其返回主链
             例:
               iptables -N http_in
               iptables -A http_in -m iprange –src-range 172.16.100.1-172.16.100.100 -j DROP
               iptables -A http_in -m state –state NEW -j ACCEPT
               iptables -A http_in -j RETURN  #返回主链
               iptables -A INPUT -d 172.16.100.7 -p tcp –dport 80 -j http_in
          -X:delete,删除自定义且零引用的空链
          -Z:zero,数据包计数器和流量计数器归零
          -P chain target:policy,设置默认策略,对filter表来讲,默认策略为ACCEPT或DROP;注意 target 前面没有-j
              例:iptables -P INPUT DROP
          -E old_name new_name:重命名零引用的自定义链
        链上的规则:
          -A:append,附加规则于链末
          -I chain [#]:insert,向链中插入规则;#表示规则编号,缺省为1
          -D chain #(或-D chain rule-specification):delete,删除指定的规则
          -R chain #:替换指定的规则
        查询:
          -L:列出指定链上的所有规则,缺省为所有链
              -n:以数字格式显示
              -v:详细格式,-vv,-vvv
              -x:exactly,不要对计数器的计数结果做单位换算,而显示其精确值
              –line-numbers:显示规则编号
     ■匹配条件:
        通用匹配:
          -s 地址:指定报文源IP地址匹配的范围;可以是IP或网络地址;可使用!取反;
                  –src, –source
          -d 地址:指定报文目标IP地址匹配的范围;
                  –dst, –destination
          -p 协议:指定匹配报文的协议类型,一般为tcp, udp或icmp;
          -i INTERFACE:数据报文流入的接口;(PREROUTING, INPUT, FORWARD)
          -o INTERFACE:数据报文流出的接口;(OUTPUT, FORWARD, POSTROUITING)
      ▲扩展匹配:调用netfilter额外模块实现特殊检查
        △隐式扩展:当使用-p {tcp|udp|icmp}中的一种时,可以直接使用扩展专用选项;
            -p tcp:
               –sport PORT[-PORT]:指定源端口,可以是端口范围
               –dport PORT[-PORT]:指定目标端口
               –tcp-flags 要检查标志位列表(逗号分隔) 必须为1的标志位列表(逗号分隔)
                   例如:–tcp-flags syn,ack,rst,fin syn
                       –tcp-flags all none  #这些标志位全为1或全为0都不正常
               –syn:相当于–tcp-flags syn,ack,rst,fin syn
            -p udp:
               –sport
               –dport
            -p icmp:
               –icmp-type
                  0:echo-reply, ping响应
                  8:echo-request, ping请求
              例如:
                允许ping其它主机而不允许其它主机ping自己:
                  iptables -A OUTPUT -s 172.16.100.7 -p icmp –icmp–type 8 -j ACCEPT
                  iptables -A INTPUT -d 172.16.100.7 -p icmp –icmp–type 0 -j ACCEPT
         △显式扩展:必须明确说明使用哪个模块进行扩展,而后才能使用其扩展专用选项;
            -m 扩展模块名称
            常用模块:
             multiport:多端口匹配;可用于匹配非连续或连续端口,最多指定15个端口;
               专用选项:
                  –source-ports, –sports port[,port,port:port]
                  –destination-ports, –dports
                  –ports
               例如:
                  iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport –dports 22,80 -j ACCEPT
                  iptables -I OUTPUT -s 172.16.100.7 -p tcp -m multiport –sports 22,80 -j ACCEPT

             iprange:匹配指定范围内的地址;
                专用选项:
                  [!] –src-ragne IP[-IP]
                  [!] –dst-range
                例如:
                  iptables -A INPUT -d 172.16.100.7 -p tcp –dport 23 -m iprange –src-range 172.16.100.1-172.16.100.100 -j ACCEPT
                  iptables -A OUTPUT -s 172.16.100.7 -p tcp –sport 23 -m iprange –dst-range 172.16.100.1-172.16.100.100 -j ACCEPT

             string:字符串匹配,能够检测报文应用层中的字符串
                    字符匹配检查高效算法:kmp, bm
                专用选项:
                  –algo {kmp|bm}
                  –string "STRING"
                  –hex-string "HEX_STRING":HEX_STRING为编码成16进制格式的字串;
                例如:iptables -I OUTPUT -m string –algo kmp –string "sex" -j DROP

             time:基于时间做访问控制
                专用选项:
                  –datestart YYYY[-MM][-DD[Thh[:mm[:ss]]]]
                  –datestop
                  –timestart hh:mm[:ss]
                  –timestop hh:mm[:ss]
                  –weekdays day[,day]
                例如:iptables -I INPUT -d 172.16.100.7 -p tcp –dport 80 -m time –timestart 08:30 –timestop 17:30 –weekdays Mon,Tue,Thu,Fri -j REJECT

             connlimit:连接数限制,对每IP所能够发起并发连接数做限制;
                专用选项:
                  [!] –connlimit-above [n]
                例如:iptables -A INPUT -d 172.16.100.7 -p tcp –dport 22 -m connlimit –connlimit-above 3 -j DROP

             limit:速率限制
                专用选项:
                  –limit n[/second|/minute|/hour|/day]
                  –limit-burst n
                例如:iptables -A INPUT -d 172.16.100.7 -p icmp –icmp-type 8 -m limit –limit 20/minute –limit-burst 5 -j ACCEPT

             state:状态检查
                专用选项:
                  –state
                    连接追踪中的状态:
                      NEW: 新建立一个会话
                      ESTABLISHED:已建立的连接
                      RELATED: 有关联关系的连接
                      INVALID: 无法识别的连接
                例如:
                  iptables -I INPUT -d 172.16.100.7 -p tcp -m multiport –dports 22,80 -m state –state NEW -j ACCEPT
                  iptables -I INPUT -m state –state ESTABLISHED -j ACCEPT
                  iptables -I OUTPUT -m state –state ESTABLISHED -j ACCEPT
                调整连接追踪功能所能容纳的连接数上限:
                  /proc/sys/net/nf_conntrack_max和/proc/sys/net/netfilter/nf_conntrack_max(若连接数超出了上限,服务器会拒绝新的连接请求)
                当前追踪的所有连接:
                  /proc/net/nf_conntrack
                不同协议或连接类型追踪时的属性:
                  /proc/sys/net/netfilter目录
              ★放行被动模式下的FTP服务:
                  ⑴装载模块:modprobe nf_conntrack_ftp
                     /lib/modules/KERNEL_VERSION/kernel/net/netfilter/                            使用modprobe命令装载模块只是即时有效,重启系统后失效,要想长期有效,可编辑iptables配置文件:
                       vim /etc/sysconfig/iptables-config
                         IPTABLES_MODULES="nf_conntrack_ftp"
                  ⑵放行请求报文
                    ①放行NEW状态对21端口请求的报文;
                    ②放行ESTABLISHED以及RELATED状态的报文
                  ⑶放行响应报文:
                     放行ESTABLISHED以及RELATED状态的报文
     ■处理目标:
         DROP,REJECT,ACCEPT
         defi_chain
         RETURN:在自义链中无法匹配报文时,让其返回主链
            iptables -A defi_chain -j RETURN
         SNAT,DNAT,MASQUERADE
         LOG,REDIRECT, MARK
            LOG表示记录日志,例如 iptables -A INPUT -d 192.168.30.20 -p tcp –dport 80 -j LOG [–log-prefix "iptables:" [–log-level #]]      

三、iptables总结
   ①过滤应做白名单,即把默认策略设为DROP
   ②先添加规则放行自己的会话
   ③在编写规则前可先定义一个重启iptables服务的任务计划,这样即使因操作不当被防火墙屏蔽,待iptables重启后又可重新进入
   ④尽量减少规则条目,彼此不相关的匹配机会较多的放在上面,属于同一功能匹配规则更严格的放在上面

四、iptables使用示例
  1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
     iptables -N web_in
     iptables -A web_in -m time –weekdays Mon -j DROP
     iptables -A web_in -m string –algo kmp –string "admin" -j DROP
     iptables -A web_in -m state –state ESTABLISHED -j ACCEPT
     iptables -A web_in -m state –state NEW -m limit –limit 100/second -j ACCEPT
     iptables -A web_in -j RETURN
     iptables -A INPUT -d 192.168.30.20 -p tcp –dport 80 -j web_in
     iptables -A OUTPUT -m state –state ESTABLISHED -j ACCEPT

  2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;
     iptables -I INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
     iptables -A INPUT -s 172.16.0.0/16 -p tcp –dport 21 -m time –timestart 08:30 –timestop 17:30 –weekdays Mon,Tue,Wen,Thu,Fri -j ACCEPT
     iptables -A OUTPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

  3、开放本机的ssh服务给172.16.30.1-172.16.30.100中的主机,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
     iptables -I INPUT -m state –state ESTABLISHED -j ACCEPT
     iptables -A INPUT -p tcp –dport 22 -m iprange –src-range 172.16.30.1-172.16.30.100 -m state –state NEW -m limit –limit 2/minute -j ACCEPT
     iptables -A OUTPUT -m state –state ESTABLISHED -j ACCEPT

  4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
     iptables -I INPUT -p tcp –tcp-flags all none -j DROP
     iptables -I INPUT -p tcp –tcp-flags all all -j DROP

参考
http://9124573.blog.51cto.com/9114573/1740096

文章出自:CCIE那点事 http://www.jdccie.com/ 版权所有。本站文章除注明出处外,皆为作者原创文章,可自由引用,但请注明来源。 禁止全文转载。
本文链接:http://www.jdccie.com/?p=3613转载请注明转自CCIE那点事
如果喜欢:点此订阅本站
  • 相关文章
  • 为您推荐
  • 各种观点

暂时还木有人评论,坐等沙发!
发表评论

您必须 [ 登录 ] 才能发表留言!