用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