Linux基础(day 34)

10.15 iptables filter表案例

iptables经常使用知识回顾点

  • iptables -I/-A/-D 后紧跟 链 ,能够是INPUT,OUTPUT,FORWARD
  • iptables -P 用来指定 链的默认策略 ——>最好不要直接操做,不然会形成远程的终端断开

iptables小案例

  • 需求:
    • 把80,22,21端口放行,但22端口指定一个IP段,只容许这个IP段的IP访问的时候,才可访问到,其余段的一律拒绝
  • 实现:(用一个脚原本实现)
    • RELATED状态,这是一个边缘的一个状态
      • 好比:客户端和服务端相互了通讯,创建完链接以后,还会有一些额外的连接出来,这时候状态就变成了RELATED(若牢牢只有ESTABLISHED,而没有RELATED,颇有可能致使其余的通讯被禁掉,由于默认策略是INPUT DROP)
    • ESTABLISHED状态, 保持链接
    • 有时,在没有增长-m --state这条规则,致使增长了80或21端口,可是不能正常通讯,加这条规则的目的是为了让通讯更加顺畅
[root@hanfeng-001 ~]# vim /usr/local/sbin/iptables.sh

添加如下内容

#! /bin/bash
ipt="/usr/sbin/iptables    //这里ipt是定义个一个变量(写脚本的时候,写全局的路径,就是绝对路径,就是后面再加载它,用变量去代替,看着更加简单)
$ipt -F    //清空以前的规则——>在没有 -t 指定表的时候,默认的就是filter表
$ipt -P INPUT DROP    //把IPPUT的策略给扔掉
$ipt -P OUTPUT ACCEPT    //把OUTPUT放行
$ipt -P FORWARD ACCEPT    //把FORWARD放行
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT    //增长规则,-m  --state 指定了状态,并针对这些状态放行(-m  --state这种用法并很少见,可是这条规则必须写进来,目的是让相关的数据包放行)
$ipt -A INPUT -s 192.168.202.130/24 -p tcp --dport 22 -j ACCEPT    //把该网段的22端口数据包放行——>这里的IP段根据本身的IP段来作实验
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT    //把80端口数据包放行
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT      //把21端口数据包放行

而后保存退出:wq
[root@hanfeng ~]# sh /usr/local/sbin/iptables.sh        //执行脚本
[root@hanfeng ~]# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   30  2148 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  *      *       192.168.202.0/24     0.0.0.0/0            tcp dpt:22
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:21

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 18 packets, 1816 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@hanfeng ~]#
  • 为何要写脚本?
  • 由于这里有INPUT DROP,确定要把你的远程链接给断开,因此须要执行脚本把你的命令批量执行

icmp示例

  1. iptables -I INPUT -p icmp --icmp-type 8 -j DROP 这个规则会产生一个效果,让你ping外面的机器还能够ping通,可是ping本机的时候,就不会通了
