iptables (二) nat & tcp_wrapper

不打扰是莪最后的温柔 提交于 2020-02-05 11:27:25

一、nat

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

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

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

常见的nat有两种情形: 

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

nat表:

PREROUTTING: DNAT
OUTPUT
POSTROUTING: SNAT

实例:架构如下

 

中间一台主机当做连接内网和外网的接口,添加两块网卡,192.168.20.1作为内网网关,192.168.1.1为外网网关,内网中有台主(192.168.20.2)机指向内网网关(192.168.20.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. 抓包测试:

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

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

# route del -net 192.168.20.0/24

4. 写iptables规则实现snat转发

# 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
如果这个外网地址不是固定的,可以用MASQUERADE机制来地址伪装:# iptables -t nat -A POSTROUTING -s 192.168.20.0/24 ! -d 192.168.20.0/24 -j MASQUERADE

6. 写iptables规则实现dnat转发

# 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

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

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

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

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

/etc/hosts.allow
/etc/hosts.deny配置文件语法:  daemon_list: client_list [:options]  daemon_list:    应用程序的文件名称,而非服务名    应用程序文件名称列表,彼此间使用逗号分隔        例如: sshd,vsftpd          ALL表示所有服务  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  [: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中

# yum install telnet-server -y
# vim /etc/xinetd.d/telnet
    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   

 

 

 

 

 

 

 

 

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!