本文介绍如何使用iptables来实现NAT转发,事实上就是将一台机器作为网关(gateway)来使用。我们假设充当网关的机器至少有网卡eth0和eth1,使用eth0表示连接到外网的网卡,使用eth1表示连接到内网交换机上的网卡,内部子网为10.0.0.0,通过NAT机制,内网中的机器可以通过网关机器访问Internet,而不需要额外的公网IP。

  本文中的配置值需要根据具体环境适当更改。

一、Gateway端

  1. 给内网网卡配置静态IP(此前确保另一张外网网卡eth0已经能够正常访问Internet。已经为eth1配置过内网静态IP的可以跳过本步)

sudo ip addr add 10.0.0.11/ dev eth1

  这里假设eth1的IP为10.0.0.11,。

  2. 配置NAT规则

sudo iptables -A FORWARD -o eth0 -i eth1 -s 10.0.0.0/ -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -t nat -F POSTROUTING
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

  第一条规则允许转发初始网络包,第二条规则允许转发已经建立连接后的网络包,第三条则设置NAT。

  接下来需要保存iptables规则,确保每次重启时能够加载NAT规则:

  2.1 保存iptables规则

sudo iptables-save | sudo tee /etc/iptables.sav

  2.2 编辑/etc/rc.local文件,将下面的一行添加到“exit 0”之前:

iptables-restore < /etc/iptables.sav

  这样以后每次重启机器时都会自动加载NAT相关的iptables规则。  

  3 启用路由转发,编辑/etc/sysctl.conf 文件,删除起始的“#”,解除

#net.ipv4.ip_forward=1

  的注释。然后使其生效:

sudo sysctl -p

  这样我们就完成了网关一端的设置。

二、Client端

  一旦网关机器设置完成,任何OS的客户端都能够通过连接到网关而访问外部网络。这里以Ubuntu Server作为client为例,假设client的eth0连接到网关eth1所在的内网10.0.0.0上,

  1. 为eth0指派静态IP(需与server端的eth1在同一网段,如果已经配置过则可以跳过本步),编辑/etc/network/interfaces文件:

auto eth0
iface eth0 inet static
address 10.0.0.31
netmask 255.255.255.0
gateway 10.0.0.11
dns-nameservers YourDNSServer

  因为我们的网关服务端并没有充当DNS服务器,此处需要额外指定client的DNS服务器,通常从网络服务提供商(ISP)那里获得。

  2. 接下来配置路由网关

sudo route add default gw 10.0.0.11 dev eth0

  使网关配置生效,如果以前已经生成过/etc/resolv.conf文件中的nameserver字段,那么这时client应该已经能够访问外部网络了,否则需要编辑/etc/resolv.conf,添加字段:

nameserver YourDNSServer

  由于在/etc/network/interfaces文件中已经配置过dns-nameservers,所以重新启动client机器时不会影响DNS配置。

  此时client已经能够通过网关机器访问外网,如果不知道ISP的DNS服务器地址,可以使用OpenDNS作为替代。

三、高级Gateway配置

  可以为gateway机器配置DHCP和DNS服务器功能,从而简化客户端机器的联网配置,同时省却为client配置DNS的过程;

  1. 安装dnsmasq

sudo aptitude install dnsmasq

  2. 备份dnsmasq的配置文件以备参考

sudo cp /etc/dnsmasq.conf /etc/dnsmasq.conf-backup

  3. 编辑dnsmasq的配置文件/etc/dnsmasq.conf,添加下面两行:

interface=eth1
dhcp-range=10.0.0.100,10.0.0.250,72h

  注意这是为gateway机器配置DHCP/DNS,interface字段需要设为该机器连接到内网的那个网卡,同时DHCP的IP池应该在我们之前配置的那个网段中。

  4. 重启dnsmasq服务

sudo /etc/init.d/dnsmasq restart

  这样client端就能够获取动态IP和自动解析域名了。

