七周四次课(1月25日)

七周四次课(1月25日)
10.15 iptables filter表案例
10.16/10.17/10.18 iptables nat表应用

10.15 iptables filter表案例

iptables小案例

vi /usr/local/sbin/iptables.sh //加入如下内容

#! /bin/bash

ipt="/usr/sbin/iptables"

$ipt -F

$ipt -P INPUT DROP

$ipt -P OUTPUT ACCEPT

$ipt -P FORWARD ACCEPT

$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT 

$ipt -A INPUT -s 192.168.133.0/24 -p tcp --dport 22 -j ACCEPT

$ipt -A INPUT -p tcp --dport 80 -j ACCEPT

$ipt -A INPUT -p tcp --dport 21 -j ACCEPT 

icmp示例

iptables -I INPUT -p icmp --icmp-type 8 -j DROP

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@tianqi-01 ~]# vim /usr/local/sbin/iptables.sh

#!/bin/bash

ipt="/usr/sbin/iptables"

$ipt -F

$ipt -P INPUT DROP

$ipt -P OUTPUT ACCEPT

$ipt -P FORWARD ACCEPT

$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

$ipt -A INPUT -s 192.168.77.1/24 -p tcp --dport 22 -j ACCEPT

$ipt -A INPUT -p tcp --dport 80 -j ACCEPT

$ipt -A INPUT -p tcp --dport 21 -j ACCEPT

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.77.1/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端口数据包放行

使用sh命令执行写好的shell脚本

[root@tianqi-01 sbin]# sh /usr/local/sbin/iptables.sh 

执行完脚本后使用iptables -nvL命令就可以查看到添加上去的规则:

[root@tianqi-01 sbin]# iptables -nvL

Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
 
  5   340 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     tcp  --  *      *       192.168.77.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 5 packets, 388 bytes)
 pkts bytes target     prot opt in     out     source               destination   
      

  • 为什么要写脚本?
  • 因为这里有INPUT DROP,肯定要把你的远程连接给断开,所以需要执行脚本把你的命令批量执行

icmp示例

1.iptables -I INPUT -p icmp --icmp-type 8 -j DROP 这个规则会产生一个效果,让你ping外面的机器还可以ping通,但是ping本机的时候,就不会通了

[root@tianqi-01 sbin]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP

//会发现可ping通外面的网络,但自己的虚拟机和物理机则无法连接

[root@tianqi-01 sbin]# ping www.qq.com
PING www.qq.com (112.90.83.112) 56(84) bytes of data.
64 bytes from 112.90.83.112: icmp_seq=1 ttl=128 time=12.1 ms
64 bytes from 112.90.83.112: icmp_seq=2 ttl=128 time=192 ms
64 bytes from 112.90.83.112: icmp_seq=3 ttl=128 time=221 ms
^C
--- www.qq.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2013ms
rtt min/avg/max/mdev = 12.123/142.229/221.660/92.744 ms
[root@tianqi-01 sbin]# 

2.这时用自己的物理机去ping虚拟机,会发现无法连接

074716_ETNA_3744518.png

3.这时,再来删除这条命令

  • iptables -D INPUT -p icmp --icmp-type 8 -j DROP

[root@tianqi-01 sbin]# iptables -D INPUT -p icmp --icmp-type 8 -j DROP

4.service iptables restart 重启iptables服务

[root@tianqi-02 ~]# service iptables restart    //重启iptables服务
Redirecting to /bin/systemctl restart  iptables.service
[root@tianqi-02 ~]# 

[root@tianqi-01 ~]# iptables -nvL    //这里会看到还没禁掉之前的规则

Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   29  1924 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    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            state NEW tcp dpt:22
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

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            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 17 packets, 1492 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@tianqi-02 ~]# 

这里--icmp-type选项要跟-p icmp一起使用,后面指定类型编号。这个8指的是能在本机ping通其他机器,而其它机器不能ping通本机,请牢记。

5.这里物理机去ping虚拟机IP,会发现再次ping通

075325_7EPw_3744518.png

  • 这里的物理机和虚拟机不通,并不指不能连接,这里仅仅是做了一个禁ping而已(是可以ping通外网的,但别人无法ping通你)

10.16/10.17/10.18 iptables nat表应用

•nat表应用

