使用NAT共享上网

      家里有一个台式机,但是没有无线网卡,必须使用网线连接路由器,但路由器在客厅,扯很长的网线很不方便.不过,我还有一台笔记本,上面装的是LINUX,所以想办法让台式机通过笔记本的eth口访问网络,那么就需要在笔记本上搭建一个NAT转发.

     在linux上,使用IPtables轻松搞定这一切.组网图大致如下:

第一种方法:

    IPtable设置如下:

# all interface 
export WAN=wlan0
# 获取无线网口的IP地址
export WAN_IP=`ifconfig ${WAN} | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'`
export LAN=eth0
# 获取路由器的地址
export REAL_GW=`route | grep default | awk '{print $2}'`

# remove all 
# 清除NAT中的所有规则
iptables -t nat -F

# NAT settings
# 因为台式机(window)中的GW设置的是10.121.36.1,所以从笔记本上看LAN口收上来的包都是到10.121.36.1的,
# 这里就需要DNAT生效了,本质上是把数据包的目的地址给改掉,然后进入路由系统查找出端口
# 那么,下面这句话就是把去10.121.36.1的数据包,修改成${REAL_GW},这里是192.168.1.1
# 原有数据包头: 
# SRC: 10.121.36.89  DST: 10.121.36.1
iptables -t nat -A PREROUTING -i ${LAN} -d 10.121.36.1 -j DNAT --to ${REAL_GW}
# 经过上面一句话后,变成
# SRC: 10.121.36.89 DST:192.168.1.1

# 然后,进入route table,找出端口,在笔记本(linux)上,192.168.1.1是default gateway.且是wlan0
# 所以数据包从wlan0走.
# 数据包终归要有ACK,如果192.168.1.1回应10.121.36.89这个地址的话,将找不到路由而在路由器上丢弃.
# 那么下面这句话,将源地址修改${WAN_IP},这里是192.168.1.4
iptables -t nat -A POSTROUTING -o ${WAN} -s 10.121.36.0/24 -j SNAT --to ${WAN_IP}
# 最终,出wlan0的数据包就是:
# SRC: 192.168.1.4 DST: 192.168.1.1

数据包从wlan口回来的时候就执行反操作.把数据发送给台式机(windows).

OK,一切正常.我不需要更复杂的设置了,如果大家有兴趣,请参考<更安全的linux网络>这本书.

第二种方法:

iptables -t nat -A POSTROUTING -s 10.121.36.0/24 -j MASQUERADE

网友依云http://lilydjwg.is-programmer.com/提供.
 

快速参考:

刘苏平的博客 http://www.liusuping.com/ubuntu-linux/iptables-firewall-setting.html

Posted by imouse 2012年10月13日 22:15