[root@hanfeng-001 ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP    //会发现可ping通外面的网络,但本身的虚拟机和物理机则没法链接
[root@hanfeng-001 ~]# ping www.qq.com
PING www.qq.com (180.96.86.192) 56(84) bytes of data.
64 bytes from 180.96.86.192: icmp_seq=1 ttl=128 time=7.38 ms
64 bytes from 180.96.86.192: icmp_seq=2 ttl=128 time=6.16 ms
64 bytes from 180.96.86.192: icmp_seq=3 ttl=128 time=7.73 ms
^C
--- www.qq.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 6.166/7.092/7.731/0.677 ms
[root@hanfeng-001 ~]#
  1. 这时用本身的物理机去ping虚拟机,会发现没法链接

输入图片说明

  1. 这时,再来删除这条命令
  • iptables -D INPUT -p icmp --icmp-type 8 -j DROP
[root@hanfeng ~]# iptables -D INPUT -p icmp --icmp-type 8 -j DROP
iptables: Bad rule (does a matching rule exist in that chain?).
[root@hanfeng ~]#
  1. service iptables restart 重启iptables服务
[root@hanfeng ~]# service iptables restart    //重启iptables服务
Redirecting to /bin/systemctl restart  iptables.service
[root@hanfeng ~]# iptables -nvL    //这里会看到还没禁掉以前的规则
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   81  6996 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            

Chain OUTPUT (policy ACCEPT 61 packets, 6060 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@hanfeng ~]#
  1. 这里物理机去ping虚拟机IP,会发现再次ping通

输入图片说明

  • 这里的物理机和虚拟机不通,并不指不能链接,这里仅仅是作了一个禁ping而已(是能够ping通外网的,但别人没法ping通你)

10.16/10.17/10.18 iptables nat表应用

nat表应用

  • A机器两块网卡ens33(192.168.202.130)、ens37(192.168.100.1),ens33能够上外网,ens37仅仅是内部网络,B机器只有ens37(192.168.100.100),和A机器ens37能够通讯互联。

需求1:可让B机器链接外网

  • A机器上打开路由转发 echo "1">/proc/sys/net/ipv4/ip_forward
  • A上执行 iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
  • B上设置网关为192.168.100.1

实现:

  1. 首先准备两台机器(如果怕实验失败,可先快照下)html

  2. 在虚拟机hf上在添加一块网卡(已添加过一块虚拟网卡)linux

    输入图片说明

  3. 而后默认的是NAT模式,而后点击完成vim

    输入图片说明

  4. 在选择添加的网卡,并在右侧,选择LAN区段windows

  • 选择LAN区段,就至关于咱们给网卡链接到了内网的一个交换机上,这个交换机,用windows机器是没法链接的,这样这台机器和那台机器连上同一个内网的交换机,它们二者之间通讯便可。bash

    输入图片说明

  1. 而后选择LAN区段中,刚设置的名称为“内网”网络

    输入图片说明

  2. 最后点击肯定tcp

  3. 选择克隆的虚拟机hf-02,并添加网卡——>在这台虚拟机上自己有一块网卡,由于已经编辑过IP,因此咱们能够直接禁掉这个网卡.net

    输入图片说明

  4. 而后hf-02添加一块网卡,和hf添加网卡步骤同样相同,并选择LAN区段,中的“内网”,并确认命令行

  5. 重启两台虚拟机rest

  • hf-02虚拟机中没有了windows所能链接的IP,因此就没法远程链接hf-02
  1. 打开hf虚拟机,输入ifconfig命令,会看到添加了一个网卡eno33554984

  2. 这里会看到eno33554984网卡,并无IP,并设置IP(新建那个当私网IP,你能够跟跟视频中的同样,也能够本身设置)

  • 设定IP有两种方法:
    • 1.能够命令行添加IP
      • 命令行ifconfig ens36 192.168.100.1/24
    • 2.也能够设置配置文件,设置配置文件和设置虚拟网卡同样的步骤
      • 将eno16777736网卡配置文件复制成eno33554984,并修改里面的IP和NETMASK便可其余都不须要管
  1. 执行命令行ifconfig ens36 192.168.100.1/24,而后运行ifconfig命令,会看到eno33554984网卡有了IP
  • 手动命令行ifconfig ens36 192.168.100.1/24,设置IP

    ![输入图片说明](https://static.oschina.net/uploads/img/201712/01120906_md73.png "新增网卡eno3355498")
  1. 可是eno33554984网卡的IP,在虚拟机一重启,那么IP就会没了——>若想永久生效,就去编辑配置文件,但默认配置文件是不存在的,须要拷贝eno16777736网卡的配置文件,而后更改其中的内容

  2. 由于hf-02虚拟机没法远程,因此只能在虚拟机上操做

  3. 用ifconfig命令查看hf-02虚拟机的网卡,会发现也没有IP地址

  4. 这里若想彻底禁掉eno16777736网卡,可执行ifdown eno16777736命令(这一步可省略,若一直失败的话,只要在设置好IP,两个私网IP互通便可)

    输入图片说明

    • 但有时会提示MAC地址不对,这时候进网卡配置文件中
      • 方法一:注释掉HWADDR参数
      • 方法二:看是否存在DEVICE参数。若没有,则增长上DEVICE参数——>(本身的是没有的)
      • 方法三:直接删除以前的网卡,新建虚拟网卡
  5. 给eno33554984网卡设置IP地址,命令行ifconfig ens36 192.168.100.100/24

  6. 而后用ifconfig命令,查看新建的网卡IP地址

    输入图片说明

  7. 这里会看到hf-02虚拟机中的eno16777736网卡,可是是没法ping通的——>若为了保险这里能够执行命令ifdown eno16777736

  8. 而后给ens36网卡设置IP地址,命令行ifconfig ens36 192.168.100.100/24

  9. 这时候,两台虚拟机中新建网卡的IP互相尝试互相ping通

    输入图片说明

    输入图片说明

  10. 这时hf机器上须要打开路由转发 ——>想使用nat表,使用网络的转发,必须修改内核参数

    • 默认/proc/sys/net/ipv4/ip_forward这个文件为0——>这个文件为0,表示这个文件没有开启内核转发
[root@hanfeng ~]# cat /proc/sys/net/ipv4/ip_forward
0
[root@hanfeng ~]#
  1. 将文件/proc/sys/net/ipv4/ip_forward默认改成1,打开端口转发
    • 要想实现nat应用,必须打开端口转发
[root@hanfeng ~]# echo "1" > !$
echo "1" > /proc/sys/net/ipv4/ip_forward
[root@hanfeng ~]# !cat
cat /proc/sys/net/ipv4/ip_forward
1
[root@hanfeng ~]#
  1. 在hf虚拟机上增长一条规则iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
[root@hanfeng ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
[root@hanfeng ~]#
  1. 实现100.0网段能够上网,作一个欺骗

  2. 给hf-02设置网关(数据包过去,从hf到hf-02,从hf-02到hf,设置好默认网关)

    输入图片说明

  3. 而后hf-02尝试是否能ping通192.168.202.130,这就意味着能够和外网通讯了

    输入图片说明

  4. 设置DNS,在/etc/resolv.conf中设置,添加mameserver 119.29.29.29

输入图片说明

  1. 这时候就能够ping通外网了——>但物理机仍是没法ping通hf-02的虚拟机IP地址

如今只作到了机器互通,能够访问外网机器的IP,但不能链接外网

  1. 需求2:C机器只能和A通讯,让C机器能够直接连通B机器的22端口
  • A上打开路由转发echo "1">/ proc/sys/net/ipv4/ip_forward
  • A上执行iptables -t nat -A PREROUTING -d 192.168.133.130 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22
  • A上执行iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.133.130
  • B上设置网关为192.168.100.1

扩展

  1. iptables应用在一个网段

  2. sant,dnat,masquerade

相关文章
相关标签/搜索