Ubuntu

Ubuntu 伺服器作為私有 NAT 路由器和公共路由器

  • December 30, 2021

我正在嘗試做一些我以前從未嘗試過的事情。我有一台安裝了 Ubuntu 的 Dell PowerEdge 540。我安裝了 Comcast Business line,並具有以下物理網路配置:

Ubuntu Server 20.04.3 LTS

enp10s0f0:   (10gb SFP+ Add-on card)
IPv4: 5*.2*.204.214
Subnet: 255.255.255.252
Gateway: 5*.2*.204.213

enp10s0f1:   (10gb SFP+ Add-on card)
IPv4: 5*.2*.205.1
Subnet: 255.255.255.0

eno1:        (1gb copper ethernet)
IPv4: 10.0.0.0
Subnet: 255.0.0.0

這是ip addr的輸出:

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
   inet 127.0.0.1/8 scope host lo
      valid_lft forever preferred_lft forever
   inet6 ::1/128 scope host
      valid_lft forever preferred_lft forever
2: eno1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
   link/ether 00:1e:c9:b5:b2:3c brd ff:ff:ff:ff:ff:ff
   inet 10.0.0.1/8 brd 10.255.255.255 scope global eno1
      valid_lft forever preferred_lft forever
   inet6 ****::***:c9ff:feb5:b23c/64 scope link
      valid_lft forever preferred_lft forever
3: eno2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
   link/ether 00:1e:c9:b5:b2:3e brd ff:ff:ff:ff:ff:ff
4: enp12s0: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
   link/ether 00:10:18:0d:a3:7e brd ff:ff:ff:ff:ff:ff
5: enp10s0f0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
   link/ether f4:e9:d4:92:9d:d0 brd ff:ff:ff:ff:ff:ff
   inet 5*.2*.204.214/30 brd 5*.2*.204.215 scope global enp10s0f0
      valid_lft forever preferred_lft forever
   inet6 fe80::f6e9:d4ff:fe92:9dd0/64 scope link
      valid_lft forever preferred_lft forever
6: enp10s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
   link/ether f4:e9:d4:92:9d:d2 brd ff:ff:ff:ff:ff:ff
   inet 5*.2*.205.1/24 brd 5*.2*.205.255 scope global enp10s0f1
      valid_lft forever preferred_lft forever
   inet6 ****::****:d4ff:fe92:9dd2/64 scope link
      valid_lft forever preferred_lft forever

我配置了以下 ip 路由:

default via 5*.2*.204.213 dev enp10s0f0 proto static
10.0.0.0/8 dev eno1 proto kernel scope link src 10.0.0.1
5*.2*.204.212/30 dev enp10s0f0 proto kernel scope link src 5*.2*.204.214
5*.2*.205.0/24 dev enp10s0f1 proto kernel scope link src 5*.2*.205.1

以下內容保存在我的*/etc/rc.local*文件中:

#!/bin/sh -e

iptables --flush
iptables --table nat --flush
iptables --delete-chain
iptables --table nat --delete-chain
iptables -F
iptables -X

###################### Enable Nat ############################
sudo echo "1" > /proc/sys/net/ipv4/ip_forward

#################### Enable Nat for internal ###########################
iptables -t nat -A POSTROUTING -o enp10s0f0 -j MASQUERADE
#iptables -t nat -A POSTROUTING -o enp12s0f1 -j MASQUERADE

################### Enable Log ########################
#iptables -A OUTPUT -j LOG
#iptables -A INPUT -j LOG
#iptables -A FORWARD -j LOG

############# Allow by default #####################
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

############################ Allow Incoming connection ############################
iptables -A INPUT -m conntrack --ctstate "ESTABLISHED,RELATED" -j ACCEPT

################################## Allow outgoing connection ######################
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT

######################## allow internal to external
iptables -A FORWARD -i eno1 -m state "ESTABLISHED,RELATED" -j ACCEPT
#iptables -A FORWARD -i eno1 -o enp12s0f1 -m state "ESTABLISHED,RELATED" -j ACCEPT
###iptables -A FORWARD -i eno1 -o enp10s0f1 -j ACCEPT
iptables -A FORWARD -i eno1 -o enp10s0f1 -j ACCEPT
#iptables -A FORWARD -i eno1 -o enp12s0f0 -j ACCEPT
#iptables -A FORWARD -i enp10s0f1 -o enp10s0f0 -j ACCEPT
#iptables -A FORWARD -i enp10s0f0 -o enp12s0f1 -j ACCEPT
exit 0

一張網路圖: 網路圖,已連結,因為我還不能發布圖片

您可能會注意到,我花了很多時間線上閱讀解決此問題的最佳方法是什麼,其中大部分內容已被註釋掉。我想,我只需要在eno1介面上進行 NAT。但是,既然是 linux,我需要iptables來做非 NAT 路由嗎?我試過禁用它,公共網路根本無法工作。

即使我讓一件事起作用,它最終也會破壞另一件事。自從我上思科課程以來已經有好幾年了,我不習慣感到如此無知。我真的希望有人可以幫助我找出實現這一點的最佳方法,或者可能發現我所做的任何導致錯誤的錯誤。

我認為您的 ISP 設置了通往您的網路的5*.2*.205.0/24路由5*.2*.204.214

讓我們假設以下狀態:Netfilter 處於預設狀態(iptables-save不顯示任何規則,所有策略都是ACCEPT)。您的公共網路5*.2*.205.0/24工作正常,主機具有預設網關5*.2*.205.1。由於未設置 NAT,因此專用網路10.0.0.0/8(帶有 gateway 10.0.0.1)不起作用。此外,我希望10.0.0.0/8和中的主機5*.2*.205.0/24能夠看到並相互交流。

你幾乎不需要做任何事情來實現這一點。只需使用網路遮罩設置所有 IP 並在核心中啟用 IP 轉發(例如net.ipv4.ip_forward=1)。你的路由表應該和你已經擁有的一樣。

為了10.0.0.0/8向 Internet 工作,您只需添加以下規則:

iptables -t nat -A POSTROUTING -o enp10s0f0 -s 10.0.0.0/8 -j MASQUERADE

它將為進入野外的“灰色”地址進行 NAT。您可以替換-j MASQUERADE-j SNAT --to-source 5*.2*.205.1(分配給 的地址enp10s0f1)或5*.2*.204.214.

如果您想將網路5*.2*.205.0/24視為類似於 Internet,您可以添加另一個 NAT 規則並轉換連接到它的連接10.0.0.0/8。除了傳出介面過濾器之外,這另一個規則將與第一個規則相同-o enp10s0f1。但是不使用 NAT 可能會很有用,特別是如果您控製網路並希望其中的主機看到直接10.0.0.0/8地址而不是將它們隱藏在網關地址下。

引用自:https://serverfault.com/questions/1088472