用CentOS7做一个简单的路由器


网关服务端说明

ens33   192.168.1.111         ===>外网,生产环境中应为公网IP
ens36   172.16.1.1            ===>内网,自定义网络,vmware中设置为仅局域网


[root@node1 ~]# uname -a
Linux node1 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64 x86_64 x86_64 GNU/Linux
[root@node1 ~]# cat /etc/centos-release 
CentOS Linux release 7.9.2009 (Core)

网关服务端前期设置

关闭selinux、firewalld、NetworkManager
[root@node1 ~]# systemctl stop firewalld && systemctl disable firewalld
[root@node1 ~]# setenforce 0
[root@node1 ~]# vim /etc/selinux/config
SELINUX=disabled    

[root@node1 ~]# systemctl stop NetworkManager && systemctl disable NetworkManager

网关服务端配置

[root@node1 ~]# cd /etc/sysconfig/network-scripts/
[root@node1 network-scripts]# cat ifcfg-ens33
TYPE="Ethernet"
BOOTPROTO="static"
NAME="ens33"
DEVICE="ens33"
HWADDR=00:0C:29:BB:6E:38		===> ifconfig 可查看
ONBOOT="yes"
IPADDR="192.168.1.111"			===> 本机内网地址,生产中为运营商提供的公网地址
PREFIX="24"						===> 掩码也是运营商提供


[root@node1 network-scripts]# cp ifcfg-ens33 ifcfg-ens36


[root@node1 network-scripts]# cat ifcfg-ens36
TYPE="Ethernet"
BOOTPROTO="none"
DEFROUTE="yes"
NAME="ens36"
DEVICE="ens36"
HWADDR=00:0C:29:BB:6E:42
ONBOOT="yes"
IPADDR="172.16.1.1"				===> 内网网段地址,当作内网的网关使用
PREFIX="24"

注:这里不用写网关和DNS


# 填写网关
[root@node1 network-scripts]# cat /etc/sysconfig/network
# Created by anaconda
NETWORKING=yes
HOSTNAME=node1
GATEWAY=192.168.1.1				===> 内网中的实际网关


# 配置DNS
[root@node1 network-scripts]# vim /etc/resolv.conf            
nameserver 192.168.1.1        // 内网中实际的DNS,生产中应为公网上的DNS   
nameserver xx.xx.xx.xx        // 备

安装iptables和网络工具

[root@node1 ~]# yum -y install iptables-services net-tools
注:先安装上iptables,不启动


设置ulimit
[root@node1 ~]# vim /etc/security/limits.conf
* soft   nofile   32768
* hard   nofile   65536



设置时间同步 chronyd


加载模块
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp


[root@node1 ~]# echo -e "modprobe nf_conntrack\nmodprobe ip_commtrack">> /etc/rc.local 



[root@node1 ~]# reboot           //重启生效
[root@node1 ~]# ulimit -n        //查看软
[root@node1 ~]# ulimit -a        //查看所有


启动iptables
[root@node1 ~]# systemctl start iptables && systemctl status iptables


内核优化
[root@node1 ~]# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1							===> 必须开启数据转发
fs.nr_open = 2048576
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 2
net.ipv4.tcp_max_syn_backlog = 65536
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_max_tw_buckets = 81920
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 3
net.ipv4.tcp_retries2 = 10
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1
net.ipv4.tcp_rmem = 4096  16777216 33554432
net.ipv4.tcp_wmem = 4096  16777216 33554432
net.ipv4.tcp_mem = 94500000 915000000 927000000
net.ipv4.tcp_max_orphans = 3276800
net.ipv4.tcp_slow_start_after_idle = 0
net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.default.accept_source_route = 0
net.core.somaxconn = 32768
net.core.rmem_default = 335544320
net.core.wmem_default = 83886000
net.core.rmem_max = 335544320
net.core.wmem_max = 83886000
net.core.netdev_max_backlog = 100000
net.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_max = 25000000
net.netfilter.nf_conntrack_tcp_timeout_established = 7200
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120


[root@node1 ~]# sysctl -p

实现控制方法及脚本

[root@node1 ~]# mkdir /opop && cd /opop
[root@node1 opop]# vim gateway.sh
#!/bin/bash
FILE=/opop/mac_new.txt
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
iptables -F INPUT
iptables -F OUTPUT
iptables -F FORWARD
iptables -t nat -F
iptables -t nat -X
iptables -F
iptables -X
iptables -A INPUT -p tcp --dport 22 -j ACCEPT

cat $FILE | while read ipad mac
do
        iptables -A FORWARD -s $ipad -m mac --mac-source $mac -j ACCEPT
        arp -s $ipad $mac
done
iptables -A FORWARD -o ens36 -m state --state  ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o ens33 -m iprange --src-range 172.16.1.1-172.16.1.254 -j SNAT --to 192.168.1.111

########### Port forwarding ##############
#iptables -t nat -A PREROUTING -i ens33 -d <公网地址> -p tcp --dport 80 -j DNAT --to-destination <内网地址>
#iptables -t nat -I POSTROUTING -d <公网地址> -p tcp --dport 80 -j SNAT --to <内网地址>
#iptables -A FORWARD -o ens36 -d <内网地址> -p tcp --dport 80 -j ACCEPT
################## THE END ###############

iptables -A FORWARD -j DROP
service iptables save
chkconfig iptables on


[root@node1 opop]# chmod +x gateway.sh 
[root@node1 opop]# vim mac_new.txt
格式:
172.16.1.15     00:0c:29:f1:e2:f9
172.16.1.16     00:0c:29:bb:6e:42
....
	....


[root@node1 opop]# sh gateway.sh


iptables备份
[root@node1 ~]# iptables-save > iptables.bak
恢复
[root@node1 ~]# iptables-resotre < iptables.bak


[root@node1 ~]# vim /etc/rc.local   
modprobe nf_conntrack       
modprobe ip_conntrack

注1:nf_conntrack是一个内核模块,用于跟踪一个连接的状态的
注2:kernel 用 ip_conntrack 模块来记录 iptables 网络包的状态,并把每条记录保存到table里(这个 table 在内存里,可以通过/proc/net/ip_conntrack查看当前已经记录的总数)

配置客户端并测试

Linux服务器
systemctl stop NetworkManager && systemctl disable NetworkManager
vim /etc/sysconfig/network-scripts/ifcfg-ens33    
DEVICE=ens33     
HWADDR=00:0C:29:D3:9F:8E     
TYPE=Ethernet     
ONBOOT=yes     
NM_CONTROLLED=yes
BOOTPROTO=static      
IPADDR=172.16.1.20    
NETMASK=255.255.255.0
GATEWAY=172.16.1.1				===> 网关服务器的内网IP
DNS1=192.168.1.1				===> 生产中应为公网DNS


systemctl restart network

测试连通性
ping 172.16.1.1
ping 192.168.1.1
ping 192.168.1.111
ping www.baidu.com
dig www.baidu.com
curl www.baidu.com
等域名或IP进行测试



Windows主机
桌面右击“网络”---“属性”---“更改是配置设置”---右击“Ethernet0”---“属性”---双击“Internet协议版本4(TCP/IPV4)”---选中“使用下面的IP地址”--->|

IP地址:172.16.1.30       		===> 主机位设哪个都行
子网掩码:255.255.255.0
默认网关:172.16.1.1   	       ===> 服务端ens36网卡的地址

首选DNS服务器:192.168.1.1        	===> 生产中应为公网上的DNS
备用DNS服务器:xxx.xxx.xxx.xx

Linux学习QQ群


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM