我想允許連接埠 x 上的連線用於在連接埠 y 上具有「已建立」狀態的 IP 位址。
僅使用 iptables 就可以做到這一點嗎?
答案1
也許你可以使用端口敲門?建立 TCP 連接時打開端口,可能是這樣: http://en.wikipedia.org/wiki/Port_knocking
答案2
答案是「有點」。您需要安裝ipset
軟體包並確保您的核心受ipset
支援。
您首先必須建立一個帶有超時的“IP 集”:
ipset create MySet hash:ip timeout 60
然後新增一條規則,為每個已建立的封包重設逾時
iptables -A INPUT -p tcp --dport $port1 -m state --state ESTABLISHED -j SET --add-set MySet src
最後,新增一組規則,僅當來源已被記錄時才允許存取第二個端口,並刪除其他規則
iptables -A INPUT -p tcp --dport $port2 -j Port2_Test
iptables -A Port2_Test -m state --state ESTABLISHED -j ACCEPT
iptables -A Port2_Test -m state --state NEW -m set --match-set MySet src -j ACCEPT
iptables -A Port2_Test -p tcp -j REJECT
編輯
我剛剛意識到也可以使用recent
匹配擴展。你這樣做:
-A INPUT -p tcp --dport $portY -m state --state ESTABLISHED -m recent --name YThenX --set -j ACCEPT
...
-A INPUT -p tcp --dport $portX -j Port2_Test
...
-A Port2_Test -m state --state ESTABLISHED -j ACCEPT
-A Port2_Test -m state --state NEW -m recent --name YThenX --rcheck --seconds $timeout --reap $timeout -j ACCEPT
-A Port2_Test -p tcp -j REJECT