使用Linux+三层交换机做NAT路由器

由于不可抗拒的原因,单位决定要到华为NE40下架,so,决定用台linux服务器来做NAT代替路由器。

# 环境

简化成:多Vlan+路由器 用户层到二层交换机,然后汇聚到核心三层交换机。 linux(CentOS 7)服务器一公网地址网卡,一张内网网卡。

# 硬件连接

三层交换机GigabitEthernet2/2/4接服务器enp7s0f1网卡

华为交换机配置:

vlan 3000
q
interface vlanif 3000
ip address 172.16.254.254 255.255.255.0
q
interface GigabitEthernet2/2/4
port link-type aceess
port default vlan 3000

linux服务器的网卡设置静态地址为172.16.254.253

最后我们再加一条默认路由,将流量转发到linux服务器接口。

ip route-static 0.0.0.0 0.0.0.0 172.16.254.253

下一跳地址就是服务器内网网卡的地址。

# NAT

NAT是一种将私有(保留)地址转化为合法IP地址的转换技术。而Linux下强大的iptables就有nat功能, 之前用树莓派做路由器就是使用iptables.

# 开启linux转发

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

这条临时生效,要永久生效我们得更改/etc/sysctl.conf

添加

net.ipv4.ip_forward=1

最后 sysctl -p 使之生效。

# iptables

添加nat链

iptables -t nat -A POSTROUTING -o enp7s0f0 -j MASQUERADE

这里 enp7s0f0 是外网地址的网卡。

# 路由表

上一步做好转发后,我们就做回执路由,不然数据包不能回到内网。

route add -net 10.0.0.0/24 gw 172.16.254.254 dev enp7s0f1
route add -net 172.16.0.0/24 gw 172.16.254.254 dev enp7s0f1

其中172.16.254.254是三层交换机跟linux服务器相连的接口地址。

到这里我们这全部设置完成了,但是这种是重启后失效,所以我们需要添加永久路由表

我们只需把上面路由表命令写到/etc/rc.local即可。

# linux nat优化

专业的路由器都是硬件nat,而且针对nat优化过,linux 下也可以相应的nat优化一下。

网上文章很少,且有点旧这里我直接贴 修改的文件

[root@CentOS ]# cat /etc/sysctl.conf 
# System default settings live in /usr/lib/sysctl.d/00-system.conf.
# To override those settings, enter new settings here, or in an /etc/sysctl.d/<name>.conf file
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0


net.ipv4.tcp_syn_retries = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.tcp_keepalive_time = 600
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_keepalive_intvl =15
net.ipv4.tcp_retries2 = 5
net.ipv4.tcp_fin_timeout = 2
net.ipv4.tcp_max_tw_buckets = 36000
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_max_orphans = 32768
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 16384
net.ipv4.tcp_wmem = 8192 131072 16777216
net.ipv4.tcp_rmem = 32768 131072 16777216
net.ipv4.tcp_mem = 786432 1048576 1572864
net.ipv4.ip_local_port_range = 1024 65000
net.nf_conntrack_max = 65536
net.netfilter.nf_conntrack_max=65536
net.netfilter.nf_conntrack_tcp_timeout_established=180
net.core.somaxconn = 16384
net.core.netdev_max_backlog = 16384

主要 更改 存储 conntrack 条目哈希表的大小, 已建立的tcp连接的超时时间, 本地开放端口范围,进入包的最大设备队列 等。

# 查看转发情况

推荐两款网卡流量监控工具iftop nethogs

nethogs

image alt text

iftop

iftop

# 总结

linux iptables 功能非常强大,同时cpu占用率一点都不高。半个月的运行还算稳定,没出任何问题,但是心里始终不放心,与专业的路由器设备比,稳定性,转发效率估计还是有很大的距离。

##参考

  1. 使用linux系统(PC机)做路由转发
  2. 用Linux做路由器
  3. iptables 详解
  4. linux下添加永久路由
  5. 优化你的 netfilter/iptables 网关

--EOF--


>看不到评论?GFW!!!