一、环境(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
二、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上查看访问日志:
在访问日志中可以看到了如我们所意料的访问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
如我们所预期,实现了DNAT
转载于:https://blog.51cto.com/xiexiaojun/1887946