# 関数など共通ロジックを記載
[root@localhost ~]# cat common.cnf
#!/bin/sh
function disable_selinux(){
SELINUX=$(getenforce)
if [ "${SELINUX}" == "Enforcing" ]; then
setenforce 0
sed -i.bak -e "/^SELINUX=/s/enforcing/disabled/" /etc/selinux/config
fi
}
function change_connection_profile_name(){
NIC=$(ip addr | grep -i -B 1 $1 | head -1 | awk '{print $2}' | sed 's/://')
PROFILE="$(nmcli connection show | grep ${NIC} | awk -F " " '{print $1}')"
if [ "$2" == "CUSTOMER" ];then
nmcli connection modify "${PROFILE}" con-name CUSTOMER
nmcli connection down CUSTOMER; nmcli connection up CUSTOMER
fi
if [ "$2" == "MANAGEMENT" ];then
nmcli connection modify "${PROFILE}" con-name MANAGEMENT
nmcli connection down MANAGEMENT; nmcli connection up MANAGEMENT
fi
}
function set_ip(){
NIC=$(ip addr | grep -i -B 1 "$1" | head -1 | awk '{print $2}' | sed -e s/://)
PROFILE="$(nmcli device show ${NIC} | grep GENERAL.CONNECTION: | awk -F : '{print $2}' | sed -e 's/ *//')"
nmcli connection modify "${PROFILE}" connection.autoconnect yes
nmcli connection modify "${PROFILE}" ipv4.addresses ${2}/${3}
if [ $# -ne 4 ]; then
nmcli connection modify "${PROFILE}" ipv4.gateway 192.168.59.2
fi
nmcli connection modify "${PROFILE}" ipv4.dns 192.168.59.2
nmcli connection modify "${PROFILE}" ipv4.method manual
nmcli connection down "${PROFILE}"; nmcli connection up "${PROFILE}"
}
function initialize_FW(){
# zone initialize
firewall-cmd --permanent --get-zones | grep MANAGEMENT
if [ $? -eq 0 ];then
firewall-cmd --permanent --delete-zone=MANAGEMENT
fi
firewall-cmd --permanent --get-zones | grep CUSTOMER
if [ $? -eq 0 ];then
firewall-cmd --permanent --delete-zone=CUSTOMER
fi
firewall-cmd --reload
IFS_BK=$IFS
IFS='
'
# zone map interface initialize
for PROFILE in $(nmcli connection show | awk -F" " 'NR>1 {print $1}')
do
nmcli connection modify "${PROFILE}" connection.zone public
done
IFS=$IFS_BK
# chain initialize
CHAINS_NUM=$(firewall-cmd --direct --permanent --get-all-chains | wc -l)
if [ ${CHAINS_NUM} -gt 0 ]; then
for CHAIN in $(firewall-cmd --direct --permanent --get-all-chains | awk '{print $3}')
do
firewall-cmd --direct --permanent --remove-rules ipv4 filter "${CHAIN}"
firewall-cmd --direct --permanent --remove-chain ipv4 filter "${CHAIN}"
done
fi
firewall-cmd --reload
}
function create_FW(){
# create zone
firewall-cmd --permanent --new-zone=CUSTOMER
firewall-cmd --permanent --new-zone=MANAGEMENT
# create direct chain
firewall-cmd --permanent --direct --add-chain ipv4 filter TEST-DIRECT-CUSTOMER-DENY
firewall-cmd --permanent --direct --add-chain ipv4 filter TEST-DIRECT-CUSTOMER-ALLOW
firewall-cmd --permanent --direct --add-chain ipv4 filter TEST-DIRECT-MANAGEMENT-DENY
firewall-cmd --permanent --direct --add-chain ipv4 filter TEST-DIRECT-MANAGEMENT-ALLOW
# map zone and interface
#for PROFILE_OR_ZONE in CUSTOMER MANAGEMENT
#do
# nmcli connection modify ${PROFILE_OR_ZONE} connection.zone ${PROFILE_OR_ZONE}
# nmcli connection down ${PROFILE_OR_ZONE}; nmcli connection up ${PROFILE_OR_ZONE}
#done
firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 1 -j TEST-DIRECT-MANAGEMENT-ALLOW
firewall-cmd --permanent --direct --add-rule ipv4 filter TEST-DIRECT-MANAGEMENT-ALLOW 1 -p tcp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
firewall-cmd --permanent --direct --add-rule ipv4 filter TEST-DIRECT-MANAGEMENT-ALLOW 2 -p tcp -m conntrack --ctstate NEW -s 192.168.232.1 --dport 22 -j ACCEPT
firewall-cmd --reload
# map zone and interface
for PROFILE_OR_ZONE in CUSTOMER MANAGEMENT
do
nmcli connection modify ${PROFILE_OR_ZONE} connection.zone ${PROFILE_OR_ZONE}
nmcli connection down ${PROFILE_OR_ZONE}; nmcli connection up ${PROFILE_OR_ZONE}
done
}
# メインスクリプト
[root@localhost ~]# cat main.sh
#!/bin/sh
CUST_MAC="00:0c:29:db:cf:ba"
IP="192.168.59.135"
PREFIX="24"
CUST_FLG="CUSTOMER"
MGMT_MAC="00:0c:29:db:cf:ce"
MGMT_IP="192.168.232.129"
MGMT_PREFIX="24"
MGMT_FLG="MANAGEMENT"
. /root/common.cnf
hostnamectl set-hostname server002
disable_selinux
change_connection_profile_name ${CUST_MAC} ${UST_FLG}
change_connection_profile_name ${MGMT_MAC} ${MGMT_FLG}
initialize_FW
set_ip ${CUST_MAC} ${IP} ${PREFIX}
set_ip ${MGMT_MAC} ${MGMT_IP} ${MGMT_PREFIX} ${MGMT_FLG}
create_FW
# デバッグ
[root@localhost ~]# sh -x ./main.sh
+ CUST_MAC=00:0c:29:db:cf:ba
+ IP=192.168.59.135
+ PREFIX=24
+ CUST_FLG=CUSTOMER
+ MGMT_MAC=00:0c:29:db:cf:ce
+ MGMT_IP=192.168.232.129
+ MGMT_PREFIX=24
+ MGMT_FLG=MANAGEMENT
+ . /root/common.cnf
+ hostnamectl set-hostname server002
+ disable_selinux
++ getenforce
+ SELINUX=Disabled
+ '[' Disabled == Enforcing ']'
+ change_connection_profile_name 00:0c:29:db:cf:ba
++ ip addr
++ grep -i -B 1 00:0c:29:db:cf:ba
++ head -1
++ awk '{print $2}'
++ sed s/://
+ NIC=ens33
++ nmcli connection show
++ grep ens33
++ awk -F ' ' '{print $1}'
+ PROFILE=CUSTOMER
+ '[' '' == CUSTOMER ']'
+ '[' '' == MANAGEMENT ']'
+ change_connection_profile_name 00:0c:29:db:cf:ce MANAGEMENT
++ grep -i -B 1 00:0c:29:db:cf:ce
++ head -1
++ awk '{print $2}'
++ sed s/://
++ ip addr
+ NIC=ens38
++ nmcli connection show
++ grep ens38
++ awk -F ' ' '{print $1}'
+ PROFILE=MANAGEMENT
+ '[' MANAGEMENT == CUSTOMER ']'
+ '[' MANAGEMENT == MANAGEMENT ']'
+ nmcli connection modify MANAGEMENT con-name MANAGEMENT
+ nmcli connection down MANAGEMENT
Connection 'MANAGEMENT' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/12)
+ nmcli connection up MANAGEMENT
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/13)
+ initialize_FW
+ firewall-cmd --permanent --get-zones
+ grep MANAGEMENT
+ '[' 1 -eq 0 ']'
+ firewall-cmd --permanent --get-zones
+ grep CUSTOMER
+ '[' 1 -eq 0 ']'
+ firewall-cmd --reload
success
+ IFS_BK='
'
+ IFS='
'
++ awk '-F ' 'NR>1 {print $1}'
++ nmcli connection show
+ for PROFILE in '$(nmcli connection show | awk -F" " '\''NR>1 {print $1}'\'')'
+ nmcli connection modify CUSTOMER connection.zone public
+ for PROFILE in '$(nmcli connection show | awk -F" " '\''NR>1 {print $1}'\'')'
+ nmcli connection modify MANAGEMENT connection.zone public
+ IFS='
'
++ firewall-cmd --direct --permanent --get-all-chains
++ wc -l
+ CHAINS_NUM=0
+ '[' 0 -gt 0 ']'
+ firewall-cmd --reload
success
+ set_ip 00:0c:29:db:cf:ba 192.168.59.135 24
++ ip addr
++ grep -B 1 00:0c:29:db:cf:ba
++ head -1
++ awk '{print $2}'
++ sed -e s/://
+ NIC=ens33
++ nmcli device show ens33
++ awk -F : '{print $2}'
++ sed -e 's/ *//'
++ grep GENERAL.CONNECTION:
+ PROFILE=CUSTOMER
+ nmcli connection modify CUSTOMER connection.autoconnect yes
+ nmcli connection modify CUSTOMER ipv4.addresses 192.168.59.135/24
+ '[' 3 -ne 4 ']'
+ nmcli connection modify CUSTOMER ipv4.gateway 192.168.59.2
+ nmcli connection modify CUSTOMER ipv4.dns 192.168.59.2
+ nmcli connection modify CUSTOMER ipv4.method manual
+ nmcli connection down CUSTOMER
Connection 'CUSTOMER' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/11)
+ nmcli connection up CUSTOMER
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/14)
+ set_ip 00:0c:29:db:cf:ce 192.168.232.129 24 MANAGEMENT
++ ip addr
++ head -1
++ awk '{print $2}'
++ sed -e s/://
++ grep -B 1 00:0c:29:db:cf:ce
+ NIC=ens38
++ grep GENERAL.CONNECTION:
++ awk -F : '{print $2}'
++ sed -e 's/ *//'
++ nmcli device show ens38
+ PROFILE=MANAGEMENT
+ nmcli connection modify MANAGEMENT connection.autoconnect yes
+ nmcli connection modify MANAGEMENT ipv4.addresses 192.168.232.129/24
+ '[' 4 -ne 4 ']'
+ nmcli connection modify MANAGEMENT ipv4.dns 192.168.59.2
+ nmcli connection modify MANAGEMENT ipv4.method manual
+ nmcli connection down MANAGEMENT
Connection 'MANAGEMENT' successfully deactivated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/13)
+ nmcli connection up MANAGEMENT
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/15)