<服务>iptables的转发功能

时间:Feb. 6, 2017 分类:

目录:

共享上网

环境准备

测试环境由两台主机实现 why-1内网192.168.0.201 外网192.168.1.201(只是模拟外网地址,实际情况下为私网地址,下面也按照此情况进行模拟) why-2内网192.168.0.202

why-1环境准备

虚拟机添加网卡

  • 选择编辑虚拟机设置

- 选择添加

- 选择网络适配器,下一步

- 选择桥接模式,完成

- 选择确定

配置why-1 eth1

通过setup进入网卡配置,选择新的驱动

选择以太网

配置一下ip和子网掩码即可,不需要配置网关

[root@why-1 ~]# setup
[root@why-1 ~]# service network restart
Shutting down interface eth0:                              [  OK  ]
Shutting down loopback interface:                          [  OK  ]
Bringing up loopback interface:                            [  OK  ]
Bringing up interface eth0:  Determining if ip address 192.168.1.201 is already in use for device eth0...
RTNETLINK answers: Invalid argument
Error adding default gateway 192.168.1.255 for eth0.
                                                           [  OK  ]
Bringing up interface eth1:  Determining if ip address 192.168.0.201 is already in use for device eth1...
                                                           [  OK  ]
[root@why-1 ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth0
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1002   0        0 eth0
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
0.0.0.0         192.168.1.1     0.0.0.0         UG    0      0        0 eth0

why-2环境准备

IP配置如下

why-1网络检查

可以访问外网

[root@why-1 ~]# ping baidu.com
PING baidu.com (220.181.57.217) 56(84) bytes of data.
64 bytes from 220.181.57.217: icmp_seq=1 ttl=54 time=24.4 ms
64 bytes from 220.181.57.217: icmp_seq=2 ttl=54 time=42.4 ms
64 bytes from 220.181.57.217: icmp_seq=3 ttl=54 time=25.4 ms
^C
--- baidu.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2215ms
rtt min/avg/max/mdev = 24.429/30.791/42.490/8.285 ms

可以访问内网192.168.0.202

[root@why-1 ~]# ping 192.168.0.202
PING 192.168.0.202 (192.168.0.202) 56(84) bytes of data.
64 bytes from 192.168.0.202: icmp_seq=1 ttl=64 time=0.868 ms
64 bytes from 192.168.0.202: icmp_seq=2 ttl=64 time=0.323 ms
^C
--- 192.168.0.202 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1433ms
rtt min/avg/max/mdev = 0.323/0.595/0.868/0.273 ms

why-2网络检查

可以访问内网192.168.0.201

可以访问外网192.168.1.202

不可以访问外网网关192.168.1.1

不可以访问外网baidu.com

配置防火墙

开启内核转发

[root@why-1 ~]# vi /etc/sysctl.conf
# Kernel sysctl configuration file for Red Hat Linux
#
# For binary values, 0 is disabled, 1 is enabled.  See sysctl(8) and
# sysctl.conf(5) for more details.

# Controls IP packet forwarding
net.ipv4.ip_forward = 0
省略部分

开启内核转发net.ipv4.ip_forward = 1

配置生效

[root@why-1 ~]# sysctl -p

检查内核iptables模块

[root@why-1 ~]# lsmod | egrep ^ip
iptable_nat             6158  1 
ipt_REJECT              2351  0 
iptable_filter          2793  0 
ip_tables              17831  2 iptable_nat,iptable_filter
ip6t_REJECT             4628  2 
ip6table_filter         2889  1 
ip6_tables             18732  1 ip6table_filter
ipv6                  317340  141 ip6t_REJECT,nf_conntrack_ipv6,nf_defrag_ipv6

如果没有的话需要通过modprobe添加

modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state

检查防火墙NAT表POSTROUTING

[root@why-1 ~]# iptables -L -n -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination 

配置防火墙转发

[root@why-1 ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source 192.168.1.201
  • -s为内网网段
  • -o eth0为网关的外网网卡
  • -j SNAT --to-source 192.168.1.201为网关的外网IP地址 如果外网IP变化的话,可以通过伪装的方式
[root@why-1 ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE

检验

端口转发

通过访问外网的192.168.1.201的web服务80端口,访问到内网192.168.0.202的8080端口,需要注意的是不论192.168.1.201的主机上80端口是否开启,如果开启了iptables的NAT转发,请求的80端口都会转发到后端的8080端口

[root@why-1 ~]# iptables -t nat -A PREROUTING -d 192.168.1.201 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.202:8080

内网ip和外网ip一对一映射

首先路由网关上绑定192.168.1.201,可以是别名的方式

[root@why-1 ~]# iptables -t nat -A PREROUTING -d 192.168.1.201 -j DNAT --to-destination 192.168.0.202
[root@why-1 ~]# iptables -t nat -A POSTROUTING -s 192.168.0.202 -o eth0 -j SNAT --to-source 192.168.1.201
[root@why-1 ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.1.201 -j SNAT --to-source 192.168.1.201

添加第三条的目的是为了防止本地地址访问192.168.1.201外网地址的时候会经过外网ip地址

映射多个IP上网

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source 192.168.1.201-192.168.1.205

目的是防止同一IP访问相同网站被封

更多的配置

  • 例如办公网络可以通过zebra路由+iptables过滤和转发+squid代理+ntop/iftop/iptraf流量查看+tc流量限速实现
  • 没有做企业路由,需要根据所给路由连接地址(即路由器外网IP),默认路由(即路由器外网网关),公网IP地址(即路由器后端IP),需要zebra配置

    关于生产环境

selinux一般在生产环境下并不会开启,iptables在内网中也是关闭的,只有在外网中才进行开启,大并发的情况下,iptables是不能开启的,非常影响性能,就必须开启硬件防火墙。

在大并发下可能会导致外网不能到达前端服务器,外网无法进行访问,并非web服务器的问题,而是iptables的问题,/var/log/messages出现kernel: nf_conntrack: table full, dropping packet.通过sysctl -w修改一些参数可能会好,但是性能也会大大影响。

调大的参数如下

net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 180
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120