• A机器两块网卡ens33(192.168.133.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

• 需求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

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

需求:现在我有两台机器,A机器共有两块网卡,一块是可以连接外网的,一块是可以连接内网的。B机器则只有一个内网网卡,不能连接外网,只能连接内网。现在的需求就是想要B机器能够连接外网,说白了就是想做一个路由器的功能。

 1.首先做这个实验需要两个虚拟机,记得先拍摄一个快照,以免在实验过程中出现问题无法恢复:

2.给第一台虚拟机添加一个网卡:

编辑虚拟机设置->选择添加->选择网络适配器,下一步->完成。

此时出现网络适配器2,选择LAN区段,点击LAN区段(s)->添加,自定义名字,确定->在LAN区段(L)下选择“自定义名字”,确定。此时网络适配器2已经选择了“LAN区段”。

3.把另一台虚拟机的网卡禁止掉,然后添加一个新网卡,同样指定刚刚添加的那个LAN区段:

154023_06fJ_3744518.png

点击“添加”,选择“网络适配器”,下一步,完成。网络适配器2右侧点击“LAN区段(L)”,选择“自定义名字”,确定。

4.将两台虚拟机启动起来,然后给新网卡配置IP,先配置CentOS 7.4-1,使用ifconfig命令可以看到新网卡的信息:

[root@tianqi-01 ~]# ifconfig -a
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.231.132  netmask 255.255.255.0  broadcast 192.168.231.255
        inet6 fe80::cdb4:62da:20:9c95  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:b3:30:b6  txqueuelen 1000  (Ethernet)
        RX packets 278  bytes 21177 (20.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 80  bytes 12260 (11.9 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens33:0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.231.139  netmask 255.255.255.0  broadcast 192.168.231.255
        ether 00:0c:29:b3:30:b6  txqueuelen 1000  (Ethernet)

ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet6 fe80::e248:f90:634b:5b98  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:b3:30:c0  txqueuelen 1000  (Ethernet)
        RX packets 35  bytes 11970 (11.6 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 102  bytes 17988 (17.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 1  (Local Loopback)
        RX packets 8  bytes 552 (552.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 8  bytes 552 (552.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

[root@tianqi-01 ~]# 

接着使用ifconfig命令给新网卡配置一个IP,设置24网段:

[root@tianqi-01 ~]# ifconfig ens37 192.168.100.1/24

但是这种方式配置的IP重启系统就没有了,想要有永久有效就需要把网卡配置文件复制一份出来,将文件名称改为该网卡的名称,然后将里面的配置信息改为这个网卡IP:

[root@tianqi-01 ~]# cd /etc/sysconfig/network-scripts/

[root@tianqi-01 network-scripts]# ls
ifcfg-ens33    ifdown-bnep  ifdown-isdn    ifdown-sit       ifup          ifup-ippp  ifup-plusb   ifup-sit       ifup-wireless
ifcfg-ens33:0  ifdown-eth   ifdown-post    ifdown-Team      ifup-aliases  ifup-ipv6  ifup-post    ifup-Team      init.ipv6-global
ifcfg-lo       ifdown-ippp  ifdown-ppp     ifdown-TeamPort  ifup-bnep     ifup-isdn  ifup-ppp     ifup-TeamPort  network-functions
ifdown         ifdown-ipv6  ifdown-routes  ifdown-tunnel    ifup-eth      ifup-plip  ifup-routes  ifup-tunnel    network-functions-ipv6

[root@tianqi-01 network-scripts]# cp ifcfg-ens33 ifcfg-ens37
[root@tianqi-01 network-scripts]# ls

ifcfg-ens33    ifdown-bnep  ifdown-post    ifdown-TeamPort  ifup-eth   ifup-plusb   ifup-Team         network-functions
ifcfg-ens33:0  ifdown-eth   ifdown-ppp     ifdown-tunnel    ifup-ippp  ifup-post    ifup-TeamPort     network-functions-ipv6

ifcfg-ens37    ifdown-ippp  ifdown-routes  ifup             ifup-ipv6  ifup-ppp     ifup-tunnel
ifcfg-lo       ifdown-ipv6  ifdown-sit     ifup-aliases     ifup-isdn  ifup-routes  ifup-wireless
ifdown         ifdown-isdn  ifdown-Team    ifup-bnep        ifup-plip  ifup-sit     init.ipv6-global

[root@tianqi-01 network-scripts]# vim ifcfg-ens37

TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="static"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"

NAME="ens37"
UUID="a0a278f6-09ab-4b83-981b-6a5bf82223b4"
DEVICE="ens37"
ONBOOT="yes"
IPADDR=192.168.100.1
NETMASK=255.255.255.0

重启网卡服务

[root@tianqi-01 network-scripts]# service network restart
Restarting network (via systemctl):                        [  OK  ]

5.配置另一台虚拟机的网卡IP:

由于无法远程,在本机操作。

同样的使用ifconfig命令配置IP

211604_fONN_3744518.png

接着复制网卡文件,并修改为新网卡的信息:

211716_MRkH_3744518.png

修改完后重启一下网卡服务,但是可能会重启失败,如果重启失败就重启操作系统即可。

162523_xsYL_3744518.png

211748_Aos0_3744518.png

以上操作成功后就ping一下CentOS 7.4的IP看看是否能ping通:

231211_BoCC_3744518.png

如果无法ping通证明有问题,需要去检查一下,CentOS 7.4的IP是否存在,如果CentOS 7.4的IP存在的话,就检查一下CentOS 7.2的IP是否存在,发现IP不存在的话就重新使用ifconfig命令配置一下即可。

如果出现多次使用ifconfig命令配置IP之后,IP却消失的情况,就得查看这个网卡的网卡配置文件是否有问题。

6.准备工作都就绪之后,确保两个网卡都可以互相ping之后,就开始完成需求1:让CentOS 7.4clone可以连接外网:

首先打开CentOS 7.4的nat路由中转发,这一步需要修改一下内核参数,需要修改/proc/sys/net/ipv4/ip_forward文件,这个文件默认的值为0,0代表没有开启转发,所以我们要将这个值改为1:

[root@tianqi-01 network-scripts]# cat /proc/sys/net/ipv4/ip_forward
0
[root@tianqi-01 network-scripts]# echo "1" > !$
echo "1" > /proc/sys/net/ipv4/ip_forward
[root@tianqi-01 network-scripts]# cat /proc/sys/net/ipv4/ip_forward
1
第二步,增加一条规则(有了这条规则就可以上网):

[root@tianqi-01 network-scripts]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33-j MASQUERADE
[root@tianqi-01 network-scripts]# iptables -t nat -nvL

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

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

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

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 MASQUERADE  all  --  *      ens33   192.168.100.0/24     0.0.0.0/0 

上面是能够连接外网网卡的名字。

这一步要注意的是,网卡的名称看清楚得是能链接外网网卡的那个网卡名称,搞错了后续步骤就会失败。

第三步,给CentOS 7.2设置默认网关:

232738_ZMGk_3744518.png

设置了默认网关后可以使用route -n查看一下,是否设置成功:

212013_z7vn_3744518.png

设置了默认网关后ping一下CentOS 7.4的外网网卡IP和虚拟机的网关地址看看能不能ping通:

 

能ping通之后,就代表可以连接外网了,但是这时候还不能够ping网址,所以接下来我们给CentOS 7.2设置一下DNS,看看能否连接网站:

234402_44aE_3744518.png

234446_9vB6_3744518.png

然后ping一下DNS的地址看看是否能ping通:

wKiom1nlwzLARdyfAANFPhp60sE937.png

能ping的通就代表没问题,这时候就可以ping一下一些网站了:

wKioL1nlwH2SMLC3AANLzqslMnk667.png

能ping通网址的话,就代表这个台内网的机器已经可以通过CentOS 7.4的nat转发来连接外网了,现在CentOS 7.4就相当于充当了一个路由器的角色,通过这台机器就可以让内网的机器得以连接外网了。

需求2:现在使用Windows是不能连接CentOS 7.2的,所以现在的需求就是能够远程连接CentOS 7.2。要实现这个需求需要通过CentOS 7.4进行一个跳转,也就是所谓的端口映射,把CentOS 7.2的22端口映射到CentOS 7.4上。

• 需求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

第一步,打开路由转发:

[root@tianqi-01 network-scripts]# cat /proc/sys/net/ipv4/ip_forward
0
[root@tianqi-01 network-scripts]# echo "1" > !$
echo "1" > /proc/sys/net/ipv4/ip_forward
[root@tianqi-01 network-scripts]# cat /proc/sys/net/ipv4/ip_forward
1

 第二步,添加规则,因为之前添加了一条规则,现在先把那条规则删掉以免影响操作:

[root@tianqi-01 ~]# iptables -t nat -D POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE 

现在nat表是一个空表,没有任何规则

[root@tianqi-01 ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         

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

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

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
[root@tianqi-01 ~]# 

第一条,是发送过来的包:

[root@tianqi-01 ~]# iptables -t nat -A PREROUTING -d 192.168.11.136 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22

这条规则是把192.168.11.136的1122端口的数据包,转发到192.168.100.100的22端口上去。

第二条,是反馈回去的包:

[root@tianqi-01 ~]# iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.11.136

这条规则是把192.168.100.100返回的数据包,转发到192.168.11.136上去,然后回到Windows上。

添加完规则检查一下是否存在nat表里:

[root@tianqi-01 ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 1 packets, 229 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DNAT       tcp  --  *      *       0.0.0.0/0            192.168.11.136       tcp dpt:1122 to:192.168.100.100:22

Chain INPUT (policy ACCEPT 1 packets, 229 bytes)
 pkts bytes target     prot opt in     out     source               destination         

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

Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 SNAT       all  --  *      *       192.168.100.100      0.0.0.0/0            to:192.168.11.136
[root@tianqi-01 ~]# 

第三步,以上操作没问题后,给CentOS 7.2设置默认网关:

232738_ZMGk_3744518.png

完成以上操作之后,在XShell里新建一个会话,连接192.168.11.136的1122端口:

215843_KFnJ_3744518.png

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

友情链接:阿铭Linux

转载于:https://my.oschina.net/u/3744518/blog/1613236

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值