<服务>iptables的转发功能
目录:
共享上网
环境准备
测试环境由两台主机实现 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