Iptables

兩個物理埠之間的Ubuntu路由問題

  • August 11, 2021

希望解決以下問題:

  • Ubuntu 18.04.5
  • 英特爾 i3

我有兩個物理埠(enp1s0 和 enp2s0),一個連接到 enp1s0 的路由器和一個連接到 enp2s0 的攝像頭。

  • enp1s0 是 192.168.1.10
  • 連接的路由器是 192.168.1.1
  • enp2s0 是 192.168.0.10
  • 攝像頭是 192.168.0.1

我希望能夠從相機訪問網際網路。(例如:ping -I enp2s0 1.1.1.1)。

|———--|    |—--——|
enp1s0      enp2s0       
|_____|    |_____|
   |         |
   |         |
 |--———|      Camera
 Router
 |_____|
   |
   |
   Internet

我嘗試了以下規則:

  • 通過以下方式啟用 IP 轉發:
 #vim /etc/sysctl.conf
 net.ipv4.ip_forward = 1

 #sysctl -p
  • 更新 IP 表
 iptables -A FORWARD -i enp2s0 -o enp1s0 -j ACCEPT
 iptables -A FORWARD -i enp1s0 -o enp2s0 -j ACCEPT
 iptables -t nat -A POSTROUTING -o enp1s0 -J MASQUERADE
 iptables -t nat -A POSTROUTING -o enp2s0 -J MASQUERADE

我仍然無法讓這兩個介面對話——希望從 enp2s0 ping enp1s0,然後從 enp2s0 訪問網際網路。它們必須位於不同的子網上。

誰能幫我理解這裡的路由問題以幫助這兩個子網相互通信?

我最初將其添加為編輯 - 但這裡是作為答案:

我已經使用 iptables flush 來刪除任何舊規則(儘管我相信無論如何都是在重新啟動時完成的)並將 nat 規則從我最初認為是正確的更改。

iptables --flush
iptables --table nat --flush
iptables --delete-chain

iptables --table nat --delete-chain

iptables --table nat --append POSTROUTING --out-interface enp1s0 -j MASQUERADE
iptables --append FORWARD --in-interface enp2s0 -j ACCEPT

因此,您要做的是獲取整個子網192.168.0.*/24(其中恰好有攝像頭),並在您的 Ubuntu 機器上使用 NAT 來假裝該子網中的所有內容實際上都來自 Ubuntu 機器。你需要這樣做只是因為路由器只接受來自子網的連接192.168.1.*/24(如果路由器沒有這個限制,你可以做正常的路由,沒有 NAT)。

這意味著您需要一個NAT規則,即傳出介面,即enp1s0. NAT 通過連接跟踪器工作,因此對於傳出的數據包,源地址將被替換為 上的地址enp1s0,而對於返回的數據包,目標地址將被原始源地址替換。

所以嘗試使用單一規則,然後在相機上做一些事情來嘗試連接(或者用第二台電腦更換相機,這樣你就可以做一個ping)。你不能在 Ubuntu 機器上測試這個ping -I,因為它不會使用轉發表。

如果設置仍然無法正常工作,請tcpdump在兩者上執行一次enp1s0enp2s0同時從攝像頭產生流量;這應該為您提供足夠的資訊來縮小任何其他問題的範圍。

引用自:https://unix.stackexchange.com/questions/660049