服务器配置一个IP当网关的核心方法是:给服务器配置静态IP、开启内核IP转发、添加NAT规则,三步完成后局域网其他设备就能把服务器当作出口路由使用。这里说的“网关”,本质上是让服务器既当路由器又当防火墙,把内网流量转发出公网。
配置前先搞懂网络拓扑与IP规划
动手前先想清楚网络怎么走,常见的场景是服务器装了两块网卡,一张接外网,一张接内网交换机,内网设备把服务器的内网IP设成网关,所有上网请求都交给服务器转发。
IP规划有几种主流思路:
- 服务器内网卡固定IP设为168.1.1,子网掩码255.255.255.0,内网设备IP范围192.168.1.2到192.168.1.254,网关统一填192.168.1.1
- 服务器外网卡用DHCP自动获取,或者用固定公网IP,这取决于运营商的接入方式
- 如果内网设备比较多,建议把DHCP地址池和服务器IP岔开,比如服务器用192.168.1.1,DHCP分配从192.168.1.100开始,避免冲突
行业共识认为网关IP应该选在网段开头或结尾,1或.254,这样容易记忆,也方便后续排错,另一个要点是确认服务器本身能正常上网,这是当网关的前提条件。
Linux服务器配置网关的具体步骤
不同操作系统配置方式有差异,这里以主流的CentOS和Ubuntu为例,分别说明服务器配置网关的完整过程。
给服务器配置静态IP
CentOS/RHEL系使用nmcli命令最稳妥:
# 查看网卡名称 ip addr # 给内网卡ens33配置静态IP nmcli con mod ens33 ipv4.addresses 192.168.1.1/24 nmcli con mod ens33 ipv4.gateway 192.168.1.1 nmcli con mod ens33 ipv4.method manual nmcli con up ens33
Ubuntu/Debian系用netplan,编辑/etc/netplan/01-netcfg.yaml:
network:
version: 2
ethernets:
ens33:
addresses:
- 192.168.1.1/24
nameservers:
addresses: [114.114.114.114, 8.8.8.8]
保存后执行netplan apply使配置生效,配置完成后用ip addr验证一下IP是否绑定成功。
开启内核IP转发
服务器默认不转发数据包,必须手动开启,编辑/etc/sysctl.conf,加入:
net.ipv4.ip_forward = 1
执行sysctl -p让配置立即生效,然后用sysctl net.ipv4.ip_forward确认输出为1。
这一步是新手最容易漏掉的环节,转发没开启,下面做再多NAT规则也是白搭。
添加iptables NAT规则实现内网设备上网
NAT(网络地址转换)的作用是把内网设备的私有IP转换成服务器外网卡的IP,这样内网设备才能访问公网。
# 启用iptables NAT表 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE # 放行FORWARD链的流量 iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT iptables -A FORWARD -i eth0 -o eth1 -m state --state RELATED,ESTABLISHED -j ACCEPT
注意把eth0换成外网卡名称,eth1换成内网卡名称,MASQUERADE适合动态获取外网IP的场景,如果是固定IP也可以用SNAT:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 服务器外网IP
保持规则永久生效:CentOS执行iptables-save > /etc/sysconfig/iptables,Ubuntu安装iptables-persistent并执行netfilter-persistent save。
验证配置是否成功
按顺序排查这几个点:
- 服务器自己能ping通外网,比如ping 223.5.5.5
- 内网设备能ping通服务器内网IP 192.168.1.1
- 内网设备把网关指向服务器,ping 223.5.5.5测试连通性
- 如果第三步通了但无法解析域名,在设备或服务器上添加DNS,比如114.114.114.114
- 用
traceroute看数据包路径,第一跳应该是服务器IP
服务器双网卡配置网关的高可用方案
单台服务器做网关有一个致命弱点:服务器挂了,整网瘫痪,对于小型办公室或分支机构的场景,这个风险多数情况下可以接受,但如果业务连续性要求高,就得考虑双机热备的方案。
keepalived虚拟IP实现主备切换
用两台服务器做网关,通过keepalived对外提供一个虚拟IP,设备网关指向虚拟IP,主服务器故障时备用服务器自动接管,内网设备无感知。
服务器1(主)配置/etc/keepalived/keepalived.conf:
vrrp_instance VI_1 {
state MASTER
interface eth1
virtual_router_id 51
priority 100
virtual_ipaddress {
192.168.1.254/24
}
}
服务器2(备)的配置和主服务器基本相同,只需把state改为BACKUP,priority改为90,这样192.168.1.254这个虚拟IP就是内网设备的统一网关地址。
多线路负载均衡场景的网关配置
有些服务器接了两条外网线路,想实现带宽叠加或故障切换,这个需求用策略路由可以搞定:
# 创建两个路由表 echo "100 telecom" >> /etc/iproute2/rt_tables echo "200 unicom" >> /etc/iproute2/rt_tables # 配置电信线路的默认路由 ip route add default via 电信网关 dev eth0 table telecom # 配置联通线路的默认路由 ip route add default via 联通网关 dev eth1 table unicom # 按源IP分流 ip rule add from 192.168.1.0/24 table telecom
这种配置能实现内网部分设备走电信线路,部分设备走联通线路,充分利用两条带宽。
用现成工具简化网关配置流程
手工敲命令的方式灵活性高,但对操作者的技术要求不低,对于那些不想折腾命令行,或者对Linux不太熟悉的朋友,下面这几种方案也很靠谱。
- RouterOS软路由:在服务器上装RouterOS,通过Winbox图形界面配置上网网关,稳定性好,常见网吧和企业分支都在用
- OpenWrt:开源系统,支持大多数家用级服务器配置,网页界面点几下就能完成
- Panabit:免费版支持基础网关功能,流控能力相当强,适合需要做带宽管理的场景
这些工具的配置思路和手工方式是一样的:先固定IP,再开转发,最后加NAT,区别只是操作界面更加友好。
排查网关配置问题的思路
配置做完但设备上不了网,别慌,按下面这个顺序查,大部分问题都能定位出来。
- 先看服务器外网通不通,ping不通公网IP说明问题出在服务器本身的网络连接,跟网关配置无关
- 再看内网设备能不能ping通网关IP,不通就是物理链路或IP地址冲突的问题
- 确认sysctl的ip_forward确实是1,很多人改完配置文件忘了执行sysctl -p
- 检查iptables规则有没有顺序错误,FORWARD链的ACCEPT规则应该放在其他限制规则之前
- 用
iptables -t nat -L -n -v看NAT规则匹配了多少数据包,如果计数一直为零,说明流量根本没用到达NAT阶段
多数情况下,问题出在ip_forward没开启或者iptables规则没保存这两个环节。
服务器配置网关常见问题解答
Linux服务器配置网关需要什么条件?
服务器至少要有两张网卡,一张连接外网线路,一张连接内网交换机,操作系统用常见的CentOS、Ubuntu、Debian都可以,建议用64位系统并保证内核版本在3.0以上以支持完整的iptables功能。
服务器做网关和用硬件路由器有什么差别?
服务器做网关的优势是性能上限高、灵活性强,可以在同一台设备上跑代理、DNS缓存、流量监控等增值服务,缺点是功耗偏高、维护需要一定技术水平,硬件路由器胜在稳定省心和功耗低,适合追求即插即用的场景。
内网设备能ping通网关但无法访问外网怎么办?
先看服务器本身能否访问外网,不能则排查运营商的接入问题,能访问的话依次检查Firewalld或iptables的FORWARD链是否放行了流量,MASQUERADE规则是否生效,内网设备的DNS设置是否正确。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/770945.html

