一、nat

之前网络防火墙的示例中,如果内网是私网地址,那么内网主机如何与外网通信呢?

这时候,iptables要实现内网和外网通信,有两种方式:

  1.   nat: Network Address Translation,安全性,网络层+传输层
  2.   proxy: 代理,应用层

常见的nat有两种情形:

  1. SNAT: 只修改请求报文的源地址
  2. DNAT:只修改请求报文的目标地址

nat表:

  1. PREROUTTING: DNAT
  2. OUTPUT
  3. POSTROUTING: SNAT

实例:架构如下

中间一台主机当做连接内网和外网的接口,添加两块网卡,192.168.20.1作为内网网关,192.168.1.1为外网网关,内网中有台主(192.168.20.2)机指向内网网关(192.168.20.1)

  1. 具体步骤:
      中间主机: 添加一块自定义网卡,添加ip # ip addr add 192.168.20.1/24
            打开转发功能: # vim /etc/sysctl.conf ==> net.ipv4.ip_forward=1 ==> sysctl -p
      内网主机: 添加ip并且指向内网网关: # ifconfig eth1 192.168.20.2/24 up; # route add default gw 192.168.20.1
      外网主机: 添加网络路由: # route add -net 192.168.20.0/24 gw 192.168.1.101
    现在内外网主机可以互相ping

接下来做一个基于DNAT的方式进行源地址转换:

1. 首先让外网启动web服务,并写一个简单的测试页面

2. 抓包测试:

  1. 外网主机: # tcpdump -i eth0 host 192.168.1.103
    内网主机: # curl http://192.168.20.2
    外网主机成功抓包: 说明内网主机可以和外网主机通信

3. 现在删掉刚才添加的外网主机的网络路由:

  1. # route del -net 192.168.20.0/24

4. 写iptables规则实现snat转发

  1. # iptables -t nat -A POSTROUTING -s 192.168.20.0/24 ! -d 192.168.20.0/24 -j SNAT --to-source 192.168.1.101
  1. 如果这个外网地址不是固定的,可以用MASQUERADE机制来地址伪装:
    # iptables -t nat -A POSTROUTING -s 192.168.20.0/24 ! -d 192.168.20.0/24 -j MASQUERADE

6. 写iptables规则实现dnat转发

  1. # iptables -t nat -A PREROUTING -d 192.168.1.101 -p tcp --dport 80 -j DNAT --to-destination 192.168.20.2

再次测试,内网和外网可以通信,如果是端口映射,可以直接在ip后面指定[:PORT]

二、tcp_wrapper

  1. tcp_wrapper: tcp包装器
      对基于tcp协议开发并提供服务的应用程序,提供的一层访问控制工具
      基于库调用实现其功能:libwrap 

判断服务是否能够由tcp_wrapper进行访问控制:

  1.  (1)动态编译: ldd命令
  2.  2)静态编译: strings命令查看应用程序文件,其结果中如果出现
  3.       hosts.allow
  4.       hosts.deny 

在配置文件中为各服务分别定义访问控制规则实现访问控制:

  1. /etc/hosts.allow
  2. /etc/hosts.deny
  3.  
  4. 配置文件语法:
      daemon_list: client_list [:options]
      daemon_list:
        应用程序的文件名称,而非服务名
        应用程序文件名称列表,彼此间使用逗号分隔
            例如: sshd,vsftpd
              ALL表示所有服务
  5.  
  6.   client_list:
        IP地址
        主机名
        网络地址:必须使用完整格式的掩码,不使用前缀格式掩码;所以类似于192.168.1.0/24不合法
        简短格式的网络地址:192.168.1.表示 192.168.1.0/255.255.255.0
        ALL: 所有主机
        KNOWN
        UNKNOWN:
        PARANOID
      
      EXCEPT: 除了
        hosts.allow
          vsftpd:172.16. EXCEPT 172.16.100.0/255.255.255.0 EXCEPT 172.16.100.1
  7.  
  8.   [:options]
        deny: 拒绝,主要用于hosts.allow文件中
          vsftpd: 172.16.:deny  //非172.16网络的反而能访问
        allow: 允许,主要用于hosts.deny文件中
        spawn: 启动额外应用程序
          vsftpd: ALL : spawn /bin/echo `date` login attempt from %c to %s,%d >> /var/log/vsftpd.deny.log
                %c: client ip    
                %s: server ip
                %d: daemon name
      
      例如: 1.vsftpd服务不允许192.168.1.101访问
            # vim /etc/hsots.deny
             添加: vsftpd: 192.168.1.101
          2. vsftpd服务只允许192.168.1网络访问
            # vim /etc/hosts.allow
              添加:vsftpd:192.168.1.
            # vim /etc/hosts.deny
              添加: vsftpd:ALL

检查次序如下图所示:先在hosts.allow中进行匹配,如果有就直接放行了,没有就继续进行host.deny匹配,hosts.deny中如果匹配,那么就拒绝放行,没有就进行默认操作,默认放行

实例:控制telnet服务仅允许172.16.0.0网络中的主机访问,但不包括172.16.100.0/255.255.255.0中的主机

  对所有正常登陆的主机都记录于/var/log/telnet.allow.log中

  所有未授权访问尝试都记录于/var/log/telnet.deny.log中

  1. # yum install telnet-server -y
  2. # vim /etc/xinetd.d/telnet
  3. disabled = no //相当于chkconfig telnet on
    # vim hosts.allow
     添加: in.telnetd: 172.16. EXCEPT 172.16.100. :spawn /bin/echo `date` login attempt from %c to %s,%d >> /var/log/telenet.allow.log
    # vim hosts.deny
     添加: in.telnetd:ALL EXCEPT 172.16. EXCEPT 172.16.100. :spawn /bin/echo `date` login attempt from %c to %s,%d >> /var/log/telnet.deny.log   

