在詳述端口轉發之前,先講一下我日前遇到的一件事情。本人是搞測試的,有一廠家拿了一個服務器軟件叫我測試。基于win2k的,端口號為881,服務器直接連接外部網絡,客戶端通過服器ip來訪問,而他們沒有基于linux的服務器軟件,照他們意思就必須將服務器換成windows的。作為一個linux愛好者,我想大家明白這種痛苦。我翻了一下資料,發現iptables的端口轉發功能可以解決,折騰了一下午,終于完成任務。下面將我的方法講一下:思想:利用端口轉發,當服務器接收到881端口請求以后,將其轉到 10.10.2.200:881上,10.10.2.200再將數據返回給請求連接
Eth0:連接ADSL,即ppp0接口
Eth1:連接內部網絡,ip為10.10.1.1
10.10.2.200為win2k服務器,其端口881提供網絡服務。
iptbles腳本:
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 881 -j DNAT --to-destination 10.10.2.200:881 ;將881請求發至10.10.2.00:881端口
iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -d 10.10.2.200 -p tcp -m tcp --dport 881 -j SNAT --to-source 10.10.1.1 ;返回a.b.b.d時數據源來自同一子網,就將其源地址更改為10.10.1.1,從eth0發出,并在連接跟蹤表中查出a.b.c.d 從ppp0進來的,又由ppp0將此數據發出。
當然不要忘了加一條允許881端口訪問的語句。 iptables –A INPUT –p tcp –dport 881 –i ppp0 –j ACCEPT
可不可把服務器放在局域內,用端口轉發來實現呢?答案當然是肯定的,既然能把881端口轉發,那么21,80這些個端口更不在話,而且很多服務器軟件都可以自定義端口,那就在得玩了,只要有合適的端口,即使給局域網每一個用戶開一個ftp服務器也是可的。你想要實現什么服務都可以,當然是基于端口轉發的。
局域網內10.10.2.101是win2k,提供www服務,端口為800
通過服務器http://serverip:800 進行訪問。
iptables -t nat -A PREROUTING -p tcp -m tcp --dport 800 -j DNAT --to-destination 10.10.2.101:800
iptables -t nat -A POSTROUTING -s 10.10.0.0/16 -d 10.10.2.101 -p tcp -m tcp --dport 800 -j SNAT --to-source 10.10.1.1
iptables –A INPUT –p tcp –dport 800 –i ppp0 –j ACCEPT
由于是基于端口轉發實現的,所以服務器上只需裝個iptables來轉發數據就行了,一切服務由內部服務器完成,這樣的話,我 linux服務器才真正的算是個防火墻。
二.IPTABLES防火墻使用經驗一談
最近架設了一臺LINUX的小型服務器 因為需要把LINUX的機子作為軟路由器來使用 所以把使用的一些經驗談一下。
iptables的功能十分的強大 例如IP轉發和偽裝 防御DoS,掃描和嗅探試的攻擊等等 在這里就不闡述了
我的系統環境: redhat 7.2, adsl 2m, 8139fast 網卡
1:linux如何所以軟路由功能:
說到這里 大家可能會想 只要在/etc/rc.d/rc.local加上cat 1 > /proc/sys/net/ipv4/ip_forward就可以了 讓linux具 ip_forward的功能 但你會發現 就算這樣設置你局域網內的其他電腦還是不能共享上網 這是為什么 因為當你只有一個公網的ip 候 你就必須用到iptables的IP偽裝功能 把IP的偽裝成你公網的IP 那怎么實現呢 你可以這樣 iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE 這樣就可以把你所以出去的IP地址偽裝成ppp0的IP地址(因為我 ADSL 如有不同可以修改)
2:我不想開放我的端口 但我要在我的電腦上啟用http服務 并對外服務:
因為你不想開放除了80以外的端口 你可以這樣 iptables –P INPUT –j DROP 我們用-P來攔截全部的通信
然后在來允許哪些端口可以被使用你可以這樣寫:
iptables –A INPUT –p tcp –dport 80 –j ACCEPT
你可以適當的按照這樣的格式來添加自己想開放的端口 當然如果你覺得這樣不是很好的管理你也可以新建一個iptables表 你可以樣做
iptables –N test (新建一個test表) iptables –A test DROP iptables –A test –p tcp –dport 80 –j ACCEPT(允許80端口被訪問) iptables –A INPUT –j test iptables –A OUTPUT –j test iptables –A FORWARD –j test(這3條的意思指讓INPUT OUTPUT FORWARD都按照test的設置)
3我想在我內網的電腦上架設ftp服務 我該怎么做:
這就又要用到iptables 的又一個強大的功能端口映射了
你可以這樣iptables -t nat -A PREROUTING -p tcp -m tcp --dport 25 -j DNAT --to-destination 192.168.0.6:21
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 192.168.0.6 -p tcp -m tcp -- dport 25-j SNAT --to-source 192.168.0.1
上面2句話的意思是把服務器的25端口映射到192.168.0.6這臺電腦上
4:我不想讓人家可以PING到我
這大概是做防火墻用到最多的一種了 你可以在iptables寫這句話 iptables -A INPUT -p icmp --icmp-type echo-request -i ppp0 -j DROP 如果你前面是新建了一個新的test表 那也可以這樣寫iptables -A test -p icmp --icmp-type echo-request -i ppp0 -j DROP
這句話就是不允許人家PING我 因為ping用到的是icmp協議 因為icmp沒有端口可言 所以也不需要指定端口了好了 這就是iptables的幾種比較基本的用法
這里在介紹幾iptbales常用的一些命令
iptables –F 清空所有的iptables的規則設置
/sbin/iptables-save > iptables – save 把你的規則保存下來 因為你所有設置的規則再重新啟動后都不會被保存 所以你必來寫一個腳本來讓他開機運行 所以你就可以用這命令來保存你的規則 然后讓他開機自動運行就可以了。


