Iptables を使用して HTTP ポートと SSH ポートを内部サーバーに転送するにはどうすればよいですか?

Iptables を使用して HTTP ポートと SSH ポートを内部サーバーに転送するにはどうすればよいですか?

私はルーターを持っていないので、CentOS 6.4 Linux システムをルーターにして、パブリック ネットワーク トラフィックをローカル LAN に転送しています。このシステムには 2 つの NIC カードがあり、1 つはパブリック IP アドレス (eth1) 用、もう 1 つはプライベート IP アドレス (eth2) 用です。

ローカル LAN に接続されたサーバーがあります192.168.1.2

ルーター

  • eth1:x.x.x.xパブリックIPアドレス
  • eth2:192.168.1.1内部ルータアドレス

外部ネットワークの誰かがパブリック IP で ssh を実行すると、サーバーにリダイレクトされるはずです。

ssh x.x.x.xまたは使用パテ

サーバー上の SELinux と iptables ファイアウォールを無効にしました。Linux システム ルーターで iptables の変更をいくつか試しましたが、SSH 要求はまだリダイレクトされません。

iptables -t nat -A PREROUTING -p tcp -d 192.168.1.1 --dport 22 -j DNAT --to-destination 192.168.1.2:22

また、同じ Linux システム ルーターから iptables を使用して、すべての HTTP (80) トラフィックを内部サーバーに転送したいと考えています。

答え1

まず、カーネルでパケット転送が有効になっていることを確認します。

# echo 1 > /proc/sys/net/ipv4/ip_forward

以下の行を追加することで永続的にすることもできます。/etc/sysctl.conf

net.ipv4.ip_forward = 1

これは、ルーターとして動作する Linux マシンで実行する必要があります。ルーター マシンで次のルールを試すことができます。

iptables -t nat -A PREROUTING -i eth1 -d x.x.x.x -p tcp --dport 22 -j  DNAT --to-destination 192.168.1.2:22

また、ルーター ボックスからの NAT ルールの出力もお知らせください。

iptables -t nat -L -n -v

答え2

この驚くべきデジタルオーシャンポート転送の方法に関するチュートリアルをここで書き直すことにしました。

私はこれがどのように機能するかについて多くの時間を費やして調査しました。私は Linux の初心者で、始めるのは必ずしも簡単ではありません。以下は私のサーバーとそのポート転送の例です。

ファイアウォール サーバー (NIC カード 2 枚) - ネットワークの詳細:

  • パブリック IP アドレス:xx.xx.xx.xx
  • プライベート IP アドレス:yy.yy.yy.yy
  • パブリックインターフェース:eth0
  • プライベートインターフェース:eth1

内部(例: ssh、web) サーバー (1 つの NIC カード) - ネットワークの詳細:

  • プライベート IP アドレス:zz.zz.zz.zz
  • プライベートインターフェース:eth0

解決:

カーネルでパケット転送を有効にする:

echo 1 > /proc/sys/net/ipv4/ip_forward

変数を定義します。

# Admin IP address (e.g. public home ip)
ADMIN="aa.aa.aa.aa"

# IP addresses of servers (e.g. in cloud):
FW_eth0_ip="xx.xx.xx.xx"
FW_eth1_ip="yy.yy.yy.yy"
WEB_eth0_ip="zz.zz.zz.zz"

# Services:
SSH="22"
HTTP="80"

Iptables ポート転送 (-m conntrack を使用):

iptables -t nat -A PREROUTING -i eth0 -s $ADMIN -d $FW_eth0_ip -p tcp --dport $SSH -j DNAT --to-destination $WEB_eth0_ip
iptables -A FORWARD -i eth0 -o eth1 -p tcp --syn --dport $SSH -m conntrack --ctstate NEW -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -p tcp --dport $SSH -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -p tcp --sport $SSH -m conntrack --ctstate ESTABLISHED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -p tcp --dport $SSH -d $WEB_eth0_ip -j SNAT --to-source $FW_eth1_ip

いくつかの注意点:

  • 「..-s $ADMIN -d $FW_eth0_ip..」 (1 行目) - セキュリティ上の理由からのみ追加 - ADMIN IP のみが SSH にアクセスできることを意味します (必要ない場合は削除できます)
  • -m 接続トラックと同じです-m 状態
  • SSHのデフォルトポートを1xxxx(/etc/ssh/sshd_config内)などの別のポートに変更することをお勧めします。
  • チェックTCPおよびUDPポート番号のリスト
  • ファイアウォールサーバのSSHにアクセスするにはポート15xx1を使用し、内部のSSHにはポート15xxx2を使用します。

ターミナル:

# access firewall server
$ ssh [email protected] -p 15xx1

# access internal server
$ ssh [email protected] -p 15xx2

使用されるルールの詳細については、前述のチュートリアルで詳しく説明されています。

私からは以上です。お役に立てれば幸いです。

答え3

この質問は iptables に関するものですが、FirewallD も実行している場合は、内部ネットワークの HTTP にアクセスする方法は次のとおりです。

まず、内部サーバーの FirewallD で http トラフィックを許可します。

# firewall-cmd --permanent --add-service=http

次に、外部 IP からの http トラフィックを内部 IP のポート 80 に転送します。

# firewall-cmd --permanent --add-forward-port=port=80:proto=tcp:toaddr=10.0.0.11

SSH サービスでも同じことができます。

答え4

まず、Linux ゲートウェイでルーティングを有効にします。

echo 1 > /proc/sys/net/ipv4/ip_forward

次に、ネットワーク インターフェイス (eth1 など) と必要なポートを使用して次のルールを追加します。

iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j DNAT --to 192.168.1.2
iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 22 -j DNAT --to 192.168.1.2
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 80 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -p tcp -d 192.168.1.2 --dport 22 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

でルールを確認するとiptables -L -v、pkts 列と bytes 列にどのルールが一致しているかが表示されます。

関連情報