一、环境(CentOS6.5)

node2:eth0:192.168.10.2/24

node3:eth0:192.168.10.3/24   eth1:172.16.11.3/16 

node4:eth0:172.16.11.4/16

wKiom1hnhGage6eSAAAfpGUtZ80894.png

二、iptables实现网络防火墙

1、node2设置网关

[root@Node2 ~]# ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN 
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether 00:0c:29:53:fa:9a brd ff:ff:ff:ff:ff:ff
    inet 192.168.10.2/24 brd 192.168.10.255 scope global eth0
    inet6 fe80::20c:29ff:fe53:fa9a/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc pfifo_fast state DOWN qlen 1000
    link/ether 00:0c:29:53:fa:a4 brd ff:ff:ff:ff:ff:ff
[root@Node2 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
[root@Node2 ~]# ping 192.168 .10.3
ping: IDN encoding of '.10.3' failed with error code 5
[root@Node2 ~]# ping 192.168.10.3
PING 192.168.10.3 (192.168.10.3) 56(84) bytes of data.
64 bytes from 192.168.10.3: icmp_seq=1 ttl=64 time=0.335 ms
^C
--- 192.168.10.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 790ms
rtt min/avg/max/mdev = 0.335/0.335/0.335/0.000 ms
[root@Node2 ~]# ping 172.16.11.3
connect: Network is unreachable
[root@Node2 ~]# ^C
[root@Node2 ~]# ping 172.16.11.4
connect: Network is unreachable
[root@Node2 ~]# route add default gw 192.168.10.3
[root@Node2 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.10.0    0.0.0.0         255.255.255.0   U     0      0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
0.0.0.0         192.168.10.3    0.0.0.0         UG    0      0        0 eth0
[root@Node2 ~]# ping 192.168.10.3 -c 1
PING 192.168.10.3 (192.168.10.3) 56(84) bytes of data.
64 bytes from 192.168.10.3: icmp_seq=1 ttl=64 time=0.391 ms

--- 192.168.10.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.391/0.391/0.391/0.000 ms
[root@Node2 ~]# ping 172.16.11.4 -c 1
PING 172.16.11.4 (172.16.11.4) 56(84) bytes of data.
^C
--- 172.16.11.4 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 2429ms

[root@Note3 ~]# cat /proc/sys/net/ipv4/ip_forward 
0

   这里我们看到node3还没有打开网络间转发功能时,node2 192.168.10.2的ip就能ping通node3的第二块网卡172.16.11.3的ip,为什么?

   因为在linux系统中,ip地址是配置在内核,显示在网卡上,不管配置在哪个网卡上,都属于当前主机的ip,到达本机就到达了目的地,即便是非客户端请求同网段的,但属于当前主机的地址,也会给予响应,不属于转发。


2、node3打开网络间转发功能

[root@Note3 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@Note3 ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@Node2 ~]# ping 172.16.11.3
PING 172.16.11.3 (172.16.11.3) 56(84) bytes of data.
64 bytes from 172.16.11.3: icmp_seq=1 ttl=64 time=1.35 ms
^C
--- 172.16.11.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 701ms
rtt min/avg/max/mdev = 1.358/1.358/1.358/0.000 ms
[root@Node2 ~]# ping 172.16.11.4
PING 172.16.11.4 (172.16.11.4) 56(84) bytes of data.
^C
--- 172.16.11.4 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 856ms

   我们看到node3打开了网络间转发功能后,node2 192.168.10.2还是ping不通node4 172.16.11.4,为什么?

   因为我们只设置了node2到node4的路由,没有设置node4到node2的路由,node4的ping响应包无法到达node2,所以仍然ping不通


3、设置node4的网关

[root@Node4 ~]# route add default gw 172.16.11.3

[root@Node2 ~]# ping 172.16.11.4
PING 172.16.11.4 (172.16.11.4) 56(84) bytes of data.
64 bytes from 172.16.11.4: icmp_seq=1 ttl=63 time=3.24 ms
64 bytes from 172.16.11.4: icmp_seq=2 ttl=63 time=0.508 ms

[root@Node4 ~]# ping 192.168.10.2
PING 179.168.10.2 (172.16.11.4) 56(84) bytes of data.
64 bytes from 192.168.10.2: icmp_seq=1 ttl=63 time=3.24 ms

  已经能互通,node3就实现了路由功能,但没有基于路由协议自动学习并创建路由表的功能,可以安装软件(Zebra)来实现

4、配置iptables作用于forwrad链,实现网络防火墙功能

[root@Note3 ~]# iptables -P FORWARD DROP
[root@Note3 ~]# ping 172.16.10.3
PING 172.16.10.3 (172.16.10.3) 56(84) bytes of data.
From 172.16.11.3 icmp_seq=2 Destination Host Unreachable

[root@Note3 ~]# ping 172.16.11.4
PING 172.16.11.4 (172.16.11.4) 56(84) bytes of data.
64 bytes from 172.16.11.4: icmp_seq=1 ttl=64 time=0.290 ms
^C
--- 172.16.11.4 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 716ms
rtt min/avg/max/mdev = 0.290/0.290/0.290/0.000 ms

[root@Note3 ~]# ping 192.168.10.2
PING 192.168.10.2 (192.168.10.2) 56(84) bytes of data.
64 bytes from 192.168.10.2: icmp_seq=1 ttl=64 time=0.386 ms
^C
--- 192.168.10.2 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 550ms
rtt min/avg/max/mdev = 0.386/0.386/0.386/0.000 ms


[root@Node2 ~]# ping 192.168.10.3 -c 1
PING 192.168.10.3 (192.168.10.3) 56(84) bytes of data.
64 bytes from 192.168.10.3: icmp_seq=1 ttl=64 time=0.254 ms

--- 192.168.10.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 0.254/0.254/0.254/0.000 ms
[root@Node2 ~]# ping 172.16.11.3
PING 172.16.11.3 (172.16.11.3) 56(84) bytes of data.
64 bytes from 172.16.11.3: icmp_seq=1 ttl=64 time=0.320 ms
^C
--- 172.16.11.3 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 502ms
rtt min/avg/max/mdev = 0.320/0.320/0.320/0.000 ms
[root@Node2 ~]# ping 172.16.11.4                      #已经ping不通node4了
PING 172.16.11.4 (172.16.11.4) 56(84) bytes of data.
^C
--- 172.16.11.4 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2542ms


[root@Note3 ~]# iptables -A FORWARD -s 192.168.10.2 -d 172.16.11.4 -p icmp  -j ACCEPT
[root@Note3 ~]# iptables -A FORWARD -d 192.168.10.2 -s 172.16.11.4 -p icmp  -j ACCEPT


[root@Node2 ~]# ping 172.16.11.4
PING 172.16.11.4 (172.16.11.4) 56(84) bytes of data.
64 bytes from 172.16.11.4: icmp_seq=1 ttl=63 time=0.738 ms

练习:

   1、如何基于FORWARD链转发对内部ftp服务的访问?


三、iptables实现NAT

私有地址通过路由为什么不能访问互联网?

    私有地址通过路由数据包能到达互联网,因为路由器不路由私有ip,数据包回不来。

NAT:网络地址转换

   工作在网络层和传输层

   过载技术,使多个主机使用一个公网IP来访问互联网

Proxy:代理,应用层网关

     工作在应用层


NAT有三种类型:

  静态转换 (Static Nat)是指将内部网络的私有IP地址转换为公有IP地址,IP地址对是一对一的,是一成不变的,某个私有IP地址只转换为某个公有IP地址。借助于静态转换,可以实现外部网络对内部网络中某些特定设备(如服务器)的访问。 

 

动态转换 (Dynamic Nat) 是指将内部网络的私有IP地址转换为公用IP地址时,IP地址对是不确定的,而是随机的,所有被授权访问上Internet的私有IP地址可随机转换为任何指定的合法IP地址。也就是说,只要指定哪些内部地址可以进行转换,以及用哪些合法地址作为外部地址时,就可以进行动态转换。动态转换可以使用多个合法外部地址集。当ISP提供的合法IP地址略少于网络内部的计算机数量时。可以采用动态转换的方式。 

 

端口多路复用(OverLoad) 是指改变外出数据包的源端口并进行端口转换,即端口地址转换(PAT,Port Address Translation).采用端口多路复用方式。内部网络的所有主机均可共享一个合法外部IP地址实现对Internet的访问,从而可以最大限度地节约IP地址资源。同时,又可隐藏网络内部的所有主机,有效避免来自internet的***。因此,目前网络中应用最多的就是端口多路复用方式。


   NAPT:网络地址端口转换

       只需要参与NAPT的前半短,后半段系统会自动查表实现转换

       SNAT:源地址转换

           用于让内网主机访问互联网

       DNAT:目标地址转换(就是常用的端口映射)  

           用于让互联网上的主机访问本地内网中的某服务器上的服务(对外发布)


iptables基于SNAT和DNAT这两个目标实现地址转换技术

-j SNAT --to-source SIP  

    需要指定转换后的源地址,如果是ADSL拨号上网的话,就不试用了

-j MASQUERADE  

   也是做源地址转发,但不需要指定转换后的源地址,会自动在互联网上找可用的公网地址,性能没有-j SNAT好

-j DNAT --to-destination DIP[:PORT]

   支持端口映射,如果不指定端口的话,公网ip端口和内网主机的端口一样


1、环境

   把172.16.11.4看作是外网的主机,192.168.10.2是内网主机

   node3的网络间转发仍需要打开,但可以不指定网关(为什么?


2、添加iptables规则,实现SNAT  

[root@Note3 ~]# iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j SNAT --to-source 172.16.11.3
[root@Note3 ~]# iptables -t nat -L POSTROUTING -nv
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    1    60 SNAT       all  --  *      *       192.168.10.0/24      0.0.0.0/0           to:172.16.11.3

在node2上访问node4上的httpd服务:

[root@Node2 ~]# curl -I 172.16.11.4
HTTP/1.1 403 Forbidden                  #能访问到服务,虽然是403
Date: Sat, 31 Dec 2016 13:40:13 GMT
Server: Apache/2.2.15 (CentOS)
Accept-Ranges: bytes
Content-Length: 4961
Connection: close
Content-Type: text/html; charset=UTF-8

在node4上查看访问日志:

wKioL1hntjjyk_B5AAAWccsriVY329.png

在访问日志中可以看到了如我们所意料的访问ip是node3 eth1的ip,实现了SNAT


3、添加iptables规则,实现DNAT

  将node2看作是外网的主机,node4是内网的主机,实现node2通过访问node3的192.16810.3:8080来访问node4的web服务

注意:

   先清除之前的iptables设置

   这个时候必须在node4上设置网关,否则访问不了(为什么?

#没设置iptables之前,显然不能访问192.168.10.3:8080
[root@Node2 ~]# curl 192.168.10.3:8080
curl: (7) couldn't connect to host

设置DNAT规则:

[root@Note3 ~]# iptables -t nat -A PREROUTING -d 192.168.10.3 -p tcp --dport 80 -j DNAT --to-destination 172.16.11.4

在node2上访问192.168.10.3:

[root@Node2 ~]# curl 192.168.10.3
hello world

查看Node4的访问日志:wKiom1hnzDyRWsiqAAAU2ctEcsc899.png

如我们所预期,实现了DNAT