iptables (二) nat & tcp_wrapper的更多相关文章

  1. 用iptables做NAT代理,使内网机器上外网

    现状:服务器A只有一个内网IP,不能上外网,内网IP与服务器B内网相通:服务器B有一个内网IP和公网IP.想实现服务器A也能上外网. 1 2 3 4 服务器A:内网网卡:eth0 内网IP:192.1 ...

  2. 动手实验iptables的NAT功能实现流量穿透

    1.NAT和iptables理论见: http://lustlost.blog.51cto.com/2600869/943110 2.引子 近期,有同事抱怨说数据入库时,由于数据库所在的服务器只有内网 ...

  3. iptables配置——NAT地址转换

    iptables nat 原理同filter表一样,nat表也有三条缺省的"链"(chains): PREROUTING:目的DNAT规则 把从外来的访问重定向到其他的机子上,比如 ...

  4. 用iptables 做NAT代理上网

    背景:有一台A服务器不能上网,和B服务器通过内网来连接,B服务器可以上网,要实现A服务器也可以上网. 内网主机: A eth1:172.16.1.8 外网主机: B eth0:10.0.0.61外网主 ...

  5. 亲测可用,iptables实现NAT转发。

    环境 服务器A:192.168.1.7 服务器B: 192.168.1.160 需求 实现将本机(192.168.1.7:7410)端口流量转发给(192.168.1.160:9200). 1. 内核 ...

  6. zabbix和iptables的nat表结合使用

    A 机器要去访问C机器,但是无法直接访问到A可以访问到B机器,B机器可以访问到C机器这时候就可以再B机器设置nat,让A机器访问C机器 正好工作中zabbix server要监控2个http地址,缺无 ...

  7. iptables之NAT端口转发设置

    背景:服务器A:103.110.114.8/192.168.1.8,有外网ip,是IDC的一台服务器服务器B:192.168.1.150,没有外网ip,A服务器是它的宿主机,能相互ping通服务器C: ...

  8. 5、iptables之nat

    iptables: 显式扩展.网络防火墙 显式扩展:multiport, iprange, string, time, connlimit, limit, state state:无关是哪种协议 /p ...

  9. iptables之NAT代理-内网访问外网

    1.前言 本文使用NAT功能:内网服务器,想上网又不想被攻击. 工作原理:内网主机向公网发送数据包时,由于目的主机跟源主机不在同一网段,所以数据包暂时发往内网默认网关处理,而本网段的主机对此数据包不做 ...

随机推荐

  1. 12306 抢票系列之只要搞定RAIL_DEVICEID的来源,从此抢票不再掉线(上)

    郑重声明: 本文仅供学习使用,禁止用于非法用途,否则后果自负,如有侵权,烦请告知删除,谢谢合作! 开篇明义 本文针对自主开发的抢票脚本在抢票过程中常常遇到的请求无效等问题,简单分析了 12306 网站 ...

  2. java4选择结构 二

    public class jh_01_为什么使用switch选择结构 { /* * 韩嫣参加计算机编程大赛 * 如果获得第一名,将参加麻省理工大学组织的1个月夏令营 * 如果获得第二名,将奖励惠普笔记 ...

  3. (三)(2)wait/notify实现生产者-消费者模型,join方法

    生产者,消费者模型 举个例子来说明,厨师,服务员,厨师做菜,服务员上菜,如果厨师没有做好菜,那么服务员就无法上菜,厨师做好了菜,然后通知服务员消费(上菜).在这个过程之中,厨师扮演的就是生产者,服务员 ...

  4. MingGW Posix VS Win32 - 明瓜娃的毒因

    MinGW-posix和win32纠缠的瓜娃子 官方首席佛偈(SourceForge)的官网下载页 法克油啊,让我一个小白情何以堪. 盘TA wiki posix wiki中文-UNIX API标准 ...

  5. 如何构建OpenStack镜像

    本文以制作CentOS7.2镜像为例,详细介绍手动制作OpenStack镜像详细步骤,解释每一步这么做的原因.镜像上传到OpenStack glance,支持以下几个功能: 支持密码注入功能(nova ...

  6. vSphere虚拟系统 添加虚拟服务器

    虚拟插槽数:插槽的概念与物理服务器的物理CPU类似,为虚拟机分配m个插槽,相当于为物理服务器配置了m颗物理CPU: 每个插槽的内核数:相当于物理服务器每颗物理CPU的核心数为n: 在上述条件下虚拟机获 ...

  7. OpenCV图像变换二 投影变换与极坐标变换实现圆形图像修正

    投影变换 在放射变换中,物体是在二维空间中变换的.如果物体在三维空间中发生了旋转,那么这种变换就成为投影变换,在投影变换中就会出现阴影或者遮挡,我们可以运用二维投影对三维投影变换进行模块化,来处理阴影 ...

  8. Failed to get convolution algorithm解决

    蒸腾了两天,终于搞定了 是cudnn版本的问题 更新cudnn的时候,首先要删除/usr/local/cuda-10.0/targets/x86_64-linux/lib路径下所有之前cudnn版本的 ...

  9. 为什么我不建议在C#中用下划线_开头来表示私有字段

    我在C#官方文档的使用属性里看到这种代码: public class Date { private int _month = 7; // Backing store public int Month ...

  10. 转载:字符编码简介 ASCII UTF-8 ISO8859-1

    字符编码简介 ASCII UTF-8 ISO8859-1 博客分类: 电脑综合知识 XP数据结构Windows  计算机中的一切都是以数字来表示的,字符同样如此.字符编码就是将字符集编码成为数字序列, ...