Ubuntu

iptables –set-mark - 通過不同的介面路由不同的埠

  • March 9, 2019

短篇小說,

3 個介面,eth0(LAN),eth1(ADSL),eth2(4G)。

eth0 -> eth1:工作

(埠 80、443、4070) eth0 -> eth2:不發生

這是該想法的圖形表示:

埠 80 和 443 通過 eth2

其餘通過 eth1

在此處輸入圖像描述

網路方案:

eth0: -ip 10.0.0.1 -net 10.0.0.0/8 -gw 10.0.0.1 (the servers own intf) 
eth1: -ip 192.168.1.74 -net 192.168.1.0/24 -gw 192.168.1.254 
eth2: -ip 192.168.1.91 -net 192.168.0.0/24 -gw 192.168.0.1 


**我認為這個新腳本將 22 和 4070 重新路由到正確的表。

但是,在到達該表後,它不會重新路由到 eth2。**


此腳本有效,但 22 和 4070 除外!

(埠 80 未註釋,它可以工作,但通過 eth1 是錯誤的。)

modprobe iptable_nat
modprobe ip_conntrack

echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -F PREROUTING
iptables -t nat -F
iptables -t mangle -F
iptables -F
# This next line restores any issues trying to connect to something
# if you get weird ACK packets when trying to connect (at least i did)!
iptables -t mangle -A PREROUTING -p tcp -j CONNMARK --restore-mark
ip route flush table main

iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 22 -j MARK --set-mark 1
###  iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 80 -j MARK --set-mark 1
iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 4070 -j MARK --set-mark 1

## Setup routes
# LAN
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
# ADSL
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
# 4G (Only accessible if marking packages with \x01
route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2
# Default via ADSL
## -- Does the same as ip route below? route add default gw 192.168.1.254


echo "201 eth2.out" >> /etc/iproute2/rt_tables

ip rule add fwmark 1 table eth2.out
ip route add default via 192.168.0.1 dev eth2 table eth2.out
ip route add default via 192.168.1.254 dev eth1



## Setup forwards
# From 4G to LAN
iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From ADSL to LAN
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From LAN to ADSL (Default route out)
# - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE

舊腳本:


 Ignore everything below unless you're interested in retracing my steps!!

我創建了一個 router.sh 腳本來設置我的環境,以防我做壞事。我有 3 個埠要發送到 4G 連接,其餘埠通過固定電話 ADSL 連接發送。為此,我已指示 iptables 在預設路由上處理包,並在 –dport == 443 | 時通過我的 4G 介面發送它們。80 | 4070

但是,這不起作用;無論如何,我仍然通過我的固定電話進行路由。

這是我的腳本的樣子:

#!/bin/bash

## routing tables
# wireless = 4G via eth2
# adsl = adsl via eth1

modprobe iptable_nat
modprobe ip_conntrack

echo "1" > /proc/sys/net/ipv4/ip_forward

iptables -P INPUT ACCEPT
iptables -F INPUT
iptables -P OUTPUT ACCEPT
iptables -F OUTPUT
iptables -P FORWARD DROP
iptables -F FORWARD
iptables -t nat -F
ip route flush table main
ip route flush table wireless
ip route flush table adsl

## Setup routing tables
# ADSL
ip route add table adsl to 192.168.1.0/24 dev eth1
# 4G
ip route add table wireless to 192.168.0.0 dev eth2
ip rule add fwmark 0x1 table wireless

## Setup routes
# LAN
route add -net 10.0.0.0 netmask 255.0.0.0 dev eth0
# ADSL
route add -net 192.168.1.0 netmask 255.255.255.0 dev eth1
# 4G (Only accessible if marking packages with \x01
route add -net 192.168.0.0 netmask 255.255.255.0 dev eth2
# Default via ADSL
route add default gw 192.168.1.254


## Forward ports into the LAN
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j DNAT --to 10.0.0.3:80


## Lets mark all packets we want for 4G forward
# HTTPS
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# HTTP
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1
# Spotify
iptables -A OUTPUT -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1

## Setup forwards
# From 4G to LAN
iptables -A FORWARD -i eth2 -o eth0 -m state --state ESTABLISHED,RELATED,NEW -j ACCEPT
# From ADSL to LAN
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# From LAN to ADSL (Default route out)
# - Note: If marked packages is sent to ADSL they will be mangled and rerouted to 4G
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -j LOG
#iptables --table nat --append POSTROUTING --out-interface eth2 --jump SNAT --to-source "192.168.1.74"
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE

我還嘗試將這 3 個添加到腳本的底部:

iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 80 -j SNAT --to "192.168.0.91"
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 443 -j SNAT --to "192.168.0.91"
iptables -t nat -A POSTROUTING -o eth2 -p tcp --dport 4070 -j SNAT --to "192.168.0.91"