Ubuntu 设置NAT共享网络(命令行方法)的更多相关文章

  1. Ubuntu server版上使用命令行操作VPNclient

    Ubuntu server版上使用命令行操作VPNclient VPN,虚拟专用网络,这个技术还是非常有用的.近期笔者參与的项目中就使用上了VPN,大概情况是这种.有两个开发团队,在异地,代码服务器在 ...

  2. linux下使用无线网卡的命令行方法(wifi,iwconfig)

    原文地址:linux下使用无线网卡的命令行方法(wifi,iwconfig) 作者:andyhzw (1)首先关闭开发板的有线网卡 [root@FriendlyARM /]# ifconfig eth ...

  3. Ubuntu 16.04开机进入命令行(tty1)+分辨率调节+字体颜色设置+中文乱码解决(解决虚拟终端Ctrl+Alt+F1分辨率太大)

    一.开机进入命令行模式(tty1) sudo vim /etc/default/grub 把GRUB_CMDLINE_LINUX_DEFAULT=”quiet splash”改成GRUB_CMDLIN ...

  4. ubuntu设置开机默认进入字符界面方法 ubuntu 12.04 桌面版关闭图形界面(转)

    ubuntu 12.04 桌面版关闭图形界面 注意]改GRUB 的配置文件(不建议直接改 grub.conf) file:/etc/default/grub GRUB_CMDLINE_LINUX_DE ...

  5. Mysql数据库中设置root密码的命令及方法

    我们都知道通常PHP连接 Mysql都是通过root用户名和密码连接,默认情况下在Mysql安装时root初始密码为空,在安装使用PHP开源系统时,都需要填写连接Mysql数据库的用户名和密码,此时当 ...

  6. Ubuntu设置环境变量的几种方法

    1.Linux的变量种类 按变量的生存周期来划分,Linux变量可分为两类: 1.1 永久的:需要修改配置文件,变量永久生效. 1.2 临时的:使用export命令声明即可,变量在关闭shell时失效 ...

  7. ubuntu关于引导修复[grub命令行][live linux]

    第一种:grub命令行: ls 列出所有分区 ls /grub ls /grub 检查确认linux引导分区,如果linux单独/boot分区,就要采用如下命令进行检查: ls /boot/grub ...

  8. 如何设置fedora默认从命令行启动?

    Sumary:因为在fedora中没有/etc/initab文件我们不方便从这里设置它的runlevel target,但是linux又给我们提供了一个强悍的工具systemd,我们可以用system ...

  9. Ubuntu启动时直接进入命令行模式

    直接粘命令吧 sudo vim /etc/init/lightdm.conf 注释掉下面的内容 start on ((filesystem and runlevel [!06] and started ...

随机推荐

  1. BZOJ.4245.[ONTAK2015]OR-XOR(贪心)

    题目链接 从高到低位贪心,判断答案的该位能否为0. 求一个前缀和sum.对于最高位,答案的这一位可以为0当且仅当至少存在m个位置满足sum[i]在这一位上为0. 注意sum[n]这一位必须为0. 如果 ...

  2. 洛谷 P2574 XOR的艺术(线段树 区间异或 区间求和)

    To 洛谷.2574 XOR的艺术 题目描述 AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的 ...

  3. 洛谷.2709.小B的询问(莫队)

    题目链接 /* 数列的最大值保证<=50000(k),可以直接用莫队.否则要离散化 */ #include<cmath> #include<cstdio> #includ ...

  4. curl解压gzip页面gzcompress内容

    $headers = array( //"Content-type:application/json;charset='utf-8'", "Cache-Control:n ...

  5. [HDU5361]In Touch

    [HDU5361]In Touch 题目大意: 有\(n(n\le2\times10^5)\)个点,每个点有三个属性\(l_i,r_i,c_i\).表示若\(|i-j|\in[l_i,r_i]\),\ ...

  6. Android弹出Toast工具类总结

    Android弹出Toast工具类总结,包括系统自带的,也包括自定义的. public class ToastUtil { public ToastUtil() { } public static T ...

  7. Charles抓包http和https

    本来不打算写的,度娘一搜一大堆各种教程,实在是网上的各种设置的各种坑都有,我还是站在巨人的肩膀上汇总一下吧 首先http的就不用说了,各种教程版本区别不大,也没什么坑,主要是https: 第一步先下载 ...

  8. DNS解析全过程分析

    DNS解析过程 1.检查浏览器缓存中是否缓存过该域名对应的IP地址 用户通过浏览器浏览过某网站之后,浏览器就会自动缓存该网站域名对应的IP地址, 当用户再次访问的时候,浏览器就会从缓存中查找该域名对应 ...

  9. centos7 apache设置伪静态 开启rewrite_module

    设置伪静态除了要生成.htaccess文件外,还需要查看服务器是否开启了rewrite_module.经过一番的纠结,处理方法如下: 编辑Apache配置文件 nano /etc/httpd/conf ...

  10. C++ stringstream 简化数据类型转换

    C++标准库中的<sstream>提供了比ANSI C的<stdio.h>更高级的一些功能,即单纯性.类型安全和可扩展性. 在C++中经常会使用到snprintf来格式化一些输 ...