sshdが22番ポートをlistenしているときに、下記の要件を実現するiptables設定をまとめてみました。
- 192.0.2.0/24 からsshdに22番ポート経由でアクセス可能
- 198.51.100.0/24 からsshdに10022番ポート経由でアクセス可能
- 他の組み合わせではアクセス不可
この場合、下記のようにすると一番見通しが良さそうです。REDIRECTされたかどうかの判断にmarkを利用しています。
# iptables -t mangle -A PREROUTING -p tcp --dport 10022 -j MARK --set-mark 10022
# iptables -t nat -A PREROUTING -p tcp --dport 10022 -j REDIRECT --to-port 22
# iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# iptables -A INPUT -s 198.51.100.0/24 -p tcp --dport 22 -m mark --mark 10022 -j ACCEPT
# iptables -A INPUT -m mark --mark 10022 -j DROP
# iptables -A INPUT -s 192.0.2.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
# iptables -A INPUT -j DROP
別解として、REDIRECTの対象となるIPアドレスを絞ってしまう設定も考えられます。ただ、これだとIPアドレスの記述がnatテーブルとfilterテーブルとに分散してしまうのがイマイチかもしれません。
# iptables -t mangle -A PREROUTING -p tcp --dport 10022 -j MARK --set-mark 10022
# iptables -t nat -A PREROUTING -s 198.51.100.0/24 -p tcp --dport 10022 -j REDIRECT --to-port 22
# iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -m mark --mark 10022 -j ACCEPT
# iptables -A INPUT -s 192.0.2.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
# iptables -A INPUT -j DROP
参考URL
- iptables でローカルの上位ポートに転送しているときにそのポートへの直接アクセスを禁止する - Qiita
-
コピペから脱出!iptablesの仕組みを理解して環境に合わせた設定をしよう | OXY NOTES
- テーブル/チェインの組み合わせと処理順の図がわかりやすい。