使用iptables將內網ftp服務對映到其他內網伺服器上
iptables一般的只需要關注兩個表,一個是nat表,一個是filter表,其他表暫時用不到,然後nat表裡有三個鏈,filter表裡有三個鏈,總結兩個表,五個鏈
入站資料流向:資料包到達防火牆後首先被PREROUTING鏈處理(是否修改資料包地址等),然後進行路由選擇(判斷資料包發往何處),如果資料包的目標地址是防火牆本機(如:Internet使用者訪問閘道器的Web服務埠),那麼核心將其傳遞給INPUT鏈進行處理(決定是否允許通過等)。
轉發資料流向:來自外界的資料包到達防火牆後首先被PREROUTTING鏈處理,然後再進行路由選擇;如果資料包的目標地址是其他的外部地址(如區域網使用者通過閘道器訪問QQ伺服器),則核心將其傳遞給FORWARD鏈進行處理(允許轉發,攔截,丟棄),最後交給POSTROUTING鏈(是否修改資料包的地址等)進行處理。
出站資料流向:防火牆本機向外部地址傳送的資料包(如在防火牆主機中測試公網DNS服務時),首先被OUTPUT鏈處理,然後進行路由選擇,再交給POSTROUTING鏈(是否修改資料包的地址等)進行處理。
下面實驗下看看:
環境說明:vmware下兩臺虛擬機器,
192.168.255.129上搭建了ftp服務,被動模式,21為控制埠,1023至65535隨機出現數據埠
192.168.255.131作為NAT伺服器
目的將129的ftp服務其對映到192.168.255.131上的指定埠
準備工作,使129的閘道器地址為131
刪除預設閘道器地址 : route delete default gw 閘道器ip(我這裡是192.168.255.2)
新增預設閘道器地址: route add default gw 192.168.255.131
1.首先確保一點,192.168.255.129的閘道器地址為192.168.255.131,否則129有多個出口,二者無法關聯對映
131要做的工作:去掉firewalld服務,關閉selinux,啟用iptables服務,129無所謂,關閉firewalld和selinux就行了
systemctl stop firewald.service && sudo systemctl disable firewald.service
yum install iptables-services iptables-devel -y
systemctl enable iptables.service && sudo systemctl start iptables.service
2.開啟131的網絡卡轉發功能
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf && sysctl -p
3.131上設定允許255過來的網段進行地址偽裝,也就是129到達之後,可以用131為源地址進行"外網”的訪問,(要不要這條配置無所謂,只是為了讓129可以上外網)
iptables -t nat -A POSTROUTING -s 192.168.255.0/24 -j MASQUERADE
4.131上設定DNAT,將去往166埠的請求轉發到129的21埠,131上可以不用開166埠,他自己會轉發,理論上166埠的包到達pre鏈就直接轉給了129的21埠,根本沒有到達131自己的INPUT鏈,所以不需要放行131INPUT鏈的166埠
iptables -t nat -I PREROUTING -p tcp -d 192.168.255.131 --dport 166 -j DNAT --to 192.168.255.129:21
5.131上開啟ftp核心模組追蹤相關資料埠
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
lsmod | grep ftp 有東西表示成功
6.接下來訪問測試看看?成功了
7.通訊詳細流程
客戶端訪問192.168.255.131:166,這時候先經過131的prerouting鏈,判斷是DNAT規則,將目的地址修改為192.168.255.129:21,經由路由選擇,判斷不是進入本機的資料包,而是轉發包,傳遞給forward鏈進行處理(這裡沒有規則,預設許可),經由postrouting鏈(這裡源ip是客戶端ip仍舊沒變,只允許255網段的修改源ip),最後轉發到129,129處理結束之後(沒開iptables),源ip為129,目的ip為客戶端ip,由於設定了閘道器地址,所以129的回包直接到達131,經由PREROUTING鏈(這裡直接通過),根據路由選擇,判斷不是到本機的,核心將其傳遞給FORWARD鏈進行處理(預設允許),再經由POSTROUTING鏈將源IP也就是129,修改為131的外網口地址(如果有外網口,這裡就是131,通過iptables可以指定,如果是外網口就必須要指定SNAT,如果像這裡,可以不用指定SNAT),最後源ip是131,目的地址客戶端ip,返回給客戶端。