也試過沒有成功:

iptables -A PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 1

最後但並非最不重要的一點是,嘗試過:

## Lets mark all packets we want for 4G forward
# HTTPS
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 443 -j MARK --set-mark 1
# HTTP
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 80 -j MARK --set-mark 1
# Spotify
iptables -A POSTROUTING -t mangle -o eth1 -p tcp --dport 4070 -j MARK --set-mark 1

路由有效,我可以瀏覽網頁,聽音樂等等,但我通過錯誤的界面進行操作。我已經在 Google 上搜尋了很長時間,並且發現了一些零碎的東西來了解我在做什麼以及為什麼要這樣做。我可以通過 tc 進行流量整形,但如果可以通過在 iptables 中標記包來實現,那將對我有很大幫助。

我的猜測是我在不同的規則上做錯了順序,主要是MASQUERADE部分?或者如果那應該在那裡?

有人可以解釋如何將DNAT埠說 tcp:80 從外部介面(一個或兩個協議)到內部 10.0.0.0 地址空間嗎?

輸出:

root@Netbridge:~# route -n Kernel IP routing table Destination    

Gateway         Genmask         Flags Metric Ref    Use Iface<br>
0.0.0.0         192.168.1.254   0.0.0.0         UG    0      0        0 eth1<br>
10.0.0.0        0.0.0.0         255.0.0.0       U     0      0        0 eth0<br>
192.168.0.0     0.0.0.0         255.255.255.0   U     0      0        0 eth2<br>
192.168.1.0     0.0.0.0         255.255.255.0   U     0      0        0 eth1
root@Netbridge:~# ifconfig

eth0      Link encap:Ethernet  HWaddr 00:0c:29:7e:9e:4e  
         inet addr:10.0.0.1  Bcast:10.255.255.255  Mask:255.0.0.0

eth1      Link encap:Ethernet  HWaddr 00:0c:29:7e:9e:58  
         inet addr:192.168.1.74  Bcast:192.168.1.255  Mask:255.255.255.0

eth2      Link encap:Ethernet  HWaddr 00:0c:29:7e:9e:62  
         inet addr:192.168.0.91  Bcast:192.168.0.255  Mask:255.255.255.0

遵循以下說明:

output-traffic-on-different-interfaces-based-on-destination-

port iptables-forward-specific-port-to-specific-nic

在其他一些相關執行緒中。

BatchyX 已經對 iptables 和路由給出了很好的解釋,所以我將鍛煉我的懶惰,直接進入腳本。

它應該通過 192.168.0.91 將所有流量 NAT 到埠 80,443,22,4070。其餘的將通過 192.168.1.254 進行 NAT。

我重新進行測試並最終遵循本指南。該指南中缺少的是我腳本中的最後 3 行。我從另一個埠發現的,但我忘記了那個連結。

這是一個經過測試的工作腳本。

需要預設路由

我沒有在腳本中添加的一件事是設置預設路由。它應該是

route add default gw 192.168.1.254

當你這樣做時route -n,它應該是唯一的預設路由 (Dest:0.0.0.0)

0.0.0.0    192.168.1.254    0.0.0.0    UG    0    0    0    eth1

fw-router.sh

# 重置/刷新 iptables
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X
iptables -P 輸入接受
iptables -P 轉發接受
iptables -P 輸出接受

#Reset/Flush/Setup IP 路由(表 4)
ip 路由刷新表 4
ip route show table main | grep -Ev ^預設 | 同時讀取 ROUTE ;做 ip route add table 4 $ROUTE ; 完畢
ip route add table 4 預設通過 192.168.0.1

#用匹配的 D.Port 標記數據包
iptables -t mangle -A PREROUTING -p tcp --dport 22 -s 10.0.0.0/24 -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp --dport 80 -s 10.0.0.0/24 -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp --dport 443 -s 10.0.0.0/24 -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp --dport 4070 -s 10.0.0.0/24 -j MARK --set-mark 4

#SNAT 規則
iptables -t nat -A POSTROUTING -o eth1 -j SNAT --to-source 192.168.1.74
iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 192.168.0.91

#IP 路由
ip 規則添加 fwmark 4 表 4
ip 路由刷新記憶體

#IP 堆棧
#這是指南中缺少的部分
迴聲 1 > /proc/sys/net/ipv4/ip_forward
對於 /proc/sys/net/ipv4/conf/*/rp_filter 中的 f ;做迴聲 0 > $f ; 完畢
迴聲 0 > /proc/sys/net/ipv4/route/flush

**PS1:**簡而言之,MASQUERADE對於具有多個需要某種負載平衡或需要 DNAT 來處理傳入流量的多個外部 IP 的 NAT,它不起作用(在大多數情況下,而且肯定是在你的情況下)。你需要SNAT方向控制。

**PS2:**純 iptables 是不夠的。

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