Iptables
兩個物理埠之間的Ubuntu路由問題
希望解決以下問題:
- 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
在兩者上執行一次enp1s0
,enp2s0
同時從攝像頭產生流量;這應該為您提供足夠的資訊來縮小任何其他問題的範圍。