iptables复习记忆
inner_net="10.0.0.0/8,192.168.0.0/16"
int_if="eth0"
ext_if="eth1"
一、基本
1、表和鏈
表(tables)
包括:filter,nat,mangle表
鏈(chains)
預設的鏈有5個,可以新增加鏈
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING
2、內核模塊分別是
# lsmod |grep iptable
iptable_mangle 3349 1
iptable_nat 6158 1
iptable_filter 2793 1
ip_tables 17831 3 iptable_mangle,iptable_nat,iptable_filter
總結
Mangle表包含所有的鏈
OUTPUT鏈在被所有表包含
Filter表只包含INPUT、FORWARD、OUTPUT
二、常用匹配
1、協(xié)議匹配
-A INPUT -p tcp
# -p ! tcp 排除tcp以外的udp、icmp。-p all所有類型
#6版本為! -p tcp
2、匹配網網卡
-i --in-interface
-A INPUT -i eth0 # 匹配封包是從eth0網卡進入
-o, --out-interface
-A FORWARD -o eth+ # 匹配封包是從eth+網卡送出,eth+表示所有eth開頭的網卡
3、IP地址匹配
-s, --src, --source
-A INPUT -s 192.168.1.1 #基于匹配封包的來源IP
#-s ! 192.168.0.0/24 ! 反向匹配 6版本為! -s
-d, --dst, --destination
-A INPUT -d 192.168.1.1 #基于匹配封包的目的IP
網段
-A INPUT -p tcp -s 192.168.0.0/16 --dport 22 -j ACCEPT
4、端口匹配
需要注意包的協(xié)議是TCP 需要-p tcp
--sport, --source-port
-A INPUT --sport 80 -j ACCEPT #基于匹配封包的來源端口
--destination-port
-A INPUT --dport 80 -j ACCEPT #基于匹配封包的目的端口
連續(xù)端口
-A OUTPUT -p tcp --sport 1024:65535 -j ACCEPT
非連續(xù)端口
-A INPUT -p tcp -m multiport --source-port 22,53,80,110
5、包的狀態(tài)匹配
顯式匹配必須用-m或--match裝載,比如要使用狀態(tài)匹配就必須使用-m state,匹配多個不連續(xù)端口-m multiport
-t filter -A INPUT -p tcp -s 50.23.109.164 --dport 9102 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
-t filter -A OUTPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT #出去
指定要匹配包的的狀態(tài),當前有4種狀態(tài)可用:NEW,RELATED,ESTABLISHED和INVALID.
NEW:表示包將要或已經開始建立一個新的連接,或者是這個包和一個還沒有在兩端都有數(shù)據發(fā)送的連接有關。
RELATED:說明包正在建立一個新的連接,這個連接是和一個已建立的連接相關的。
比如,FTP data transfer(管理端口驗證后需要開啟數(shù)據端口傳輸數(shù)據),ICMP error 和一個TCP或UDP連接相關。
ESTABLISHED:意思是包是完全有效的,而且屬于一個已建立的連接,這個連接的兩端都已經有數(shù)據發(fā)送。
注意:NEW狀態(tài)并不在試圖建立新連接的TCP包里尋找SYN標記,
因此它不應該不加修改地用在只有一個防火墻或在不同的防火墻之間沒有啟用負載平衡的地方。
INVALID意味著這個包沒有已知的流或連接與之關聯(lián),也可能是它包含的數(shù)據或包頭有問題。
5、包的mac地址匹配
--mac-source
-A INPUT -m mac --mac-source 00:00:00:00:00:01
6、tcp-flags【未用到】
-p tcp --tcp-flags SYN,FIN,ACK SYN #阻止所有沒有經過你系統(tǒng)授權的TCP連接
表示匹配那些SYN標記被設置而FIN和ACK標記沒有設置的包,注意各標記之間只有一個逗號而沒有空格。
匹配指定的TCP標記。有兩個參數(shù),它們都是列表,列表內部用英文的逗號作分隔符,這兩個列表之間用空格分開。
第一個參數(shù)指定我們要檢查的標記(作用就象掩碼),第二個參數(shù)指定“在第一個列表中出現(xiàn)過的且必須被設為1(即狀態(tài)是打開的)的”標記(第一個列表中其他的標記必須置0)。
也就是說,第一個參數(shù)提供檢查范圍,第二個參數(shù)提供被設置的條件(就是哪些位置1)。
這個匹配操作可以識別以下標記:SYN, ACK,FIN,RST ,URG,PSH。另外還有兩個詞也可使用,就是ALL和NONE。
顧名思義,ALL是指選定所有的標記,NONE是指未選定任何標記。這個匹配也可在參數(shù)前加英文的感嘆號表示取反。例如:
1)、iptables -p tcp --tcp-flags SYN,FIN,ACK SYN 表示匹配那些SYN標記被設置而FIN和ACK標記沒有設置的包,注意各標記之間只有一個逗號而沒有空格。
2)、--tcp-flags ALL NONE 匹配所有標記都未置1的包。
3)、iptables -p tcp --tcp-flags ! SYN,FIN,ACK SYN表示匹配那些FIN和ACK標記被設置而SYN標記沒有設置的包,注意和例1比較一下。
4)、-t filter -A INPUT -i eth0 -p tcp --syn -j DROP # 阻止所有沒有經過你系統(tǒng)授權的TCP連接
ipchains時代的遺留物,之所以還保留它,是為了向后兼容。
它匹配那些SYN標記被設置而 ACK和RST標記沒有設置的包,這和iptables -p tcp --tcp-flags SYN,RST,ACK SYN 的作用毫無二樣。
6、--limit --limit-burst限制 【不知道數(shù)字標準,不要使用】
這個匹配操作必須由-m limit明確指定才能使用。有了它的幫助,就可以對指定的規(guī)則的日志數(shù)量加以限制
-A INPUT -f -m limit --limit 100/s --limit-burst 100 -j ACCEPT # IP包流量限制
--limit設置最大平均匹配速率,也就是單位時間內limit match可以匹配幾個包。它的形式是一個數(shù)值加一個時間單位,可以是/second /minute /hour /day 。默認值是每小時3次(用戶
角度),即3/hour ,也就是每20分鐘一次(iptables角度)
--limit-burst定義的是--limit的峰值,就是在單位時間(這個時間由上面的--limit指定)內最多可匹配幾個包(由此可見,--limit-burst的值要比--limit的大)。默認值是5。為了觀
察它是如何工作的,你可以啟動“只有一條規(guī)則的腳本”Limit- match.txt,然后用不同的時間間隔、發(fā)送不同數(shù)量的ping數(shù)據包。這樣,通過返回的 echo replies就可以看出其工作方式
了。
7、其他
-A INPUT -p tcp -m tcp --dport 80 -m state --state NEW -m recent --update --seconds 5 --hitcount 20 --rttl --name WEB --rsource -j DROP # 可防御cc攻擊(未測試)
三、常用動作
1、添加
-A
2、刪除
iptables -t filter -nL --line-numbe #查看編號
-D INPUT 8 # 從某個規(guī)則鏈中刪除一條規(guī)則根據編號
-D INPUT --dport 80 -j DROP # 從某個規(guī)則鏈中刪除一條規(guī)則
3、替換
-R INPUT 8 -s 192.168.0.1 -j DROP # 取代現(xiàn)行規(guī)則
4、插入
-I INPUT 8 --dport 80 -j ACCEPT # 插入一條規(guī)則 編號前插入
四、常用icmp
-t filter -A INPUT -p icmp -s $inner_net --icmp-type 8 -j ACCEPT
-t filter -A INPUT -p icmp -s $inner_net --icmp-type 0 -j ACCEPT
-t filter -A OUTPUT -p icmp -d $inner_net --icmp-type 0 -j ACCEPT
-t filter -A OUTPUT -p icmp -d $inner_net --icmp-type 8 -j ACCEPT
所有eth網卡都可以ping
-t filter -A INPUT -i eth+ -p icmp -m icmp --icmp-type 0 -j ACCEPT
-t filter -A INPUT -i eth+ -p icmp -m icmp --icmp-type 8 -j ACCEPT
-t filter -A OUTPUT -i eth+ -p icmp -m icmp --icmp-type 0 -j ACCEPT
-t filter -A OUTPUT -i eth+ -p icmp -m icmp --icmp-type 8 -j ACCEPT
icmp的類型
0 Echo request——回顯請求(Ping請求)
8 Echo Reply——回顯應答(Ping應答)
-A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -j DROP # 禁止icmp類型
-A INPUT -i eth0 -p icmp -j DROP # 禁止icmp協(xié)議
五、提供服務 Server
tcp
service name:SSH/Telnet/Http/Https/Squid/FTP/DNS/Samba/NFS/SMTP/POP3/POP3S/IMAP/IMAPS/LDAP/Mysql/Sql Server/rsync/iscsi/pptp
port: 22/23/80/443/8080/20:21/53/137:139 445/固定端口/25/110 995/143 993/389/3306/1433/873/3260/1723
DNS tcp53端口是server和server之間通訊
udp:
service name:ntp/dhcp/rsyslog/snmp
port:123/67:68/514/161
備注
1、日志可以改成tcp
2、dhcp
dhcp client使用udp68端口請求
dhcp server使用udp67端口回應
1、詳細的服務
針對網段
#allow inner connect sshd
-t filter -A INPUT -p tcp -s $inner_net --dport 22 -j ACCEPT
-t filter -A OUTPUT -p tcp -d $inner_net --sport 22 -j ACCEPT
針對網卡
#allow inner connect http
-t filter -A INPUT -p tcp -i ${ext_if} --dport 80 -j ACCEPT
-t filter -A OUTPUT -p tcp -i ${ext_if} --sport 80 -j ACCEPT
#DNS
-t filter -A INPUT -p udp -i ${ext_if} --dport 53 -j ACCEPT
-t filter -A OUTPUT -p udp -i ${ext_if} --sport 53 -j ACCEPT
#DHCP
-t filter -A INPUT -p udp -s $inner_net --dport 67 -j ACCEPT
-t filter -A OUTPUT -p udp -s $inner_net --sport 67 -j ACCEPT
或者
-t filter -A INPUT -p udp -s $inner_net --sport 68 -j ACCEPT
-t filter -A OUTPUT -p udp -s $inner_net --dport 68 -j ACCEPT
2、特殊的服務ftp
注意點:加載模塊 主動被動模式
1)、加載模塊
如果使用shell腳本配置需:
modprobe ip_conntrack_ftp
如果使用配置文件配置需修改配置文件:
# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="ip_conntrack_ftp"
2)、模式
21控制,20數(shù)據
模式是站在client立場來說的
主動模式:client隨機選擇一個tcp端口連接FTP服務器的21端口請求建立連接,當需要傳輸數(shù)據時,client通過控制連接用一個port command告訴服務端另外一個隨機接受數(shù)據傳輸?shù)亩丝?
,【服務器用TCP20端口】和client通知的接受數(shù)據的端口建立數(shù)據連接
被動動模式:client隨機選擇一個tcp端口連接FTP服務器的21端口請求建立連接,當需要傳輸數(shù)據時,client通過控制連接用一個PASV command給服務器要求進入被動傳輸模式,
【服務器隨機選擇一個TCP端口】,并用控制連接告訴client,client用來另一個TCP端口連接剛才服務器指定的TCP端口來建立數(shù)據通道。
主動服務端固定端口21,20,客戶端隨機,建立數(shù)據參數(shù)點在服務端
被動服務端21固定,數(shù)據傳輸端口隨機,客戶端隨機,建立數(shù)據傳輸點在客戶端
ftp client規(guī)則
-A OUTPUT -p tcp -d 50.23.109.174 --dport 21 -j ACCEPT
#-A OUTPUT -p tcp -d 50.23.109.174 --dport 20 -j ACCEPT
-A OUTPUT -p tcp -d 50.23.109.174 --sport 1024:65535 -j ACCEPT
-A INPUT -p tcp -s 50.23.109.174 -m state --state ESTABLISHED,RELATED -j ACCEPT
ftp server規(guī)則
-t filter -A INPUT -p tcp --dport 21 -j ACCEPT
-A OUTPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
被動模式數(shù)據可以傳輸出去因為 --state RELATED
我線上配置的ftp服務器為被動模式,所以,其實client OUTPUT不是訪問服務端20端口,而是訪問隨機端口,所以client OUTPUT有規(guī)則
-A OUTPUT -p tcp -d 50.23.109.174 --sport 1024:65535 -j ACCEPT
vsftpd默認為被動模式
pasv_enable
Set to NO if you want to disallow the PASV method of obtaining a data connection.
Default: YES
拉數(shù)據的時候也可以看到隨機端口
[root@backup ~]# netstat -antlp |grep ftp
tcp 0 0 50.23.109.164:49072 0.0.0.0:* LISTEN 21838/vsftpd
tcp 0 0 0.0.0.0:21 0.0.0.0:* LISTEN 7163/vsftpd
tcp 0 771840 50.23.109.164:49072 180.175.188.190:33813 ESTABLISHED 21840/vsftpd
tcp 0 0 50.23.109.164:21 180.175.188.190:33812 ESTABLISHED 21838/vsftpd
六、訪問常見的服務 client
1、client都通過內網訪問自己的ssh,dns,ntp,dhcp服務器
#ssh client,dns client,ntp client,dhcp client
#ssh client
$iptab -t filter -A OUTPUT -p tcp -d $inner_net --dport 22 -j ACCEPT
$iptab -t filter -A INPUT -p tcp -s $inner_net --sport 22 -j ACCEPT
#dns client 協(xié)議udp #server到server使用tcp 53
$iptab -t filter -A OUTPUT -p udp -d $inner_net --dport 53 -j ACCEPT
$iptab -t filter -A INPUT -p udp -s $inner_net --sport 53 -j ACCEPT
#ntp client 協(xié)議udp
$iptab -t filter -A OUTPUT -p udp -d $inner_net --dport 123 -j ACCEPT
$iptab -t filter -A INPUT -p udp -s $inner_net --sport 123 -j ACCEPT
#dhcp client 協(xié)議udp
-t filter -A OUTPUT -p udp -s $inner_net --dport 67 -j ACCEPT
-t filter -A INPUT -p udp -s $inner_net --sport 67 -j ACCEPT
2、安裝軟件需求
#allow to Internet 80 443 and 20 21 port
#如果沒有內網的源,沒有使用代理,需要使用外網
$iptab -t filter -A OUTPUT -o $ext_if -p tcp --dport 20 -j ACCEPT
$iptab -t filter -A INPUT -i $ext_if -p udp --sport 20 -j ACCEPT
$iptab -t filter -A OUTPUT -o $ext_if -p tcp --dport 21 -j ACCEPT
$iptab -t filter -A INPUT -i $ext_if -p udp --sport 21-j ACCEPT
$iptab -t filter -A OUTPUT -o $ext_if -p tcp --dport 80 -j ACCEPT
$iptab -t filter -A INPUT -i $ext_if -p udp --sport 80 -j ACCEPT
$iptab -t filter -A OUTPUT -o $ext_if -p tcp --dport 443 -j ACCEPT
$iptab -t filter -A INPUT -i $ext_if -p udp --sport 443 -j ACCEPT
3、稍微寬松的規(guī)則,打開出去的規(guī)則,進來的包的狀態(tài)為ESTABLISHED,RELATED才容許通過
#client出去不限制,出去建立起連接后的所有包都容許通過
$iptab -t filter -A OUTPUT -o $ext_if -j ACCEPT
$iptab -t filter -A INPUT -i $ext_if -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
七、當數(shù)據庫包的目標地址是本機時 數(shù)據包通過的原理
和七構成了提供服務(如http)的數(shù)據包的流人流出原理,掌握清楚就可以配置常用filter表防火墻規(guī)則
(1)數(shù)據包進入網絡接口
(2)進入mangle表的PREROUTING鏈,在這里可以根據需要改變數(shù)據包頭內容(比如數(shù)據包TTL值)
(3)進入nat表的PREROUTING鏈,在這里可以根據需要做DNAT(目標地址轉換)
(4)進行路由判斷(進入本地還是轉發(fā))
(5)進入mangle表的INPUT鏈,在路由之后達到本地程序之前修改數(shù)據包頭的內容。【目標地址是本地】
(6)進入filter表的INPUT鏈, 所有目的地址是本機的數(shù)據包都會經過這里,不管從那里來的,所以在這里可以對進入的數(shù)據包的過濾條件進行設置。【過濾】
(7)到達本地應用程序處理數(shù)據包
不修改包頭,不NAT,目標地址為本機的數(shù)據流向如下:
網卡-->>mangle表的PREROUTING鏈[不做處理]-->>nat表的PREROUTING鏈[不做處理]-->>路由判斷[選擇本機]-->>mangle表的INPUT鏈[不做處理]-->>filter表的INPUT鏈[過濾規(guī)則]-->>本地
應用程序
八、當數(shù)據庫包的源地址是本機時 數(shù)據包通過的原理
(1)本地應用程序產生數(shù)據包
(2)路由判斷 【注意多網絡環(huán)境】
(3)進入mangle表的OUTPUT鏈,在這里可以根據需要修改數(shù)據包頭的內容
(4)進入NAT表的OUTPUT鏈,在這里可以根據需要做DNAT(沒見到過在這里操作的規(guī)則)
(5)進入filter表的OUTPUT鏈,在這里可以對數(shù)據包的過濾條件進行設置【過濾】
(6)進入mangle表的POSTROUTING鏈,在這里可以根據需要做DNAT(沒見到過在這里操作的規(guī)則),數(shù)據包離開本機之前修改數(shù)據包頭內容,
有兩種數(shù)據包會經過這里,本機程序產生的數(shù)據包和被轉發(fā)的數(shù)據包。
(7)進入nat表的POSTROUTING鏈,在這里對數(shù)據包做SNAT(源頭)。(有兩種數(shù)據包會經過這里,本機程序產生的數(shù)據包和被轉發(fā)的數(shù)據包)
(8)離開本地
不修改包頭,不NAT源地址為本機的數(shù)據流向如下:
本地應用程序-->>路由判斷-->>mangle表的OUTPUT鏈[不做處理]-->> NAT表的OUTPUT鏈[不做處理]-->>filter表的OUTPUT鏈[過濾]-->>mangle表的POSTROUTING鏈[不做處理]-->>nat表的
POSTROUTING鏈[不做處理]-->>通過網卡離開本地
九、經由本地轉發(fā)的數(shù)據包 數(shù)據包通過的原理
(1)數(shù)據包進入網絡接口
(2)進入mangle表的PREROUTING鏈,在這里可以根據需要改變數(shù)據包頭內容(比如數(shù)據包TTL值)
(3)進入nat表的PREROUTING鏈,在這里可以根據需要做DNAT(目標地址轉換)
(4)進行路由判斷(進入本地還是轉發(fā))
(5)進入mangle表的FORWARD鏈,在這里可以根據需要修改數(shù)據包頭的內容 【目標地址是其他】
(6)進入filter表的FORWARD鏈,只有需要轉發(fā)的數(shù)據包才會到達和經過這里,并且針對這些數(shù)據包的所有過濾也在這里。【目標地址是其他的數(shù)據包,過濾】
(7)進入mangle表的POSTROUTING鏈,數(shù)據包離開本機之前修改數(shù)據包頭內容.(有兩種數(shù)據包會經過這里,本機程序產生的數(shù)據包和被轉發(fā)的數(shù)據包)
(8)進入nat表的POSTROUTING鏈,在這里對數(shù)據包做SNAT(源頭),MASQUERADE.(有兩種數(shù)據包會經過這里,本機程序產生的數(shù)據包和被轉發(fā)的數(shù)據包)
(9)離開本地
簡單總結七八九
1、進入包
任何包進入都會通過mangle表的PREROUTING鏈,nat表的PREROUTING鏈,和路由選擇
1)DNAT,REDIRECT
DNAT,REDIRECT在nat表的PREROUTING
2)過濾
所有進入包(進入本地)在 [filter表的INPUT鏈] 過濾
2、出去包
任何包出去都會通過mangle表的POSTROUTING鏈,nat表的POSTROUTING鏈
1)SNAT,MASQUERADE
SNAT,MASQUERADE在nat表的POSTROUTING鏈
2)過濾
本地出去包在 [filter表的OUTPUT鏈] 過濾
經本地轉發(fā)包在 [filter表的FORWARD鏈] 過濾
所有包過濾都在filter表,INPUT[到本地],OUTPUT[本地出去],FORWARD[經由本地轉發(fā)]
十、NAT常見應用
modprobe ip_nat_ftp
iptables -t nat -nL #查看
PREROUTING 包進來時操作。包括SNAT,
<一>SNAT 應用
1、 通過vpn上網
詳細可以參考:http://www.cnblogs.com/sixiweb/archive/2012/11/20/2778732.html
#美國VPS只有一張網卡eth0
#VPN撥號后的后的IP網段為192.168.0.0/24
echo 1 > /proc/sys/net/ipv4/ip_forward
/sbin/iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
/sbin/iptables -t filter -A INPUT -p gre -j ACCEPT
/sbin/iptables -t filter -A INPUT -p tcp --dport 1723 -j ACCEPT
/sbin/iptables -t filter -A FORWARD -s 192.168.0.0/24 -o eth0 -j ACCEPT
/sbin/iptables -t filter -A FORWARD -d 192.168.0.0/24 -i eth0 -j ACCEPT
/sbin/iptables -t filter -I FORWARD -p tcp --syn -i ppp+ -j TCPMSS --set-mss 1356
/sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
#mss是在TCP連接建立開始時,通過帶有syn標志的IP數(shù)據包進行傳輸?shù)?#xff0c;所以我們在iptables里面規(guī)定,在轉發(fā)數(shù)據時,
只要發(fā)現(xiàn)產生于ppt*的帶有syn標志數(shù)據包時,將其mss設定為1356字節(jié)
#http://hi.baidu.com/gvmfexzehygpqze/item/dcae158f8305365d840fabc9
注意點:
(1)、這里只有偽裝,沒有SNAT,因為VPN撥號動態(tài)獲得IP
(2)、VPN用到GRE協(xié)議
(3)、過濾在filter表FORWARD鏈
(4)、mss優(yōu)化
2、網關-內網轉發(fā)
iptables所在服務器有兩張網卡,有一張外網網卡可以上網,局域網將使用這臺作為網關上網
eth0內網,eth1外網
局域網網段:10.0.0.0/8
服務端
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#iptables -t filter -A INPUT -s 10.0.0.0/8 -j ACCEPT 轉發(fā)的根本沒有到filter表的INPUT鏈
iptables -t filter -A FORWARD -s 10.0.0.0/8 -o eth1 -j ACCEPT
iptables -t filter -A FORWARD -d 10.0.0.0/8 -i eth1 -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -s 10.0.0.0/8 -j SNAT --to 202.102.32.156
局域網的內服務器需要將網關IP指向這臺服務器內網IP
route add default gw 10.0.0.254
nat表POSTROUTING鏈SNAT的用法
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000
指定源地址和端口,有以下幾種方式:
1、單獨的地址。
2、一段連續(xù)的地址,用連字符分隔,如194.236.50.155-194.236.50.160,這樣可以實現(xiàn)負載平衡。每個流會被隨機分配一個IP,但對于同一個流使用的是同一個IP。
3、在指定-p tcp 或 -p udp的前提下,可以指定源端口的范圍,如194.236.50.155:1024-32000,這樣包的源端口就被限制在1024-32000了。
注意,如果可能,iptables總是想避免任何的端口變更,換句話說,它總是盡力使用建立連接時所用的端口。但是如果兩臺機子使用相同的源端口,iptables 將會把他們的其中之一映射到
另外的一個端口。如果沒有指定端口范圍, 所有的在512以內的源端口會被映射到512以內的另一個端口,512和1023之間的將會被映射到 1024內,其他的將會被映射到大于或對于1024的端
口,也就是說是同范圍映射。還要注意,這種映射和目的端口無關。因此,如果客戶想和防火墻外的HTTP服務器聯(lián)系,它是不會被映射到FTP control所用的端口的。
iptables -t nat -A PREROUTING -d 192.168.10.158 -p tcp --dport 9999 -j DNAT --to 10.10.20.55:22
根據mac控制局域網用戶上網
http://netsecurity.51cto.com/art/201005/202340.htm
4)代理服務器 squid+iptabels實現(xiàn) 端口重定向
iptables所在服務器有兩張網卡,有一張外網網卡可以上網,局域網將使用這臺作為網關上網
eth0內網,eth1外網
局域網網段:10.0.0.0/8
服務器已經搭建了squid的透明代理服務,服務使用8080端口
服務器iptables
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t filter -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -A PREROUTING -p tcp -i eth0 -s 10.0.0.0/8 --dport 80 -j REDIRECT --to-ports 8080
局域網的內服務器需要將網關IP指向這臺服務器內網IP
route add default gw 10.0.0.254
原理:
1、LAN client請求任何站點的80端口到網關
2、網關iptables REDIRECT 到8080
3、squid代理出去訪問外網
這個SNAT的區(qū)別為squid代替iptables的轉發(fā)
MASQUERAD和SNAT target區(qū)別
MASQUERADE
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000
在指定TCP或UDP的前提下,設置外出包能使用的端口,方式是單個端口,如--to-ports 1025,或者是端口范圍,如--to- ports 1024-3000。注意,在指定范圍時要使用連字號
SNAT
iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000
MASQUERADE和SNAT target的作用是一樣的,區(qū)別就是它不需要指定--to-source 。
MASQUERADE是被專門設計用于那些動態(tài)獲取IP地址的連接的,比如,撥號上網、DHCP連接等。如果你有固定的IP地址,還是用SNAT target吧
<二>DNAT 應用
DNAT單獨貌似無法應用,要和SNAT一起才能組成DMZ的端口映射
# 把外網的服務映射到內網服務器
echo 1 > /proc/sys/net/ipv4/ip_forward
route add -net 10.0.0.0 netmask 255.255.255.0 gw 10.0.0.254 # 內網需要添加默認網關,并且網關開啟轉發(fā)
#PREROUTING chain
$IPTABLES -t nat -A PREROUTING -p TCP -i $INET_IFACE -d $HTTP_IP --dport 80 -j DNAT --to-destination $DMZ_HTTP_IP
$IPTABLES -t nat -A PREROUTING -p TCP -i $INET_IFACE -d $DNS_IP --dport 53 -j DNAT --to-destination $DMZ_DNS_IP
$IPTABLES -t nat -A PREROUTING -p UDP -i $INET_IFACE -d $DNS_IP --dport 53 -j DNAT --to-destination $DMZ_DNS_IP
#POSTROUTING chain 必須有SNAT,不然服務響應的包無法返回請求的client
$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP
如果提供外網服務的端口和內網服務不一樣,可以指定不通的端口
iptables -t nat -A PREROUTING -d 192.168.10.158 -p tcp --dport 9999 -j DNAT --to 10.10.20.55:22
延伸,用DMZ可以做基于防火墻的4層的負載均衡
轉載于:https://www.cnblogs.com/diege/p/3198341.html
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的iptables复习记忆的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 关于如何实现程序一天只启动一次的想法(C
- 下一篇: 字符串转json对象的各种方法