Ubuntu下利用双网卡实现网关路由和NAT功能

本文详细介绍了如何在Linux主机上配置双网卡以实现更灵活的NAT功能,包括配置网络接口、实现基本转发功能和使用iptables命令实现NAT。通过此教程,您将了解如何将内部网络与外部网络的端口进行灵活映射。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

环境:Ubuntu 10.10

网卡:一张集成网卡,一张在扩展槽上的独立网卡

主机:Dell vostro 200

linux主机实现网关有很多好处,比如可以实现更好的NAT功能。一般的路由器(如TP-LINK TL-R478, NETGEAR N300, LINKSYS WRT54GS等,不过强大的路由器除外)只支持简单的虚拟服务器功能,即将外网对网关服务器的请求映射到内网的一台主机上。它的缺点在于外网的请求只能 映射到内网一台主机的同名端口上。 比如外网的Web请求于202.XX.XX.XXX:80上,路由器可以路由到一台内网的Web服务器上。但是有的情况下,需要内网与外网的端口号不一 致,这样路由器就无能为力了。比如内网有多台主机有远程桌面的需求,就不得不将网关的不同的端口映射到内网几个主机的3389端口上。

这种灵活的NAT可以同双网卡的linux主机实现。以下是我的操作步骤,其他的linux系统可能一些配置文件的位置会不同,不过大致的思路是一致的。

STEP 1

为机器装好两块网卡。集成的或是独立的无所谓。编辑/etc/network/interface,如下

auto eth0

iface eth0 inet static

address 192.168.X.XX

netmask 255.255.255.0

auto eth1

iface eth1 inet static

address 202.XX.XX.XXX

gateway 202.XX.XX.XXX

netmask 255.255.255.0

dns-nameservers XX.XX.XX.XX XXX.XX.XX.XX

其中我配置eth0为内网的网关,eth1为外网的接口。注意到内网不用设置gateway。还有外网的设定要由实际情况来设,如DHCP等,实际的DNS服务器等。我这里的情况上静态的IP,还要与MAC绑定,之前MAC没有设好,卡了我很久。

STEP 2

让机器实现简单的转发功能。

首先先让它知道什么包要给哪个网卡发出去,添加两条路由表项:

#route add -net 192.168.X.0 netmask 255.255.255.0 eth0

#route add -net 202.XX.XX.0 netmask 255.255.255.0 eth1

意思是192.等等开头的从eth0发出去,202.等等开头的从eth1发出去。

其次要让从一个网卡进来的包可以forward到另一个网卡上去,键入以下命令:

#echo 1 > /proc/sys/net/ipv4/ip_forward

同时修改/etc/sysctl.conf, 将net.ipv4.ip_forward=1的注释去掉

这几个命令可能写成一个shell script开机运行,当然也可以手工操作。

STEP 3

到上面一步只是实现了路由器的功能,还没有到NAT的实现。linux主机实现NAT是通过iptables命令实现的。这个命令有语法稍显复杂,不过网上有很多讲解的文章。这里只给出个toyexample,是一个shell script,可以设置为登录运行:

#!/bin/bash
# iptables firewall script

#-------------------------------------------------------------------------------

#load module

modprobe ip_tables

modprobe iptable_filtermod

probe iptable_nat

modprobe ip_conntrack

modprobe ip_conntrack_ftpmod

probe ip_nat_ftp

#-------------------------------------------------------------------------------

#flush iptables

iptables -F

iptables -t nat -F


#-------------------------------------------------------------------------------

# firewall

iptables -P INPUT ACCEPT

iptables -A INPUT -i lo -j ACCEPT

iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT

iptables -A INPUT -s 10.8.0.0/24 -j ACCEPT

iptables -A INPUT -s 219.228.100.0/24 -j ACCEPT

iptables -A INPUT -p 47 -j ACCEPT

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT


iptables -P OUTPUT ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT

iptables -A OUTPUT -p 47 -j ACCEPT

iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

iptables -A OUTPUT -o eth0 -j ACCEPT

iptables -A OUTPUT -o eth1 -j ACCEPT

#-------------------------------------------------------------------------------

# SNAT

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 202.120.38.191

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -j SNAT --to 202.120.38.191

#-------------------------------------------------------------------------------

# DNAT
# for FTP

iptables -A INPUT -p tcp -d 202.120.38.191 --dport 21 -j ACCEPT

iptables -t nat -A PREROUTING -p tcp -d 202.120.38.191 --dport 21 -j DNAT --to 192.168.1.145:21

# for Web Server

iptables -A INPUT -p tcp -d 202.120.38.191 --dport 80 -j ACCEPT

iptables -t nat -A PREROUTING -p tcp -d 202.120.38.191 --dport 80 -j DNAT --to 192.168.1.66:80

#for Remote Desktop

iptables -A INPUT -p tcp -d 202.120.38.191 --dport 3128 -j ACCEPT

iptables -t nat -A PREROUTING -p tcp -d 202.120.38.191 --dport 3128 -j DNAT --to 192.168.1.77:3389

#-------------------------------------------------------------------------------

# echo current config

iptables -L

iptables -t nat -L

Trouble Shooting

开始的时候,碰到好多问题。硬件搭好后就是上不了网,以下是我的排错经验

网关上来回ping,看是否可以ping通内网与处网的IP地址,如果不通,检查物理连接和基本设置,如MAC地址等,DNSserver是否写对

如果可以,则问题出在网间转发上,转到上述STEP2检查是否正确设置

如果上述测验也没问题,就试一下NAN的功能,比如访问一下内网的web 和ftp服务器,试一下每个人的远程桌面(或putty)是否可以正常使用

如果都通过,就大成告成了~



iptable具体配置可以参照

http://www.linux.gov.cn/netweb/iptables.htm

### 配置Ubuntu Linux中的双网络接口卡(NIC)进行路由 #### 一、准备阶段 确保已安装必要的软件包,如`iptables`用于防火墙管理以及基本的网络工具集。对于Ubuntu而言,默认情况下这些工具已经存在。 #### 二、编辑网络接口文件 修改 `/etc/network/interfaces` 文件来定义静态IP地址其他属性给每个网卡。假设两块网卡分别为 `eth0` `eth1`, 并且希望它们分别连接至不同子网: ```bash auto eth0 iface eth0 inet static address 192.168.1.242 # 主机A IP 地址 netmask 255.255.255.0 # 子网掩码 gateway 192.168.1.1 # 默认网关 auto eth1 iface eth1 inet static address 172.16.0.2 # 主机B IP 地址 netmask 255.255.0.0 # 不同于第一个网口所属的子网 ``` 上述配置使得一块网卡可以访问内部局域网资源而另一块则指向外部互联网或其他隔离环境[^1]。 #### 三、启用IPv4转发功能 为了使一台机器能够作为路由器工作,在终端执行命令开启系统的IP转发能力: ```bash echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p ``` 这一步骤允许数据包通过该设备被发送到其他网络段上[^3]。 #### 四、设置NAT规则 如果目标之一是让某些流量经过其中一个特定接口出去,则可以通过添加相应的 NAT (Network Address Translation)规则实现这一点。比如为了让所有来自第二个LAN内的请求都经由第一个WAN出口上网: ```bash iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE ``` 此操作会伪装源地址为外联网卡的实际公网IP,从而完成合法的数据传输过程。 #### 五、保存并重启服务 最后记得保存所做的更改并将新的设定应用起来: ```bash service networking restart ``` 或者更推荐的方式是在较新版本的操作系统里使用如下指令代替前者: ```bash systemctl restart networking.service ``` 这样就完成了基于Ubuntu平台下的简单双网卡路由方案部署。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值