假设现有三台计算机
A计算机有三块网卡 eth0: 192.168.1.125 连接到Internet。 eth1:192.168.2.1 。 eth2:192.168.3.1。
B计算机 ip:192.168.2.120 默认网关:192.168.2.1
C计算机 ip:192.168.3.114 默认网关:192.168.3.1
现在B、C计算机要以A计算机ip为网关上网,并实现B、C网段之间的访问,A计算机相当于实现路由器功能。
A计算机配置:
$/sbin/ifconfig eth0 192168.1.125 netmask 255.255.255.0
$/sbin/ifconfig eth1 192168.2.1 netmask 255.255.255.0
$/sbin/ifconfig eth2 192168.3.1 netmask 255.255.255.0
不过开机重启后这些配置信息会丢失,所以添加到文件保存,如eth0的配置信息添加到/etc/sysconfig/network-scripts/ifcfg-eth0
# Networking Interface
DEVICE=eth0
HWADDR=00:0C:29:D3:7D:7C
ONBOOT=yes
IPADDR=192.168.1.125
BOOTPROTO=none
NETMASK=255.255.255.0
DNS2=202.96.128.68
TYPE=Ethernet
GATEWAY=192.168.1.1
DNS1=202.96.134.133
NM_CONTROLLED=yes
IPV6INIT=no
USERCTL=yes
PREFIX=24
NAME="my eth0"
UUID=5fb06bd0-0bb0-7ffb-45f1-d6edd65f3e03
eth1和eth2类似添加
添加完这些后添加路由表
#/sbin/route add -net 192.168.1.0 netmask 255.255.255.0 dev eth0
#/sbin/route add -net 192.168.2.0 netmask 255.255.255.0 dev eth1
#/sbin/route add -net 192.168.3.0 netmask 255.255.255.0 dev eth2
使用命令查看路由表
#route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.3.0 * 255.255.255.0 U 0 0 0 eth1
192.168.2.0 * 255.255.255.0 U 1 0 0 eth2
192.168.1.0 * 255.255.255.0 U 1 0 0 eth0
这时候还需要添加默认网关,也就是计算机A连接到网络的路由器:192.168.1.1
#route add default gw 192.168.1.1
#route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.3.0 * 255.255.255.0 U 0 0 0 eth1
192.168.2.0 * 255.255.255.0 U 1 0 0 eth2
192.168.1.0 * 255.255.255.0 U 1 0 0 eth0
default 192.168.1.1 0.0.0.0 UG 0 0 0 eth0
打开转发ip转发功能
echo 1 >/proc/sys/net/ipv4/ip_forward
或者
sysctl -w net.ipv4.ip_forward = 1
可以在命令中使用,也可以为了自动化加入rc.local中
计算机BC配置
B:ip address:192.168.2.120 mask:255.255.255.0 default gateway:192.168.2.1
c:ip address:192.168.3.120 mask:255.255.255.0 default gateway:192.168.3.1
DNS自己根据当地网络设置
B计算机:
ping 192.168.2.1
ping 192.168.3.1
ping 192.168.1.125
这三个应该没什么问题,继续
ping 192.168.3.114
ping 192.168.1.1
发现还是不通
查看A计算机的iptables
iptables -L
Chain INPUT (policy ACCEPT)
...
Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
ok, we find it! 看来iptable中转发被阻止了,删除这个组织规则就可以了
iptables -D FORWARD 1
OK!现在BC应该可以联网了
当然笔者在此还遇到了其他的问题,最后需求帮助得知输入如下信息
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.2.0/24 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.3.0/24 -j MASQUERADE
or
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.2.0/24 -j SNAT --to 192.168.1.125
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.3.0/24 -j SNAT --to 192.168.1.125
自己分析下:
nat,这个表被查询时表示遇到了产生新的连接的包
POSTROUTING链表存放修改准备出去的包
-o eth0 表示修改后的数据包由接口eth0送出
SNAT: 这个目标只适用于nat表的POSTROUTING链。它规定修改包的源地址
到此目标linux路由器配置完成了!
欢迎各位留意讨论
下面对为什么要进行伪装做分析:
利用之前网上看到的一个例子:
两个客户机想通信,要求网关都之指新做的这台路由上,可是在一些情况下做不到。这时可以用地址伪装实现。
比如我做了一台新linux路由器,这时他可以与其它科室的一台机可以通信(因为我的新linux路由器一块网卡与其在一个网段嘛),我的另一台客户机通过我做的新linux路由在另一个网段。这时如果我能把其它科室的机器与我的机器网关都设成我的新linux路由器就可以通信了,可是没有这种权限啊!!!
我可以在新linux路由器上通过地址伪装得以实现。
如果实现我可以访问他,他不能访问我可以这么做:
iptables -t nat -A POSTROUTING -o eth0 -s 你的IP地址段/子网掩码表示 -j MASQUERADE
如果实现他可以访问我,可以加上:
iptables -t nat -A POSTROUTING -o eth1 -s 他的IP地址段/子网掩码表示 -j
MASQUERADE
原理及分析:
如果我没有做地址伪装时,我的数据包通过了新的linux路由器,转发到了他的机器,可是因为我的IP地址不与他在同一网段,他利于网关发到了其它的地方。所以只有你对的数据包没有回来的,通过在新的linux路由器抓包可以看的很清楚。
在做了地址伪装后,数据包源地址是新的linux路由器上的地址,因为发过去后是与他在同一网段内,所以不用网关转发,直接发到新的linux路由器,然后就可以返回来。通过在新的linux路由器上抓包也可以看的很清楚。