- 追加された行はこのように表示されます。
- 削除された行は
このように表示されます。
!!フォーワード設定
カーネルパラメータ
net.ipv4.ip_forward = 1
にすればフォワードされる。方法は以下のどちらでもよい。
echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.ip_forward=1
上記設定をすれば、/etc/sysconfig/network に
FORWARD_IPV4=yes
を'''記述する必要はない'''。
(そもそもCentOS6以降は FORWARD_IPV4=yes は効かない)
恒久的に設定するには
/etc/sysctl.conf
に以下を記述する。
net.ipv4.ip_forward = 1
iptables -L -n -v
iptables -L -n -v -t nat
などのコマンドで設定した内容を確認できる。
!!iptables 設定
!IPv4
#!/bin/sh
IPTABLES="/sbin/iptables"
#/etc/init.d/iptables stop
local0Dev="eno1"
local0IP="192.168.0.0/24"
local1Dev="enp13s0"
local1IP="192.168.1.0/24"
ppp0Dev="ppp0"
ppp1Dev="ppp1"
$IPTABLES -t filter -F #フィルター クリア
$IPTABLES -t nat -F #NATクリア
$IPTABLES -P FORWARD DROP #全てのフォワードをドロップ
$IPTABLES -P INPUT DROP #全てのインバウンドをドロップ
$IPTABLES -P OUTPUT ACCEPT #全てのアウトバウンドを許可
#指定ポートのインバウンドを許可
#$IPTABLES -A INPUT -i ${ppp0Dev} -p tcp --dport 2780 -j ACCEPT
# $IPTABLES -A INPUT -i ${ppp0Dev} -p tcp --dport 2722 -j ACCEPT
#$IPTABLES -A INPUT -i ${ppp0Dev} -p tcp --dport 2723 -j ACCEPT
#ループバック(127.0.0.1)を許可
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
# ICMP echo
$IPTABLES -A INPUT -p icmp --icmp-type 8 -j ACCEPT
# ICMP echo reply
$IPTABLES -A INPUT -p icmp --icmp-type 0 -j ACCEPT
#確立しているコネクションとそれに関連したインバウンドを許可
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#フォワード、マスカレイド設定
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
### ローカル ####
#指定アドレスからのインバウンドを許可
$IPTABLES -A INPUT -i ${local0Dev} -s ${local0IP} -j ACCEPT
#フォワード、NAT
$IPTABLES -A FORWARD -s ${local0IP} -o ${ppp0Dev} -j ACCEPT
$IPTABLES -A FORWARD -s ${local0IP} -o ${ppp1Dev} -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -o ${ppp0Dev} -s ${local0IP} -j MASQUERADE
$IPTABLES -t nat -A POSTROUTING -o ${ppp1Dev} -s ${local0IP} -j MASQUERADE
# 無線からの Synergy を許可
# $IPTABLES -A FORWARD -s ${local1IP} -o ${local0Dev} -p tcp --dport 24800 -j ACCEPT
### 無線 ###
#DNSの使用許可
$IPTABLES -A INPUT -p udp -i ${local1Dev} -s ${local1IP} --dport 53 -j ACCEPT
# $IPTABLES -A INPUT -i ${local1Dev} -p tcp --dport 2723 -j ACCEPT
$IPTABLES -A INPUT -p tcp -m state --state NEW -i ${local1Dev} -s ${local1IP} --dport 53 -j ACCEPT
#フォワード、NAT
#$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -d ${local1IP} -j ACCEPT
$IPTABLES -A FORWARD -s ${local0IP} -o ${local1Dev} -j ACCEPT
$IPTABLES -A FORWARD -s ${local1IP} -o ${ppp0Dev} -j ACCEPT
$IPTABLES -t nat -A POSTROUTING -o ${ppp0Dev} -s ${local1IP} -j MASQUERADE
#$IPTABLES -t nat -A POSTROUTING -o ${ppp1Dev} -s ${local1IP} -j MASQUERADE
# interface port toHost toPort returnHost
# eth0 8022 192.168.1.100 22 192.168.0.1
function setPortforward(){
#パケットの送信先変換
$IPTABLES -t nat -A PREROUTING -i $1 -p tcp --dport $2 -j DNAT --to $3:$4
#パケットフォワード
$IPTABLES -A FORWARD -i $1 -p tcp -d $3 --dport $4 -j ACCEPT
#パケットの送信元変換
$IPTABLES -t nat -A POSTROUTING -p tcp -d $3 --dport $4 -j SNAT --to $5
}
#指定ポートへのアクセスをローカルPCのポートへ転送
# setPortforward ppp0 3000 192.168.0.2 80 192.168.0.1
################################################
#Outgoing packet should be real internet Address
################################################
$IPTABLES -A OUTPUT -o ${ppp0Dev} -d 10.0.0.0/8 -j DROP
$IPTABLES -A OUTPUT -o ${ppp0Dev} -d 176.16.0.0/12 -j DROP
$IPTABLES -A OUTPUT -o ${ppp0Dev} -d 192.168.0.0/16 -j DROP
$IPTABLES -A OUTPUT -o ${ppp0Dev} -d 127.0.0.0/8 -j DROP
$IPTABLES -A OUTPUT -o ${ppp1Dev} -d 10.0.0.0/8 -j DROP
$IPTABLES -A OUTPUT -o ${ppp1Dev} -d 176.16.0.0/12 -j DROP
$IPTABLES -A OUTPUT -o ${ppp1Dev} -d 192.168.0.0/16 -j DROP
$IPTABLES -A OUTPUT -o ${ppp1Dev} -d 127.0.0.0/8 -j DROP
# カーネルパラメータの設定
#echo 1 > /proc/sys/net/ipv4/ip_forward
sysctl -w net.ipv4.ip_forward=1
!IPv6
とりあえず必要最低限
#!/bin/sh
IPTABLES="/sbin/ip6tables"
local0Dev="eno1"
local0IP="192.168.0.0/24"
local1Dev="enp13s0"
local1IP="192.168.1.0/24"
ppp0Dev="enp7s0"
#ppp1Dev="ppp1"
$IPTABLES -t filter -F #フィルター クリア
$IPTABLES -t nat -F #NATクリア
$IPTABLES -P FORWARD DROP #全てのフォワードをドロップ
$IPTABLES -P INPUT DROP #全てのインバウンドをドロップ
$IPTABLES -P OUTPUT ACCEPT #全てのアウトバウンドを許可
#ループバック(127.0.0.1)を許可
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT
$IPTABLES -A INPUT -p ipv6-icmp -j ACCEPT
#確立しているコネクションとそれに関連したインバウンドを許可
$IPTABLES -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
#フォワード、マスカレイド設定
$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
#sysctl -w net.ipv6.conf.all.forwarding=1
!!設定反映
!iptables service
iptablesコマンドでルールを設定したあとで
serivce iptables save
で設定を保存できる。
保存先
/etc/sysconfig/iptables
/etc/sysconfig/ip6tables
また、iptables-save で設定を標準出力に表示できる。
iptables-save > iptables
ip6tables-save > ip6tables
等で出力してから編集して、/etc/sysconfigにコピーしても良い。
!OS起動時にルールを設定するシェルを実行する(systemd)
systemdのサービスを作成し、ネットワークやiptablesの起動後に設定用のシェルが実行されるようにする。
/etc/systemd/system/startup.service
[Unit]
Description=Funa startup service(oneshot)
After=network-online.target iptables.service nss-lookup.target
[Service]
Type=oneshot
ExecStart=/root/bin/startup.sh
RemainAfterExit=no
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable startup
!OS起動時にルールを設定するシェルを実行する(rc.local)
この方法場合、
+iptables起動
+/etc/sysconfig/iptables を参照
+rc.local で上記シェルの実行
となる。(rc.* の実行順序で rc.localの実行順序がiptablesより後ならば)
なので、/etc/sysconfig/iptables の設定は全ての通信を遮断するか
上記シェルを実行後に
/etc/init.d/iptables save
を実行し、/etc/sysconfig/iptables と上記シェルと内容を合わせた方が無難。
!!!補足
!!SNATについて
http://www.mazn.net/blog/2008/07/18/99.html
ポートフォワード時以下の条件を満たす場合は、SNATの設定は不要。
*フォワード先のデフォルトゲートウェイが設定されている場合
*フォワード先からの戻りパケットがNATを行ったマシンを正しく経由する場合
フォワード先からの戻りパケットを正しく返すには、SNATにより送信元を変更する。
{{category2 OS,Linux}}