咱们平时使用的大多数家用路由器都是经过NAT(Network Address Translation,网络地址转换)功能实现共享上网的,iptables是linux内核里整合的一个ip信息包过滤系统,使用iptables配置nat就能够实现和家用路由器同样的上网效果。(本文永久地址:http://woymk.blog.51cto.com/10000269/1923952) html
环境:两台电脑,都是centos6的系统,其中一台能上网,一台不能上网,两台电脑经过内网相连。linux
A电脑:外网(eth0) ip为192.168.1.1,内网(eth1) ip为10.1.1.1nginx
B电脑:内网(eth0) ip为10.1.1.2centos
配置方法以下:网络
一、启用Linux的ip转发功能curl
首先查看ip转发功能是否已经打开ide
sysctl -a |grep 'net.ipv4.ip_forward'测试
若是值为1,则说明已经打开,不然执行如下操做ui
echo "1" >/proc/sys/net/ipv4/ip_forwardurl
这是临时修改,系统重启后失效
或者直接修改配置文件
vi /etc/sysctl.conf
找到
net.ipv4.ip_forward = 0
改为
net.ipv4.ip_forward = 1
而后运行 sysctl -p
二、设置iptables规则
在A电脑上执行
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -j SNAT --to-source 192.168.1.1
保存配置
service iptables save
这个语句就是告诉系统把即将要流出本机的数据的source ip address修改为为192.168.1.1。这样,数据包在达到目的机器之后,目的机器会将包返回到192.168.1.1。若是不作这个操做,那么数据包在传递的过程当中,reply的包确定会丢失。
假如当前系统用的是ADSL/3G/4G动态拨号方式,那么每次拨号,出口ip都会改变,snat是把源地址转换为固定的ip地址,这样就会有局限性。这时可使用:
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -o eth0 -j MASQUERADE
与snat不一样的是,masquerade能够自动读取外网卡得到动态ip地址,而后进行地址转换。
POSTROUTING:在经过Linux路由器以后作的策略,也就是路由器的外网接口。
-s 10.1.1.0/24:源数据所来自这个网段,也能够是单个ip,不写表示全部内网ip。
-o eth0 -j MASQUERADE:表示在eth0这个外网接口上使用IP假装。
三、 在B电脑上设置网关
vi/etc/sysconfig/network-scripts/ifcfg-eth0
添加或修改
GATEWAY=10.1.1.1
保存后重启网络服务
service network restart
四、测试
在B电脑上执行
ping www.163.com
[root@www ~]# ping www.163.com
PING 163.xdwscache.ourglb0.com (58.216.21.93) 56(84) bytes of data.
64 bytes from 58.216.21.93: icmp_seq=1 ttl=128 time=8.23 ms
64 bytes from 58.216.21.93: icmp_seq=2 ttl=128 time=9.72 ms
64 bytes from 58.216.21.93: icmp_seq=3 ttl=128 time=8.78 ms
64 bytes from 58.216.21.93: icmp_seq=4 ttl=128 time=8.97 ms
curl www.163.com -I
[root@www ~]# curl www.163.com -I
HTTP/1.0 200 OK
Expires: Tue, 09 May 2017 15:21:02 GMT
Date: Tue, 09 May 2017 15:19:42 GMT
Server: nginx
Content-Type: text/html; charset=GBK
Vary: Accept-Encoding,User-Agent,Accept
Cache-Control: max-age=80
Via: 1.1 cache.163.com:80 (squid)
X-Via: 1.0 czdx87:3 (Cdn Cache Server V2.0), 1.0 adxxz41:6 (Cdn Cache Server V2.0)
Connection: keep-alive
结果显示已经能够正常上网!